ReactOS  0.4.14-dev-593-g1793dcc
vfatlib.c File Reference
#include "vfatlib.h"
#include <debug.h>
Include dependency graph for vfatlib.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

NTSTATUS NTAPI VfatFormat (IN PUNICODE_STRING DriveRoot, IN FMIFS_MEDIA_FLAG MediaFlag, IN PUNICODE_STRING Label, IN BOOLEAN QuickFormat, IN ULONG ClusterSize, IN PFMIFSCALLBACK Callback)
 
VOID UpdateProgress (PFORMAT_CONTEXT Context, ULONG Increment)
 
VOID VfatPrintV (PCHAR Format, va_list args)
 
VOID VfatPrint (PCHAR Format,...)
 
NTSTATUS NTAPI VfatChkdsk (IN PUNICODE_STRING DriveRoot, IN BOOLEAN FixErrors, IN BOOLEAN Verbose, IN BOOLEAN CheckOnlyIfDirty, IN BOOLEAN ScanDrive, IN PFMIFSCALLBACK Callback)
 

Variables

PFMIFSCALLBACK ChkdskCallback = NULL
 
ULONG FsCheckFlags
 
PVOID FsCheckMemQueue
 
ULONG FsCheckTotalFiles
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 37 of file vfatlib.c.

Function Documentation

◆ UpdateProgress()

VOID UpdateProgress ( PFORMAT_CONTEXT  Context,
ULONG  Increment 
)

Definition at line 322 of file vfatlib.c.

324 {
325  ULONG NewPercent;
326 
327  Context->CurrentSectorCount += (ULONGLONG)Increment;
328 
329  NewPercent = (Context->CurrentSectorCount * 100ULL) / Context->TotalSectorCount;
330 
331  if (NewPercent > Context->Percent)
332  {
333  Context->Percent = NewPercent;
334  if (Context->Callback != NULL)
335  {
336  Context->Callback(PROGRESS, 0, &Context->Percent);
337  }
338  }
339 }
Definition: fmifs.h:68
smooth NULL
Definition: ftsmooth.c:416
#define ULL(a, b)
Definition: format_msg.c:27
if(!(yy_init))
Definition: macro.lex.yy.c:714
uint64_t ULONGLONG
Definition: typedefs.h:65
unsigned int ULONG
Definition: retypes.h:1
IN OUT PLONG IN OUT PLONG Addend IN OUT PLONG IN LONG Increment
Definition: CrNtStubs.h:42

Referenced by Fat12WriteBootSector(), Fat12WriteFAT(), Fat12WriteRootDirectory(), Fat16WriteBootSector(), Fat16WriteFAT(), Fat16WriteRootDirectory(), Fat32WriteBootSector(), Fat32WriteFAT(), Fat32WriteFsInfo(), Fat32WriteRootDirectory(), and FatWipeSectors().

◆ VfatChkdsk()

NTSTATUS NTAPI VfatChkdsk ( IN PUNICODE_STRING  DriveRoot,
IN BOOLEAN  FixErrors,
IN BOOLEAN  Verbose,
IN BOOLEAN  CheckOnlyIfDirty,
IN BOOLEAN  ScanDrive,
IN PFMIFSCALLBACK  Callback 
)

Definition at line 375 of file vfatlib.c.

