WIN7 初始化格式化磁盘问题

无线空虚EMS 2012-03-09 06:15:41
目前在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

不知道怎么解决。





...全文
497 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
无线空虚EMS 2012-03-12
  • 打赏
  • 举报
回复
在USB2.0可以初始化(相对XP慢),USB3.0就不行。

有没有人会呢
无线空虚EMS 2012-03-12
  • 打赏
  • 举报
回复
直接去掉if (::DeviceIoControl(hDev, IOCTL_DISK_VERIFY, pVi, sizeof(VERIFY_INFORMATION),
NULL, 0, &returnedCount, NULL))。。。OK~~~!!

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