本文介绍了初始化磁盘,分区并格式化它的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试初始化磁盘,分区并将其格式化为NTFS或FAT32格式,但我遇到了一些问题。代码可以初始化磁盘并对其进行分区,但在代码执行后,磁盘起始扇区数据是错误的。这是代码。

I'm trying to initialize a disk, partition and format it in NTFS or FAT32 format, but I encountered some problems. The code can initialize a disk and partition it, but after code execution the disk start sector data was wrong. Here is the code.

int InitDisk(void)
{
	BOOL bResult = FALSE;     // generic results flag   
	CAutoFile hDevice;               // handle to the drive to be examined  
	DWORD junk = 0;                   // discard results 

	hDevice = CreateFile(TEXT("\\\\.\\PhysicalDrive0"), //"\\\\.\\PhysicalDrive1",  // drive to open 
		GENERIC_READ | GENERIC_WRITE,                // no access to the drive 
		FILE_SHARE_READ | // share mode 
		FILE_SHARE_WRITE,  
		NULL,             // default security attributes 
		OPEN_EXISTING,    // disposition 
		0,                // file attributes 
		NULL);            // do not copy file attributes 
	if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive 
	{ 
		return GetLastError();
	}

	CREATE_DISK dsk; 
	dsk.PartitionStyle = PARTITION_STYLE_MBR;  
	dsk.Mbr.Signature = 9999;

         // Initialize disk
	bResult = DeviceIoControl(hDevice,        // device to be queried 
		IOCTL_DISK_CREATE_DISK,  // operation to perform 
		&dsk, sizeof(dsk),        //sizeof(pdg),     // output buffer 
		NULL, 0,                // no output buffer 
		&junk,                    // # bytes returned 
		NULL); 
	if (!bResult)
	{ 
		return GetLastError(); 
	}
	bResult = DeviceIoControl(hDevice, 
		IOCTL_DISK_UPDATE_PROPERTIES, 
		NULL, 0, NULL, 0, &junk, NULL);
	if (! bResult)
	{ 
		return GetLastError(); 
	}

	LARGE_INTEGER lgPartitionSize;
	lgPartitionSize.QuadPart = (1024 * 1024 * 1024);
	DWORD dwDriverLayoutInfoExLen = sizeof (DRIVE_LAYOUT_INFORMATION_EX) + 3 * sizeof(PARTITION_INFORMATION_EX);
	DRIVE_LAYOUT_INFORMATION_EX *pdg = (DRIVE_LAYOUT_INFORMATION_EX *)new BYTE[dwDriverLayoutInfoExLen];
	if (pdg == NULL)
	{
		return -1;
	}
	SecureZeroMemory(pdg, dwDriverLayoutInfoExLen);
	// set RewritePartition=true in every partition to force rewrite.   
	// 	for (int item = 0; item < 4; item++){
	// 		pdg->PartitionEntry[item].RewritePartition = 1;
	// 		pdg->PartitionEntry[item].PartitionNumber = 0;
	// 	}

	pdg->PartitionStyle = PARTITION_STYLE_MBR; 
	pdg->PartitionCount = 1;
	pdg->Mbr.Signature = 99999;

	pdg->PartitionEntry[0].PartitionStyle = PARTITION_STYLE_MBR;   
	pdg->PartitionEntry[0].StartingOffset.QuadPart = 32256;   // 63扇区
	pdg->PartitionEntry[0].PartitionLength.QuadPart = lgPartitionSize.QuadPart * 36;   
	pdg->PartitionEntry[0].PartitionNumber = 1;   
	pdg->PartitionEntry[0].RewritePartition = TRUE;   
	pdg->PartitionEntry[0].Mbr.PartitionType = PARTITION_NTFT; // PARTITION_IFS (NTFS partition or logical drive)   
	pdg->PartitionEntry[0].Mbr.BootIndicator = TRUE;
	pdg->PartitionEntry[0].Mbr.RecognizedPartition = 1;   
	pdg->PartitionEntry[0].Mbr.HiddenSectors = 32256 / 512;   

         // partition a disk
	bResult = DeviceIoControl(hDevice,        // device to be queried 
		IOCTL_DISK_SET_DRIVE_LAYOUT_EX,  // operation to perform 
		pdg, sizeof DRIVE_LAYOUT_INFORMATION_EX,        //sizeof(pdg),     // output buffer 
		NULL, 0,                // no output buffer 
		&junk,                    // # bytes returned 
		NULL); 
	if (!bResult)
	{ 
		return GetLastError(); 
	}
	bResult = DeviceIoControl(hDevice, 
		IOCTL_DISK_UPDATE_PROPERTIES, 
		NULL, 0, NULL, 0, &junk, NULL);
	if (!bResult)
	{ 
		return GetLastError(); 
	}

	PARTITION_INFORMATION_EX dskinfo; 
	PARTITION_INFORMATION_MBR mbrinfo; 
	mbrinfo.PartitionType = PARTITION_NTFT; 
	mbrinfo.HiddenSectors = (32256 / 512);
	mbrinfo.BootIndicator = 1;
	mbrinfo.RecognizedPartition = 1;

	dskinfo.PartitionStyle = PARTITION_STYLE_MBR; 
	dskinfo.StartingOffset.QuadPart = 32256;  
	dskinfo.PartitionLength.QuadPart = lgPartitionSize.QuadPart * 36; 
	dskinfo.PartitionNumber = 1; 
	dskinfo.RewritePartition = TRUE; 
	dskinfo.Mbr = mbrinfo; 
        // IOCTL_DISK_SET_PARTITION_INFO_EX can not perform successful
	bResult = DeviceIoControl(hDevice,        // device to be queried 
		IOCTL_DISK_SET_PARTITION_INFO_EX,  // operation to perform 
		&dskinfo, sizeof(dskinfo),        //sizeof(pdg),     // output buffer 
		NULL, 0,                // no output buffer 
		&junk,                    // # bytes returned 
		//(LPOVERLAPPED)  
		NULL); 
	if (!bResult)
	{ 
		return GetLastError();
	} 

	return 0;
}



希望有经验的朋友可以指导我!

格式化分区函数不会调用SHFormatDrive Shell API!


Hope that friends who have some experience can guide me!
Format the partition function does not call SHFormatDrive Shell API!

推荐答案


这篇关于初始化磁盘,分区并格式化它的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-26 18:04