381 {
382  BOOLEAN verify;
383  BOOLEAN salvage_files;
384  ULONG free_clusters;
385  DOS_FS fs;
387 
388  RtlZeroMemory(&fs, sizeof(fs));
389 
390  /* Store callback pointer */
393 
394  /* Set parameters */
395  FsCheckFlags = 0;
396  if (Verbose)
398  if (FixErrors)
400 
401  FsCheckTotalFiles = 0;
402 
403  verify = TRUE;
404  salvage_files = TRUE;
405 
406  /* Open filesystem and lock it */
409  {
410  /* We failed to lock, ask the caller whether we should continue */
411  if (Callback(VOLUMEINUSE, 0, NULL))
412  {
414  }
415  }
416  if (!NT_SUCCESS(Status))
417  {
418  fs_close(FALSE);
420  }
421 
422  if (CheckOnlyIfDirty && !fs_isdirty())
423  {
424  /* Unlock volume if required */
426  fs_lock(FALSE);
427 
428  /* No need to check FS */
430  }
431  else if (CheckOnlyIfDirty && fs_isdirty())
432  {
434  {
435  fs_close(FALSE);
437  }
438  }
439 
440  read_boot(&fs);
441 
442  if (verify)
443  VfatPrint("Starting check/repair pass.\n");
444 
445  while (read_fat(&fs), scan_root(&fs))
447 
448  if (ScanDrive)
449  fix_bad(&fs);
450 
451  if (salvage_files)
452  reclaim_file(&fs);
453  else
454  reclaim_free(&fs);
455 
456  free_clusters = update_free(&fs);
457  file_unused();
459  if (verify)
460  {
461  FsCheckTotalFiles = 0;
462  VfatPrint("Starting verification pass.\n");
463  read_fat(&fs);
464  scan_root(&fs);
465  reclaim_free(&fs);
467  }
468 
469  if (fs_changed())
470  {
472  {
474  {
475  FixErrors = get_key("yn", "Perform changes ? (y/n)") == 'y';
476  if (FixErrors)
478  else
480  }
481  else
482  VfatPrint("Performing changes.\n");
483  }
484  else
485  {
486  VfatPrint("Leaving filesystem unchanged.\n");
487  }
488  }
489 
490  VfatPrint("%wZ: %u files, %lu/%lu clusters\n", DriveRoot,
491  FsCheckTotalFiles, fs.data_clusters - free_clusters, fs.data_clusters);
492 
494  {
495  /* Dismount the volume */
496  fs_dismount();
497 
498  /* Unlock the volume */
499  fs_lock(FALSE);
500  }
501 
502  // https://technet.microsoft.com/en-us/library/cc730714.aspx
503  // https://support.microsoft.com/en-us/kb/265533
504 
505  /* Close the volume */
507 }
void qfree(void **root)
Definition: common.c:157
#define TRUE
Definition: types.h:120
BOOL Verbose
Definition: chkdsk.c:72
LONG NTSTATUS
Definition: precomp.h:26
void read_fat(DOS_FS *fs)
Definition: fat.c:81
VOID VfatPrint(PCHAR Format,...)
Definition: vfatlib.c:363
Definition: fs.h:235
void fs_open(char *path, int rw)
Definition: io.c:163
void read_boot(DOS_FS *fs)
Definition: boot.c:334
PVOID FsCheckMemQueue
Definition: vfatlib.c:45
int scan_root(DOS_FS *fs)
Definition: check.c:1232
#define FSCHECK_READ_WRITE
Definition: rosglue.h:27
ULONG FsCheckFlags
Definition: vfatlib.c:44
ULONG FsCheckTotalFiles
Definition: vfatlib.c:46
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
#define FSCHECK_INTERACTIVE
Definition: rosglue.h:23
char get_key(const char *valid, const char *prompt)
Definition: common.c:184
#define FSCHECK_VERBOSE
Definition: rosglue.h:25
#define fs_changed(gen, s)
Definition: reiserfs_fs.h:1290
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
void file_unused(void)
Definition: file.c:269
#define STATUS_ACCESS_DENIED
Definition: udferr_usr.h:145
Status
Definition: gdiplustypes.h:24
void fix_bad(DOS_FS *fs)
Definition: fat.c:322
PFMIFSCALLBACK ChkdskCallback
Definition: vfatlib.c:43
#define fs
Definition: i386-dis.c:435
BOOL FixErrors
Definition: chkdsk.c:69
void reclaim_file(DOS_FS *fs)
Definition: fat.c:426
uint32_t update_free(DOS_FS *fs)
Definition: fat.c:531
#define STATUS_DISK_CORRUPT_ERROR
Definition: udferr_usr.h:147
unsigned int ULONG
Definition: retypes.h:1
int fs_close(int write)
Definition: io.c:455
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
return STATUS_SUCCESS
Definition: btrfs.c:2938
LPFNPSPCALLBACK Callback
Definition: desk.c:111
void reclaim_free(DOS_FS *fs)
Definition: fat.c:340

◆ VfatFormat()

