-#ifndef __DRIVERS_FS_NP_NPFS_H
-#define __DRIVERS_FS_NP_NPFS_H
+/*
+ * PROJECT: ReactOS Named Pipe FileSystem
+ * LICENSE: BSD - See COPYING.ARM in the top level directory
+ * FILE: drivers/filesystems/npfs/npfs.h
+ * PURPOSE: Named Pipe FileSystem Header
+ * PROGRAMMERS: ReactOS Portable Systems Group
+ */
-#include <ntifs.h>
-#include <ndk/iotypes.h>
-#include <pseh/pseh2.h>
-
-#define TAG_NPFS_CCB 'cFpN'
-#define TAG_NPFS_CCB_DATA 'iFpN' /* correct? */
-#define TAG_NPFS_FCB 'FFpN'
-#define TAG_NPFS_NAMEBLOCK 'nFpN'
-#define TAG_NPFS_THREAD_CONTEXT 'tFpN'
-
-#define ROUND_DOWN(n, align) \
- (((ULONG)n) & ~((align) - 1l))
-
-#define ROUND_UP(n, align) \
- ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
-
-typedef enum _FCB_TYPE
-{
- FCB_INVALID,
- FCB_DEVICE,
- FCB_DIRECTORY,
- FCB_PIPE
-} FCB_TYPE;
-
-typedef enum _CCB_TYPE
-{
- CCB_INVALID,
- CCB_DEVICE,
- CCB_DIRECTORY,
- CCB_PIPE
-} CCB_TYPE;
-
-/* Volume Control Block (VCB) aka Device Extension */
-typedef struct _NPFS_VCB
-{
- LIST_ENTRY PipeListHead;
- LIST_ENTRY ThreadListHead;
- KMUTEX PipeListLock;
- ULONG EmptyWaiterCount;
- ULONG MinQuota;
- ULONG DefaultQuota;
- ULONG MaxQuota;
- struct _NPFS_FCB *DeviceFcb;
- struct _NPFS_FCB *RootFcb;
-} NPFS_VCB, *PNPFS_VCB;
-
-typedef struct _NPFS_FCB
-{
- FCB_TYPE Type;
- PNPFS_VCB Vcb;
- UNICODE_STRING PipeName;
- LIST_ENTRY PipeListEntry;
- KMUTEX CcbListLock;
- LIST_ENTRY ServerCcbListHead;
- LIST_ENTRY ClientCcbListHead;
- LIST_ENTRY WaiterListHead;
- LIST_ENTRY EmptyBufferListHead;
- ULONG PipeType;
- ULONG ClientReadMode;
- ULONG ServerReadMode;
- ULONG CompletionMode;
- ULONG PipeConfiguration;
- ULONG MaximumInstances;
- ULONG CurrentInstances;
- ULONG InboundQuota;
- ULONG OutboundQuota;
- LARGE_INTEGER TimeOut;
-} NPFS_FCB, *PNPFS_FCB;
+#ifndef _NPFS_PCH_
+#define _NPFS_PCH_
+/* INCLUDES *******************************************************************/
-typedef struct _NPFS_CCB_DIRECTORY_DATA
+/* System Headers */
+#include <ntifs.h>
+#include <ndk/obfuncs.h>
+#include <pseh/pseh2.h>
+//#define UNIMPLEMENTED
+//#define DPRINT1 DbgPrint
+
+#define NDEBUG
+#include <debug.h>
+#define TRACE(...) /* DPRINT1("%s: ", __FUNCTION__); DbgPrint(__VA_ARGS__) */
+
+/* Allow Microsoft Extensions */
+#ifdef _MSC_VER
+#pragma warning(disable:4201)
+#pragma warning(disable:4214)
+#pragma warning(disable:4100)
+#endif
+
+#define MIN_INDEXED_LENGTH 5
+#define MAX_INDEXED_LENGTH 9
+
+/* TYPEDEFS & DEFINES *********************************************************/
+
+//
+// Pool Tags for NPFS (from pooltag.txt)
+//
+// Npf* -npfs.sys - Npfs Allocations
+// NpFc - npfs.sys - CCB, client control block
+// NpFf - npfs.sys - FCB, file control block
+// NpFC - npfs.sys - ROOT_DCB CCB
+// NpFD - npfs.sys - DCB, directory block
+// NpFg - npfs.sys - Global storage
+// NpFi - npfs.sys - NPFS client info buffer.
+// NpFn - npfs.sys - Name block
+// NpFq - npfs.sys - Query template buffer used for directory query
+// NpFr - npfs.sys - DATA_ENTRY records(read / write buffers)
+// NpFs - npfs.sys - Client security context
+// NpFw - npfs.sys - Write block
+// NpFW - npfs.sys - Write block
+#define NPFS_CCB_TAG 'cFpN'
+#define NPFS_ROOT_DCB_CCB_TAG 'CFpN'
+#define NPFS_DCB_TAG 'DFpN'
+#define NPFS_FCB_TAG 'fFpN'
+#define NPFS_GLOBAL_TAG 'gFpN'
+#define NPFS_CLIENT_INFO_TAG 'iFpN'
+#define NPFS_NAME_BLOCK_TAG 'nFpN'
+#define NPFS_QUERY_TEMPLATE_TAG 'qFpN'
+#define NPFS_DATA_ENTRY_TAG 'rFpN'
+#define NPFS_CLIENT_SEC_CTX_TAG 'sFpN'
+#define NPFS_WAIT_BLOCK_TAG 'tFpN'
+#define NPFS_WRITE_BLOCK_TAG 'wFpN'
+
+//
+// NPFS bugchecking support
+//
+// We define the NpBugCheck macro which triggers a NPFS_FILE_SYSTEM bugcheck
+// containing the source file ID number and the line where it was emitted, as
+// described in the MSDN article "Bug Check 0x25: NPFS_FILE_SYSTEM".
+//
+// The bugcheck emits 4 ULONGs; the first one is made, in its high word, by
+// the current source file ID and in its low word, by the line number; the
+// three other ones are user-defined.
+//
+// In order to avoid redefinition of the same file ID in different source files,
+// we gather all of them here, so that you will have to add (or remove) a new
+// one as soon as you add (or remove) a source file from the NPFS driver code.
+//
+// To use the NpBugCheck macro in a source file, define at its beginning
+// the constant NPFS_BUGCHECK_FILE_ID with one of the following file IDs,
+// then use the bugcheck macro wherever you want.
+//
+#define NPFS_BUGCHECK_CLEANUP 0x0001
+#define NPFS_BUGCHECK_CLOSE 0x0002
+#define NPFS_BUGCHECK_CREATE 0x0003
+#define NPFS_BUGCHECK_DATASUP 0x0004
+#define NPFS_BUGCHECK_FILEINFO 0x0005
+#define NPFS_BUGCHECK_FILEOBSUP 0x0006
+#define NPFS_BUGCHECK_FLUSHBUF 0x0007
+#define NPFS_BUGCHECK_FSCTRL 0x0008
+#define NPFS_BUGCHECK_MAIN 0x0009
+#define NPFS_BUGCHECK_PREFXSUP 0x000a
+#define NPFS_BUGCHECK_READ 0x000b
+#define NPFS_BUGCHECK_READSUP 0x000c
+#define NPFS_BUGCHECK_SECURSUP 0x000d
+#define NPFS_BUGCHECK_SEINFO 0x000e
+#define NPFS_BUGCHECK_STATESUP 0x000f
+#define NPFS_BUGCHECK_STRUCSUP 0x0010
+#define NPFS_BUGCHECK_VOLINFO 0x0011
+#define NPFS_BUGCHECK_WAITSUP 0x0012
+#define NPFS_BUGCHECK_WRITE 0x0013
+#define NPFS_BUGCHECK_WRITESUP 0x0014
+
+#define NpBugCheck(p1, p2, p3) \
+ KeBugCheckEx(NPFS_FILE_SYSTEM, \
+ (NPFS_BUGCHECK_FILE_ID << 16) | __LINE__, \
+ (p1), (p2), (p3))
+
+/* Node Type Codes for NPFS */
+#define NPFS_NTC_VCB 1
+#define NPFS_NTC_ROOT_DCB 2
+#define NPFS_NTC_FCB 4
+#define NPFS_NTC_CCB 6
+#define NPFS_NTC_NONPAGED_CCB 7
+#define NPFS_NTC_ROOT_DCB_CCB 8
+typedef USHORT NODE_TYPE_CODE, *PNODE_TYPE_CODE;
+
+/* Data Queue States */
+typedef enum _NP_DATA_QUEUE_STATE
{
- UNICODE_STRING SearchPattern;
- ULONG FileIndex;
-} NPFS_CCB_DIRECTORY_DATA, *PNPFS_CCB_DIRECTORY_DATA;
-
+ ReadEntries = 0,
+ WriteEntries = 1,
+ Empty = 2
+} NP_DATA_QUEUE_STATE;
-typedef struct _NPFS_CCB
+/* Data Queue Entry Types */
+typedef enum _NP_DATA_QUEUE_ENTRY_TYPE
{
- LIST_ENTRY CcbListEntry;
- CCB_TYPE Type;
- PNPFS_FCB Fcb;
-
- PFILE_OBJECT FileObject;
-
- struct _NPFS_CCB* OtherSide;
- struct ETHREAD *Thread;
- KEVENT ConnectEvent;
- KEVENT ReadEvent;
- KEVENT WriteEvent;
- ULONG PipeEnd;
- ULONG PipeState;
- ULONG ReadDataAvailable;
- ULONG WriteQuotaAvailable;
- ULONG RefCount;
-
- LIST_ENTRY ReadRequestListHead;
-
- PVOID Data;
- PVOID ReadPtr;
- PVOID WritePtr;
- ULONG MaxDataLength;
-
- FAST_MUTEX DataListLock; /* Data queue lock */
+ Buffered = 0,
+ Unbuffered
+} NP_DATA_QUEUE_ENTRY_TYPE;
- union
- {
- NPFS_CCB_DIRECTORY_DATA Directory;
- } u;
-
-} NPFS_CCB, *PNPFS_CCB;
-
-typedef struct _NPFS_CONTEXT
+/* An Input or Output Data Queue. Each CCB has two of these. */
+typedef struct _NP_DATA_QUEUE
{
- LIST_ENTRY ListEntry;
- PKEVENT WaitEvent;
-} NPFS_CONTEXT, *PNPFS_CONTEXT;
-
-typedef struct _NPFS_THREAD_CONTEXT
+ LIST_ENTRY Queue;
+ ULONG QueueState;
+ ULONG BytesInQueue;
+ ULONG EntriesInQueue;
+ ULONG QuotaUsed;
+ ULONG ByteOffset;
+ ULONG Quota;
+} NP_DATA_QUEUE, *PNP_DATA_QUEUE;
+
+/* The Entries that go into the Queue */
+typedef struct _NP_DATA_QUEUE_ENTRY
{
- ULONG Count;
- KEVENT Event;
- PNPFS_VCB Vcb;
- LIST_ENTRY ListEntry;
- PVOID WaitObjectArray[MAXIMUM_WAIT_OBJECTS];
- KWAIT_BLOCK WaitBlockArray[MAXIMUM_WAIT_OBJECTS];
- PIRP WaitIrpArray[MAXIMUM_WAIT_OBJECTS];
-} NPFS_THREAD_CONTEXT, *PNPFS_THREAD_CONTEXT;
-
-typedef struct _NPFS_WAITER_ENTRY
+ LIST_ENTRY QueueEntry;
+ ULONG DataEntryType;
+ PIRP Irp;
+ ULONG QuotaInEntry;
+ PSECURITY_CLIENT_CONTEXT ClientSecurityContext;
+ ULONG DataSize;
+} NP_DATA_QUEUE_ENTRY, *PNP_DATA_QUEUE_ENTRY;
+
+/* A Wait Queue. Only the VCB has one of these. */
+typedef struct _NP_WAIT_QUEUE
{
- LIST_ENTRY Entry;
- PNPFS_CCB Ccb;
-} NPFS_WAITER_ENTRY, *PNPFS_WAITER_ENTRY;
-
-
-extern NPAGED_LOOKASIDE_LIST NpfsPipeDataLookasideList;
-
-
-#define KeLockMutex(x) KeWaitForSingleObject(x, \
- UserRequest, \
- KernelMode, \
- FALSE, \
- NULL);
-
-#define KeUnlockMutex(x) KeReleaseMutex(x, FALSE);
-
-#define PAGE_ROUND_UP(x) ( (((ULONG_PTR)x)%PAGE_SIZE) ? ((((ULONG_PTR)x)&(~(PAGE_SIZE-1)))+PAGE_SIZE) : ((ULONG_PTR)x) )
+ LIST_ENTRY WaitList;
+ KSPIN_LOCK WaitLock;
+} NP_WAIT_QUEUE, *PNP_WAIT_QUEUE;
-DRIVER_DISPATCH NpfsCreate;
-NTSTATUS NTAPI NpfsCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-
-DRIVER_DISPATCH NpfsCreateNamedPipe;
-NTSTATUS NTAPI NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-
-DRIVER_DISPATCH NpfsCleanup;
-NTSTATUS NTAPI NpfsCleanup(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-
-DRIVER_DISPATCH NpfsClose;
-NTSTATUS NTAPI NpfsClose(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+/* The Entries in the Queue above, one for each Waiter. */
+typedef struct _NP_WAIT_QUEUE_ENTRY
+{
+ PIRP Irp;
+ KDPC Dpc;
+ KTIMER Timer;
+ PNP_WAIT_QUEUE WaitQueue;
+ UNICODE_STRING AliasName;
+ PFILE_OBJECT FileObject;
+} NP_WAIT_QUEUE_ENTRY, *PNP_WAIT_QUEUE_ENTRY;
+
+/* The event buffer in the NonPaged CCB */
+typedef struct _NP_EVENT_BUFFER
+{
+ PKEVENT Event;
+} NP_EVENT_BUFFER, *PNP_EVENT_BUFFER;
-DRIVER_DISPATCH NpfsDirectoryControl;
-NTSTATUS NTAPI NpfsDirectoryControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+/* The CCB for the Root DCB */
+typedef struct _NP_ROOT_DCB_CCB
+{
+ NODE_TYPE_CODE NodeType;
+ PVOID Unknown;
+ ULONG Unknown2;
+} NP_ROOT_DCB_CCB, *PNP_ROOT_DCB_FCB;
-DRIVER_DISPATCH NpfsRead;
-NTSTATUS NTAPI NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+/* The header that both FCB and DCB share */
+typedef struct _NP_CB_HEADER
+{
+ NODE_TYPE_CODE NodeType;
+ LIST_ENTRY DcbEntry;
+ PVOID ParentDcb;
+ ULONG CurrentInstances;
+ ULONG ServerOpenCount;
+ PSECURITY_DESCRIPTOR SecurityDescriptor;
+} NP_CB_HEADER, *PNP_CB_HEADER;
-DRIVER_DISPATCH NpfsWrite;
-NTSTATUS NTAPI NpfsWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+/* The footer that both FCB and DCB share */
+typedef struct _NP_CB_FOOTER
+{
+ UNICODE_STRING FullName;
+ UNICODE_STRING ShortName;
+ UNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry;
+} NP_CB_FOOTER;
-DRIVER_DISPATCH NpfsFlushBuffers;
-NTSTATUS NTAPI NpfsFlushBuffers(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+/* A Directory Control Block (DCB) */
+typedef struct _NP_DCB
+{
+ /* Common Header */
+ NP_CB_HEADER;
+
+ /* DCB-specific data */
+ LIST_ENTRY NotifyList;
+ LIST_ENTRY NotifyList2;
+ LIST_ENTRY FcbList;
+#ifndef _WIN64
+ ULONG Pad;
+#endif
+
+ /* Common Footer */
+ NP_CB_FOOTER;
+} NP_DCB, *PNP_DCB;
+
+/* A File Control BLock (FCB) */
+typedef struct _NP_FCB
+{
+ /* Common Header */
+ NP_CB_HEADER;
-DRIVER_DISPATCH NpfsFileSystemControl;
-NTSTATUS NTAPI NpfsFileSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+ /* FCB-specific fields */
+ ULONG MaximumInstances;
+ USHORT NamedPipeConfiguration;
+ USHORT NamedPipeType;
+ LARGE_INTEGER Timeout;
+ LIST_ENTRY CcbList;
+#ifdef _WIN64
+ PVOID Pad[2];
+#endif
+
+ /* Common Footer */
+ NP_CB_FOOTER;
+} NP_FCB, *PNP_FCB;
+
+C_ASSERT(FIELD_OFFSET(NP_FCB, PrefixTableEntry) == FIELD_OFFSET(NP_DCB, PrefixTableEntry));
+
+/* The nonpaged portion of the CCB */
+typedef struct _NP_NONPAGED_CCB
+{
+ NODE_TYPE_CODE NodeType;
+ PNP_EVENT_BUFFER EventBuffer[2];
+ ERESOURCE Lock;
+} NP_NONPAGED_CCB, *PNP_NONPAGED_CCB;
-DRIVER_DISPATCH NpfsQueryInformation;
-NTSTATUS NTAPI NpfsQueryInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+/* A Client Control Block (CCB) */
+typedef struct _NP_CCB
+{
+ NODE_TYPE_CODE NodeType;
+ UCHAR NamedPipeState;
+ UCHAR ReadMode[2];
+ UCHAR CompletionMode[2];
+ SECURITY_QUALITY_OF_SERVICE ClientQos;
+ LIST_ENTRY CcbEntry;
+ PNP_FCB Fcb;
+ PFILE_OBJECT FileObject[2];
+ PEPROCESS Process;
+ PVOID ClientSession;
+ PNP_NONPAGED_CCB NonPagedCcb;
+ NP_DATA_QUEUE DataQueue[2];
+ PSECURITY_CLIENT_CONTEXT ClientContext;
+ LIST_ENTRY IrpList;
+} NP_CCB, *PNP_CCB;
+
+/* A Volume Control Block (VCB) */
+typedef struct _NP_VCB
+{
+ NODE_TYPE_CODE NodeType;
+ ULONG ReferenceCount;
+ PNP_DCB RootDcb;
+ UNICODE_PREFIX_TABLE PrefixTable;
+ ERESOURCE Lock;
+ RTL_GENERIC_TABLE EventTable;
+ NP_WAIT_QUEUE WaitQueue;
+} NP_VCB, *PNP_VCB;
+
+extern PNP_VCB NpVcb;
+
+/* Defines an alias */
+typedef struct _NPFS_ALIAS
+{
+ struct _NPFS_ALIAS *Next;
+ PUNICODE_STRING TargetName;
+ UNICODE_STRING Name;
+} NPFS_ALIAS, *PNPFS_ALIAS;
-DRIVER_DISPATCH NpfsSetInformation;
-NTSTATUS NTAPI NpfsSetInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+/* Private structure used to enumerate the alias values */
+typedef struct _NPFS_QUERY_VALUE_CONTEXT
+{
+ BOOLEAN SizeOnly;
+ SIZE_T FullSize;
+ ULONG NumberOfAliases;
+ ULONG NumberOfEntries;
+ PNPFS_ALIAS CurrentAlias;
+ PUNICODE_STRING CurrentTargetName;
+ PWCHAR CurrentStringPointer;
+} NPFS_QUERY_VALUE_CONTEXT, *PNPFS_QUERY_VALUE_CONTEXT;
+
+extern PNPFS_ALIAS NpAliasList;
+extern PNPFS_ALIAS NpAliasListByLength[MAX_INDEXED_LENGTH + 1 - MIN_INDEXED_LENGTH];
+
+/* This structure is actually a user-mode structure and should go into a share header */
+typedef struct _NP_CLIENT_PROCESS
+{
+ PVOID Unknown;
+ PVOID Process;
+ USHORT DataLength;
+ WCHAR Buffer[17];
+} NP_CLIENT_PROCESS, *PNP_CLIENT_PROCESS;
-DRIVER_DISPATCH NpfsQueryVolumeInformation;
-NTSTATUS NTAPI NpfsQueryVolumeInformation (PDEVICE_OBJECT DeviceObject, PIRP Irp);
+/* FUNCTIONS ******************************************************************/
-NTSTATUS NTAPI
-DriverEntry(PDRIVER_OBJECT DriverObject,
- PUNICODE_STRING RegistryPath);
+/* Functions to lock/unlock the global VCB lock */
-PNPFS_FCB
-NpfsFindPipe(PNPFS_VCB Vcb,
- PUNICODE_STRING PipeName);
+FORCEINLINE
+VOID
+NpAcquireSharedVcb(VOID)
+{
+ /* Acquire the lock in shared mode */
+ ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE);
+}
-FCB_TYPE
-NpfsGetFcb(PFILE_OBJECT FileObject,
- PNPFS_FCB *Fcb);
+FORCEINLINE
+VOID
+NpAcquireExclusiveVcb(VOID)
+{
+ /* Acquire the lock in exclusive mode */
+ ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE);
+}
-CCB_TYPE
-NpfsGetCcb(PFILE_OBJECT FileObject,
- PNPFS_CCB *Ccb);
+FORCEINLINE
+VOID
+NpReleaseVcb(VOID)
+{
+ /* Release the lock */
+ ExReleaseResourceLite(&NpVcb->Lock);
+}
+
+//
+// Function to process deferred IRPs outside the VCB lock but still within the
+// critical region
+//
+FORCEINLINE
+VOID
+NpCompleteDeferredIrps(IN PLIST_ENTRY DeferredList)
+{
+ PLIST_ENTRY ThisEntry, NextEntry;
+ PIRP Irp;
-#endif /* __DRIVERS_FS_NP_NPFS_H */
+ /* Loop the list */
+ ThisEntry = DeferredList->Flink;
+ while (ThisEntry != DeferredList)
+ {
+ /* Remember the next entry, but don't switch to it yet */
+ NextEntry = ThisEntry->Flink;
+
+ /* Complete the IRP for this entry */
+ Irp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
+ IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT);
+
+ /* And now switch to the next one */
+ ThisEntry = NextEntry;
+ }
+}
+
+LONG
+NTAPI
+NpCompareAliasNames(
+ _In_ PCUNICODE_STRING String1,
+ _In_ PCUNICODE_STRING String2);
+
+BOOLEAN
+NTAPI
+NpDeleteEventTableEntry(IN PRTL_GENERIC_TABLE Table,
+ IN PVOID Buffer);
+
+VOID
+NTAPI
+NpInitializeWaitQueue(IN PNP_WAIT_QUEUE WaitQueue);
+
+NTSTATUS
+NTAPI
+NpUninitializeDataQueue(IN PNP_DATA_QUEUE DataQueue);
+
+PLIST_ENTRY
+NTAPI
+NpGetNextRealDataQueueEntry(IN PNP_DATA_QUEUE DataQueue,
+ IN PLIST_ENTRY List);
+
+PIRP
+NTAPI
+NpRemoveDataQueueEntry(IN PNP_DATA_QUEUE DataQueue,
+ IN BOOLEAN Flag,
+ IN PLIST_ENTRY List);
+
+NTSTATUS
+NTAPI
+NpAddDataQueueEntry(IN ULONG NamedPipeEnd,
+ IN PNP_CCB Ccb,
+ IN PNP_DATA_QUEUE DataQueue,
+ IN ULONG Who,
+ IN ULONG Type,
+ IN ULONG DataSize,
+ IN PIRP Irp,
+ IN PVOID Buffer,
+ IN ULONG ByteOffset);
+
+VOID
+NTAPI
+NpCompleteStalledWrites(IN PNP_DATA_QUEUE DataQueue,
+ IN PLIST_ENTRY List);
+
+NTSTATUS
+NTAPI
+NpInitializeDataQueue(IN PNP_DATA_QUEUE DataQueue,
+ IN ULONG Quota);
+
+NTSTATUS
+NTAPI
+NpCreateCcb(IN PNP_FCB Fcb,
+ IN PFILE_OBJECT FileObject,
+ IN UCHAR State,
+ IN UCHAR ReadMode,
+ IN UCHAR CompletionMode,
+ IN ULONG InQuota,
+ IN ULONG OutQuota,
+ OUT PNP_CCB *NewCcb);
+
+NTSTATUS
+NTAPI
+NpCreateFcb(IN PNP_DCB Dcb,
+ IN PUNICODE_STRING PipeName,
+ IN ULONG MaximumInstances,
+ IN LARGE_INTEGER Timeout,
+ IN USHORT NamedPipeConfiguration,
+ IN USHORT NamedPipeType,
+ OUT PNP_FCB *NewFcb);
+
+NTSTATUS
+NTAPI
+NpCreateRootDcb(VOID);
+
+NTSTATUS
+NTAPI
+NpCreateRootDcbCcb(IN PNP_ROOT_DCB_FCB *NewRootCcb);
+
+VOID
+NTAPI
+NpInitializeVcb(VOID);
+
+VOID
+NTAPI
+NpDeleteCcb(IN PNP_CCB Ccb,
+ IN PLIST_ENTRY ListEntry);
+
+VOID
+NTAPI
+NpDeleteFcb(IN PNP_FCB Fcb,
+ IN PLIST_ENTRY ListEntry);
+
+NTSTATUS
+NTAPI
+NpFsdCreateNamedPipe(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+NpFsdCreate(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+NpFsdClose(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+NpFsdCleanup(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+NpFsdFileSystemControl(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+NpSetConnectedPipeState(IN PNP_CCB Ccb,
+ IN PFILE_OBJECT FileObject,
+ IN PLIST_ENTRY List);
+
+NTSTATUS
+NTAPI
+NpSetListeningPipeState(IN PNP_CCB Ccb,
+ IN PIRP Irp,
+ IN PLIST_ENTRY List);
+
+NTSTATUS
+NTAPI
+NpSetDisconnectedPipeState(IN PNP_CCB Ccb,
+ IN PLIST_ENTRY List);
+
+NTSTATUS
+NTAPI
+NpSetClosingPipeState(IN PNP_CCB Ccb,
+ IN PIRP Irp,
+ IN ULONG NamedPipeEnd,
+ IN PLIST_ENTRY List);
+
+VOID
+NTAPI
+NpFreeClientSecurityContext(IN PSECURITY_CLIENT_CONTEXT ClientContext);
+
+NTSTATUS
+NTAPI
+NpImpersonateClientContext(IN PNP_CCB Ccb);
+
+VOID
+NTAPI
+NpCopyClientContext(IN PNP_CCB Ccb,
+ IN PNP_DATA_QUEUE_ENTRY DataQueueEntry);
+
+VOID
+NTAPI
+NpUninitializeSecurity(IN PNP_CCB Ccb);
+
+NTSTATUS
+NTAPI
+NpInitializeSecurity(IN PNP_CCB Ccb,
+ IN PSECURITY_QUALITY_OF_SERVICE SecurityQos,
+ IN PETHREAD Thread);
+
+NTSTATUS
+NTAPI
+NpGetClientSecurityContext(IN ULONG NamedPipeEnd,
+ IN PNP_CCB Ccb,
+ IN PETHREAD Thread,
+ IN PSECURITY_CLIENT_CONTEXT *Context);
+
+VOID
+NTAPI
+NpSetFileObject(IN PFILE_OBJECT FileObject,
+ IN PVOID PrimaryContext,
+ IN PVOID Ccb,
+ IN ULONG NamedPipeEnd);
+
+NODE_TYPE_CODE
+NTAPI
+NpDecodeFileObject(IN PFILE_OBJECT FileObject,
+ OUT PVOID *PrimaryContext OPTIONAL,
+ OUT PNP_CCB *Ccb,
+ OUT PULONG NamedPipeEnd OPTIONAL);
+
+PNP_FCB
+NTAPI
+NpFindPrefix(IN PUNICODE_STRING Name,
+ IN ULONG CaseInsensitiveIndex,
+ IN PUNICODE_STRING Prefix);
+
+NTSTATUS
+NTAPI
+NpFindRelativePrefix(IN PNP_DCB Dcb,
+ IN PUNICODE_STRING Name,
+ IN ULONG CaseInsensitiveIndex,
+ IN PUNICODE_STRING Prefix,
+ OUT PNP_FCB *FoundFcb);
+
+VOID
+NTAPI
+NpCheckForNotify(IN PNP_DCB Dcb,
+ IN BOOLEAN SecondList,
+ IN PLIST_ENTRY List);
+
+NTSTATUS
+NTAPI
+NpAddWaiter(IN PNP_WAIT_QUEUE WaitQueue,
+ IN LARGE_INTEGER WaitTime,
+ IN PIRP Irp,
+ IN PUNICODE_STRING AliasName);
+
+NTSTATUS
+NTAPI
+NpCancelWaiter(IN PNP_WAIT_QUEUE WaitQueue,
+ IN PUNICODE_STRING PipeName,
+ IN NTSTATUS Status,
+ IN PLIST_ENTRY ListEntry);
+
+
+IO_STATUS_BLOCK
+NTAPI
+NpReadDataQueue(IN PNP_DATA_QUEUE DataQueue,
+ IN BOOLEAN Peek,
+ IN BOOLEAN ReadOverflowOperation,
+ IN PVOID Buffer,
+ IN ULONG BufferSize,
+ IN ULONG Mode,
+ IN PNP_CCB Ccb,
+ IN PLIST_ENTRY List);
+
+
+NTSTATUS
+NTAPI
+NpWriteDataQueue(IN PNP_DATA_QUEUE WriteQueue,
+ IN ULONG Mode,
+ IN PVOID OutBuffer,
+ IN ULONG OutBufferSize,
+ IN ULONG PipeType,
+ OUT PULONG BytesWritten,
+ IN PNP_CCB Ccb,
+ IN ULONG NamedPipeEnd,
+ IN PETHREAD Thread,
+ IN PLIST_ENTRY List);
+
+NTSTATUS
+NTAPI
+NpFsdRead(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+_Function_class_(FAST_IO_READ)
+_IRQL_requires_same_
+BOOLEAN
+NTAPI
+NpFastRead(
+ _In_ PFILE_OBJECT FileObject,
+ _In_ PLARGE_INTEGER FileOffset,
+ _In_ ULONG Length,
+ _In_ BOOLEAN Wait,
+ _In_ ULONG LockKey,
+ _Out_ PVOID Buffer,
+ _Out_ PIO_STATUS_BLOCK IoStatus,
+ _In_ PDEVICE_OBJECT DeviceObject);
+
+_Function_class_(FAST_IO_WRITE)
+_IRQL_requires_same_
+BOOLEAN
+NTAPI
+NpFastWrite(
+ _In_ PFILE_OBJECT FileObject,
+ _In_ PLARGE_INTEGER FileOffset,
+ _In_ ULONG Length,
+ _In_ BOOLEAN Wait,
+ _In_ ULONG LockKey,
+ _In_ PVOID Buffer,
+ _Out_ PIO_STATUS_BLOCK IoStatus,
+ _In_ PDEVICE_OBJECT DeviceObject);
+
+
+NTSTATUS
+NTAPI
+NpFsdWrite(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+NpFsdFlushBuffers(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+NpFsdSetInformation(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+NpFsdQueryInformation(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+
+NTSTATUS
+NTAPI
+NpFsdQuerySecurityInfo(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+NpFsdSetSecurityInfo(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+NpFsdQueryVolumeInformation(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+#endif /* _NPFS_PCH_ */