#include <ntifs.h>
#include <ntddcdrm.h>
+#include <pseh/pseh2.h>
+
+#ifdef __GNUC__
+#define INIT_SECTION __attribute__((section ("INIT")))
+#else
+#define INIT_SECTION /* Done via alloc_text for MSC */
+#endif
#define CDFS_BASIC_SECTOR 2048
#define CDFS_PRIMARY_DESCRIPTOR_LOCATION 16
#define MAX_PATH 260
-typedef struct _CDFS_SHORT_NAME
+typedef struct _CDFS_SHORT_NAME
{
LIST_ENTRY Entry;
LARGE_INTEGER StreamOffset;
ERESOURCE NameListResource;
LIST_ENTRY ShortNameList;
+ FILE_LOCK FileLock;
} FCB, *PFCB;
ULONG LastOffset;
} CCB, *PCCB;
-#define TAG_CCB 'BCCI'
-#define TAG_FCB 'BCFI'
+#define CDFS_TAG 'sfdC'
+#define CDFS_CCB_TAG 'ccdC'
+#define CDFS_NONPAGED_FCB_TAG 'nfdC'
+#define CDFS_SHORT_NAME_TAG 'sgdC'
+#define CDFS_SEARCH_PATTERN_TAG 'eedC'
+#define CDFS_FILENAME_TAG 'nFdC'
-typedef struct
+typedef struct _CDFS_GLOBAL_DATA
{
PDRIVER_OBJECT DriverObject;
- PDEVICE_OBJECT DeviceObject;
+ PDEVICE_OBJECT CdFsDeviceObject;
+ PDEVICE_OBJECT HddFsDeviceObject;
ULONG Flags;
CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
+ FAST_IO_DISPATCH FastIoDispatch;
+ NPAGED_LOOKASIDE_LIST IrpContextLookasideList;
} CDFS_GLOBAL_DATA, *PCDFS_GLOBAL_DATA;
+#define IRPCONTEXT_CANWAIT 0x1
+#define IRPCONTEXT_COMPLETE 0x2
+#define IRPCONTEXT_QUEUE 0x4
+
+typedef struct _CDFS_IRP_CONTEXT
+{
+// NTFSIDENTIFIER Identifier;
+ ULONG Flags;
+ PIO_STACK_LOCATION Stack;
+ UCHAR MajorFunction;
+ UCHAR MinorFunction;
+ WORK_QUEUE_ITEM WorkQueueItem;
+ PIRP Irp;
+ BOOLEAN IsTopLevel;
+ PDEVICE_OBJECT DeviceObject;
+ PFILE_OBJECT FileObject;
+ NTSTATUS SavedExceptionCode;
+ CCHAR PriorityBoost;
+} CDFS_IRP_CONTEXT, *PCDFS_IRP_CONTEXT;
+
+
extern PCDFS_GLOBAL_DATA CdfsGlobalData;
+/* cdfs.c */
-/* cleanup.c */
+NTSTATUS
+NTAPI
+DriverEntry(
+ PDRIVER_OBJECT DriverObject,
+ PUNICODE_STRING RegistryPath);
-DRIVER_DISPATCH CdfsCleanup;
+/* cleanup.c */
NTSTATUS
NTAPI
-CdfsCleanup(PDEVICE_OBJECT DeviceObject,
- PIRP Irp);
+CdfsCleanup(
+ PCDFS_IRP_CONTEXT IrpContext);
/* close.c */
-DRIVER_DISPATCH CdfsClose;
-
NTSTATUS
NTAPI
-CdfsClose(PDEVICE_OBJECT DeviceObject,
- PIRP Irp);
+CdfsClose(
+ PCDFS_IRP_CONTEXT IrpContext);
NTSTATUS
CdfsCloseFile(PDEVICE_EXTENSION DeviceExt,
/* create.c */
-DRIVER_DISPATCH CdfsCreate;
-
NTSTATUS
NTAPI
-CdfsCreate(PDEVICE_OBJECT DeviceObject,
- PIRP Irp);
+CdfsCreate(
+ PCDFS_IRP_CONTEXT IrpContext);
/* devctrl.c */
-DRIVER_DISPATCH CdfsDeviceControl;
-
NTSTATUS NTAPI
-CdfsDeviceControl(PDEVICE_OBJECT DeviceObject,
- PIRP Irp);
+CdfsDeviceControl(
+ PCDFS_IRP_CONTEXT IrpContext);
/* dirctl.c */
-DRIVER_DISPATCH CdfsDirectoryControl;
+NTSTATUS
+NTAPI
+CdfsDirectoryControl(
+ PCDFS_IRP_CONTEXT IrpContext);
+
+/* dispatch.c */
+DRIVER_DISPATCH CdfsFsdDispatch;
NTSTATUS
NTAPI
-CdfsDirectoryControl(PDEVICE_OBJECT DeviceObject,
- PIRP Irp);
+CdfsFsdDispatch(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp);
+
+/* fastio.c */
+
+BOOLEAN
+NTAPI
+CdfsAcquireForLazyWrite(IN PVOID Context,
+ IN BOOLEAN Wait);
+
+VOID
+NTAPI
+CdfsReleaseFromLazyWrite(IN PVOID Context);
+FAST_IO_CHECK_IF_POSSIBLE CdfsFastIoCheckIfPossible;
+FAST_IO_READ CdfsFastIoRead;
+FAST_IO_WRITE CdfsFastIoWrite;
/* fcb.c */
/* finfo.c */
-DRIVER_DISPATCH CdfsQueryInformation;
-
NTSTATUS
NTAPI
-CdfsQueryInformation(PDEVICE_OBJECT DeviceObject,
- PIRP Irp);
-
-DRIVER_DISPATCH CdfsSetInformation;
+CdfsQueryInformation(
+ PCDFS_IRP_CONTEXT IrpContext);
NTSTATUS
NTAPI
-CdfsSetInformation(PDEVICE_OBJECT DeviceObject,
- PIRP Irp);
+CdfsSetInformation(
+ PCDFS_IRP_CONTEXT IrpContext);
/* fsctl.c */
-DRIVER_DISPATCH CdfsFileSystemControl;
-
NTSTATUS NTAPI
-CdfsFileSystemControl(PDEVICE_OBJECT DeviceObject,
- PIRP Irp);
+CdfsFileSystemControl(
+ PCDFS_IRP_CONTEXT IrpContext);
/* misc.c */
+BOOLEAN
+CdfsIsIrpTopLevel(
+ PIRP Irp);
+
+PCDFS_IRP_CONTEXT
+CdfsAllocateIrpContext(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp);
+
VOID
CdfsSwapString(PWCHAR Out,
PUCHAR In,
VOID
CdfsShortNameCacheGet
-(PFCB DirectoryFcb,
- PLARGE_INTEGER StreamOffset,
- PUNICODE_STRING LongName,
+(PFCB DirectoryFcb,
+ PLARGE_INTEGER StreamOffset,
+ PUNICODE_STRING LongName,
PUNICODE_STRING ShortName);
-/* rw.c */
+BOOLEAN
+CdfsIsRecordValid(IN PDEVICE_EXTENSION DeviceExt,
+ IN PDIR_RECORD Record);
-DRIVER_DISPATCH CdfsRead;
+VOID
+CdfsGetDirEntryName(PDEVICE_EXTENSION DeviceExt,
+ PDIR_RECORD Record,
+ PWSTR Name);
+
+/* rw.c */
NTSTATUS
NTAPI
-CdfsRead(PDEVICE_OBJECT DeviceObject,
- PIRP Irp);
-
-DRIVER_DISPATCH CdfsWrite;
+CdfsRead(
+ PCDFS_IRP_CONTEXT IrpContext);
NTSTATUS
NTAPI
-CdfsWrite(PDEVICE_OBJECT DeviceObject,
- PIRP Irp);
+CdfsWrite(
+ PCDFS_IRP_CONTEXT IrpContext);
/* volinfo.c */
-DRIVER_DISPATCH CdfsQueryVolumeInformation;
-
NTSTATUS
NTAPI
-CdfsQueryVolumeInformation(PDEVICE_OBJECT DeviceObject,
- PIRP Irp);
-
-DRIVER_DISPATCH CdfsSetVolumeInformation;
+CdfsQueryVolumeInformation(
+ PCDFS_IRP_CONTEXT IrpContext);
NTSTATUS
NTAPI
-CdfsSetVolumeInformation(PDEVICE_OBJECT DeviceObject,
- PIRP Irp);
-
-/* cdfs.c */
-
-NTSTATUS NTAPI
-DriverEntry(PDRIVER_OBJECT DriverObject,
- PUNICODE_STRING RegistryPath);
-
-BOOLEAN NTAPI
-CdfsAcquireForLazyWrite(IN PVOID Context,
- IN BOOLEAN Wait);
-
-VOID NTAPI
-CdfsReleaseFromLazyWrite(IN PVOID Context);
+CdfsSetVolumeInformation(
+ PCDFS_IRP_CONTEXT IrpContext);
#endif /* CDFS_H */