tigerL
驱动小牛
驱动小牛
  • 注册日期2003-12-24
  • 最后登录2008-10-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望23点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
阅读:1582回复:4

请教:如何获得一个磁盘的句柄?

楼主#
更多 发布于:2004-07-19 23:34
想向一个磁盘发送IOCTL_DISK_GET_DRIVE_LAYOUT的DeviceIoControl请求,但是不知如何获得磁盘的句柄。

我试了hDisk = CreateFile("\\\\\\\\.\\\\PhysicalDrive0",...);
但是每次调用DeviceIoControl(hDisk,IOCTL_DISK_GET_DRIVE_LAYOUT,...);都返回输出缓冲区长度不够的错误,任凭我分配多大的缓冲区都涛声依旧。

请各位指教:(1)如何获得磁盘句柄?(2)如何向磁盘发送IOCTL_DISK_GET_DRIVE_LAYOUT请求?

省元坊
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
沙发#
发布于: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]
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
tigerL
驱动小牛
驱动小牛
  • 注册日期2003-12-24
  • 最后登录2008-10-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望23点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-07-21 23:05
还没在机器上试过,先表示感谢!
省元坊
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
地板#
发布于:2004-07-22 08:39
上面的代码反斜杠贴不出来,我把源文件贴上来吧
附件名称/大小 下载次数 最后更新
2004-07-22_PartsInfo.cpp (2KB)  42
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
tigerL
驱动小牛
驱动小牛
  • 注册日期2003-12-24
  • 最后登录2008-10-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望23点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-07-23 00:02
真是太感谢了!
省元坊
游客

返回顶部