[NPFS]
[reactos.git] / reactos / 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 /* FUNCTIONS ******************************************************************/
364
365 //
366 // Functions to lock/unlock the global VCB lock
367 //
368 FORCEINLINE
369 VOID
370 NpAcquireSharedVcb(VOID)
371 {
372 /* Acquire the lock in shared mode */
373 ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE);
374 }
375
376 FORCEINLINE
377 VOID
378 NpAcquireExclusiveVcb(VOID)
379 {
380 /* Acquire the lock in exclusive mode */
381 ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE);
382 }
383
384 FORCEINLINE
385 VOID
386 NpReleaseVcb(VOID)
387 {
388 /* Release the lock */
389 ExReleaseResourceLite(&NpVcb->Lock);
390 }
391
392
393
394 //
395 // Function to process deferred IRPs outside the VCB lock but still within the
396 // critical region
397 //
398 VOID
399 FORCEINLINE
400 NpCompleteDeferredIrps(IN PLIST_ENTRY DeferredList)
401 {
402 PLIST_ENTRY ThisEntry, NextEntry;
403 PIRP Irp;
404
405 /* Loop the list */
406 ThisEntry = DeferredList->Flink;
407 while (ThisEntry != DeferredList)
408 {
409 /* Remember the next entry, but don't switch to it yet */
410 NextEntry = ThisEntry->Flink;
411
412 /* Complete the IRP for this entry */
413 Irp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
414 IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT);
415
416 /* And now switch to the next one */
417 ThisEntry = NextEntry;
418 }
419 }
420
421 LONG
422 NTAPI
423 NpCompareAliasNames(
424 _In_ PCUNICODE_STRING String1,
425 _In_ PCUNICODE_STRING String2);
426
427 BOOLEAN
428 NTAPI
429 NpDeleteEventTableEntry(IN PRTL_GENERIC_TABLE Table,
430 IN PVOID Buffer);
431
432 VOID
433 NTAPI
434 NpInitializeWaitQueue(IN PNP_WAIT_QUEUE WaitQueue);
435
436
437 NTSTATUS
438 NTAPI
439 NpUninitializeDataQueue(IN PNP_DATA_QUEUE DataQueue);
440
441 PLIST_ENTRY
442 NTAPI
443 NpGetNextRealDataQueueEntry(IN PNP_DATA_QUEUE DataQueue,
444 IN PLIST_ENTRY List);
445
446 PIRP
447 NTAPI
448 NpRemoveDataQueueEntry(IN PNP_DATA_QUEUE DataQueue,
449 IN BOOLEAN Flag,
450 IN PLIST_ENTRY List);
451
452 NTSTATUS
453 NTAPI
454 NpAddDataQueueEntry(IN ULONG NamedPipeEnd,
455 IN PNP_CCB Ccb,
456 IN PNP_DATA_QUEUE DataQueue,
457 IN ULONG Who,
458 IN ULONG Type,
459 IN ULONG DataSize,
460 IN PIRP Irp,
461 IN PVOID Buffer,
462 IN ULONG ByteOffset);
463
464 VOID
465 NTAPI
466 NpCompleteStalledWrites(IN PNP_DATA_QUEUE DataQueue,
467 IN PLIST_ENTRY List);
468
469 NTSTATUS
470 NTAPI
471 NpInitializeDataQueue(IN PNP_DATA_QUEUE DataQueue,
472 IN ULONG Quota);
473
474 NTSTATUS
475 NTAPI
476 NpCreateCcb(IN PNP_FCB Fcb,
477 IN PFILE_OBJECT FileObject,
478 IN UCHAR State,
479 IN UCHAR ReadMode,
480 IN UCHAR CompletionMode,
481 IN ULONG InQuota,
482 IN ULONG OutQuota,
483 OUT PNP_CCB *NewCcb);
484
485 NTSTATUS
486 NTAPI
487 NpCreateFcb(IN PNP_DCB Dcb,
488 IN PUNICODE_STRING PipeName,
489 IN ULONG MaximumInstances,
490 IN LARGE_INTEGER Timeout,
491 IN USHORT NamedPipeConfiguration,
492 IN USHORT NamedPipeType,
493 OUT PNP_FCB *NewFcb);
494
495 NTSTATUS
496 NTAPI
497 NpCreateRootDcb(VOID);
498
499 NTSTATUS
500 NTAPI
501 NpCreateRootDcbCcb(IN PNP_ROOT_DCB_FCB *NewRootCcb);
502
503 VOID
504 NTAPI
505 NpInitializeVcb(VOID);
506
507 VOID
508 NTAPI
509 NpDeleteCcb(IN PNP_CCB Ccb,
510 IN PLIST_ENTRY ListEntry);
511
512 VOID
513 NTAPI
514 NpDeleteFcb(IN PNP_FCB Fcb,
515 IN PLIST_ENTRY ListEntry);
516
517 NTSTATUS
518 NTAPI
519 NpFsdCreateNamedPipe(IN PDEVICE_OBJECT DeviceObject,
520 IN PIRP Irp);
521
522 NTSTATUS
523 NTAPI
524 NpFsdCreate(IN PDEVICE_OBJECT DeviceObject,
525 IN PIRP Irp);
526
527 NTSTATUS
528 NTAPI
529 NpFsdClose(IN PDEVICE_OBJECT DeviceObject,
530 IN PIRP Irp);
531
532
533 NTSTATUS
534 NTAPI
535 NpFsdCleanup(IN PDEVICE_OBJECT DeviceObject,
536 IN PIRP Irp);
537
538 NTSTATUS
539 NTAPI
540 NpFsdFileSystemControl(IN PDEVICE_OBJECT DeviceObject,
541 IN PIRP Irp);
542
543 NTSTATUS
544 NTAPI
545 NpSetConnectedPipeState(IN PNP_CCB Ccb,
546 IN PFILE_OBJECT FileObject,
547 IN PLIST_ENTRY List);
548
549 NTSTATUS
550 NTAPI
551 NpSetListeningPipeState(IN PNP_CCB Ccb,
552 IN PIRP Irp,
553 IN PLIST_ENTRY List);
554
555
556 NTSTATUS
557 NTAPI
558 NpSetDisconnectedPipeState(IN PNP_CCB Ccb,
559 IN PLIST_ENTRY List);
560
561 NTSTATUS
562 NTAPI
563 NpSetClosingPipeState(IN PNP_CCB Ccb,
564 IN PIRP Irp,
565 IN ULONG NamedPipeEnd,
566 IN PLIST_ENTRY List);
567
568 VOID
569 NTAPI
570 NpFreeClientSecurityContext(IN PSECURITY_CLIENT_CONTEXT ClientContext);
571
572 NTSTATUS
573 NTAPI
574 NpImpersonateClientContext(IN PNP_CCB Ccb);
575
576 VOID
577 NTAPI
578 NpCopyClientContext(IN PNP_CCB Ccb,
579 IN PNP_DATA_QUEUE_ENTRY DataQueueEntry);
580
581 VOID
582 NTAPI
583 NpUninitializeSecurity(IN PNP_CCB Ccb);
584
585 NTSTATUS
586 NTAPI
587 NpInitializeSecurity(IN PNP_CCB Ccb,
588 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos,
589 IN PETHREAD Thread);
590
591 NTSTATUS
592 NTAPI
593 NpGetClientSecurityContext(IN ULONG NamedPipeEnd,
594 IN PNP_CCB Ccb,
595 IN PETHREAD Thread,
596 IN PSECURITY_CLIENT_CONTEXT *Context);
597
598 VOID
599 NTAPI
600 NpSetFileObject(IN PFILE_OBJECT FileObject,
601 IN PVOID PrimaryContext,
602 IN PVOID Ccb,
603 IN ULONG NamedPipeEnd);
604
605 NODE_TYPE_CODE
606 NTAPI
607 NpDecodeFileObject(IN PFILE_OBJECT FileObject,
608 OUT PVOID *PrimaryContext OPTIONAL,
609 OUT PNP_CCB *Ccb,
610 OUT PULONG NamedPipeEnd OPTIONAL);
611
612 PNP_FCB
613 NTAPI
614 NpFindPrefix(IN PUNICODE_STRING Name,
615 IN ULONG CaseInsensitiveIndex,
616 IN PUNICODE_STRING Prefix);
617
618 NTSTATUS
619 NTAPI
620 NpFindRelativePrefix(IN PNP_DCB Dcb,
621 IN PUNICODE_STRING Name,
622 IN ULONG CaseInsensitiveIndex,
623 IN PUNICODE_STRING Prefix,
624 OUT PNP_FCB *FoundFcb);
625
626 VOID
627 NTAPI
628 NpCheckForNotify(IN PNP_DCB Dcb,
629 IN BOOLEAN SecondList,
630 IN PLIST_ENTRY List);
631
632 NTSTATUS
633 NTAPI
634 NpAddWaiter(IN PNP_WAIT_QUEUE WaitQueue,
635 IN LARGE_INTEGER WaitTime,
636 IN PIRP Irp,
637 IN PUNICODE_STRING AliasName);
638
639 NTSTATUS
640 NTAPI
641 NpCancelWaiter(IN PNP_WAIT_QUEUE WaitQueue,
642 IN PUNICODE_STRING PipeName,
643 IN NTSTATUS Status,
644 IN PLIST_ENTRY ListEntry);
645
646
647 IO_STATUS_BLOCK
648 NTAPI
649 NpReadDataQueue(IN PNP_DATA_QUEUE DataQueue,
650 IN BOOLEAN Peek,
651 IN BOOLEAN ReadOverflowOperation,
652 IN PVOID Buffer,
653 IN ULONG BufferSize,
654 IN ULONG Mode,
655 IN PNP_CCB Ccb,
656 IN PLIST_ENTRY List);
657
658
659 NTSTATUS
660 NTAPI
661 NpWriteDataQueue(IN PNP_DATA_QUEUE WriteQueue,
662 IN ULONG Mode,
663 IN PVOID OutBuffer,
664 IN ULONG OutBufferSize,
665 IN ULONG PipeType,
666 OUT PULONG BytesWritten,
667 IN PNP_CCB Ccb,
668 IN ULONG NamedPipeEnd,
669 IN PETHREAD Thread,
670 IN PLIST_ENTRY List);
671
672 NTSTATUS
673 NTAPI
674 NpFsdRead(IN PDEVICE_OBJECT DeviceObject,
675 IN PIRP Irp);
676
677
678 NTSTATUS
679 NTAPI
680 NpFsdWrite(IN PDEVICE_OBJECT DeviceObject,
681 IN PIRP Irp);
682
683 NTSTATUS
684 NTAPI
685 NpFsdFlushBuffers(IN PDEVICE_OBJECT DeviceObject,
686 IN PIRP Irp);
687
688 NTSTATUS
689 NTAPI
690 NpFsdSetInformation(IN PDEVICE_OBJECT DeviceObject,
691 IN PIRP Irp);
692
693 NTSTATUS
694 NTAPI
695 NpFsdQueryInformation(IN PDEVICE_OBJECT DeviceObject,
696 IN PIRP Irp);
697
698
699 NTSTATUS
700 NTAPI
701 NpFsdQuerySecurityInfo(IN PDEVICE_OBJECT DeviceObject,
702 IN PIRP Irp);
703
704 NTSTATUS
705 NTAPI
706 NpFsdSetSecurityInfo(IN PDEVICE_OBJECT DeviceObject,
707 IN PIRP Irp);
708
709 NTSTATUS
710 NTAPI
711 NpFsdQueryVolumeInformation(IN PDEVICE_OBJECT DeviceObject,
712 IN PIRP Irp);
713
714 /* EOF */