2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: drivers/filesystems/npfs/npfs.c
5 * PURPOSE: Named pipe filesystem
6 * PROGRAMMER: David Welch <welch@cwcom.net>
9 /* INCLUDES ******************************************************************/
16 /* FUNCTIONS *****************************************************************/
19 DriverEntry(PDRIVER_OBJECT DriverObject
,
20 PUNICODE_STRING RegistryPath
)
22 PDEVICE_OBJECT DeviceObject
;
23 UNICODE_STRING DeviceName
;
28 UNREFERENCED_PARAMETER(RegistryPath
);
30 DPRINT("Named Pipe FSD 0.0.2\n");
32 ASSERT (sizeof(NPFS_CONTEXT
) <= FIELD_OFFSET(IRP
, Tail
.Overlay
.DriverContext
));
33 ASSERT (sizeof(NPFS_WAITER_ENTRY
) <= FIELD_OFFSET(IRP
, Tail
.Overlay
.DriverContext
));
35 DriverObject
->MajorFunction
[IRP_MJ_CREATE
] = NpfsCreate
;
36 DriverObject
->MajorFunction
[IRP_MJ_CREATE_NAMED_PIPE
] =
38 DriverObject
->MajorFunction
[IRP_MJ_CLOSE
] = NpfsClose
;
39 DriverObject
->MajorFunction
[IRP_MJ_READ
] = NpfsRead
;
40 DriverObject
->MajorFunction
[IRP_MJ_WRITE
] = NpfsWrite
;
41 DriverObject
->MajorFunction
[IRP_MJ_QUERY_INFORMATION
] =
43 DriverObject
->MajorFunction
[IRP_MJ_SET_INFORMATION
] =
45 DriverObject
->MajorFunction
[IRP_MJ_QUERY_VOLUME_INFORMATION
] =
46 NpfsQueryVolumeInformation
;
47 DriverObject
->MajorFunction
[IRP_MJ_CLEANUP
] = NpfsCleanup
;
48 DriverObject
->MajorFunction
[IRP_MJ_FLUSH_BUFFERS
] = NpfsFlushBuffers
;
49 DriverObject
->MajorFunction
[IRP_MJ_DIRECTORY_CONTROL
] =
51 DriverObject
->MajorFunction
[IRP_MJ_FILE_SYSTEM_CONTROL
] =
52 NpfsFileSystemControl
;
53 // DriverObject->MajorFunction[IRP_MJ_QUERY_SECURITY] =
55 // DriverObject->MajorFunction[IRP_MJ_SET_SECURITY] =
58 DriverObject
->DriverUnload
= NULL
;
60 RtlInitUnicodeString(&DeviceName
, L
"\\Device\\NamedPipe");
61 Status
= IoCreateDevice(DriverObject
,
64 FILE_DEVICE_NAMED_PIPE
,
68 if (!NT_SUCCESS(Status
))
70 DPRINT1("Failed to create named pipe device! (Status %lx)\n", Status
);
74 /* Initialize the device object */
75 DeviceObject
->Flags
|= DO_DIRECT_IO
;
76 DeviceObject
->Flags
&= ~DO_DEVICE_INITIALIZING
;
78 /* Initialize the Volume Control Block (VCB) */
79 Vcb
= (PNPFS_VCB
)DeviceObject
->DeviceExtension
;
80 InitializeListHead(&Vcb
->PipeListHead
);
81 InitializeListHead(&Vcb
->ThreadListHead
);
82 KeInitializeMutex(&Vcb
->PipeListLock
, 0);
83 Vcb
->EmptyWaiterCount
= 0;
85 /* set the size quotas */
86 Vcb
->MinQuota
= PAGE_SIZE
;
87 Vcb
->DefaultQuota
= 8 * PAGE_SIZE
;
88 Vcb
->MaxQuota
= 64 * PAGE_SIZE
;
90 /* Create the device FCB */
91 Fcb
= ExAllocatePoolWithTag(NonPagedPool
, sizeof(NPFS_FCB
), TAG_NPFS_FCB
);
94 DPRINT1("Out of memory for device FCB!\n");
95 IoDeleteDevice(DeviceObject
);
96 return STATUS_INSUFFICIENT_RESOURCES
;
98 Fcb
->Type
= FCB_DEVICE
;
101 Vcb
->DeviceFcb
= Fcb
;
103 /* Create the root directory FCB */
104 Fcb
= ExAllocatePoolWithTag(NonPagedPool
, sizeof(NPFS_FCB
), TAG_NPFS_FCB
);
107 DPRINT1("Out of memory for root FCB!\n");
108 IoDeleteDevice(DeviceObject
);
109 ExFreePoolWithTag(Vcb
->DeviceFcb
, TAG_NPFS_FCB
);
110 return STATUS_INSUFFICIENT_RESOURCES
;
112 Fcb
->Type
= FCB_DIRECTORY
;
117 return STATUS_SUCCESS
;
122 NpfsGetFcb(PFILE_OBJECT FileObject
,
125 PNPFS_FCB LocalFcb
= NULL
;
126 FCB_TYPE FcbType
= FCB_INVALID
;
130 LocalFcb
= (PNPFS_FCB
)FileObject
->FsContext
;
131 FcbType
= LocalFcb
->Type
;
133 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
136 FcbType
= FCB_INVALID
;
147 NpfsGetCcb(PFILE_OBJECT FileObject
,
150 PNPFS_CCB LocalCcb
= NULL
;
151 CCB_TYPE CcbType
= CCB_INVALID
;
155 LocalCcb
= (PNPFS_CCB
)FileObject
->FsContext2
;
156 CcbType
= LocalCcb
->Type
;
158 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
161 CcbType
= CCB_INVALID
;