i write a general driver , i want to query file cluster info, so i write this code:
but how to get FSD DeviceObject and send FSCTL_GET_RETRIEVAL_POINTERS query file cluster info . FileObject i can get already .
BOOLEAN QueryFileClustersInfo(PDEVICE_OBJECT DeviceObject,
PFILE_OBJECT FileObject,
PSTARTING_VCN_INPUT_BUFFER pStartingVcn,
ULONG ushStartingVcn,
PRETRIEVAL_POINTERS_BUFFER pVcnPairs,
ULONG ushpVcnPairs)
{
PIRP irp;
KEVENT event;
IO_STATUS_BLOCK IoStatusBlock;
PIO_STACK_LOCATION ioStackLocation;
KeInitializeEvent(&event, NotificationEvent, FALSE);
irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);
if (!irp)
return FALSE;
irp->AssociatedIrp.SystemBuffer = pStartingVcn;
irp->UserBuffer = pVcnPairs;
irp->UserEvent = &event;
irp->UserIosb = &IoStatusBlock;
irp->Tail.Overlay.Thread = PsGetCurrentThread();
irp->Tail.Overlay.OriginalFileObject = FileObject;
irp->RequestorMode = KernelMode; irp->Flags = 0;
ioStackLocation = IoGetNextIrpStackLocation(irp);
ioStackLocation->MajorFunction = IRP_MJ_FILE_SYSTEM_CONTROL;
ioStackLocation->MinorFunction = IRP_MN_USER_FS_REQUEST;
ioStackLocation->DeviceObject = DeviceObject;
ioStackLocation->FileObject = FileObject;
ioStackLocation->Parameters.DeviceIoControl.IoControlCode = FSCTL_GET_RETRIEVAL_POINTERS ;
ioStackLocation->Parameters.DeviceIoControl.OutputBufferLength = ushpVcnPairs;
ioStackLocation->Parameters.DeviceIoControl.InputBufferLength = ushStartingVcn;
ioStackLocation->Parameters.DeviceIoControl.Type3InputBuffer = pStartingVcn;
IoSetCompletionRoutine(irp, QueryFileClustersInfoComplete, 0, TRUE, TRUE, TRUE);
IoCallDriver(DeviceObject, irp) ;
KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, 0); return NT_SUCCESS(IoStatusBlock.Status) ;
}// End QueryFileClustersInfo()
NTSTATUS
QueryFileClustersInfoComplete(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context)
{
if (Irp->PendingReturned)
KeSetEvent((PKEVENT)Context, IO_NO_INCREMENT, FALSE);
return STATUS_MORE_PROCESSING_REQUIRED;
}