* PROGRAMMERS: ReactOS Portable Systems Group
*/
+#ifndef _NPFS_PCH_
+#define _NPFS_PCH_
+
/* INCLUDES *******************************************************************/
-//
-// System Headers
-//
+/* System Headers */
#include <ntifs.h>
-#include <ntndk.h>
+#include <ndk/obfuncs.h>
#include <pseh/pseh2.h>
-#define UNIMPLEMENTED
-#define DPRINT1 DbgPrint
+//#define UNIMPLEMENTED
+//#define DPRINT1 DbgPrint
-//
-// Allow Microsoft Extensions
-//
+#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 *********************************************************/
// NpFs - npfs.sys - Client security context
// NpFw - npfs.sys - Write block
// NpFW - npfs.sys - Write block
-#define NPFS_CCB_TAG 'NpFc'
-#define NPFS_ROOT_DCB_CCB_TAG 'NpFC'
-#define NPFS_DCB_TAG 'NpFD'
-#define NPFS_FCB_TAG 'NpFf'
-#define NPFS_GLOBAL_TAG 'NpFg'
-#define NPFS_CLIENT_INFO_TAG 'NpFi'
-#define NPFS_NAME_BLOCK_TAG 'NpFn'
-#define NPFS_QUERY_TEMPLATE_TAG 'NpFq'
-#define NPFS_DATA_ENTRY_TAG 'NpFr'
-#define NPFS_CLIENT_SEC_CTX_TAG 'NpFs'
-#define NPFS_WAIT_BLOCK_TAG 'NpFt'
-#define NPFS_WRITE_BLOCK_TAG 'NpFw'
+#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
(NPFS_BUGCHECK_FILE_ID << 16) | __LINE__, \
(p1), (p2), (p3))
-//
-// Node Type Codes for NPFS
-//
+/* Node Type Codes for NPFS */
#define NPFS_NTC_VCB 1
#define NPFS_NTC_ROOT_DCB 2
#define NPFS_NTC_FCB 4
#define NPFS_NTC_ROOT_DCB_CCB 8
typedef USHORT NODE_TYPE_CODE, *PNODE_TYPE_CODE;
-//
-// Data Queue States
-//
+/* Data Queue States */
typedef enum _NP_DATA_QUEUE_STATE
{
ReadEntries = 0,
Empty = 2
} NP_DATA_QUEUE_STATE;
-//
-// Data Queue Entry Types
-//
+/* Data Queue Entry Types */
typedef enum _NP_DATA_QUEUE_ENTRY_TYPE
{
Buffered = 0,
Unbuffered
} NP_DATA_QUEUE_ENTRY_TYPE;
-//
-// An Input or Output Data Queue. Each CCB has two of these.
-//
+/* An Input or Output Data Queue. Each CCB has two of these. */
typedef struct _NP_DATA_QUEUE
{
LIST_ENTRY Queue;
ULONG Quota;
} NP_DATA_QUEUE, *PNP_DATA_QUEUE;
-//
-// The Entries that go into the Queue
-//
+/* The Entries that go into the Queue */
typedef struct _NP_DATA_QUEUE_ENTRY
{
LIST_ENTRY QueueEntry;
ULONG DataSize;
} NP_DATA_QUEUE_ENTRY, *PNP_DATA_QUEUE_ENTRY;
-//
-// A Wait Queue. Only the VCB has one of these.
-//
+/* A Wait Queue. Only the VCB has one of these. */
typedef struct _NP_WAIT_QUEUE
{
LIST_ENTRY WaitList;
KSPIN_LOCK WaitLock;
} NP_WAIT_QUEUE, *PNP_WAIT_QUEUE;
-//
-// The Entries in the Queue above, one for each Waiter.
-//
+/* The Entries in the Queue above, one for each Waiter. */
typedef struct _NP_WAIT_QUEUE_ENTRY
{
PIRP Irp;
PFILE_OBJECT FileObject;
} NP_WAIT_QUEUE_ENTRY, *PNP_WAIT_QUEUE_ENTRY;
-//
-// The event buffer in the NonPaged CCB
-//
+/* The event buffer in the NonPaged CCB */
typedef struct _NP_EVENT_BUFFER
{
PKEVENT Event;
} NP_EVENT_BUFFER, *PNP_EVENT_BUFFER;
-//
-// The CCB for the Root DCB
-//
+/* The CCB for the Root DCB */
typedef struct _NP_ROOT_DCB_CCB
{
NODE_TYPE_CODE NodeType;
ULONG Unknown2;
} NP_ROOT_DCB_CCB, *PNP_ROOT_DCB_FCB;
-//
-// The header that both FCB and DCB share
-//
+/* The header that both FCB and DCB share */
typedef struct _NP_CB_HEADER
{
NODE_TYPE_CODE NodeType;
PSECURITY_DESCRIPTOR SecurityDescriptor;
} NP_CB_HEADER, *PNP_CB_HEADER;
-//
-// The footer that both FCB and DCB share
-//
+/* The footer that both FCB and DCB share */
typedef struct _NP_CB_FOOTER
{
UNICODE_STRING FullName;
UNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry;
} NP_CB_FOOTER;
-//
-// A Directory Control Block (DCB)
-//
+/* A Directory Control Block (DCB) */
typedef struct _NP_DCB
{
- //
- // Common Header
- //
+ /* Common Header */
NP_CB_HEADER;
- //
- // DCB-specific data
- //
+ /* DCB-specific data */
LIST_ENTRY NotifyList;
LIST_ENTRY NotifyList2;
LIST_ENTRY FcbList;
ULONG Pad;
#endif
- //
- // Common Footer
- //
+ /* Common Footer */
NP_CB_FOOTER;
} NP_DCB, *PNP_DCB;
-//
-// A File Control BLock (FCB)
-//
+/* A File Control BLock (FCB) */
typedef struct _NP_FCB
{
- //
- // Common Header
- //
+ /* Common Header */
NP_CB_HEADER;
- //
- // FCB-specific fields
- //
+ /* FCB-specific fields */
ULONG MaximumInstances;
USHORT NamedPipeConfiguration;
USHORT NamedPipeType;
PVOID Pad[2];
#endif
- //
- // Common Footer
- //
+ /* 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
-//
+/* The nonpaged portion of the CCB */
typedef struct _NP_NONPAGED_CCB
{
NODE_TYPE_CODE NodeType;
ERESOURCE Lock;
} NP_NONPAGED_CCB, *PNP_NONPAGED_CCB;
-//
-// A Client Control Block (CCB)
-//
+/* A Client Control Block (CCB) */
typedef struct _NP_CCB
{
NODE_TYPE_CODE NodeType;
LIST_ENTRY IrpList;
} NP_CCB, *PNP_CCB;
-//
-// A Volume Control Block (VCB)
-//
+/* A Volume Control Block (VCB) */
typedef struct _NP_VCB
{
NODE_TYPE_CODE NodeType;
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;
+
+/* 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;
/* FUNCTIONS ******************************************************************/
-//
-// Functions to lock/unlock the global VCB lock
-//
+/* Functions to lock/unlock the global VCB lock */
+
FORCEINLINE
VOID
NpAcquireSharedVcb(VOID)
ExReleaseResourceLite(&NpVcb->Lock);
}
-
-
//
// Function to process deferred IRPs outside the VCB lock but still within the
// critical region
//
-VOID
FORCEINLINE
+VOID
NpCompleteDeferredIrps(IN PLIST_ENTRY DeferredList)
{
PLIST_ENTRY ThisEntry, NextEntry;
}
}
+LONG
+NTAPI
+NpCompareAliasNames(
+ _In_ PCUNICODE_STRING String1,
+ _In_ PCUNICODE_STRING String2);
+
BOOLEAN
NTAPI
NpDeleteEventTableEntry(IN PRTL_GENERIC_TABLE Table,
NTAPI
NpInitializeWaitQueue(IN PNP_WAIT_QUEUE WaitQueue);
-
NTSTATUS
NTAPI
NpUninitializeDataQueue(IN PNP_DATA_QUEUE DataQueue);
NpAddDataQueueEntry(IN ULONG NamedPipeEnd,
IN PNP_CCB Ccb,
IN PNP_DATA_QUEUE DataQueue,
- IN ULONG Who,
+ IN ULONG Who,
IN ULONG Type,
IN ULONG DataSize,
IN PIRP Irp,
NpFsdClose(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
-
NTSTATUS
NTAPI
NpFsdCleanup(IN PDEVICE_OBJECT DeviceObject,
NTSTATUS
NTAPI
NpSetListeningPipeState(IN PNP_CCB Ccb,
- IN PIRP Irp,
+ IN PIRP Irp,
IN PLIST_ENTRY List);
-
NTSTATUS
NTAPI
-NpSetDisconnectedPipeState(IN PNP_CCB Ccb,
+NpSetDisconnectedPipeState(IN PNP_CCB Ccb,
IN PLIST_ENTRY List);
NTSTATUS
NTAPI
NpSetClosingPipeState(IN PNP_CCB Ccb,
- IN PIRP Irp,
- IN ULONG NamedPipeEnd,
+ IN PIRP Irp,
+ IN ULONG NamedPipeEnd,
IN PLIST_ENTRY List);
VOID
NTAPI
NpAddWaiter(IN PNP_WAIT_QUEUE WaitQueue,
IN LARGE_INTEGER WaitTime,
- IN PIRP Irp,
+ IN PIRP Irp,
IN PUNICODE_STRING AliasName);
NTSTATUS
IO_STATUS_BLOCK
NTAPI
-NpReadDataQueue(IN PNP_DATA_QUEUE DataQueue,
+NpReadDataQueue(IN PNP_DATA_QUEUE DataQueue,
IN BOOLEAN Peek,
IN BOOLEAN ReadOverflowOperation,
IN PVOID Buffer,
- IN ULONG BufferSize,
- IN ULONG Mode,
+ IN ULONG BufferSize,
+ IN ULONG Mode,
IN PNP_CCB Ccb,
IN PLIST_ENTRY List);
-NTSTATUS
+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 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
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
NpFsdQueryVolumeInformation(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
-/* EOF */
+#endif /* _NPFS_PCH_ */