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

月竹影 月竹影 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
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;
}
...全文
评论 1
收藏 已收藏
分享
返回顶部