#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
typedef enum _CCB_TYPE
{
+ CCB_INVALID,
CCB_DEVICE,
CCB_DIRECTORY,
CCB_PIPE
ULONG MinQuota;
ULONG DefaultQuota;
ULONG MaxQuota;
+ struct _NPFS_FCB *DeviceFcb;
struct _NPFS_FCB *RootFcb;
} NPFS_VCB, *PNPFS_VCB;
{
FCB_TYPE Type;
PNPFS_VCB Vcb;
+ volatile LONG RefCount;
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;
+ PFILE_OBJECT FileObject;
struct _NPFS_CCB* OtherSide;
struct ETHREAD *Thread;
ULONG PipeState;
ULONG ReadDataAvailable;
ULONG WriteQuotaAvailable;
+ volatile LONG 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
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);
+VOID
+NpfsDereferenceFcb(PNPFS_FCB Fcb);
+
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 */