Hi all , i have written a function to find out if a file object is related to a directory or to a file . here’s my code :
BOOLEAN FuncQueryFileInformation( PDEVICE_OBJECT DeviceObject,
PFILE_OBJECT FileObject,
PFILE_STANDARD_INFORMATION FileInformation, ULONG FileInformationLength )
{
PIRP irp;
KEVENT event;
IO_STATUS_BLOCK IoStatusBlock;
PIO_STACK_LOCATION ioStackLocation;
DbgPrint((“Getting file information for (%x)\n”, FileObject));
KeInitializeEvent(&event, SynchronizationEvent, FALSE);
irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);
if (!irp) {
return FALSE;
}
irp->AssociatedIrp.SystemBuffer = FileInformation;
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_QUERY_INFORMATION;
ioStackLocation->DeviceObject = DeviceObject;
ioStackLocation->FileObject = FileObject;
ioStackLocation->Parameters.QueryFile.Length = FileInformationLength;
ioStackLocation->Parameters.QueryFile.FileInformationClass = FileStandardInformation ;
IoSetCompletionRoutine(irp, FuncQueryFileInformationComplete, 0, TRUE, TRUE, TRUE);
(void) IoCallDriver(DeviceObject, irp);
KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, 0);
return NT_SUCCESS( IoStatusBlock.Status );
}
NTSTATUS FuncQueryFileInformationComplete(PDEVICE_OBJECT DeviceObject,
PIRP Irp,
PVOID Context)
{
*Irp->UserIosb = Irp->IoStatus;
if( !NT_SUCCESS(Irp->IoStatus.Status) ) {
DbgPrint((" ERROR ON IRP: %x\n", Irp->IoStatus.Status ));
}
KeSetEvent(Irp->UserEvent, 0, FALSE);
IoFreeIrp(Irp);
return STATUS_MORE_PROCESSING_REQUIRED;
}
what’s wrong with these routines ? why they allways returns “STATUS_INVALID_PARAMETER” ?
thanks.