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 TAG_NPFS_CCB 'cFpN'
9 #define TAG_NPFS_CCB_DATA 'iFpN' /* correct? */
10 #define TAG_NPFS_FCB 'FFpN'
11 #define TAG_NPFS_NAMEBLOCK 'nFpN'
12 #define TAG_NPFS_THREAD_CONTEXT 'tFpN'
14 #define ROUND_DOWN(n, align) \
15 (((ULONG)n) & ~((align) - 1l))
17 #define ROUND_UP(n, align) \
18 ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
20 typedef enum _FCB_TYPE
28 typedef enum _CCB_TYPE
36 /* Volume Control Block (VCB) aka Device Extension */
37 typedef struct _NPFS_VCB
39 LIST_ENTRY PipeListHead
;
40 LIST_ENTRY ThreadListHead
;
42 ULONG EmptyWaiterCount
;
46 struct _NPFS_FCB
*DeviceFcb
;
47 struct _NPFS_FCB
*RootFcb
;
48 } NPFS_VCB
, *PNPFS_VCB
;
50 typedef struct _NPFS_FCB
54 volatile LONG RefCount
;
55 UNICODE_STRING PipeName
;
56 LIST_ENTRY PipeListEntry
;
58 LIST_ENTRY ServerCcbListHead
;
59 LIST_ENTRY ClientCcbListHead
;
60 LIST_ENTRY WaiterListHead
;
61 LIST_ENTRY EmptyBufferListHead
;
66 ULONG PipeConfiguration
;
67 ULONG MaximumInstances
;
68 ULONG CurrentInstances
;
71 LARGE_INTEGER TimeOut
;
72 } NPFS_FCB
, *PNPFS_FCB
;
75 typedef struct _NPFS_CCB_DIRECTORY_DATA
77 UNICODE_STRING SearchPattern
;
79 } NPFS_CCB_DIRECTORY_DATA
, *PNPFS_CCB_DIRECTORY_DATA
;
82 typedef struct _NPFS_CCB
84 LIST_ENTRY CcbListEntry
;
87 PFILE_OBJECT FileObject
;
89 struct _NPFS_CCB
* OtherSide
;
90 struct ETHREAD
*Thread
;
96 ULONG ReadDataAvailable
;
97 ULONG WriteQuotaAvailable
;
98 volatile LONG RefCount
;
100 LIST_ENTRY ReadRequestListHead
;
107 FAST_MUTEX DataListLock
; /* Data queue lock */
111 NPFS_CCB_DIRECTORY_DATA Directory
;
114 } NPFS_CCB
, *PNPFS_CCB
;
116 typedef struct _NPFS_CONTEXT
118 LIST_ENTRY ListEntry
;
120 } NPFS_CONTEXT
, *PNPFS_CONTEXT
;
122 typedef struct _NPFS_THREAD_CONTEXT
127 LIST_ENTRY ListEntry
;
128 PVOID WaitObjectArray
[MAXIMUM_WAIT_OBJECTS
];
129 KWAIT_BLOCK WaitBlockArray
[MAXIMUM_WAIT_OBJECTS
];
130 PIRP WaitIrpArray
[MAXIMUM_WAIT_OBJECTS
];
131 } NPFS_THREAD_CONTEXT
, *PNPFS_THREAD_CONTEXT
;
133 typedef struct _NPFS_WAITER_ENTRY
137 } NPFS_WAITER_ENTRY
, *PNPFS_WAITER_ENTRY
;
140 extern NPAGED_LOOKASIDE_LIST NpfsPipeDataLookasideList
;
143 #define KeLockMutex(x) KeWaitForSingleObject(x, \
149 #define KeUnlockMutex(x) KeReleaseMutex(x, FALSE);
151 #define PAGE_ROUND_UP(x) ( (((ULONG_PTR)x)%PAGE_SIZE) ? ((((ULONG_PTR)x)&(~(PAGE_SIZE-1)))+PAGE_SIZE) : ((ULONG_PTR)x) )
153 DRIVER_DISPATCH NpfsCreate
;
154 NTSTATUS NTAPI
NpfsCreate(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
156 DRIVER_DISPATCH NpfsCreateNamedPipe
;
157 NTSTATUS NTAPI
NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
159 DRIVER_DISPATCH NpfsCleanup
;
160 NTSTATUS NTAPI
NpfsCleanup(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
162 DRIVER_DISPATCH NpfsClose
;
163 NTSTATUS NTAPI
NpfsClose(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
165 DRIVER_DISPATCH NpfsDirectoryControl
;
166 NTSTATUS NTAPI
NpfsDirectoryControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
168 DRIVER_DISPATCH NpfsRead
;
169 NTSTATUS NTAPI
NpfsRead(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
171 DRIVER_DISPATCH NpfsWrite
;
172 NTSTATUS NTAPI
NpfsWrite(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
174 DRIVER_DISPATCH NpfsFlushBuffers
;
175 NTSTATUS NTAPI
NpfsFlushBuffers(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
177 DRIVER_DISPATCH NpfsFileSystemControl
;
178 NTSTATUS NTAPI
NpfsFileSystemControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
180 DRIVER_DISPATCH NpfsQueryInformation
;
181 NTSTATUS NTAPI
NpfsQueryInformation(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
183 DRIVER_DISPATCH NpfsSetInformation
;
184 NTSTATUS NTAPI
NpfsSetInformation(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
186 DRIVER_DISPATCH NpfsQueryVolumeInformation
;
187 NTSTATUS NTAPI
NpfsQueryVolumeInformation (PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
190 DriverEntry(PDRIVER_OBJECT DriverObject
,
191 PUNICODE_STRING RegistryPath
);
194 NpfsDereferenceFcb(PNPFS_FCB Fcb
);
197 NpfsFindPipe(PNPFS_VCB Vcb
,
198 PUNICODE_STRING PipeName
);
201 NpfsGetFcb(PFILE_OBJECT FileObject
,
205 NpfsGetCcb(PFILE_OBJECT FileObject
,
208 #endif /* __DRIVERS_FS_NP_NPFS_H */