NTSTATUS NTAPI VfatFormat ( IN PUNICODE_STRING  DriveRoot,
IN FMIFS_MEDIA_FLAG  MediaFlag,
IN PUNICODE_STRING  Label,
IN BOOLEAN  QuickFormat,
IN ULONG  ClusterSize,
IN PFMIFSCALLBACK  Callback 
)

Definition at line 50 of file vfatlib.c.

56 {
58  DISK_GEOMETRY DiskGeometry;
63  NTSTATUS Status, LockStatus;
64 
65  DPRINT("VfatFormat(DriveRoot '%wZ')\n", DriveRoot);
66 
67  Context.TotalSectorCount = 0;
68  Context.CurrentSectorCount = 0;
69  Context.Callback = Callback;
70  Context.Success = FALSE;
71  Context.Percent = 0;
72 
74  DriveRoot,
75  0,
76  NULL,
77  NULL);
78 
82  &Iosb,
85  if (!NT_SUCCESS(Status))
86  {
87  DPRINT1("NtOpenFile() failed with status 0x%.08x\n", Status);
88  return Status;
89  }
90 
92  NULL,
93  NULL,
94  NULL,
95  &Iosb,
97  NULL,
98  0,
99  &DiskGeometry,
100  sizeof(DISK_GEOMETRY));
101  if (!NT_SUCCESS(Status))
102  {
103  DPRINT("IOCTL_DISK_GET_DRIVE_GEOMETRY failed with status 0x%.08x\n", Status);
105  return Status;
106  }
107 
108  if (DiskGeometry.MediaType == FixedMedia)
109  {
110  DPRINT("Cylinders %I64d\n", DiskGeometry.Cylinders.QuadPart);
111  DPRINT("TracksPerCylinder %ld\n", DiskGeometry.TracksPerCylinder);
112  DPRINT("SectorsPerTrack %ld\n", DiskGeometry.SectorsPerTrack);
113  DPRINT("BytesPerSector %ld\n", DiskGeometry.BytesPerSector);
114  DPRINT("DiskSize %I64d\n",
115  DiskGeometry.Cylinders.QuadPart *
116  (ULONGLONG)DiskGeometry.TracksPerCylinder *
117  (ULONGLONG)DiskGeometry.SectorsPerTrack *
118  (ULONGLONG)DiskGeometry.BytesPerSector);
119 
121  NULL,
122  NULL,
123  NULL,
124  &Iosb,
126  NULL,
127  0,
128  &PartitionInfo,
129  sizeof(PARTITION_INFORMATION));
130  if (!NT_SUCCESS(Status))
131  {
132  DPRINT("IOCTL_DISK_GET_PARTITION_INFO failed with status 0x%.08x\n", Status);
134  return Status;
135  }
136  }
137  else
138  {
139  PartitionInfo.PartitionType = 0;
140  PartitionInfo.StartingOffset.QuadPart = 0ULL;
141  PartitionInfo.PartitionLength.QuadPart =
142  DiskGeometry.Cylinders.QuadPart *
143  (ULONGLONG)DiskGeometry.TracksPerCylinder *
144  (ULONGLONG)DiskGeometry.SectorsPerTrack *
145  (ULONGLONG)DiskGeometry.BytesPerSector;
146  PartitionInfo.HiddenSectors = 0;
147  PartitionInfo.PartitionNumber = 0;
148  PartitionInfo.BootIndicator = FALSE;
149  PartitionInfo.RewritePartition = FALSE;
150  PartitionInfo.RecognizedPartition = FALSE;
151  }
152 
153  /* If it already has a FAT FS, we'll use that type.
154  * If it doesn't, we will determine the FAT type based on size and offset */
155  if (PartitionInfo.PartitionType != PARTITION_FAT_12 &&
156  PartitionInfo.PartitionType != PARTITION_FAT_16 &&
157  PartitionInfo.PartitionType != PARTITION_HUGE &&
158  PartitionInfo.PartitionType != PARTITION_XINT13 &&
159  PartitionInfo.PartitionType != PARTITION_FAT32 &&
160  PartitionInfo.PartitionType != PARTITION_FAT32_XINT13)
161  {
162  /* Determine the correct type based upon size and offset (copied from usetup) */
163  if (PartitionInfo.PartitionLength.QuadPart < (4200LL * 1024LL))
164  {
165  /* FAT12 CHS partition (disk is smaller than 4.1MB) */
166  PartitionInfo.PartitionType = PARTITION_FAT_12;
167  }
168  else if (PartitionInfo.StartingOffset.QuadPart < (1024LL * 255LL * 63LL * 512LL))
169  {
170  /* Partition starts below the 8.4GB boundary ==> CHS partition */
171 
172  if (PartitionInfo.PartitionLength.QuadPart < (32LL * 1024LL * 1024LL))
173  {
174  /* FAT16 CHS partition (partition size < 32MB) */
175  PartitionInfo.PartitionType = PARTITION_FAT_16;
176  }
177  else if (PartitionInfo.PartitionLength.QuadPart < (512LL * 1024LL * 1024LL))
178  {
179  /* FAT16 CHS partition (partition size < 512MB) */
180  PartitionInfo.PartitionType = PARTITION_HUGE;
181  }
182  else
183  {
184  /* FAT32 CHS partition (partition size >= 512MB) */
185  PartitionInfo.PartitionType = PARTITION_FAT32;
186  }
187  }
188  else
189  {
190  /* Partition starts above the 8.4GB boundary ==> LBA partition */
191 
192  if (PartitionInfo.PartitionLength.QuadPart < (512LL * 1024LL * 1024LL))
193  {
194  /* FAT16 LBA partition (partition size < 512MB) */
195  PartitionInfo.PartitionType = PARTITION_XINT13;
196  }
197  else
198  {
199  /* FAT32 LBA partition (partition size >= 512MB) */
200  PartitionInfo.PartitionType = PARTITION_FAT32_XINT13;
201  }
202  }
203  }
204 
205  DPRINT("PartitionType 0x%x\n", PartitionInfo.PartitionType);
206  DPRINT("StartingOffset %I64d\n", PartitionInfo.StartingOffset.QuadPart);
207  DPRINT("PartitionLength %I64d\n", PartitionInfo.PartitionLength.QuadPart);
208  DPRINT("HiddenSectors %lu\n", PartitionInfo.HiddenSectors);
209  DPRINT("PartitionNumber %d\n", PartitionInfo.PartitionNumber);
210  DPRINT("BootIndicator 0x%x\n", PartitionInfo.BootIndicator);
211  DPRINT("RewritePartition %d\n", PartitionInfo.RewritePartition);
212  DPRINT("RecognizedPartition %d\n", PartitionInfo.RecognizedPartition);
213 
214  if (Callback != NULL)
215  {
216  Context.Percent = 0;
217  Callback (PROGRESS, 0, (PVOID)&Context.Percent);
218  }
219 
220  LockStatus = NtFsControlFile(FileHandle,
221  NULL,
222  NULL,
223  NULL,
224  &Iosb,
226  NULL,
227  0,
228  NULL,
229  0);
230  if (!NT_SUCCESS(LockStatus))
231  {
232  DPRINT1("WARNING: Failed to lock volume for formatting! Format may fail! (Status: 0x%x)\n", LockStatus);
233  }
234 
235  if (PartitionInfo.PartitionType == PARTITION_FAT_12)
236  {
237  /* FAT12 */
239  &PartitionInfo,
240  &DiskGeometry,
241  Label,
242  QuickFormat,
243  ClusterSize,
244  &Context);
245  }
246  else if (PartitionInfo.PartitionType == PARTITION_FAT_16 ||
247  PartitionInfo.PartitionType == PARTITION_HUGE ||
248  PartitionInfo.PartitionType == PARTITION_XINT13)
249  {
250  /* FAT16 */
252  &PartitionInfo,
253  &DiskGeometry,
254  Label,
255  QuickFormat,
256  ClusterSize,
257  &Context);
258  }
259  else if (PartitionInfo.PartitionType == PARTITION_FAT32 ||
260  PartitionInfo.PartitionType == PARTITION_FAT32_XINT13)
261  {
262  /* FAT32 */
264  &PartitionInfo,
265  &DiskGeometry,
266  Label,
267  QuickFormat,
268  ClusterSize,
269  &Context);
270  }
271  else
272  {
274  }
275 
276  /* Attempt to dismount formatted volume */
277  LockStatus = NtFsControlFile(FileHandle,
278  NULL,
279  NULL,
280  NULL,
281  &Iosb,
283  NULL,
284  0,
285  NULL,
286  0);
287  if (!NT_SUCCESS(LockStatus))
288  {
289  DPRINT1("Failed to umount volume (Status: 0x%x)\n", LockStatus);
290  }
291 
292  LockStatus = NtFsControlFile(FileHandle,
293  NULL,
294  NULL,
295  NULL,
296  &Iosb,
298  NULL,
299  0,
300  NULL,
301  0);
302  if (!NT_SUCCESS(LockStatus))
303  {
304  DPRINT1("Failed to unlock volume (Status: 0x%x)\n", LockStatus);
305  }
306 
308 
309  if (Callback != NULL)
310  {
311  Context.Success = (BOOLEAN)(NT_SUCCESS(Status));
312  Callback(DONE, 0, (PVOID)&Context.Success);
313  }
314 
315  DPRINT("VfatFormat() done. Status 0x%.08x\n", Status);
316 
317  return Status;
318 }
#define PARTITION_FAT32
Definition: disk.h:95
#define FILE_GENERIC_READ
Definition: nt_native.h:653
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:35
NTSTATUS Fat16Format(IN HANDLE FileHandle, IN PPARTITION_INFORMATION PartitionInfo, IN PDISK_GEOMETRY DiskGeometry, IN PUNICODE_STRING Label, IN BOOLEAN QuickFormat, IN ULONG ClusterSize, IN OUT PFORMAT_CONTEXT Context)
Definition: fat16.c:238
#define FSCTL_UNLOCK_VOLUME
Definition: nt_native.h:833
#define LL
Definition: tui.h:85
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
NTSTATUS Fat12Format(IN HANDLE FileHandle, IN PPARTITION_INFORMATION PartitionInfo, IN PDISK_GEOMETRY DiskGeometry, IN PUNICODE_STRING Label, IN BOOLEAN QuickFormat, IN ULONG ClusterSize, IN OUT PFORMAT_CONTEXT Context)
Definition: fat12.c:239
LONG NTSTATUS
Definition: precomp.h:26
Definition: fmifs.h:68
NTSYSCALLAPI NTSTATUS NTAPI NtFsControlFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, ULONG FsControlCode, PVOID InputBuffer, ULONG InputBufferLength, PVOID OutputBuffer, ULONG OutputBufferLength)
ULONG BytesPerSector
Definition: ntdddisk.h:381
ULONG TracksPerCylinder
Definition: ntdddisk.h:379
NTSYSAPI NTSTATUS NTAPI NtDeviceIoControlFile(IN HANDLE hFile, IN HANDLE hEvent OPTIONAL, IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL, IN PVOID IoApcContext OPTIONAL, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG DeviceIoControlCode, IN PVOID InBuffer OPTIONAL, IN ULONG InBufferLength, OUT PVOID OutBuffer OPTIONAL, IN ULONG OutBufferLength)
#define FILE_SHARE_READ
Definition: compat.h:125
#define PARTITION_XINT13
Definition: disk.h:97
HANDLE FileHandle
Definition: stats.c:38
#define FILE_SYNCHRONOUS_IO_ALERT
Definition: from_kernel.h:30
#define PARTITION_HUGE
Definition: disk.h:92
smooth NULL
Definition: ftsmooth.c:416
void DPRINT(...)
Definition: polytest.cpp:61
BOOL QuickFormat
Definition: format.c:66
#define ULL(a, b)
Definition: format_msg.c:27
#define FSCTL_DISMOUNT_VOLUME
Definition: nt_native.h:834
NTSYSAPI NTSTATUS NTAPI NtOpenFile(OUT PHANDLE phFile, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG ShareMode, IN ULONG OpenMode)
Definition: file.c:3951
return Iosb
Definition: create.c:4426
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
uint64_t ULONGLONG
Definition: typedefs.h:65
LARGE_INTEGER Cylinders
Definition: ntdddisk.h:377
ULONG SectorsPerTrack
Definition: ntdddisk.h:380
DWORD ClusterSize
Definition: format.c:67
_In_ ULONG _In_ struct _SET_PARTITION_INFORMATION_EX * PartitionInfo
Definition: iofuncs.h:2101
MEDIA_TYPE MediaType
Definition: ntdddisk.h:378
#define PARTITION_FAT_16
Definition: disk.h:90
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
Definition: obhandle.c:3399
#define IOCTL_DISK_GET_PARTITION_INFO
Definition: ntdddisk.h:88
#define SYNCHRONIZE
Definition: nt_native.h:61
Status
Definition: gdiplustypes.h:24
#define FILE_GENERIC_WRITE
Definition: nt_native.h:660
#define DPRINT1
Definition: precomp.h:8
#define BOOLEAN
Definition: pedump.c:73
#define FSCTL_LOCK_VOLUME
Definition: nt_native.h:832
#define PARTITION_FAT_12
Definition: disk.h:87
struct tagContext Context
Definition: acpixf.h:1030
PWCHAR Label
Definition: format.c:70
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
#define DONE
Definition: rnr20lib.h:14
#define PARTITION_FAT32_XINT13
Definition: disk.h:96
LPFNPSPCALLBACK Callback
Definition: desk.c:111
#define IOCTL_DISK_GET_DRIVE_GEOMETRY
Definition: cdrw_usr.h:169
NTSTATUS Fat32Format(IN HANDLE FileHandle, IN PPARTITION_INFORMATION PartitionInfo, IN PDISK_GEOMETRY DiskGeometry, IN PUNICODE_STRING Label, IN BOOLEAN QuickFormat, IN ULONG ClusterSize, IN OUT PFORMAT_CONTEXT Context)
Definition: fat32.c:386
LONGLONG QuadPart
Definition: typedefs.h:112

