[CDFS]
[reactos.git] / reactos / drivers / filesystems / cdfs / cdfs.h
index e11b638..3d77e5b 100644 (file)
@@ -5,6 +5,12 @@
 #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 BLOCKSIZE CDFS_BASIC_SECTOR
@@ -174,7 +180,7 @@ typedef struct
 
 #define MAX_PATH                260
 
-typedef struct _CDFS_SHORT_NAME 
+typedef struct _CDFS_SHORT_NAME
 {
     LIST_ENTRY Entry;
     LARGE_INTEGER StreamOffset;
@@ -214,6 +220,7 @@ typedef struct _FCB
 
   ERESOURCE  NameListResource;
   LIST_ENTRY ShortNameList;
+  FILE_LOCK FileLock;
 } FCB, *PFCB;
 
 
@@ -231,38 +238,69 @@ typedef struct _CCB
   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,
@@ -289,30 +327,47 @@ CdfsDeviceIoControl (IN PDEVICE_OBJECT DeviceObject,
 
 /* 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 */
 
@@ -384,32 +439,35 @@ CdfsGetFCBForFile(PDEVICE_EXTENSION Vcb,
 
 /* 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,
@@ -425,55 +483,43 @@ CdfsFileFlagsToAttributes(PFCB Fcb,
 
 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 */