#include <ntifs.h>
#include <ndk/iotypes.h>
+#include <pseh/pseh2.h>
-typedef struct _NPFS_DEVICE_EXTENSION
+#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;
ULONG MinQuota;
ULONG DefaultQuota;
ULONG MaxQuota;
-} NPFS_DEVICE_EXTENSION, *PNPFS_DEVICE_EXTENSION;
+ struct _NPFS_FCB *DeviceFcb;
+ struct _NPFS_FCB *RootFcb;
+} NPFS_VCB, *PNPFS_VCB;
typedef struct _NPFS_FCB
{
- FSRTL_COMMON_FCB_HEADER RFCB;
+ FCB_TYPE Type;
+ PNPFS_VCB Vcb;
UNICODE_STRING PipeName;
LIST_ENTRY PipeListEntry;
KMUTEX CcbListLock;
LARGE_INTEGER TimeOut;
} NPFS_FCB, *PNPFS_FCB;
+
+typedef struct _NPFS_CCB_DIRECTORY_DATA
+{
+ UNICODE_STRING SearchPattern;
+ ULONG FileIndex;
+} NPFS_CCB_DIRECTORY_DATA, *PNPFS_CCB_DIRECTORY_DATA;
+
+
typedef struct _NPFS_CCB
{
LIST_ENTRY CcbListEntry;
+ CCB_TYPE Type;
+ PNPFS_FCB Fcb;
+
struct _NPFS_CCB* OtherSide;
struct ETHREAD *Thread;
- PNPFS_FCB Fcb;
KEVENT ConnectEvent;
KEVENT ReadEvent;
KEVENT WriteEvent;
ULONG PipeState;
ULONG ReadDataAvailable;
ULONG WriteQuotaAvailable;
+ ULONG RefCount;
LIST_ENTRY ReadRequestListHead;
ULONG MaxDataLength;
FAST_MUTEX DataListLock; /* Data queue lock */
+
+ union
+ {
+ NPFS_CCB_DIRECTORY_DATA Directory;
+ } u;
+
} NPFS_CCB, *PNPFS_CCB;
typedef struct _NPFS_CONTEXT
{
ULONG Count;
KEVENT Event;
- PNPFS_DEVICE_EXTENSION DeviceExt;
+ PNPFS_VCB Vcb;
LIST_ENTRY ListEntry;
PVOID WaitObjectArray[MAXIMUM_WAIT_OBJECTS];
KWAIT_BLOCK WaitBlockArray[MAXIMUM_WAIT_OBJECTS];
DRIVER_DISPATCH NpfsClose;
NTSTATUS NTAPI NpfsClose(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+DRIVER_DISPATCH NpfsDirectoryControl;
+NTSTATUS NTAPI NpfsDirectoryControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+
DRIVER_DISPATCH NpfsRead;
NTSTATUS NTAPI NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp);
DriverEntry(PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath);
+PNPFS_FCB
+NpfsFindPipe(PNPFS_VCB Vcb,
+ PUNICODE_STRING PipeName);
+
+FCB_TYPE
+NpfsGetFcb(PFILE_OBJECT FileObject,
+ PNPFS_FCB *Fcb);
+
+CCB_TYPE
+NpfsGetCcb(PFILE_OBJECT FileObject,
+ PNPFS_CCB *Ccb);
+
#endif /* __DRIVERS_FS_NP_NPFS_H */