25#define FAT_IS_END_CLUSTER(clnumber) \
26 (((Volume->FatType == FAT12) && (clnumber >= 0xff8)) || \
27 ((Volume->FatType == FAT16 || Volume->FatType == FATX16) && (clnumber >= 0xfff8)) || \
28 ((Volume->FatType == FAT32 || Volume->FatType == FATX32) && (clnumber >= 0x0ffffff8)))
30#define TAG_FAT_CHAIN 'CtaT'
31#define TAG_FAT_FILE 'FtaF'
32#define TAG_FAT_VOLUME 'VtaF'
33#define TAG_FAT_BUFFER 'BtaF'
34#define TAG_FAT_CACHE 'HtaF'
36#define FAT_MAX_CACHE_SIZE (256 * 1024)
63 SW(
Obj, BytesPerSector);
64 SW(
Obj, ReservedSectors);
65 SW(
Obj, RootDirEntries);
66 SW(
Obj, TotalSectors);
67 SW(
Obj, SectorsPerFat);
70 SD(
Obj, HiddenSectors);
71 SD(
Obj, TotalSectorsBig);
72 SD(
Obj, VolumeSerialNumber);
73 SW(
Obj, BootSectorMagic);
78 SW(
Obj, BytesPerSector);
79 SW(
Obj, ReservedSectors);
80 SW(
Obj, RootDirEntries);
81 SW(
Obj, TotalSectors);
82 SW(
Obj, SectorsPerFat);
84 SD(
Obj, HiddenSectors);
85 SD(
Obj, TotalSectorsBig);
86 SD(
Obj, SectorsPerFatBig);
87 SW(
Obj, ExtendedFlags);
88 SW(
Obj, FileSystemVersion);
89 SD(
Obj, RootDirStartCluster);
92 SD(
Obj, VolumeSerialNumber);
93 SW(
Obj, BootSectorMagic);
98 SD(
Obj, VolumeSerialNumber);
99 SD(
Obj, SectorsPerCluster);
100 SW(
Obj, NumberOfFats);
107 SW(
Obj, LastAccessDate);
108 SW(
Obj, ClusterHigh);
118 SW(
Obj, StartCluster);
119 for(
i = 0;
i < 5;
i++)
121 for(
i = 0;
i < 6;
i++)
123 for(
i = 0;
i < 2;
i++)
129 SD(
Obj, StartCluster);
135 SW(
Obj, LastAccessTime);
136 SW(
Obj, LastAccessDate);
157 return ((
Volume->TotalSectors -
Volume->DataSectorStart) /
Volume->SectorsPerCluster);
168 TRACE(
"FatOpenVolume() DeviceId = %d\n",
Volume->DeviceId);
181 TRACE(
"Dumping boot sector:\n");
191 TRACE(
"Unknown: 0x%x\n", FatXVolumeBootSector->
Unknown);
201 TRACE(
"JumpBoot: 0x%x 0x%x 0x%x\n", Fat32VolumeBootSector->
JumpBoot[0], Fat32VolumeBootSector->
JumpBoot[1], Fat32VolumeBootSector->
JumpBoot[2]);
202 TRACE(
"OemName: %c%c%c%c%c%c%c%c\n", Fat32VolumeBootSector->
OemName[0], Fat32VolumeBootSector->
OemName[1], Fat32VolumeBootSector->
OemName[2], Fat32VolumeBootSector->
OemName[3], Fat32VolumeBootSector->
OemName[4], Fat32VolumeBootSector->
OemName[5], Fat32VolumeBootSector->
OemName[6], Fat32VolumeBootSector->
OemName[7]);
219 TRACE(
"FsInfo: %d\n", Fat32VolumeBootSector->
FsInfo);
226 TRACE(
"VolumeLabel: %c%c%c%c%c%c%c%c%c%c%c\n", Fat32VolumeBootSector->
VolumeLabel[0], Fat32VolumeBootSector->
VolumeLabel[1], Fat32VolumeBootSector->
VolumeLabel[2], Fat32VolumeBootSector->
VolumeLabel[3], Fat32VolumeBootSector->
VolumeLabel[4], Fat32VolumeBootSector->
VolumeLabel[5], Fat32VolumeBootSector->
VolumeLabel[6], Fat32VolumeBootSector->
VolumeLabel[7], Fat32VolumeBootSector->
VolumeLabel[8], Fat32VolumeBootSector->
VolumeLabel[9], Fat32VolumeBootSector->
VolumeLabel[10]);
236 TRACE(
"OemName: %c%c%c%c%c%c%c%c\n", FatVolumeBootSector->
OemName[0], FatVolumeBootSector->
OemName[1], FatVolumeBootSector->
OemName[2], FatVolumeBootSector->
OemName[3], FatVolumeBootSector->
OemName[4], FatVolumeBootSector->
OemName[5], FatVolumeBootSector->
OemName[6], FatVolumeBootSector->
OemName[7]);
253 TRACE(
"VolumeLabel: %c%c%c%c%c%c%c%c%c%c%c\n", FatVolumeBootSector->
VolumeLabel[0], FatVolumeBootSector->
VolumeLabel[1], FatVolumeBootSector->
VolumeLabel[2], FatVolumeBootSector->
VolumeLabel[3], FatVolumeBootSector->
VolumeLabel[4], FatVolumeBootSector->
VolumeLabel[5], FatVolumeBootSector->
VolumeLabel[6], FatVolumeBootSector->
VolumeLabel[7], FatVolumeBootSector->
VolumeLabel[8], FatVolumeBootSector->
VolumeLabel[9], FatVolumeBootSector->
VolumeLabel[10]);
263 sprintf(
ErrMsg,
"Invalid boot sector magic (expected 0xaa55 found 0x%x)",
276 FileSystemError(
"This file system has cluster sizes bigger than 64k.\nFreeLoader does not support this.");
338 Volume->ActiveFatSectorStart =
354 FileSystemError(
"FreeLoader is too old to work with this FAT32 filesystem.\nPlease update FreeLoader.");
361 TRACE(
"FAT cache is %d sectors, %d bytes\n",
Volume->FatCacheSize,
Volume->FatCacheSize *
Volume->BytesPerSector);
371 if (!
Volume->FatCacheIndex)
388 for (
i = 0;
i <
Volume->FatCacheSize;
i++)
398 ULONG RootDirSectors;
399 ULONG DataSectorCount;
402 ULONG CountOfClusters;
409 if (CountOfClusters < 65525)
433 if (CountOfClusters < 4085)
438 else if (CountOfClusters < 65525)
467 TRACE(
"FatBufferDirectory() DirectoryStartCluster = %d RootDirectory = %s\n", DirectoryStartCluster, (
RootDirectory ?
"TRUE" :
"FALSE"));
475 DirectoryStartCluster =
Volume->RootDirStartCluster;
490 TRACE(
"Found cached buffer\n");
492 return DirectoryBuffer->
Data;
501 *DirectorySize =
Volume->RootDirSectors *
Volume->BytesPerSector;
511 TRACE(
"Trying to allocate (DirectorySize) %d bytes.\n", *DirectorySize);
515 if (DirectoryBuffer ==
NULL)
546 return DirectoryBuffer->
Data;
553 CHAR LfnNameBuffer[265];
554 CHAR ShortNameBuffer[20];
561 EntryCount = DirectorySize /
sizeof(
DIRENTRY);
563 TRACE(
"FatSearchDirectoryBufferForFile() DirectoryBuffer = 0x%x EntryCount = %d FileName = %s\n", DirectoryBuffer, EntryCount,
FileName);
568 for (CurrentEntry=0; CurrentEntry<EntryCount; CurrentEntry++, DirectoryBuffer = ((
PDIRENTRY)DirectoryBuffer)+1)
572 OurDirEntry = *((
PDIRENTRY) DirectoryBuffer);
592 if (
DirEntry->FileName[0] ==
'\xE5')
623 if (LfnDirEntry->
Name0_4[0] != 0xFFFF)
627 if (LfnDirEntry->
Name0_4[1] != 0xFFFF)
631 if (LfnDirEntry->
Name0_4[2] != 0xFFFF)
635 if (LfnDirEntry->
Name0_4[3] != 0xFFFF)
639 if (LfnDirEntry->
Name0_4[4] != 0xFFFF)
643 if (LfnDirEntry->
Name5_10[0] != 0xFFFF)
647 if (LfnDirEntry->
Name5_10[1] != 0xFFFF)
651 if (LfnDirEntry->
Name5_10[2] != 0xFFFF)
655 if (LfnDirEntry->
Name5_10[3] != 0xFFFF)
659 if (LfnDirEntry->
Name5_10[4] != 0xFFFF)
663 if (LfnDirEntry->
Name5_10[5] != 0xFFFF)
725 TRACE(
"MSDOS Directory Entry:\n");
726 TRACE(
"FileName[11] = %c%c%c%c%c%c%c%c%c%c%c\n",
740 TRACE(
"StartCluster = 0x%x\n", StartCluster);
765 TRACE(
"FatXSearchDirectoryBufferForFile() DirectoryBuffer = 0x%x EntryCount = %d FileName = %s\n", DirectoryBuffer, EntryCount,
FileName);
769 for (CurrentEntry = 0; CurrentEntry < EntryCount; CurrentEntry++, DirectoryBuffer = ((
PFATX_DIRENTRY)DirectoryBuffer)+1)
793 TRACE(
"FATX Directory Entry:\n");
820 ULONG NumberOfPathParts;
823 PVOID DirectoryBuffer;
824 ULONG DirectoryStartCluster = 0;
845 for (
i=0;
i<NumberOfPathParts;
i++)
864 if (DirectoryBuffer ==
NULL)
891 if ((
i+1) < NumberOfPathParts)
904 RtlCopyMemory(FatFileInfoPointer, &FatFileInfo,
sizeof(FatFileInfo));
982 UINT32 SectorNumAbsolute =
Volume->ActiveFatSectorStart + FatSectorNumber;
983 UINT32 CacheIndex = FatSectorNumber %
Volume->FatCacheSize;
985 ASSERT(FatSectorNumber < Volume->SectorsPerFat);
988 if (
Volume->FatCacheIndex[CacheIndex] != SectorNumAbsolute)
998 for (
i = 0;
i < SectorsToRead;
i++)
1000 Volume->FatCacheIndex[CacheIndex +
i] = SectorNumAbsolute +
i;
1003 TRACE(
"FAT cache miss: read sector 0x%x from disk\n", SectorNumAbsolute);
1007 TRACE(
"FAT cache hit: sector 0x%x present\n", SectorNumAbsolute);
1010 return &
Volume->FatCache[CacheIndex *
Volume->BytesPerSector];
1020 UINT32 FatOffset, ThisFatSecNum, ThisFatEntOffset,
fat;
1023 TRACE(
"FatGetFatEntry() Retrieving FAT entry for cluster %d.\n", Cluster);
1029 FatOffset = Cluster + (Cluster / 2);
1030 ThisFatSecNum = FatOffset /
Volume->BytesPerSector;
1031 ThisFatEntOffset = (FatOffset %
Volume->BytesPerSector);
1033 TRACE(
"FatOffset: %d\n", FatOffset);
1034 TRACE(
"ThisFatSecNum: %d\n", ThisFatSecNum);
1035 TRACE(
"ThisFatEntOffset: %d\n", ThisFatEntOffset);
1051 if (Cluster & 0x0001)
1061 FatOffset = (Cluster * 2);
1062 ThisFatSecNum = FatOffset /
Volume->BytesPerSector;
1063 ThisFatEntOffset = (FatOffset %
Volume->BytesPerSector);
1079 FatOffset = (Cluster * 4);
1080 ThisFatSecNum = FatOffset /
Volume->BytesPerSector;
1081 ThisFatEntOffset = (FatOffset %
Volume->BytesPerSector);
1096 ERR(
"Unknown FAT type %d\n",
Volume->FatType);
1100 TRACE(
"FAT entry is 0x%x.\n",
fat);
1102 *ClusterPointer =
fat;
1110 ULONG ClusterCount = 0;
1112 TRACE(
"FatCountClustersInChain() StartCluster = %d\n", StartCluster);
1138 TRACE(
"FatCountClustersInChain() ClusterCount = %d\n", ClusterCount);
1140 return ClusterCount;
1146 UINT32 StartClusterNumber,
1152 UINT32 NextClusterNumber;
1153 UINT32 ClustersToRead = 1;
1154 UINT32 PrevClusterNumber = StartClusterNumber;
1155 UINT32 ClusterStartSector = ((PrevClusterNumber - 2) *
Volume->SectorsPerCluster) +
Volume->DataSectorStart;
1158 *LastClusterNumber = 0;
1166 while (!
FAT_IS_END_CLUSTER(NextClusterNumber) && ClustersToRead < MaxClusters && (NextClusterNumber == PrevClusterNumber + 1))
1169 PrevClusterNumber = NextClusterNumber;
1181 *ClustersRead = ClustersToRead;
1182 *LastClusterNumber = NextClusterNumber;
1194 UINT32 ClustersRead, NextClusterNumber, ClustersLeft = NumberOfClusters;
1196 TRACE(
"FatReadClusterChain() StartClusterNumber = %d NumberOfClusters = %d Buffer = 0x%x\n", StartClusterNumber, NumberOfClusters,
Buffer);
1198 ASSERT(NumberOfClusters > 0);
1202 ClustersLeft -= ClustersRead;
1204 StartClusterNumber = NextClusterNumber;
1207 if (LastClusterNumber)
1209 *LastClusterNumber = NextClusterNumber;
1212 return (ClustersRead > 0);
1221 ULONG ClusterStartSector;
1228 ClusterStartSector = ((ClusterNumber - 2) *
Volume->SectorsPerCluster) +
Volume->DataSectorStart;
1266 UINT32 NextClusterNumber, BytesPerCluster;
1268 TRACE(
"FatReadFile() BytesToRead = %d Buffer = 0x%x\n", BytesToRead,
Buffer);
1321 BytesPerCluster =
Volume->SectorsPerCluster *
Volume->BytesPerSector;
1333 UINT32 LengthInCluster =
min(BytesToRead, BytesPerCluster - OffsetInCluster);
1335 ASSERT(LengthInCluster <= BytesPerCluster && LengthInCluster > 0);
1348 BytesToRead -= LengthInCluster;
1353 if ((LengthInCluster + OffsetInCluster) == BytesPerCluster)
1368 if (BytesToRead > 0)
1373 UINT32 NumberOfClusters = BytesToRead / BytesPerCluster;
1375 TRACE(
"Going to read: %u clusters\n", NumberOfClusters);
1377 if (NumberOfClusters > 0)
1379 UINT32 BytesReadHere = NumberOfClusters * BytesPerCluster;
1392 BytesToRead -= BytesReadHere;
1406 if (BytesToRead > 0)
1443 TRACE(
"FatReadVolumeSectors() Failed to seek\n");
1453 TRACE(
"FatReadVolumeSectors() Failed to read\n");
1486 TRACE(
"FatGetFileInformation(%lu) -> FileSize = %lu, FilePointer = 0x%lx\n",
1507 TRACE(
"FatOpen() FileName = %s\n",
Path);
1570 TRACE(
"FatSeek() NewPosition = %u, OldPointer = %u, SeekMode = %d\n", NewPosition.
LowPart,
FileHandle->FilePointer, SeekMode);
1576 TRACE(
"FatSeek() OldClusterIdx: %u, NewClusterIdx: %u\n", OldClusterIdx, NewClusterIdx);
1578 if (NewClusterIdx != OldClusterIdx)
1580 UINT32 CurrentClusterIdx, ClusterNumber;
1582 if (NewClusterIdx > OldClusterIdx)
1584 CurrentClusterIdx = OldClusterIdx;
1589 CurrentClusterIdx = 0;
1593 for (; CurrentClusterIdx < NewClusterIdx; CurrentClusterIdx++)
1658 TRACE(
"Enter FatMount(%lu)\n", DeviceId);
1712 Volume->DeviceId = DeviceId;
1731 TRACE(
"FatMount(%lu) success\n", DeviceId);
PRTL_UNICODE_STRING_BUFFER Path
ACPI_SIZE strlen(const char *String)
int strncmp(const char *String1, const char *String2, ACPI_SIZE Count)
#define ReadBuffer(BaseIoAddress, Buffer, Count)
NTSTATUS FatMount(_In_ ULONG DeviceId, _In_ ULONG Unknown, _Out_ PBL_FILE_ENTRY *FileEntry)
ULONG PartitionSectorCount
#define DBG_DEFAULT_CHANNEL(ch)
struct FATX_DIRENTRY * PFATX_DIRENTRY
#define FAT_ATTR_LONG_NAME
#define FAT_ATTR_READONLY
struct _FATX_BOOTSECTOR * PFATX_BOOTSECTOR
struct DIRENTRY * PDIRENTRY
#define FAT_ATTR_VOLUMENAME
#define FAT_ATTR_DIRECTORY
struct LFN_DIRENTRY * PLFN_DIRENTRY
ARC_STATUS ArcGetFileInformation(ULONG FileId, FILEINFORMATION *Information)
ARC_STATUS ArcSeek(ULONG FileId, LARGE_INTEGER *Position, SEEKMODE SeekMode)
PVOID FsGetDeviceSpecific(ULONG FileId)
ULONG FsGetNumPathParts(PCSTR Path)
VOID FsSetDeviceSpecific(ULONG FileId, PVOID Specific)
VOID FileSystemError(PCSTR ErrorString)
ULONG FsGetDeviceId(ULONG FileId)
ARC_STATUS ArcRead(ULONG FileId, VOID *Buffer, ULONG N, ULONG *Count)
VOID FsGetFirstNameFromPath(PCHAR Buffer, PCSTR Path)
VOID FrLdrTempFree(PVOID Allocation, ULONG Tag)
PVOID FrLdrTempAlloc(_In_ SIZE_T Size, _In_ ULONG Tag)
static BOOLEAN FatSearchDirectoryBufferForFile(PFAT_VOLUME_INFO Volume, PVOID DirectoryBuffer, ULONG DirectorySize, PCHAR FileName, PFAT_FILE_INFO FatFileInfoPointer)
static PUCHAR FatGetFatSector(PFAT_VOLUME_INFO Volume, UINT32 FatSectorNumber)
Reads 1-4 sectors from FAT using the cache.
static BOOLEAN FatReadAdjacentClusters(PFAT_VOLUME_INFO Volume, UINT32 StartClusterNumber, UINT32 MaxClusters, PVOID Buffer, PUINT32 ClustersRead, PUINT32 LastClusterNumber)
VOID FatSwapFatBootSector(PFAT_BOOTSECTOR Obj)
VOID FatSwapFat32BootSector(PFAT32_BOOTSECTOR Obj)
VOID FatSwapDirEntry(PDIRENTRY Obj)
ULONGLONG FatGetVolumeSize(_In_ ULONG DeviceId)
Returns the size of the FAT volume laid on the storage media device opened via DeviceId.
static BOOLEAN FatGetFatEntry(PFAT_VOLUME_INFO Volume, UINT32 Cluster, PUINT32 ClusterPointer)
VOID FatSwapFatXBootSector(PFATX_BOOTSECTOR Obj)
ARC_STATUS FatLookupFile(PFAT_VOLUME_INFO Volume, PCSTR FileName, PFAT_FILE_INFO FatFileInfoPointer)
static BOOLEAN FatReadClusterChain(PFAT_VOLUME_INFO Volume, UINT32 StartClusterNumber, UINT32 NumberOfClusters, PVOID Buffer, PUINT32 LastClusterNumber)
ULONG FatDetermineFatType(PFAT_BOOTSECTOR FatBootSector, ULONGLONG PartitionSectorCount)
struct _DIRECTORY_BUFFER DIRECTORY_BUFFER
static BOOLEAN FatReadFile(PFAT_FILE_INFO FatFileInfo, ULONG BytesToRead, ULONG *BytesRead, PVOID Buffer)
ARC_STATUS FatOpen(CHAR *Path, OPENMODE OpenMode, ULONG *FileId)
PVOID FatBufferDirectory(PFAT_VOLUME_INFO Volume, ULONG DirectoryStartCluster, ULONG *EntryCountPointer, BOOLEAN RootDirectory)
#define FAT_IS_END_CLUSTER(clnumber)
static ULONG FatCountClustersInChain(PFAT_VOLUME_INFO Volume, UINT32 StartCluster)
const DEVVTBL FatXFuncTable
static BOOLEAN FatXSearchDirectoryBufferForFile(PFAT_VOLUME_INFO Volume, PVOID DirectoryBuffer, ULONG DirectorySize, PCHAR FileName, PFAT_FILE_INFO FatFileInfoPointer)
VOID FatSwapLFNDirEntry(PLFN_DIRENTRY Obj)
struct _DIRECTORY_BUFFER * PDIRECTORY_BUFFER
ARC_STATUS FatSeek(ULONG FileId, LARGE_INTEGER *Position, SEEKMODE SeekMode)
BOOLEAN FatReadVolumeSectors(PFAT_VOLUME_INFO Volume, ULONG SectorNumber, ULONG SectorCount, PVOID Buffer)
BOOLEAN FatOpenVolume(PFAT_VOLUME_INFO Volume, PFAT_BOOTSECTOR BootSector, ULONGLONG PartitionSectorCount)
ARC_STATUS FatRead(ULONG FileId, VOID *Buffer, ULONG N, ULONG *Count)
PFAT_VOLUME_INFO FatVolumes[MAX_FDS]
VOID FatSwapFatXDirEntry(PFATX_DIRENTRY Obj)
#define FAT_MAX_CACHE_SIZE
const DEVVTBL FatFuncTable
ARC_STATUS FatGetFileInformation(ULONG FileId, FILEINFORMATION *Information)
struct _FAT_VOLUME_INFO FAT_VOLUME_INFO
void FatParseShortFileName(PCHAR Buffer, PDIRENTRY DirEntry)
LIST_ENTRY DirectoryBufferListHead
ARC_STATUS FatClose(ULONG FileId)
BOOLEAN FatReadPartialCluster(PFAT_VOLUME_INFO Volume, ULONG ClusterNumber, ULONG StartingOffset, ULONG Length, PVOID Buffer)
BOOL BackupBootSector(LPCTSTR lpszVolumeName)
#define SW(Object, Field)
#define SD(Object, Field)
_In_ PFCB _In_ LONGLONG StartingOffset
#define _strnicmp(_String1, _String2, _MaxCount)
#define FatNumberOfClusters(B)
#define InsertTailList(ListHead, Entry)
#define ROUND_UP(n, align)
struct _FileName FileName
_Must_inspect_result_ _In_opt_ PFLT_INSTANCE _Out_ PHANDLE FileHandle
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define RtlEqualMemory(dst, src, len)
static unsigned char * fat
static PLARGE_INTEGER Time
_In_ ULONG _In_ ULONG _In_ ULONG Length
static OUT PIO_STATUS_BLOCK OUT PVOID FileInformation
struct _FAT32_BOOTSECTOR * PFAT32_BOOTSECTOR
struct _FAT_BOOTSECTOR * PFAT_BOOTSECTOR
base of all file and directory entries
ULONG DirectoryStartCluster
ULONG RootDirStartCluster
CHAR FileName[RTL_FIELD_SIZE(FILEINFORMATION, FileName)]
ULONG ActiveFatSectorStart
ULONG RootDirStartCluster
struct _LIST_ENTRY * Flink
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define CONTAINING_RECORD(address, type, field)
static int Link(const char **args)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PLONGLONG _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_opt_ PULONG_PTR BytesRead
_In_ WDFREQUEST _In_ NTSTATUS _In_ ULONG_PTR Information
_In_ ULONG _In_ ULONG _In_ ULONG NumberOfHeads
_In_ ULONG _In_ ULONG SectorsPerTrack