xref: /reactos/drivers/filesystems/npfs/npfs.h (revision c2c66aff)
1 /*
2  * PROJECT:     ReactOS Named Pipe FileSystem
3  * LICENSE:     BSD - See COPYING.ARM in the top level directory
4  * FILE:        drivers/filesystems/npfs/npfs.h
5  * PURPOSE:     Named Pipe FileSystem Header
6  * PROGRAMMERS: ReactOS Portable Systems Group
7  */
8 
9 #ifndef _NPFS_PCH_
10 #define _NPFS_PCH_
11 
12 /* INCLUDES *******************************************************************/
13 
14 /* System Headers */
15 #include <ntifs.h>
16 #include <ndk/obfuncs.h>
17 #include <pseh/pseh2.h>
18 //#define UNIMPLEMENTED
19 //#define DPRINT1 DbgPrint
20 
21 #define NDEBUG
22 #include <debug.h>
23 #define TRACE(...) /* DPRINT1("%s: ", __FUNCTION__); DbgPrint(__VA_ARGS__) */
24 
25 /* Allow Microsoft Extensions */
26 #ifdef _MSC_VER
27 #pragma warning(disable:4201)
28 #pragma warning(disable:4214)
29 #pragma warning(disable:4100)
30 #endif
31 
32 #define MIN_INDEXED_LENGTH 5
33 #define MAX_INDEXED_LENGTH 9
34 
35 /* TYPEDEFS & DEFINES *********************************************************/
36 
37 //
38 // Pool Tags for NPFS (from pooltag.txt)
39 //
40 //  Npf* -npfs.sys - Npfs Allocations
41 //  NpFc - npfs.sys - CCB, client control block
42 //  NpFf - npfs.sys - FCB, file control block
43 //  NpFC - npfs.sys - ROOT_DCB CCB
44 //  NpFD - npfs.sys - DCB, directory block
45 //  NpFg - npfs.sys - Global storage
46 //  NpFi - npfs.sys - NPFS client info buffer.
47 //  NpFn - npfs.sys - Name block
48 //  NpFq - npfs.sys - Query template buffer used for directory query
49 //  NpFr - npfs.sys - DATA_ENTRY records(read / write buffers)
50 //  NpFs - npfs.sys - Client security context
51 //  NpFw - npfs.sys - Write block
52 //  NpFW - npfs.sys - Write block
53 #define NPFS_CCB_TAG            'cFpN'
54 #define NPFS_ROOT_DCB_CCB_TAG   'CFpN'
55 #define NPFS_DCB_TAG            'DFpN'
56 #define NPFS_FCB_TAG            'fFpN'
57 #define NPFS_GLOBAL_TAG         'gFpN'
58 #define NPFS_CLIENT_INFO_TAG    'iFpN'
59 #define NPFS_NAME_BLOCK_TAG     'nFpN'
60 #define NPFS_QUERY_TEMPLATE_TAG 'qFpN'
61 #define NPFS_DATA_ENTRY_TAG     'rFpN'
62 #define NPFS_CLIENT_SEC_CTX_TAG 'sFpN'
63 #define NPFS_WAIT_BLOCK_TAG     'tFpN'
64 #define NPFS_WRITE_BLOCK_TAG    'wFpN'
65 
66 //
67 // NPFS bugchecking support
68 //
69 // We define the NpBugCheck macro which triggers a NPFS_FILE_SYSTEM bugcheck
70 // containing the source file ID number and the line where it was emitted, as
71 // described in the MSDN article "Bug Check 0x25: NPFS_FILE_SYSTEM".
72 //
73 // The bugcheck emits 4 ULONGs; the first one is made, in its high word, by
74 // the current source file ID and in its low word, by the line number; the
75 // three other ones are user-defined.
76 //
77 // In order to avoid redefinition of the same file ID in different source files,
78 // we gather all of them here, so that you will have to add (or remove) a new
79 // one as soon as you add (or remove) a source file from the NPFS driver code.
80 //
81 // To use the NpBugCheck macro in a source file, define at its beginning
82 // the constant NPFS_BUGCHECK_FILE_ID with one of the following file IDs,
83 // then use the bugcheck macro wherever you want.
84 //
85 #define NPFS_BUGCHECK_CLEANUP   0x0001
86 #define NPFS_BUGCHECK_CLOSE     0x0002
87 #define NPFS_BUGCHECK_CREATE    0x0003
88 #define NPFS_BUGCHECK_DATASUP   0x0004
89 #define NPFS_BUGCHECK_FILEINFO  0x0005
90 #define NPFS_BUGCHECK_FILEOBSUP 0x0006
91 #define NPFS_BUGCHECK_FLUSHBUF  0x0007
92 #define NPFS_BUGCHECK_FSCTRL    0x0008
93 #define NPFS_BUGCHECK_MAIN      0x0009
94 #define NPFS_BUGCHECK_PREFXSUP  0x000a
95 #define NPFS_BUGCHECK_READ      0x000b
96 #define NPFS_BUGCHECK_READSUP   0x000c
97 #define NPFS_BUGCHECK_SECURSUP  0x000d
98 #define NPFS_BUGCHECK_SEINFO    0x000e
99 #define NPFS_BUGCHECK_STATESUP  0x000f
100 #define NPFS_BUGCHECK_STRUCSUP  0x0010
101 #define NPFS_BUGCHECK_VOLINFO   0x0011
102 #define NPFS_BUGCHECK_WAITSUP   0x0012
103 #define NPFS_BUGCHECK_WRITE     0x0013
104 #define NPFS_BUGCHECK_WRITESUP  0x0014
105 
106 #define NpBugCheck(p1, p2, p3)                              \
107     KeBugCheckEx(NPFS_FILE_SYSTEM,                          \
108                  (NPFS_BUGCHECK_FILE_ID << 16) | __LINE__,  \
109                  (p1), (p2), (p3))
110 
111 /* Node Type Codes for NPFS */
112 #define NPFS_NTC_VCB            1
113 #define NPFS_NTC_ROOT_DCB       2
114 #define NPFS_NTC_FCB            4
115 #define NPFS_NTC_CCB            6
116 #define NPFS_NTC_NONPAGED_CCB   7
117 #define NPFS_NTC_ROOT_DCB_CCB   8
118 typedef USHORT NODE_TYPE_CODE, *PNODE_TYPE_CODE;
119 
120 /* Data Queue States */
121 typedef enum _NP_DATA_QUEUE_STATE
122 {
123     ReadEntries = 0,
124     WriteEntries = 1,
125     Empty = 2
126 } NP_DATA_QUEUE_STATE;
127 
128 /* Data Queue Entry Types */
129 typedef enum _NP_DATA_QUEUE_ENTRY_TYPE
130 {
131     Buffered = 0,
132     Unbuffered
133 } NP_DATA_QUEUE_ENTRY_TYPE;
134 
135 /* An Input or Output Data Queue. Each CCB has two of these. */
136 typedef struct _NP_DATA_QUEUE
137 {
138     LIST_ENTRY Queue;
139     ULONG QueueState;
140     ULONG BytesInQueue;
141     ULONG EntriesInQueue;
142     ULONG QuotaUsed;
143     ULONG ByteOffset;
144     ULONG Quota;
145 } NP_DATA_QUEUE, *PNP_DATA_QUEUE;
146 
147 /* The Entries that go into the Queue */
148 typedef struct _NP_DATA_QUEUE_ENTRY
149 {
150     LIST_ENTRY QueueEntry;
151     ULONG DataEntryType;
152     PIRP Irp;
153     ULONG QuotaInEntry;
154     PSECURITY_CLIENT_CONTEXT ClientSecurityContext;
155     ULONG DataSize;
156 } NP_DATA_QUEUE_ENTRY, *PNP_DATA_QUEUE_ENTRY;
157 
158 /* A Wait Queue. Only the VCB has one of these. */
159 typedef struct _NP_WAIT_QUEUE
160 {
161     LIST_ENTRY WaitList;
162     KSPIN_LOCK WaitLock;
163 } NP_WAIT_QUEUE, *PNP_WAIT_QUEUE;
164 
165 /* The Entries in the Queue above, one for each Waiter. */
166 typedef struct _NP_WAIT_QUEUE_ENTRY
167 {
168     PIRP Irp;
169     KDPC Dpc;
170     KTIMER Timer;
171     PNP_WAIT_QUEUE WaitQueue;
172     UNICODE_STRING AliasName;
173     PFILE_OBJECT FileObject;
174 } NP_WAIT_QUEUE_ENTRY, *PNP_WAIT_QUEUE_ENTRY;
175 
176 /* The event buffer in the NonPaged CCB */
177 typedef struct _NP_EVENT_BUFFER
178 {
179     PKEVENT Event;
180 } NP_EVENT_BUFFER, *PNP_EVENT_BUFFER;
181 
182 /* The CCB for the Root DCB */
183 typedef struct _NP_ROOT_DCB_CCB
184 {
185     NODE_TYPE_CODE NodeType;
186     PVOID Unknown;
187     ULONG Unknown2;
188 } NP_ROOT_DCB_CCB, *PNP_ROOT_DCB_FCB;
189 
190 /* The header that both FCB and DCB share */
191 typedef struct _NP_CB_HEADER
192 {
193     NODE_TYPE_CODE NodeType;
194     LIST_ENTRY DcbEntry;
195     PVOID ParentDcb;
196     ULONG CurrentInstances;
197     ULONG ServerOpenCount;
198     PSECURITY_DESCRIPTOR SecurityDescriptor;
199 } NP_CB_HEADER, *PNP_CB_HEADER;
200 
201 /* The footer that both FCB and DCB share */
202 typedef struct _NP_CB_FOOTER
203 {
204     UNICODE_STRING FullName;
205     UNICODE_STRING ShortName;
206     UNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry;
207 } NP_CB_FOOTER;
208 
209 /* A Directory Control Block (DCB) */
210 typedef struct _NP_DCB
211 {
212     /* Common Header */
213     NP_CB_HEADER;
214 
215     /* DCB-specific data */
216     LIST_ENTRY NotifyList;
217     LIST_ENTRY NotifyList2;
218     LIST_ENTRY FcbList;
219 #ifndef _WIN64
220     ULONG Pad;
221 #endif
222 
223     /* Common Footer */
224     NP_CB_FOOTER;
225 } NP_DCB, *PNP_DCB;
226 
227 /* A File Control BLock (FCB) */
228 typedef struct _NP_FCB
229 {
230     /* Common Header */
231     NP_CB_HEADER;
232 
233     /* FCB-specific fields */
234     ULONG MaximumInstances;
235     USHORT NamedPipeConfiguration;
236     USHORT NamedPipeType;
237     LARGE_INTEGER Timeout;
238     LIST_ENTRY CcbList;
239 #ifdef _WIN64
240     PVOID Pad[2];
241 #endif
242 
243     /* Common Footer */
244     NP_CB_FOOTER;
245 } NP_FCB, *PNP_FCB;
246 
247 C_ASSERT(FIELD_OFFSET(NP_FCB, PrefixTableEntry) == FIELD_OFFSET(NP_DCB, PrefixTableEntry));
248 
249 /* The nonpaged portion of the CCB */
250 typedef struct _NP_NONPAGED_CCB
251 {
252     NODE_TYPE_CODE NodeType;
253     PNP_EVENT_BUFFER EventBuffer[2];
254     ERESOURCE Lock;
255 } NP_NONPAGED_CCB, *PNP_NONPAGED_CCB;
256 
257 /* A Client Control Block (CCB) */
258 typedef struct _NP_CCB
259 {
260     NODE_TYPE_CODE NodeType;
261     UCHAR NamedPipeState;
262     UCHAR ReadMode[2];
263     UCHAR CompletionMode[2];
264     SECURITY_QUALITY_OF_SERVICE ClientQos;
265     LIST_ENTRY CcbEntry;
266     PNP_FCB Fcb;
267     PFILE_OBJECT FileObject[2];
268     PEPROCESS Process;
269     PVOID ClientSession;
270     PNP_NONPAGED_CCB NonPagedCcb;
271     NP_DATA_QUEUE DataQueue[2];
272     PSECURITY_CLIENT_CONTEXT ClientContext;
273     LIST_ENTRY IrpList;
274 } NP_CCB, *PNP_CCB;
275 
276 /* A Volume Control Block (VCB) */
277 typedef struct _NP_VCB
278 {
279     NODE_TYPE_CODE NodeType;
280     ULONG ReferenceCount;
281     PNP_DCB RootDcb;
282     UNICODE_PREFIX_TABLE PrefixTable;
283     ERESOURCE Lock;
284     RTL_GENERIC_TABLE EventTable;
285     NP_WAIT_QUEUE WaitQueue;
286 } NP_VCB, *PNP_VCB;
287 
288 extern PNP_VCB NpVcb;
289 
290 /* Defines an alias */
291 typedef struct _NPFS_ALIAS
292 {
293     struct _NPFS_ALIAS *Next;
294     PUNICODE_STRING TargetName;
295     UNICODE_STRING Name;
296 } NPFS_ALIAS, *PNPFS_ALIAS;
297 
298 /* Private structure used to enumerate the alias values */
299 typedef struct _NPFS_QUERY_VALUE_CONTEXT
300 {
301     BOOLEAN SizeOnly;
302     SIZE_T FullSize;
303     ULONG NumberOfAliases;
304     ULONG NumberOfEntries;
305     PNPFS_ALIAS CurrentAlias;
306     PUNICODE_STRING CurrentTargetName;
307     PWCHAR CurrentStringPointer;
308 } NPFS_QUERY_VALUE_CONTEXT, *PNPFS_QUERY_VALUE_CONTEXT;
309 
310 extern PNPFS_ALIAS NpAliasList;
311 extern PNPFS_ALIAS NpAliasListByLength[MAX_INDEXED_LENGTH + 1 - MIN_INDEXED_LENGTH];
312 
313 /* This structure is actually a user-mode structure and should go into a share header */
314 typedef struct _NP_CLIENT_PROCESS
315 {
316     PVOID Unknown;
317     PVOID Process;
318     USHORT DataLength;
319     WCHAR Buffer[17];
320 } NP_CLIENT_PROCESS, *PNP_CLIENT_PROCESS;
321 
322 /* FUNCTIONS ******************************************************************/
323 
324 /* Functions to lock/unlock the global VCB lock */
325 
326 FORCEINLINE
327 VOID
NpAcquireSharedVcb(VOID)328 NpAcquireSharedVcb(VOID)
329 {
330     /* Acquire the lock in shared mode */
331     ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE);
332 }
333 
334 FORCEINLINE
335 VOID
NpAcquireExclusiveVcb(VOID)336 NpAcquireExclusiveVcb(VOID)
337 {
338     /* Acquire the lock in exclusive mode */
339     ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE);
340 }
341 
342 FORCEINLINE
343 VOID
NpReleaseVcb(VOID)344 NpReleaseVcb(VOID)
345 {
346     /* Release the lock */
347     ExReleaseResourceLite(&NpVcb->Lock);
348 }
349 
350 //
351 // Function to process deferred IRPs outside the VCB lock but still within the
352 // critical region
353 //
354 FORCEINLINE
355 VOID
NpCompleteDeferredIrps(IN PLIST_ENTRY DeferredList)356 NpCompleteDeferredIrps(IN PLIST_ENTRY DeferredList)
357 {
358     PLIST_ENTRY ThisEntry, NextEntry;
359     PIRP Irp;
360 
361     /* Loop the list */
362     ThisEntry = DeferredList->Flink;
363     while (ThisEntry != DeferredList)
364     {
365         /* Remember the next entry, but don't switch to it yet */
366         NextEntry = ThisEntry->Flink;
367 
368         /* Complete the IRP for this entry */
369         Irp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
370         IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT);
371 
372         /* And now switch to the next one */
373         ThisEntry = NextEntry;
374     }
375 }
376 
377 LONG
378 NTAPI
379 NpCompareAliasNames(
380     _In_ PCUNICODE_STRING String1,
381     _In_ PCUNICODE_STRING String2);
382 
383 BOOLEAN
384 NTAPI
385 NpDeleteEventTableEntry(IN PRTL_GENERIC_TABLE Table,
386                         IN PVOID Buffer);
387 
388 VOID
389 NTAPI
390 NpInitializeWaitQueue(IN PNP_WAIT_QUEUE WaitQueue);
391 
392 NTSTATUS
393 NTAPI
394 NpUninitializeDataQueue(IN PNP_DATA_QUEUE DataQueue);
395 
396 PLIST_ENTRY
397 NTAPI
398 NpGetNextRealDataQueueEntry(IN PNP_DATA_QUEUE DataQueue,
399                             IN PLIST_ENTRY List);
400 
401 PIRP
402 NTAPI
403 NpRemoveDataQueueEntry(IN PNP_DATA_QUEUE DataQueue,
404                        IN BOOLEAN Flag,
405                        IN PLIST_ENTRY List);
406 
407 NTSTATUS
408 NTAPI
409 NpAddDataQueueEntry(IN ULONG NamedPipeEnd,
410                     IN PNP_CCB Ccb,
411                     IN PNP_DATA_QUEUE DataQueue,
412                     IN ULONG Who,
413                     IN ULONG Type,
414                     IN ULONG DataSize,
415                     IN PIRP Irp,
416                     IN PVOID Buffer,
417                     IN ULONG ByteOffset);
418 
419 VOID
420 NTAPI
421 NpCompleteStalledWrites(IN PNP_DATA_QUEUE DataQueue,
422                         IN PLIST_ENTRY List);
423 
424 NTSTATUS
425 NTAPI
426 NpInitializeDataQueue(IN PNP_DATA_QUEUE DataQueue,
427                       IN ULONG Quota);
428 
429 NTSTATUS
430 NTAPI
431 NpCreateCcb(IN PNP_FCB Fcb,
432             IN PFILE_OBJECT FileObject,
433             IN UCHAR State,
434             IN UCHAR ReadMode,
435             IN UCHAR CompletionMode,
436             IN ULONG InQuota,
437             IN ULONG OutQuota,
438             OUT PNP_CCB *NewCcb);
439 
440 NTSTATUS
441 NTAPI
442 NpCreateFcb(IN PNP_DCB Dcb,
443             IN PUNICODE_STRING PipeName,
444             IN ULONG MaximumInstances,
445             IN LARGE_INTEGER Timeout,
446             IN USHORT NamedPipeConfiguration,
447             IN USHORT NamedPipeType,
448             OUT PNP_FCB *NewFcb);
449 
450 NTSTATUS
451 NTAPI
452 NpCreateRootDcb(VOID);
453 
454 NTSTATUS
455 NTAPI
456 NpCreateRootDcbCcb(IN PNP_ROOT_DCB_FCB *NewRootCcb);
457 
458 VOID
459 NTAPI
460 NpInitializeVcb(VOID);
461 
462 VOID
463 NTAPI
464 NpDeleteCcb(IN PNP_CCB Ccb,
465             IN PLIST_ENTRY ListEntry);
466 
467 VOID
468 NTAPI
469 NpDeleteFcb(IN PNP_FCB Fcb,
470             IN PLIST_ENTRY ListEntry);
471 
472 NTSTATUS
473 NTAPI
474 NpFsdCreateNamedPipe(IN PDEVICE_OBJECT DeviceObject,
475                      IN PIRP Irp);
476 
477 NTSTATUS
478 NTAPI
479 NpFsdCreate(IN PDEVICE_OBJECT DeviceObject,
480             IN PIRP Irp);
481 
482 NTSTATUS
483 NTAPI
484 NpFsdClose(IN PDEVICE_OBJECT DeviceObject,
485                      IN PIRP Irp);
486 
487 NTSTATUS
488 NTAPI
489 NpFsdCleanup(IN PDEVICE_OBJECT DeviceObject,
490                     IN PIRP Irp);
491 
492 NTSTATUS
493 NTAPI
494 NpFsdFileSystemControl(IN PDEVICE_OBJECT DeviceObject,
495                      IN PIRP Irp);
496 
497 NTSTATUS
498 NTAPI
499 NpSetConnectedPipeState(IN PNP_CCB Ccb,
500                         IN PFILE_OBJECT FileObject,
501                         IN PLIST_ENTRY List);
502 
503 NTSTATUS
504 NTAPI
505 NpSetListeningPipeState(IN PNP_CCB Ccb,
506                         IN PIRP Irp,
507                         IN PLIST_ENTRY List);
508 
509 NTSTATUS
510 NTAPI
511 NpSetDisconnectedPipeState(IN PNP_CCB Ccb,
512                            IN PLIST_ENTRY List);
513 
514 NTSTATUS
515 NTAPI
516 NpSetClosingPipeState(IN PNP_CCB Ccb,
517                       IN PIRP Irp,
518                       IN ULONG NamedPipeEnd,
519                       IN PLIST_ENTRY List);
520 
521 VOID
522 NTAPI
523 NpFreeClientSecurityContext(IN PSECURITY_CLIENT_CONTEXT ClientContext);
524 
525 NTSTATUS
526 NTAPI
527 NpImpersonateClientContext(IN PNP_CCB Ccb);
528 
529 VOID
530 NTAPI
531 NpCopyClientContext(IN PNP_CCB Ccb,
532                     IN PNP_DATA_QUEUE_ENTRY DataQueueEntry);
533 
534 VOID
535 NTAPI
536 NpUninitializeSecurity(IN PNP_CCB Ccb);
537 
538 NTSTATUS
539 NTAPI
540 NpInitializeSecurity(IN PNP_CCB Ccb,
541                      IN PSECURITY_QUALITY_OF_SERVICE SecurityQos,
542                      IN PETHREAD Thread);
543 
544 NTSTATUS
545 NTAPI
546 NpGetClientSecurityContext(IN ULONG NamedPipeEnd,
547                            IN PNP_CCB Ccb,
548                            IN PETHREAD Thread,
549                            IN PSECURITY_CLIENT_CONTEXT *Context);
550 
551 VOID
552 NTAPI
553 NpSetFileObject(IN PFILE_OBJECT FileObject,
554                 IN PVOID PrimaryContext,
555                 IN PVOID Ccb,
556                 IN ULONG NamedPipeEnd);
557 
558 NODE_TYPE_CODE
559 NTAPI
560 NpDecodeFileObject(IN PFILE_OBJECT FileObject,
561                    OUT PVOID *PrimaryContext OPTIONAL,
562                    OUT PNP_CCB *Ccb,
563                    OUT PULONG NamedPipeEnd OPTIONAL);
564 
565 PNP_FCB
566 NTAPI
567 NpFindPrefix(IN PUNICODE_STRING Name,
568              IN ULONG CaseInsensitiveIndex,
569              IN PUNICODE_STRING Prefix);
570 
571 NTSTATUS
572 NTAPI
573 NpFindRelativePrefix(IN PNP_DCB Dcb,
574                      IN PUNICODE_STRING Name,
575                      IN ULONG CaseInsensitiveIndex,
576                      IN PUNICODE_STRING Prefix,
577                      OUT PNP_FCB *FoundFcb);
578 
579 VOID
580 NTAPI
581 NpCheckForNotify(IN PNP_DCB Dcb,
582                  IN BOOLEAN SecondList,
583                  IN PLIST_ENTRY List);
584 
585 NTSTATUS
586 NTAPI
587 NpAddWaiter(IN PNP_WAIT_QUEUE WaitQueue,
588             IN LARGE_INTEGER WaitTime,
589             IN PIRP Irp,
590             IN PUNICODE_STRING AliasName);
591 
592 NTSTATUS
593 NTAPI
594 NpCancelWaiter(IN PNP_WAIT_QUEUE WaitQueue,
595                IN PUNICODE_STRING PipeName,
596                IN NTSTATUS Status,
597                IN PLIST_ENTRY ListEntry);
598 
599 
600 IO_STATUS_BLOCK
601 NTAPI
602 NpReadDataQueue(IN PNP_DATA_QUEUE DataQueue,
603                 IN BOOLEAN Peek,
604                 IN BOOLEAN ReadOverflowOperation,
605                 IN PVOID Buffer,
606                 IN ULONG BufferSize,
607                 IN ULONG Mode,
608                 IN PNP_CCB Ccb,
609                 IN PLIST_ENTRY List);
610 
611 
612 NTSTATUS
613 NTAPI
614 NpWriteDataQueue(IN PNP_DATA_QUEUE WriteQueue,
615                  IN ULONG Mode,
616                  IN PVOID OutBuffer,
617                  IN ULONG OutBufferSize,
618                  IN ULONG PipeType,
619                  OUT PULONG BytesWritten,
620                  IN PNP_CCB Ccb,
621                  IN ULONG NamedPipeEnd,
622                  IN PETHREAD Thread,
623                  IN PLIST_ENTRY List);
624 
625 NTSTATUS
626 NTAPI
627 NpFsdRead(IN PDEVICE_OBJECT DeviceObject,
628           IN PIRP Irp);
629 
630 _Function_class_(FAST_IO_READ)
631 _IRQL_requires_same_
632 BOOLEAN
633 NTAPI
634 NpFastRead(
635     _In_ PFILE_OBJECT FileObject,
636     _In_ PLARGE_INTEGER FileOffset,
637     _In_ ULONG Length,
638     _In_ BOOLEAN Wait,
639     _In_ ULONG LockKey,
640     _Out_ PVOID Buffer,
641     _Out_ PIO_STATUS_BLOCK IoStatus,
642     _In_ PDEVICE_OBJECT DeviceObject);
643 
644 _Function_class_(FAST_IO_WRITE)
645 _IRQL_requires_same_
646 BOOLEAN
647 NTAPI
648 NpFastWrite(
649     _In_ PFILE_OBJECT FileObject,
650     _In_ PLARGE_INTEGER FileOffset,
651     _In_ ULONG Length,
652     _In_ BOOLEAN Wait,
653     _In_ ULONG LockKey,
654     _In_ PVOID Buffer,
655     _Out_ PIO_STATUS_BLOCK IoStatus,
656     _In_ PDEVICE_OBJECT DeviceObject);
657 
658 
659 NTSTATUS
660 NTAPI
661 NpFsdWrite(IN PDEVICE_OBJECT DeviceObject,
662            IN PIRP Irp);
663 
664 NTSTATUS
665 NTAPI
666 NpFsdFlushBuffers(IN PDEVICE_OBJECT DeviceObject,
667                   IN PIRP Irp);
668 
669 NTSTATUS
670 NTAPI
671 NpFsdSetInformation(IN PDEVICE_OBJECT DeviceObject,
672                     IN PIRP Irp);
673 
674 NTSTATUS
675 NTAPI
676 NpFsdQueryInformation(IN PDEVICE_OBJECT DeviceObject,
677                      IN PIRP Irp);
678 
679 
680 NTSTATUS
681 NTAPI
682 NpFsdQuerySecurityInfo(IN PDEVICE_OBJECT DeviceObject,
683                        IN PIRP Irp);
684 
685 NTSTATUS
686 NTAPI
687 NpFsdSetSecurityInfo(IN PDEVICE_OBJECT DeviceObject,
688                      IN PIRP Irp);
689 
690 NTSTATUS
691 NTAPI
692 NpFsdQueryVolumeInformation(IN PDEVICE_OBJECT DeviceObject,
693                             IN PIRP Irp);
694 
695 #endif /* _NPFS_PCH_ */
696