PositionInfo->CurrentByteOffset));
return(STATUS_SUCCESS);
}
-
+
+NTSTATUS FsdGetBasicInformation(PFILE_OBJECT FileObject,
+ PVfatFCB FCB,
+ PDEVICE_OBJECT DeviceObject,
+ PFILE_BASIC_INFORMATION BasicInfo)
+{
+ DPRINT("FsdGetBasicInformation()\n");
+
+// BasicInfo->CreationTime =
+// BasicInfo->LastAccessTime =
+// BasicInfo->LastWriteTime =
+// BasicInfo->ChangeTime =
+
+ BasicInfo->FileAttributes = FCB->entry.Attrib;
+
+ DPRINT("Getting attributes %x\n", BasicInfo->FileAttributes);
+
+ return(STATUS_SUCCESS);
+}
+
NTSTATUS FsdQueryInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp)
/*
DeviceObject,
SystemBuffer);
break;
+ case FileBasicInformation:
+ RC = FsdGetBasicInformation(FileObject,
+ FCB,
+ DeviceObject,
+ SystemBuffer);
+ break;
default:
RC=STATUS_NOT_IMPLEMENTED;
}
+ Irp->IoStatus.Status = RC;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
return RC;
}
RC = STATUS_NOT_IMPLEMENTED;
}
+ Irp->IoStatus.Status = RC;
+ Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return RC;
}
-
+
STDCALL NTSTATUS DriverEntry(PDRIVER_OBJECT _DriverObject,
PUNICODE_STRING RegistryPath)
ULONG Length,
FILE_INFORMATION_CLASS FileInformationClass)
{
- NTSTATUS Status;
- PFILE_OBJECT FileObject;
- PIRP Irp;
- PIO_STACK_LOCATION StackPtr;
- KEVENT Event;
+ PIRP Irp;
+ PDEVICE_OBJECT DeviceObject;
+ PFILE_OBJECT FileObject;
+ NTSTATUS Status;
+ KEVENT Event;
+ PIO_STACK_LOCATION StackPtr;
- DPRINT("ZwQueryInformation(Handle %x StatBlk %x FileInfo %x Length %d Class %d)\n",
- FileHandle,
- IoStatusBlock,
- FileInformation,
- Length,
- FileInformationClass);
+ DPRINT("ZwQueryInformationFile(Handle %x StatBlk %x FileInfo %x Length %d Class %d)\n",
+ FileHandle,
+ IoStatusBlock,
+ FileInformation,
+ Length,
+ FileInformationClass);
- /* Get the file object from the file handle */
- Status = ObReferenceObjectByHandle(FileHandle,
- FILE_READ_ATTRIBUTES,
- IoFileType,
- UserMode,
- (PVOID *) &FileObject,
- NULL);
- if (!NT_SUCCESS(Status))
- {
- return Status;
- }
- DPRINT("FileObject %x\n", FileObject);
+ Status = ObReferenceObjectByHandle(FileHandle,
+ FILE_READ_ATTRIBUTES,
+ IoFileType,
+ UserMode,
+ (PVOID *)&FileObject,
+ NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ return(Status);
+ }
+ DPRINT("FileObject %x\n", FileObject);
+
+ KeInitializeEvent(&Event,NotificationEvent,FALSE);
+ DeviceObject = FileObject->DeviceObject;
- /* initialize an event object to wait on for the request */
- KeInitializeEvent(&Event, NotificationEvent, FALSE);
-
- /* build the IRP to be sent to the driver for the request */
- Irp = IoBuildSynchronousFsdRequest(IRP_MJ_QUERY_INFORMATION,
- FileObject->DeviceObject,
- FileInformation,
- Length,
- 0,
- &Event,
- IoStatusBlock);
- StackPtr = IoGetNextIrpStackLocation(Irp);
- StackPtr->FileObject = FileObject;
- StackPtr->Parameters.QueryFile.Length = Length;
- StackPtr->Parameters.QueryFile.FileInformationClass = FileInformationClass;
+ Irp = IoAllocateIrp(DeviceObject->StackSize, TRUE);
+ if (Irp==NULL)
+ {
+ ObDereferenceObject(FileObject);
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ Irp->UserIosb = IoStatusBlock;
+ Irp->UserEvent = &Event;
+ Irp->UserBuffer=FileInformation;
- /* Pass the IRP to the FSD (and wait for it if required) */
- DPRINT("FileObject->DeviceObject %x\n", FileObject->DeviceObject);
- Status = IoCallDriver(FileObject->DeviceObject, Irp);
- if (Status == STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO))
- {
- KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
- Status = Irp->IoStatus.Status;
- }
-
- return Status;
+ StackPtr = IoGetNextIrpStackLocation(Irp);
+ StackPtr->MajorFunction = IRP_MJ_QUERY_INFORMATION;
+ StackPtr->MinorFunction = 0;
+ StackPtr->Flags = 0;
+ StackPtr->Control = 0;
+ StackPtr->DeviceObject = DeviceObject;
+ StackPtr->FileObject = FileObject;
+
+ StackPtr->Parameters.QueryFile.FileInformationClass =
+ FileInformationClass;
+ StackPtr->Parameters.QueryFile.Length = Length;
+
+ Status = IoCallDriver(FileObject->DeviceObject,Irp);
+ if (Status==STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO))
+ {
+ KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
+ Status = Irp->IoStatus.Status;
+ }
+ return(Status);
}
NTSTATUS NtSetInformationFile(HANDLE FileHandle,
PIO_STACK_LOCATION StackPtr;
KEVENT Event;
- DPRINT("ZwSetInformation(Handle %x StatBlk %x FileInfo %x Length %d Class %d)\n",
+ DPRINT("ZwSetInformationFile(Handle %x StatBlk %x FileInfo %x Length %d Class %d)\n",
FileHandle,
IoStatusBlock,
FileInformation,