DeviceIoControl函数可以直接操作硬件比如硬盘,光驱等等。这个函数有一个控制码IOCTL_XXX和FSCTL_XXX。
通过这两种控制码其实就可以区分出操作的对象的不同。IOCTL_XXX操作的对象如果是硬盘的话,只能是物理路径,(\\\\.\\PhysicalDrive0)
FSCTL_XXX是分区(卷)路径(\\\\.\\D:)
如下面这个函数:
BOOL UpdatePartition(CString letter)
{
DWORD readed=0;
DWORD dwDiskNum = GetPhysicDriveFromLetter(letter);
if (dwDiskNum == -1)
{
MessageBox(0,L"获取驱动器ID失败",0,0);
return FALSE;
}
CString drive;
drive.Format(_T("\\\\.\\PhysicalDrive%d"),dwDiskNum);
HANDLE hDisk = CreateFile(drive,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_DEVICE,NULL);
if (hDisk == INVALID_HANDLE_VALUE)
{
::MessageBox(0,_T("打开U盘失败"),0,0);
return FALSE;
}
DeviceIoControl(hDisk,IOCTL_DISK_UPDATE_PROPERTIES,NULL,0,NULL,0,&readed,NULL);
CloseHandle(hDisk);
CString csPartition;
csPartition.Format(_T("\\\\.\\%s"),letter);
csPartition.TrimRight(_T("\\"));
HANDLE hPartition = CreateFile(csPartition,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_DEVICE,NULL);
if (hPartition == INVALID_HANDLE_VALUE)
{
return FALSE;
}
DeviceIoControl((HANDLE) hPartition, (DWORD) FSCTL_LOCK_VOLUME, NULL,0,NULL, 0, (LPDWORD) &readed,NULL);
DeviceIoControl(hPartition, FSCTL_DISMOUNT_VOLUME, NULL, 0, NULL,0, &readed, NULL);
DeviceIoControl((HANDLE) hPartition, (DWORD) FSCTL_UNLOCK_VOLUME, NULL,0,NULL, 0, (LPDWORD) &readed,NULL);
CloseHandle(hPartition);
return TRUE;
}
这个函数是用来更新对硬盘的操作的,第一个更新分区表的 IOCTL_DISK_UPDATE_PROPERTIES, 所以第一个参数取自物理磁盘驱动器编号
第二个是卸载分区(卷) 重新加载,第一个参数取自分区的盘符。