I’m trying to get disk signature in my upper disk class filter driver during the AddDevice. But I’m getting some junk status value being returned? Below is the code. Any help. THaNKS.
NTSTATUS MyFltrGetDiskSignature (IN PDEVICE_OBJECT DeviceObject,
OUT PUNICODE_STRING DiskSignature)
{
NTSTATUS status = STATUS_SUCCESS;
IO_STATUS_BLOCK ioStatus;
KEVENT event;
PDEVICE_EXTENSION deviceExtension;
PIRP irp = NULL;
PDISK_GEOMETRY_EX diskGeometry;
ULONG size;
PCCHAR msg = “Disk signature %s\n”;
PAGED_CODE ();
deviceExtension = DeviceObject->DeviceExtension;
/* allocate memory
*/
size = sizeof (DISK_GEOMETRY_EX) +
sizeof (DISK_PARTITION_INFO) +
sizeof (DISK_DETECTION_INFO);
diskGeometry = (PDISK_GEOMETRY_EX)ExAllocatePool (PagedPool, size);
if (NULL == diskGeometry) {
status = STATUS_INSUFFICIENT_RESOURCES;
msg = “Fail to get build DiskGeometry\n”;
goto END;
}
KeInitializeEvent (&event, NotificationEvent, FALSE);
/* Request for the device geometry
*/
irp = IoBuildDeviceIoControlRequest (IOCTL_DISK_GET_DRIVE_GEOMETRY_EX,
deviceExtension->TargetDeviceObject,
NULL,
0,
(PVOID)diskGeometry,
size,
FALSE,
&event,
&ioStatus);
if (NULL == irp) {
status = STATUS_INSUFFICIENT_RESOURCES;
msg = “Fail to get build Irp\n”;
goto END;
}
status = IoCallDriver (deviceExtension->TargetDeviceObject, irp);
/*
* status that I get is : status = -1073741661
*
*/
if (STATUS_PENDING == status) {
KeWaitForSingleObject (&event, Executive, KernelMode, FALSE, NULL);
status = ioStatus.Status;
}
if (!NT_SUCCESS (status)) {
msg = “IoBuildDeviceIoControlRequest failed\n”;
goto END;
}
MyFltrAddDevice (DriverObject, PhysicalDeviceObject…)
{
status = IoCreateDevice (DriverObject,
DEVICE_EXTENSION_SIZE,
NULL,
FILE_DEVICE_DISK,
FILE_DEVICE_SECURE_OPEN,
FALSE,
&filterDeviceObject);
if (!NT_SUCCESS (status)) {
MyDebugPrint (Cannot create filterDeviceObject\n");
return (status);
}
filterDeviceObject->Flags |= DO_DIRECT_IO;
deviceExtension = (PDEVICE_EXTENSION)filterDeviceObject->DeviceExtension;
RtlZeroMemory (deviceExtension, DEVICE_EXTENSION_SIZE);
deviceExtension->PhysicalDeviceObject = PhysicalDeviceObject;
deviceExtension->TargetDeviceObject = IoAttachDeviceToDeviceStack (filterDeviceObject,
PhysicalDeviceObject);
if (NULL == deviceExtension->TargetDeviceObject) {
ExFreePool (deviceExtension->DiskCounters);
deviceExtension->DiskCounters = NULL;
IoDeleteDevice (filterDeviceObject);
MyDebugPrint (“Unable to attach %X to target %X\n”,
filterDeviceObject,
PhysicalDeviceObject);
return (STATUS_NO_SUCH_DEVICE);
}
/* Save the filter device object in the device extension
*/
deviceExtension->DeviceObject = filterDeviceObject;
deviceExtension->PhysicalDeviceName.Buffer = deviceExtension->PhysicalDeviceNameBuffer;
// at the end of MyFltrAddDevice
MyFltrGetDiskSignature (FilterDeviceObject, &diskSignature);
…
}