win32 文件过滤驱动中如何获得硬盘的大小

月竹影 2015-05-09 03:48:07
Hi,各位大侠,
我最近遇到一个比较头痛的问题,我在一个文件驱动中在设备加载的时候想获得硬盘的大小
我往下传IOCTL_DISK_GET_DRIVE_GEOMETRY_EX控制命令,成功了,但是返回值都是0,大家有什么好的解决方法不?
NTSTATUS GetDiskGeometry(IN PDEVICE_OBJECT pDiskDevObj, 
OUT LARGE_INTEGER * pDiskSize)
{
IO_STATUS_BLOCK IoStatusBlock;
KEVENT Event;
PIRP pIrp;
NTSTATUS status;
DISK_GEOMETRY_EX diskGeo;
PDISK_GEOMETRY_EX diskGeometry;
ULONG size ;


/* allocate memory
*/
size = sizeof (DISK_GEOMETRY_EX);
diskGeometry =&diskGeo;

RtlZeroMemory(diskGeometry, sizeof(DISK_GEOMETRY_EX));
KeInitializeEvent(&Event, NotificationEvent, FALSE);

while(true)
{
/* Request for the device geometry
*/
pIrp = IoBuildDeviceIoControlRequest (IOCTL_DISK_GET_DRIVE_GEOMETRY_EX,
pDiskDevObj,
NULL,
0,
(PVOID)diskGeometry,
size,
FALSE,
&Event,
&IoStatusBlock);

if (!pIrp)
{
//return STATUS_INSUFFICIENT_RESOURCES;
KeResetEvent(&Event);
break;
}

status = IoCallDriver(pDiskDevObj, pIrp);
if (status == STATUS_PENDING)
{
KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
status = IoStatusBlock.Status;
}

if (NT_SUCCESS(status))
{
pDiskSize->QuadPart = diskGeometry->DiskSize.QuadPart;
if(pDiskSize->QuadPart!=0)
{
return status;
}
}

break;
}

pIrp = IoBuildDeviceIoControlRequest(
IOCTL_DISK_GET_DRIVE_GEOMETRY,
pDiskDevObj,
NULL,
0,
&diskGeometry->Geometry,
sizeof(DISK_GEOMETRY),
FALSE,
&Event,
&IoStatusBlock);

if (!pIrp)
{
return STATUS_INSUFFICIENT_RESOURCES;
}
status = IoCallDriver(pDiskDevObj, pIrp);
if (status == STATUS_PENDING)
{
KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
status = IoStatusBlock.Status;
}

if (NT_SUCCESS(status))
{
pDiskSize->QuadPart = diskGeometry->Geometry.Cylinders.QuadPart*diskGeometry->Geometry.SectorsPerTrack*diskGeometry->Geometry.TracksPerCylinder;
}
return status;
}
...全文
355 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
毕健 2016-05-07
  • 打赏
  • 举报
回复

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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