阅读:1582回复:4
请教:如何获得一个磁盘的句柄?
想向一个磁盘发送IOCTL_DISK_GET_DRIVE_LAYOUT的DeviceIoControl请求,但是不知如何获得磁盘的句柄。
我试了hDisk = CreateFile("\\\\\\\\.\\\\PhysicalDrive0",...); 但是每次调用DeviceIoControl(hDisk,IOCTL_DISK_GET_DRIVE_LAYOUT,...);都返回输出缓冲区长度不够的错误,任凭我分配多大的缓冲区都涛声依旧。 请各位指教:(1)如何获得磁盘句柄?(2)如何向磁盘发送IOCTL_DISK_GET_DRIVE_LAYOUT请求? |
|
|
沙发#
发布于:2004-07-20 08:43
下面是我写的一段代码,在我的系统上测试通过(Win2k SP4),注意nBufferSize 后面那个数字,我用的是20,因为我的系统返回的lpPartInfo->PartitionCount 是 12,我的硬盘分了三个区,一般这个数字需要设为: (硬盘的分区数 * 4 - 1)
大一点没什么关系啦 :) #include "stdafx.h" #include <Windows.h> #include <Winioctl.h> int main(int argc, char* argv[]) { HANDLE hDevice = NULL; DWORD nBytesRead = 0; DWORD nBufferSize = sizeof(DRIVE_LAYOUT_INFORMATION) + sizeof(PARTITION_INFORMATION)*20; PDRIVE_LAYOUT_INFORMATION lpPartInfo = (PDRIVE_LAYOUT_INFORMATION)malloc(nBufferSize); if(lpPartInfo == NULL) { return 0; } memset(lpPartInfo, 0, nBufferSize); // // Getting a handle to 1st HD using CreateFile() function // Open the 1st HD using "\.PhysicalDrive0" // Open drive C: using "\.C:" // hDevice = CreateFile("\.PhysicalDrive0", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if(hDevice == NULL) { return 0; } DeviceIoControl( hDevice, IOCTL_DISK_GET_DRIVE_LAYOUT, NULL, 0, (LPVOID) lpPartInfo, (DWORD) nBufferSize, (LPDWORD) &nBytesRead, NULL ); CloseHandle(hDevice); free(lpPartInfo); return 0; } [编辑 - 7/20/04 by seaquester] [编辑 - 7/20/04 by seaquester] |
|
|
板凳#
发布于:2004-07-21 23:05
还没在机器上试过,先表示感谢!
|
|
|
地板#
发布于:2004-07-22 08:39
上面的代码反斜杠贴不出来,我把源文件贴上来吧
|
|
|
地下室#
发布于:2004-07-23 00:02
真是太感谢了!
|
|
|