◆ VfatPrint()

VOID VfatPrint ( PCHAR  Format,
  ... 
)

Definition at line 363 of file vfatlib.c.

364 {
365  va_list args;
366 
367  va_start(args, Format);
369  va_end(args);
370 }
VOID VfatPrintV(PCHAR Format, va_list args)
Definition: vfatlib.c:343
Definition: match.c:390
#define va_end(ap)
Definition: acmsvcex.h:90
char * va_list
Definition: acmsvcex.h:78
#define va_start(ap, A)
Definition: acmsvcex.h:91
#define args
Definition: format.c:66

Referenced by rename_file(), and VfatChkdsk().

◆ VfatPrintV()

VOID VfatPrintV ( PCHAR  Format,
va_list  args 
)

Definition at line 343 of file vfatlib.c.

344 {
346  CHAR TextBuf[512];
347 
348  _vsnprintf(TextBuf, sizeof(TextBuf), Format, args);
349 
350  /* Prepare parameters */
351  TextOut.Lines = 1;
352  TextOut.Output = TextBuf;
353 
354  DPRINT1("VfatPrint -- %s", TextBuf);
355 
356  /* Do the callback */
357  if (ChkdskCallback)
359 }
char CHAR
Definition: xmlstorage.h:175
Definition: match.c:390
PFMIFSCALLBACK ChkdskCallback
Definition: vfatlib.c:43
#define _vsnprintf
Definition: xmlstorage.h:202
#define DPRINT1
Definition: precomp.h:8
#define TextOut
Definition: wingdi.h:4482
Definition: fmifs.h:82

Referenced by die(), pdie(), and VfatPrint().

Variable Documentation

◆ ChkdskCallback

PFMIFSCALLBACK ChkdskCallback = NULL

Definition at line 43 of file vfatlib.c.

Referenced by VfatChkdsk(), and VfatPrintV().

◆ FsCheckFlags

ULONG FsCheckFlags

Definition at line 44 of file vfatlib.c.

Referenced by fs_flush(), fs_write(), and VfatChkdsk().

◆ FsCheckMemQueue

PVOID FsCheckMemQueue

Definition at line 45 of file vfatlib.c.

Referenced by VfatChkdsk().

◆ FsCheckTotalFiles

ULONG FsCheckTotalFiles

Definition at line 46 of file vfatlib.c.

Referenced by VfatChkdsk().