21,595
社区成员
发帖
与我相关
我的任务
分享
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;
}