描述:
目前在WIN7初始化磁盘遇到问题:
具体代码如下:
bool CreatePartition(int PhysicalDriveNumber)
{
// TODO: Add your control notification handler code here
bool br = false;
HANDLE hDev = NULL;
CString strDev;
DWORD returnedCount = 0;
strDev.Format(_T("\\\\.\\PHYSICALDRIVE%d"), PhysicalDriveNumber);
//strDev.Format(_T("\\\\.\\Disk%d"), PhysicalDriveNumber);
if (!strDev.IsEmpty())
{
hDev = ::CreateFile(strDev, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hDev != INVALID_HANDLE_VALUE)
{
DISK_GEOMETRY_EX* pDgEx = (DISK_GEOMETRY_EX*) new BYTE[512];
//Get disk size
if (::DeviceIoControl(hDev,
IOCTL_DISK_GET_DRIVE_GEOMETRY_EX,
NULL,
0,
pDgEx,
512,
&returnedCount,
NULL))
{
//MessageBox(_T("GET_DRIVE_GEOMETRY_EX"));
CREATE_DISK cd;
CREATE_DISK* pCd = &cd;
PDISK_PARTITION_INFO pDpi = (PDISK_PARTITION_INFO) pDgEx->Data; //DiskGeometryGetPartition(pDgEx);
pCd->PartitionStyle = PARTITION_STYLE_MBR;
pCd->Mbr.Signature = pDpi->Mbr.Signature;
//Initialize disk.
if (::DeviceIoControl(hDev,
IOCTL_DISK_CREATE_DISK,
pCd,
sizeof(CREATE_DISK),
NULL,
0,
&returnedCount,
NULL))
{
//MessageBox(_T("CREATE_DISK"));
int layoutInfoSize = sizeof(DRIVE_LAYOUT_INFORMATION_EX) + sizeof(PARTITION_INFORMATION_EX) * 3;
DRIVE_LAYOUT_INFORMATION_EX* pDliEx2 = (DRIVE_LAYOUT_INFORMATION_EX*) new BYTE[layoutInfoSize];
pDliEx2->PartitionStyle = PARTITION_STYLE_MBR;
pDliEx2->PartitionCount = 4;
pDliEx2->Mbr.Signature = pDpi->Mbr.Signature;//0xBBF0;//?
pDliEx2->PartitionEntry[0].PartitionStyle = PARTITION_STYLE_MBR;
pDliEx2->PartitionEntry[0].StartingOffset.QuadPart = 32256;
pDliEx2->PartitionEntry[0].PartitionLength.QuadPart = pDgEx->Geometry.Cylinders.QuadPart
* pDgEx->Geometry.TracksPerCylinder
* pDgEx->Geometry.SectorsPerTrack
* pDgEx->Geometry.BytesPerSector
- pDliEx2->PartitionEntry[0].StartingOffset.QuadPart;
pDliEx2->PartitionEntry[0].PartitionNumber = 1;
pDliEx2->PartitionEntry[0].RewritePartition = TRUE;
pDliEx2->PartitionEntry[0].Mbr.PartitionType = PARTITION_IFS;
pDliEx2->PartitionEntry[0].Mbr.BootIndicator = FALSE;
pDliEx2->PartitionEntry[0].Mbr.RecognizedPartition = TRUE;
pDliEx2->PartitionEntry[0].Mbr.HiddenSectors = 63;
pDliEx2->PartitionEntry[1].PartitionStyle = PARTITION_STYLE_MBR;
pDliEx2->PartitionEntry[1].StartingOffset.QuadPart = 0;
pDliEx2->PartitionEntry[1].PartitionLength.QuadPart = 0;
pDliEx2->PartitionEntry[1].PartitionNumber = 0;
pDliEx2->PartitionEntry[1].RewritePartition = FALSE;
pDliEx2->PartitionEntry[1].Mbr.PartitionType = PARTITION_ENTRY_UNUSED;
pDliEx2->PartitionEntry[1].Mbr.BootIndicator = FALSE;
pDliEx2->PartitionEntry[1].Mbr.RecognizedPartition = FALSE;
pDliEx2->PartitionEntry[1].Mbr.HiddenSectors = 0;
pDliEx2->PartitionEntry[2].PartitionStyle = PARTITION_STYLE_MBR;
pDliEx2->PartitionEntry[2].StartingOffset.QuadPart = 0;
pDliEx2->PartitionEntry[2].PartitionLength.QuadPart = 0;
pDliEx2->PartitionEntry[2].PartitionNumber = 0;
pDliEx2->PartitionEntry[2].RewritePartition = FALSE;
pDliEx2->PartitionEntry[2].Mbr.PartitionType = PARTITION_ENTRY_UNUSED;
pDliEx2->PartitionEntry[2].Mbr.BootIndicator = FALSE;
pDliEx2->PartitionEntry[2].Mbr.RecognizedPartition = FALSE;
pDliEx2->PartitionEntry[2].Mbr.HiddenSectors = 0;
pDliEx2->PartitionEntry[3].PartitionStyle = PARTITION_STYLE_MBR;
pDliEx2->PartitionEntry[3].StartingOffset.QuadPart = 0;
pDliEx2->PartitionEntry[3].PartitionLength.QuadPart = 0;
pDliEx2->PartitionEntry[3].PartitionNumber = 0;
pDliEx2->PartitionEntry[3].RewritePartition = FALSE;
pDliEx2->PartitionEntry[3].Mbr.PartitionType = PARTITION_ENTRY_UNUSED;
pDliEx2->PartitionEntry[3].Mbr.BootIndicator = FALSE;
pDliEx2->PartitionEntry[3].Mbr.RecognizedPartition = FALSE;
pDliEx2->PartitionEntry[3].Mbr.HiddenSectors = 0;
//Partitioning disk
if (::DeviceIoControl(hDev, IOCTL_DISK_SET_DRIVE_LAYOUT_EX, pDliEx2, layoutInfoSize,
NULL, 0, &returnedCount, NULL))
{
//MessageBox(_T("SET_DRIVE_LAYOUT_EX"));
VERIFY_INFORMATION vi;
VERIFY_INFORMATION* pVi = &vi;
pVi->StartingOffset.QuadPart = 0;
pVi->Length = (ULONG)pDgEx->DiskSize.QuadPart;
//Verifying
//OVERLAPPED xyz;
if (::DeviceIoControl(hDev, IOCTL_DISK_VERIFY, pVi, sizeof(VERIFY_INFORMATION),
NULL, 0, &returnedCount, NULL))
{
//MessageBox(_T("DISK_VERIFY"));
//Updating
if (::DeviceIoControl(hDev, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0,
NULL, 0, &returnedCount, NULL))
{
//MessageBox(_T("UPDATE_PROPERTIES"));
br = true;
}
}
}
delete pDliEx2;
}
}
delete pDgEx;
::CloseHandle(hDev);
}
}
return br;
}
XP下是好的,win7下的话一下语句遇到问题:
if (::DeviceIoControl(hDev, IOCTL_DISK_VERIFY, pVi, sizeof(VERIFY_INFORMATION),
NULL, 0, &returnedCount, NULL))
返回lasterror = 1117
不知道怎么解决。