Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenfatstruc.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
1.7.6.1
|