1 #ifndef __DRIVERS_FS_NP_NPFS_H
2 #define __DRIVERS_FS_NP_NPFS_H
5 #include <ndk/iotypes.h>
6 #include <pseh/pseh2.h>
8 #define ROUND_DOWN(n, align) \
9 (((ULONG)n) & ~((align) - 1l))
11 #define ROUND_UP(n, align) \
12 ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
14 typedef enum _FCB_TYPE
22 typedef enum _CCB_TYPE
30 /* Volume Control Block (VCB) aka Device Extension */
31 typedef struct _NPFS_VCB
33 LIST_ENTRY PipeListHead
;
34 LIST_ENTRY ThreadListHead
;
36 ULONG EmptyWaiterCount
;
40 struct _NPFS_FCB
*DeviceFcb
;
41 struct _NPFS_FCB
*RootFcb
;
42 } NPFS_VCB
, *PNPFS_VCB
;
44 typedef struct _NPFS_FCB
48 UNICODE_STRING PipeName
;
49 LIST_ENTRY PipeListEntry
;
51 LIST_ENTRY ServerCcbListHead
;
52 LIST_ENTRY ClientCcbListHead
;
53 LIST_ENTRY WaiterListHead
;
54 LIST_ENTRY EmptyBufferListHead
;
59 ULONG PipeConfiguration
;
60 ULONG MaximumInstances
;
61 ULONG CurrentInstances
;
64 LARGE_INTEGER TimeOut
;
65 } NPFS_FCB
, *PNPFS_FCB
;
68 typedef struct _NPFS_CCB_DIRECTORY_DATA
70 UNICODE_STRING SearchPattern
;
72 } NPFS_CCB_DIRECTORY_DATA
, *PNPFS_CCB_DIRECTORY_DATA
;
75 typedef struct _NPFS_CCB
77 LIST_ENTRY CcbListEntry
;
81 struct _NPFS_CCB
* OtherSide
;
82 struct ETHREAD
*Thread
;
88 ULONG ReadDataAvailable
;
89 ULONG WriteQuotaAvailable
;
91 LIST_ENTRY ReadRequestListHead
;
98 FAST_MUTEX DataListLock
; /* Data queue lock */
102 NPFS_CCB_DIRECTORY_DATA Directory
;
105 } NPFS_CCB
, *PNPFS_CCB
;
107 typedef struct _NPFS_CONTEXT
109 LIST_ENTRY ListEntry
;
111 } NPFS_CONTEXT
, *PNPFS_CONTEXT
;
113 typedef struct _NPFS_THREAD_CONTEXT
118 LIST_ENTRY ListEntry
;
119 PVOID WaitObjectArray
[MAXIMUM_WAIT_OBJECTS
];
120 KWAIT_BLOCK WaitBlockArray
[MAXIMUM_WAIT_OBJECTS
];
121 PIRP WaitIrpArray
[MAXIMUM_WAIT_OBJECTS
];
122 } NPFS_THREAD_CONTEXT
, *PNPFS_THREAD_CONTEXT
;
124 typedef struct _NPFS_WAITER_ENTRY
128 } NPFS_WAITER_ENTRY
, *PNPFS_WAITER_ENTRY
;
131 extern NPAGED_LOOKASIDE_LIST NpfsPipeDataLookasideList
;
134 #define KeLockMutex(x) KeWaitForSingleObject(x, \
140 #define KeUnlockMutex(x) KeReleaseMutex(x, FALSE);
142 #define PAGE_ROUND_UP(x) ( (((ULONG_PTR)x)%PAGE_SIZE) ? ((((ULONG_PTR)x)&(~(PAGE_SIZE-1)))+PAGE_SIZE) : ((ULONG_PTR)x) )
144 DRIVER_DISPATCH NpfsCreate
;
145 NTSTATUS NTAPI
NpfsCreate(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
147 DRIVER_DISPATCH NpfsCreateNamedPipe
;
148 NTSTATUS NTAPI
NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
150 DRIVER_DISPATCH NpfsCleanup
;
151 NTSTATUS NTAPI
NpfsCleanup(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
153 DRIVER_DISPATCH NpfsClose
;
154 NTSTATUS NTAPI
NpfsClose(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
156 DRIVER_DISPATCH NpfsDirectoryControl
;
157 NTSTATUS NTAPI
NpfsDirectoryControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
159 DRIVER_DISPATCH NpfsRead
;
160 NTSTATUS NTAPI
NpfsRead(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
162 DRIVER_DISPATCH NpfsWrite
;
163 NTSTATUS NTAPI
NpfsWrite(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
165 DRIVER_DISPATCH NpfsFlushBuffers
;
166 NTSTATUS NTAPI
NpfsFlushBuffers(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
168 DRIVER_DISPATCH NpfsFileSystemControl
;
169 NTSTATUS NTAPI
NpfsFileSystemControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
171 DRIVER_DISPATCH NpfsQueryInformation
;
172 NTSTATUS NTAPI
NpfsQueryInformation(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
174 DRIVER_DISPATCH NpfsSetInformation
;
175 NTSTATUS NTAPI
NpfsSetInformation(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
177 DRIVER_DISPATCH NpfsQueryVolumeInformation
;
178 NTSTATUS NTAPI
NpfsQueryVolumeInformation (PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
181 DriverEntry(PDRIVER_OBJECT DriverObject
,
182 PUNICODE_STRING RegistryPath
);
185 NpfsFindPipe(PNPFS_VCB Vcb
,
186 PUNICODE_STRING PipeName
);
189 NpfsGetFcb(PFILE_OBJECT FileObject
,
193 NpfsGetCcb(PFILE_OBJECT FileObject
,
196 #endif /* __DRIVERS_FS_NP_NPFS_H */