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