ReactOS Fundraising Campaign 2012
 
€ 3,873 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

fatstruc.h
Go to the documentation of this file.
00001 #pragma once
00002 
00003 typedef struct _FAT_SCAN_CONTEXT *PFAT_SCAN_CONTEXT;
00004 typedef struct _FAT_IO_CONTEXT *PFAT_IO_CONTEXT;
00005 typedef struct _FAT_IRP_CONTEXT *PFAT_IRP_CONTEXT;
00006 typedef PVOID PBCB;
00007 
00008 typedef NTSTATUS (*PFAT_OPERATION_HANDLER) (PFAT_IRP_CONTEXT);
00009 
00010 /* Node type stuff */
00011 typedef CSHORT FAT_NODE_TYPE;
00012 typedef FAT_NODE_TYPE *PFAT_NODE_TYPE;
00013 
00014 #define FatNodeType(Ptr) (*((PFAT_NODE_TYPE)(Ptr)))
00015 
00016 /* Node type codes */
00017 #define FAT_NTC_VCB         (CSHORT) '00VF'
00018 #define FAT_NTC_FCB         (CSHORT)   'CF'
00019 #define FAT_NTC_DCB         (CSHORT)   'DF'
00020 #define FAT_NTC_ROOT_DCB    (CSHORT)  'RFD'
00021 #define FAT_NTC_CCB         (CSHORT)  'BCC'
00022 #define FAT_NTC_IRP_CONTEXT (CSHORT)  'PRI'
00023 
00024 typedef struct _FAT_GLOBAL_DATA
00025 {
00026     ERESOURCE Resource;
00027     PEPROCESS SystemProcess;
00028     PDRIVER_OBJECT DriverObject;
00029     PDEVICE_OBJECT DiskDeviceObject;
00030     LIST_ENTRY VcbListHead;
00031     NPAGED_LOOKASIDE_LIST NonPagedFcbList;
00032     NPAGED_LOOKASIDE_LIST ResourceList;
00033     NPAGED_LOOKASIDE_LIST IrpContextList;
00034     FAST_IO_DISPATCH FastIoDispatch;
00035     CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
00036     CACHE_MANAGER_CALLBACKS CacheMgrNoopCallbacks;
00037     BOOLEAN Win31FileSystem;
00038     BOOLEAN ShutdownStarted;
00039     /* Jan 1, 1980 System Time */
00040     LARGE_INTEGER DefaultFileTime;
00041 
00042     /* Queued close */
00043     ULONG AsyncCloseCount;
00044     ULONG DelayedCloseCount;
00045     LIST_ENTRY AsyncCloseList;
00046     LIST_ENTRY DelayedCloseList;
00047     PIO_WORKITEM FatCloseItem;
00048 
00049     /* Various flags */
00050     BOOLEAN AsyncCloseActive;
00051 
00052     /* FullFAT integration */
00053     FF_IOMAN *Ioman;
00054     FF_ERROR FF_Error;
00055 } FAT_GLOBAL_DATA;
00056 
00057 typedef struct _FAT_PAGE_CONTEXT
00058 {
00059     PFILE_OBJECT FileObject;
00060     LARGE_INTEGER EndOfData;
00061     LARGE_INTEGER Offset;
00062     LARGE_INTEGER EndOfPage;
00063     SIZE_T ValidLength;
00064     PVOID Buffer;
00065     PBCB Bcb;
00066     BOOLEAN CanWait;
00067 } FAT_PAGE_CONTEXT, *PFAT_PAGE_CONTEXT;
00068 
00069 #define FatPinSetupContext(xContext, xFcb, CanWait)     \
00070 {                                                       \
00071     (xContext)->FileObject = (xFcb)->StreamFileObject;  \
00072     (xContext)->EndOfData = (xFcb)->Header.FileSize;    \
00073     (xContext)->Offset.QuadPart = -1LL;                 \
00074     (xContext)->Bcb = NULL;                             \
00075     (xContext)->CanWait = CanWait;                      \
00076 }
00077 
00078 #define FatPinCleanupContext(xContext)                  \
00079     if ((xContext)->Bcb != NULL) {                      \
00080         CcUnpinData((xContext)->Bcb);                   \
00081         (xContext)->Bcb = NULL;                         \
00082     }                                                   \
00083 
00084 #define FatPinEndOfPage(xContext, xType) \
00085     Add2Ptr((xContext)->Buffer, (xContext)->ValidLength, xType)
00086 
00087 #define FatPinIsLastPage(xContext) \
00088     ((xContext)->ValidLength != PAGE_SIZE)
00089 
00090 #define IRPCONTEXT_CANWAIT          0x0001
00091 #define IRPCONTEXT_PENDINGRETURNED  0x0002
00092 #define IRPCONTEXT_STACK_IO_CONTEXT 0x0004
00093 #define IRPCONTEXT_WRITETHROUGH     0x0008
00094 #define IRPCONTEXT_TOPLEVEL         0x0010
00095 
00096 typedef struct _FAT_IRP_CONTEXT
00097 {
00098     /*  Type and size of this record (must be FAT_NTC_IRP_CONTEXT) */
00099     FAT_NODE_TYPE NodeTypeCode;
00100     CSHORT NodeByteSize;
00101 
00102     PIRP Irp;
00103     PDEVICE_OBJECT DeviceObject;
00104     UCHAR MajorFunction;
00105     UCHAR MinorFunction;
00106     PFILE_OBJECT FileObject;
00107     ULONG Flags;
00108     struct _VCB *Vcb;
00109     ULONG PinCount;
00110     FAT_PAGE_CONTEXT Page;
00111     struct _FAT_IO_CONTEXT *FatIoContext;
00112     WORK_QUEUE_ITEM WorkQueueItem;
00113     PFAT_OPERATION_HANDLER QueuedOperationHandler;
00114     PIO_STACK_LOCATION Stack;
00115     KEVENT Event;
00116 } FAT_IRP_CONTEXT;
00117 
00118 typedef struct _FAT_IO_CONTEXT
00119 {
00120     PMDL ZeroMdl;
00121     PIRP Irp;
00122     LONG RunCount;
00123     SIZE_T Length;
00124     LONGLONG Offset;
00125     PFILE_OBJECT FileObject;
00126 
00127     union
00128     {
00129         struct
00130         {
00131             PERESOURCE Resource;
00132             PERESOURCE PagingIoResource;
00133             ERESOURCE_THREAD ResourceThreadId;
00134         } Async;
00135         KEVENT SyncEvent;
00136     } Wait;
00137     PIRP AssociatedIrp[0];
00138 } FAT_IO_CONTEXT;
00139 
00140 typedef ULONG (*PFAT_SCANFAT_FOR_CONTINOUS_RUN_ROUTINE) (PFAT_PAGE_CONTEXT, PULONG, BOOLEAN);
00141 typedef ULONG (*PFAT_SETFAT_CONTINOUS_RUN_ROUTINE) (PFAT_PAGE_CONTEXT, ULONG, ULONG, BOOLEAN);
00142 typedef ULONG (*PFAT_SCANFAT_FOR_VALUE_RUN_ROUTINE) (PFAT_PAGE_CONTEXT, PULONG, ULONG, BOOLEAN);
00143 typedef ULONG (*PFAT_SETFAT_VALUE_RUN_ROUTINE) (PFAT_PAGE_CONTEXT, ULONG, ULONG, ULONG, BOOLEAN);
00144 
00145 typedef struct _FAT_METHODS {
00146     PFAT_SCANFAT_FOR_CONTINOUS_RUN_ROUTINE ScanContinousRun;
00147     PFAT_SETFAT_CONTINOUS_RUN_ROUTINE SetContinousRun;
00148     PFAT_SCANFAT_FOR_VALUE_RUN_ROUTINE ScanValueRun;
00149     PFAT_SETFAT_VALUE_RUN_ROUTINE SetValueRun;
00150 } FAT_METHODS, *PFAT_METHODS;
00151 
00152 #define VCB_STATE_FLAG_LOCKED               0x001
00153 #define VCB_STATE_FLAG_DIRTY                0x002
00154 #define VCB_STATE_MOUNTED_DIRTY             0x004
00155 #define VCB_STATE_CREATE_IN_PROGRESS        0x008
00156 #define VCB_STATE_FLAG_CLOSE_IN_PROGRESS    0x010
00157 #define VCB_STATE_FLAG_DELETED_FCB          0x020
00158 #define VCB_STATE_FLAG_DISMOUNT_IN_PROGRESS 0x040
00159 #define VCB_STATE_FLAG_DEFERRED_FLUSH       0x080
00160 #define VCB_STATE_FLAG_WRITE_PROTECTED      0x100
00161 
00162 typedef enum _VCB_CONDITION
00163 {
00164     VcbGood,
00165     VcbNotMounted,
00166     VcbBad
00167 } VCB_CONDITION;
00168 
00169 /* Volume Control Block */
00170 typedef struct _VCB
00171 {
00172     FSRTL_ADVANCED_FCB_HEADER Header;
00173     FAST_MUTEX HeaderMutex;
00174     SECTION_OBJECT_POINTERS SectionObjectPointers;
00175 
00176     PFILE_OBJECT StreamFileObject;
00177     PDEVICE_OBJECT TargetDeviceObject;
00178     LIST_ENTRY VcbLinks;
00179     PVPB Vpb;
00180     ULONG State;
00181     VCB_CONDITION Condition;
00182     ERESOURCE Resource;
00183     struct _CLOSE_CONTEXT *CloseContext;
00184     LIST_ENTRY AsyncCloseList;
00185     LIST_ENTRY DelayedCloseList;
00186 
00187     /* Direct volume access */
00188     SHARE_ACCESS ShareAccess;
00189     PFILE_OBJECT FileObjectWithVcbLocked;
00190 
00191     /* Notifications support */
00192     PNOTIFY_SYNC NotifySync;
00193     LIST_ENTRY NotifyList;
00194 
00195     /*  Volume Characteristics: */
00196     ULONG SerialNumber;
00197     BIOS_PARAMETER_BLOCK Bpb;
00198     ULONG BytesPerClusterLog;
00199     ULONG BytesPerCluster;
00200     ULONG SectorsPerFat;
00201     ULONG DataArea;
00202     ULONG Sectors;
00203     ULONG Clusters;
00204     ULONG IndexDepth;
00205     ULONG RootDirent;
00206     ULONG RootDirentSectors;
00207     LONGLONG BeyondLastClusterInFat;
00208     FAT_METHODS Methods;
00209 
00210     /*  Root Directory Control block */
00211     struct _FCB *RootDcb;
00212 
00213     /* Counters */
00214     ULONG DirectOpenCount;
00215     ULONG OpenFileCount;
00216     ULONG ReadOnlyCount;
00217     ULONG InternalOpenCount;
00218     ULONG ResidualOpenCount;
00219     ULONG DirectAccessOpenCount;
00220     ULONG MediaChangeCount;
00221 
00222     /* FullFAT integration */
00223     FF_IOMAN *Ioman;
00224 } VCB, *PVCB;
00225 
00226 #define VcbToVolumeDeviceObject(xVcb) \
00227     CONTAINING_RECORD((xVcb), VOLUME_DEVICE_OBJECT, Vcb))
00228 
00229 #define VcbToDeviceObject(xVcb) \
00230     &(VcbToVolumeDeviceObject(xVcb)->DeviceObject)
00231 
00232 
00233 #define SectorsToBytes(xVcb, xSectrors) \
00234     ((xVcb)->Bpb.BytesPerSector * (xSectrors))
00235 
00236 #define BytesToSectors(xVcb, xBytes) \
00237     ((xBytes + (xVcb)->Bpb.BytesPerSector - 1) / (xVcb)->Bpb.BytesPerSector)
00238 
00239 #define SectorsToClusters(xVcb, xSectors) \
00240     ((xSectors + (xVcb)->Bpb.SectorsPerCluster - 1) / (xVcb)->Bpb.SectorsPerCluster)
00241 
00242 #define VCB_FAT_BITMAP_SIZE             0x10000
00243 #define VcbFatBitmapIndex(xCluster)     ((xCluster)/VCB_FAT_BITMAP_SIZE)
00244 
00245 /* Volume Device Object */
00246 typedef struct _VOLUME_DEVICE_OBJECT
00247 {
00248     DEVICE_OBJECT DeviceObject;
00249     union {
00250         FSRTL_COMMON_FCB_HEADER VolumeHeader;
00251         VCB Vcb; /* Must be the last entry! */
00252     };
00253 } VOLUME_DEVICE_OBJECT, *PVOLUME_DEVICE_OBJECT;
00254 
00255 typedef enum _TYPE_OF_OPEN
00256 {
00257     UnopenedFileObject,
00258     UserFileOpen,
00259     UserDirectoryOpen,
00260     UserVolumeOpen,
00261     VirtualVolumeFile,
00262     DirectoryFile,
00263     EaFile
00264 } TYPE_OF_OPEN;
00265 
00266 //
00267 //  Short name always exists in FAT
00268 //
00269 enum _FCB_NAME_TYPE {
00270     FcbShortName = 0x0,
00271     FcbLongName
00272 } FCB_NAME_TYPE;
00273 
00274 typedef struct _FCB_NAME_LINK {
00275     struct _FCB *Fcb;
00276     RTL_SPLAY_LINKS Links;
00277     union
00278     {
00279         OEM_STRING Ansi;
00280         UNICODE_STRING String;
00281     } Name;
00282     BOOLEAN IsDosName;
00283 } FCB_NAME_LINK, *PFCB_NAME_LINK;
00284 
00285 typedef enum _FCB_CONDITION
00286 {
00287     FcbGood,
00288     FcbBad,
00289     FcbNeedsToBeVerified
00290 } FCB_CONDITION;
00291 
00292 #define FCB_STATE_HAS_NAMES         0x01
00293 #define FCB_STATE_HAS_UNICODE_NAME  0x02
00294 #define FCB_STATE_PAGEFILE          0x04
00295 #define FCB_STATE_DELAY_CLOSE       0x08
00296 #define FCB_STATE_TRUNCATE_ON_CLOSE 0x10
00297 #define FCB_STATE_DELETE_ON_CLOSE   0x20
00298 
00299 typedef struct _FCB
00300 {
00301     FSRTL_ADVANCED_FCB_HEADER Header;
00302    /*
00303     * Later we might want to move the next four fields
00304     * into a separate structureif we decide to split
00305     * FCB into paged and non paged parts
00306     * (as it is done in MS implementation
00307     */
00308     FAST_MUTEX HeaderMutex; // nonpaged!
00309     SECTION_OBJECT_POINTERS SectionObjectPointers;
00310     ERESOURCE Resource; // nonpaged!
00311     ERESOURCE PagingIoResource; // nonpaged!
00312 
00313     /* First cluster in the fat allocation chain */
00314     ULONG FirstClusterOfFile;
00315     /* A list of all FCBs of that DCB */
00316     LIST_ENTRY ParentDcbLinks;
00317     /* Reference to the Parent Dcb*/
00318     struct _FCB *ParentFcb;
00319     /* Pointer to a Vcb */
00320     PVCB Vcb;
00321     /* Fcb state */
00322     ULONG State;
00323     /* Fcb condition */
00324     FCB_CONDITION Condition;
00325     /* Share access */
00326     SHARE_ACCESS ShareAccess;
00327     ULONG FirstCluster;
00328     /* Links into FCB Tree */
00329     FCB_NAME_LINK ShortName;
00330     FCB_NAME_LINK LongName;
00331     /* Buffer for the short name */
00332     CHAR ShortNameBuffer[0xc];
00333     /* Full file name */
00334     UNICODE_STRING FullFileName;
00335     /* Long name with exact case */
00336     UNICODE_STRING ExactCaseLongName;
00337     /* Hint for the filename length */
00338     ULONG FileNameLength;
00339     /* A copy of fat attribute byte */
00340     UCHAR DirentFatFlags;
00341     /* File basic info */
00342     FILE_BASIC_INFORMATION BasicInfo;
00343     /* FullFAT file handle */
00344     FF_FILE *FatHandle;
00345     /* The file has outstanding async writes */
00346     ULONG OutstandingAsyncWrites;
00347     /* The outstanding async writes sync event */
00348     PKEVENT OutstandingAsyncEvent;
00349     /* Counters */
00350     ULONG OpenCount;
00351     ULONG UncleanCount;
00352     ULONG NonCachedUncleanCount;
00353     union
00354     {
00355         struct
00356         {
00357             /* File and Op locks */
00358             FILE_LOCK Lock;
00359             OPLOCK Oplock;
00360         } Fcb;
00361 
00362         struct
00363         {
00364             LIST_ENTRY ParentDcbList; /* A list of all FCBs/DCBs opened under this DCB */
00365             ULONG DirectoryFileOpenCount; /* Sector-based access to the dir */
00366             PFILE_OBJECT DirectoryFile;
00367             /* Directory data stream (just handy to have it). */
00368             //PFILE_OBJECT StreamFileObject;
00369             /* Names */
00370             PRTL_SPLAY_LINKS SplayLinksAnsi;
00371             PRTL_SPLAY_LINKS SplayLinksUnicode;
00372         } Dcb;
00373     };
00374 } FCB, *PFCB;
00375 
00376 typedef struct _FAT_ENUM_DIRENT_CONTEXT *PFAT_ENUM_DIRENT_CONTEXT;
00377 typedef struct _FAT_ENUM_DIR_CONTEXT *PFAT_ENUM_DIR_CONTEXT;
00378 
00379 typedef ULONG (*PFAT_COPY_DIRENT_ROUTINE) (PFAT_ENUM_DIR_CONTEXT, PDIR_ENTRY, PVOID);
00380 
00381 typedef struct _FAT_ENUM_DIRENT_CONTEXT
00382 {
00383     FAT_PAGE_CONTEXT Page;
00384 
00385     /* Copy dirent to dirinfo */
00386     PFAT_COPY_DIRENT_ROUTINE CopyDirent;
00387     LONGLONG BytesPerClusterMask;
00388 
00389     /* Info buffer characteristics */
00390     PVOID Buffer;
00391     SIZE_T Offset;
00392     SIZE_T Length;
00393 
00394     /* Criteria */
00395     PUNICODE_STRING FileName;
00396     UCHAR CcbFlags;
00397 
00398     /* Lfn buffer/length offsets */
00399     ULONG LengthOffset;
00400     ULONG NameOffset;
00401 } FAT_ENUM_DIRENT_CONTEXT;
00402 
00403 typedef struct _FAT_FIND_DIRENT_CONTEXT
00404 {
00405     FAT_PAGE_CONTEXT Page;
00406     UNICODE_STRING ShortName;
00407     WCHAR ShortNameBuffer[0x18];
00408     /* Criteria */
00409     PUNICODE_STRING FileName;
00410     BOOLEAN Valid8dot3Name;
00411 } FAT_FIND_DIRENT_CONTEXT, *PFAT_FIND_DIRENT_CONTEXT;
00412 
00413 typedef struct _CLOSE_CONTEXT
00414 {
00415     LIST_ENTRY GlobalLinks;
00416     LIST_ENTRY VcbLinks;
00417 
00418     PVCB Vcb;
00419     PFCB Fcb;
00420     TYPE_OF_OPEN TypeOfOpen;
00421     BOOLEAN Free;
00422 } CLOSE_CONTEXT, *PCLOSE_CONTEXT;
00423 
00424 typedef struct _CCB
00425 {
00426     CSHORT NodeTypeCode;
00427     CSHORT NodeByteSize;
00428 
00429     LARGE_INTEGER CurrentByteOffset;
00430     ULONG Entry;
00431     UNICODE_STRING SearchPattern;
00432     UCHAR Flags;
00433     CLOSE_CONTEXT CloseContext;
00434 } CCB, *PCCB;
00435 
00436 typedef enum _FILE_TIME_INDEX
00437 {
00438     FileCreationTime = 0,
00439     FileLastAccessTime,
00440     FileLastWriteTime,
00441     FileChangeTime
00442 } FILE_TIME_INDEX;
00443 
00444 #define CCB_SEARCH_RETURN_SINGLE_ENTRY      0x01
00445 #define CCB_SEARCH_PATTERN_LEGAL_8DOT3      0x02
00446 #define CCB_SEARCH_PATTERN_HAS_WILD_CARD    0x04
00447 #define CCB_DASD_IO                         0x08
00448 #define CCB_READ_ONLY                       0x10
00449 #define CCB_DELETE_ON_CLOSE                 0x20
00450 #define CCB_COMPLETE_DISMOUNT               0x40
00451 #define CCB_CLOSE_CONTEXT                   0x80
00452 
00453 extern FAT_GLOBAL_DATA FatGlobalData;

Generated on Sat May 19 2012 04:25:34 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.