DriverEntry(PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath)
{
- PNPFS_DEVICE_EXTENSION DeviceExtension;
PDEVICE_OBJECT DeviceObject;
UNICODE_STRING DeviceName;
+ PNPFS_VCB Vcb;
+ PNPFS_FCB Fcb;
NTSTATUS Status;
DPRINT("Named Pipe FSD 0.0.2\n");
NpfsQueryVolumeInformation;
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = NpfsCleanup;
DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = NpfsFlushBuffers;
- // DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] =
- // NpfsDirectoryControl;
+ DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] =
+ NpfsDirectoryControl;
DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] =
NpfsFileSystemControl;
// DriverObject->MajorFunction[IRP_MJ_QUERY_SECURITY] =
RtlInitUnicodeString(&DeviceName, L"\\Device\\NamedPipe");
Status = IoCreateDevice(DriverObject,
- sizeof(NPFS_DEVICE_EXTENSION),
+ sizeof(NPFS_VCB),
&DeviceName,
FILE_DEVICE_NAMED_PIPE,
0,
return Status;
}
- /* initialize the device object */
+ /* Initialize the device object */
DeviceObject->Flags |= DO_DIRECT_IO;
DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
- /* initialize the device extension */
- DeviceExtension = DeviceObject->DeviceExtension;
- InitializeListHead(&DeviceExtension->PipeListHead);
- InitializeListHead(&DeviceExtension->ThreadListHead);
- KeInitializeMutex(&DeviceExtension->PipeListLock, 0);
- DeviceExtension->EmptyWaiterCount = 0;
+ /* Initialize the Volume Control Block (VCB) */
+ Vcb = (PNPFS_VCB)DeviceObject->DeviceExtension;
+ InitializeListHead(&Vcb->PipeListHead);
+ InitializeListHead(&Vcb->ThreadListHead);
+ KeInitializeMutex(&Vcb->PipeListLock, 0);
+ Vcb->EmptyWaiterCount = 0;
/* set the size quotas */
- DeviceExtension->MinQuota = PAGE_SIZE;
- DeviceExtension->DefaultQuota = 8 * PAGE_SIZE;
- DeviceExtension->MaxQuota = 64 * PAGE_SIZE;
+ Vcb->MinQuota = PAGE_SIZE;
+ Vcb->DefaultQuota = 8 * PAGE_SIZE;
+ Vcb->MaxQuota = 64 * PAGE_SIZE;
+
+ /* Create the device FCB */
+ Fcb = ExAllocatePoolWithTag(NonPagedPool, sizeof(NPFS_FCB), TAG_NPFS_FCB);
+ Fcb->Type = FCB_DEVICE;
+ Fcb->Vcb = Vcb;
+ Vcb->DeviceFcb = Fcb;
+
+ /* Create the root directory FCB */
+ Fcb = ExAllocatePoolWithTag(NonPagedPool, sizeof(NPFS_FCB), TAG_NPFS_FCB);
+ Fcb->Type = FCB_DIRECTORY;
+ Fcb->Vcb = Vcb;
+ Vcb->RootFcb = Fcb;
return STATUS_SUCCESS;
}
+
+FCB_TYPE
+NpfsGetFcb(PFILE_OBJECT FileObject,
+ PNPFS_FCB *Fcb)
+{
+ PNPFS_FCB LocalFcb = NULL;
+ FCB_TYPE FcbType = FCB_INVALID;
+
+ _SEH2_TRY
+ {
+ LocalFcb = (PNPFS_FCB)FileObject->FsContext;
+ FcbType = LocalFcb->Type;
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ LocalFcb = NULL;
+ FcbType = FCB_INVALID;
+ }
+ _SEH2_END;
+
+ *Fcb = LocalFcb;
+
+ return FcbType;
+}
+
+
+CCB_TYPE
+NpfsGetCcb(PFILE_OBJECT FileObject,
+ PNPFS_CCB *Ccb)
+{
+ PNPFS_CCB LocalCcb = NULL;
+ CCB_TYPE CcbType = CCB_INVALID;
+
+ _SEH2_TRY
+ {
+ LocalCcb = (PNPFS_CCB)FileObject->FsContext2;
+ CcbType = LocalCcb->Type;
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ LocalCcb = NULL;
+ CcbType = CCB_INVALID;
+ }
+ _SEH2_END;
+
+ *Ccb = LocalCcb;
+
+ return CcbType;
+}
+
/* EOF */