ReactOS 0.4.16-dev-2613-g9533ad7
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

BOOLEAN NTAPI VfatFormat (IN PUNICODE_STRING DriveRoot, IN PFMIFSCALLBACK Callback, IN BOOLEAN QuickFormat, IN BOOLEAN BackwardCompatible, IN MEDIA_TYPE MediaType, IN PUNICODE_STRING Label, IN ULONG ClusterSize)
 
VOID UpdateProgress (PFORMAT_CONTEXT Context, ULONG Increment)
 
VOID VfatPrintV (PCHAR Format, va_list args)
 
VOID VfatPrint (PCHAR Format,...)
 
BOOLEAN NTAPI VfatChkdsk (IN PUNICODE_STRING DriveRoot, IN PFMIFSCALLBACK Callback, IN BOOLEAN FixErrors, IN BOOLEAN Verbose, IN BOOLEAN CheckOnlyIfDirty, IN BOOLEAN ScanDrive, IN PVOID pUnknown1, IN PVOID pUnknown2, IN PVOID pUnknown3, IN PVOID pUnknown4, IN PULONG ExitStatus)
 

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 364 of file vfatlib.c.

366{
367 ULONG NewPercent;
368
369 Context->CurrentSectorCount += (ULONGLONG)Increment;
370
371 NewPercent = (Context->CurrentSectorCount * 100ULL) / Context->TotalSectorCount;
372
373 if (NewPercent > Context->Percent)
374 {
375 Context->Percent = NewPercent;
376 if (Context->Callback != NULL)
377 {
378 Context->Callback(PROGRESS, 0, &Context->Percent);
379 }
380 }
381}
#define NULL
Definition: types.h:112
IN OUT PLONG IN OUT PLONG Addend IN OUT PLONG IN LONG Increment
Definition: CrNtStubs.h:46
@ PROGRESS
Definition: fmifs.h:83
if(dx< 0)
Definition: linetemp.h:194
_In_ PVOID Context
Definition: storport.h:2269
uint32_t ULONG
Definition: typedefs.h:59
uint64_t ULONGLONG
Definition: typedefs.h:67

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

◆ VfatChkdsk()

BOOLEAN NTAPI VfatChkdsk ( IN PUNICODE_STRING  DriveRoot,
IN PFMIFSCALLBACK  Callback,
IN BOOLEAN  FixErrors,
IN BOOLEAN  Verbose,
IN BOOLEAN  CheckOnlyIfDirty,
IN BOOLEAN  ScanDrive,
IN PVOID  pUnknown1,
IN PVOID  pUnknown2,
IN PVOID  pUnknown3,
IN PVOID  pUnknown4,
IN PULONG  ExitStatus 
)

Definition at line 417 of file vfatlib.c.

429{
430 BOOLEAN verify;
431 BOOLEAN salvage_files;
432 ULONG free_clusters;
433 DOS_FS fs;
435 WCHAR DriveLetter[2] = L"0";
436
437 UNREFERENCED_PARAMETER(pUnknown1);
438 UNREFERENCED_PARAMETER(pUnknown2);
439 UNREFERENCED_PARAMETER(pUnknown3);
440 UNREFERENCED_PARAMETER(pUnknown4);
441
442 RtlZeroMemory(&fs, sizeof(fs));
443
444 /* Store callback pointer */
447
448 /* Set parameters */
449 FsCheckFlags = 0;
450 if (Verbose)
452 if (FixErrors)
454
456
457 verify = TRUE;
458 salvage_files = TRUE;
459
460 /* Open filesystem and lock it */
463 {
464 /* We failed to lock, ask the caller whether we should continue */
465 if (Callback(VOLUMEINUSE, 0, NULL))
466 {
468 }
469 }
470 if (!NT_SUCCESS(Status))
471 {
474 return FALSE;
475 }
476
477 if (CheckOnlyIfDirty && !fs_isdirty())
478 {
479 /* Unlock volume if required */
481 fs_lock(FALSE);
482
483 /* No need to check FS */
486 return (Status == STATUS_SUCCESS);
487 }
488 else if (CheckOnlyIfDirty && fs_isdirty())
489 {
491 {
494 return FALSE;
495 }
496 }
497
498 read_boot(&fs);
499
500 if (verify)
501 VfatPrint("Starting check/repair pass.\n");
502
503 while (read_fat(&fs), scan_root(&fs))
505
506 if (ScanDrive)
507 fix_bad(&fs);
508
509 if (salvage_files)
511 else
513
514 free_clusters = update_free(&fs);
515 file_unused();
517 if (verify)
518 {
520 VfatPrint("Starting verification pass.\n");
521 read_fat(&fs);
522 scan_root(&fs);
525 }
526
527 if (fs_changed())
528 {
530 {
532 {
533 FixErrors = get_key("yn", "Perform changes ? (y/n)") == 'y';
534 if (FixErrors)
536 else
537 FsCheckFlags &= ~FSCHECK_READ_WRITE;
538 }
539 else
540 VfatPrint("Performing changes.\n");
541 }
542 else
543 {
544 VfatPrint("Leaving filesystem unchanged.\n");
545 }
546 }
547
548#ifdef __REACTOS__
549 if (DriveRoot->Buffer[0] == '\\' && DriveRoot->Buffer[1] == '?' &&
550 DriveRoot->Buffer[2] == '?' && DriveRoot->Buffer[3] == '\\')
551 {
552 DriveLetter[0] = DriveRoot->Buffer[4] & 0x5F; // 0x5f for Uppercase letter
553 VfatPrint("Chkdsk complete for Volume %S.\n", DriveLetter);
554 VfatPrint("%10u files on disk.\n\n", FsCheckTotalFiles);
555 VfatPrint("%10u bytes per cluster.\n", fs.cluster_size);
556 VfatPrint("%10lu total clusters on the disk.\n", fs.data_clusters);
557 VfatPrint("%10lu clusters available on the disk.\n", free_clusters);
558 }
559 else
560 VfatPrint("%wZ: %u files, %lu/%lu clusters\n", DriveRoot,
561 FsCheckTotalFiles, fs.data_clusters - free_clusters, fs.data_clusters);
562#else
563 VfatPrint("%wZ: %u files, %lu/%lu clusters\n", DriveRoot,
564 FsCheckTotalFiles, fs.data_clusters - free_clusters, fs.data_clusters);
565#endif
567 {
568 /* Dismount the volume */
569 fs_dismount();
570
571 /* Unlock the volume */
572 fs_lock(FALSE);
573 }
574
575 // https://technet.microsoft.com/en-us/library/cc730714.aspx
576 // https://support.microsoft.com/en-us/kb/265533
577
578 /* Close the volume */
581 return (Status == STATUS_SUCCESS);
582}
unsigned char BOOLEAN
Definition: actypes.h:127
LONG NTSTATUS
Definition: precomp.h:26
BOOL FixErrors
Definition: chkdsk.c:69
BOOL Verbose
Definition: chkdsk.c:72
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define L(x)
Definition: resources.c:13
err_t fs_open(struct fs_file *file, const char *name)
Definition: fs.c:43
void fs_close(struct fs_file *file)
Definition: fs.c:83
@ VOLUMEINUSE
Definition: fmifs.h:91
int scan_root(DOS_FS *fs)
Definition: check.c:1232
Status
Definition: gdiplustypes.h:25
#define fs
Definition: i386-dis.c:444
_In_ NTSTATUS ExitStatus
Definition: psfuncs.h:868
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
short WCHAR
Definition: pedump.c:58
#define FSCHECK_VERBOSE
Definition: rosglue.h:25
#define FSCHECK_READ_WRITE
Definition: rosglue.h:27
#define FSCHECK_INTERACTIVE
Definition: rosglue.h:23
void read_boot(DOS_FS *fs)
Definition: boot.c:334
void qfree(void **root)
Definition: common.c:157
char get_key(const char *valid, const char *prompt)
Definition: common.c:184
void fix_bad(DOS_FS *fs)
Definition: fat.c:322
void reclaim_free(DOS_FS *fs)
Definition: fat.c:340
uint32_t update_free(DOS_FS *fs)
Definition: fat.c:531
void read_fat(DOS_FS *fs)
Definition: fat.c:81
void reclaim_file(DOS_FS *fs)
Definition: fat.c:426
void file_unused(void)
Definition: file.c:269
int fs_changed(void)
Definition: io.c:479
#define STATUS_SUCCESS
Definition: shellext.h:65
Definition: ffs.h:70
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define STATUS_ACCESS_DENIED
Definition: udferr_usr.h:145
#define STATUS_DISK_CORRUPT_ERROR
Definition: udferr_usr.h:147
ULONG FsCheckFlags
Definition: vfatlib.c:44
PFMIFSCALLBACK ChkdskCallback
Definition: vfatlib.c:43
VOID VfatPrint(PCHAR Format,...)
Definition: vfatlib.c:405
PVOID FsCheckMemQueue
Definition: vfatlib.c:45
ULONG FsCheckTotalFiles
Definition: vfatlib.c:46
_In_ WDFINTERRUPT _In_ PFN_WDF_INTERRUPT_SYNCHRONIZE Callback
Definition: wdfinterrupt.h:458

◆ VfatFormat()

BOOLEAN NTAPI VfatFormat ( IN PUNICODE_STRING  DriveRoot,
IN PFMIFSCALLBACK  Callback,
IN BOOLEAN  QuickFormat,
IN BOOLEAN  BackwardCompatible,
IN MEDIA_TYPE  MediaType,
IN PUNICODE_STRING  Label,
IN ULONG  ClusterSize 
)

Definition at line 50 of file vfatlib.c.

58{
60 DISK_GEOMETRY DiskGeometry;
65 FAT_TYPE FatType = FAT_UNKNOWN;
66 NTSTATUS Status, LockStatus;
67
68 DPRINT("VfatFormat(DriveRoot '%wZ')\n", DriveRoot);
69
70 // FIXME:
71 UNREFERENCED_PARAMETER(BackwardCompatible);
72 UNREFERENCED_PARAMETER(MediaType);
73
74 Context.TotalSectorCount = 0;
75 Context.CurrentSectorCount = 0;
76 Context.Callback = Callback;
77 Context.Success = FALSE;
78 Context.Percent = 0;
79
81 DriveRoot,
82 0,
83 NULL,
84 NULL);
85
89 &Iosb,
92 if (!NT_SUCCESS(Status))
93 {
94 DPRINT1("NtOpenFile() failed with status 0x%08x\n", Status);
95 return FALSE;
96 }
97
99 NULL,
100 NULL,
101 NULL,
102 &Iosb,
104 NULL,
105 0,
106 &DiskGeometry,
107 sizeof(DISK_GEOMETRY));
108 if (!NT_SUCCESS(Status))
109 {
110 DPRINT("IOCTL_DISK_GET_DRIVE_GEOMETRY failed with status 0x%08x\n", Status);
112 return FALSE;
113 }
114
115 if (DiskGeometry.MediaType == FixedMedia)
116 {
117 DPRINT("Cylinders %I64d\n", DiskGeometry.Cylinders.QuadPart);
118 DPRINT("TracksPerCylinder %ld\n", DiskGeometry.TracksPerCylinder);
119 DPRINT("SectorsPerTrack %ld\n", DiskGeometry.SectorsPerTrack);
120 DPRINT("BytesPerSector %ld\n", DiskGeometry.BytesPerSector);
121 DPRINT("DiskSize %I64d\n",
122 DiskGeometry.Cylinders.QuadPart *
123 (ULONGLONG)DiskGeometry.TracksPerCylinder *
124 (ULONGLONG)DiskGeometry.SectorsPerTrack *
125 (ULONGLONG)DiskGeometry.BytesPerSector);
126
128 NULL,
129 NULL,
130 NULL,
131 &Iosb,
133 NULL,
134 0,
137 if (!NT_SUCCESS(Status))
138 {
139 DPRINT("IOCTL_DISK_GET_PARTITION_INFO_EX failed with status 0x%08x\n", Status);
141 return FALSE;
142 }
143 }
144 else
145 {
146 PartitionInfo.PartitionStyle = PARTITION_STYLE_MBR;
147 PartitionInfo.Mbr.PartitionType = 0;
148 PartitionInfo.StartingOffset.QuadPart = 0ULL;
149 PartitionInfo.PartitionLength.QuadPart =
150 DiskGeometry.Cylinders.QuadPart *
151 (ULONGLONG)DiskGeometry.TracksPerCylinder *
152 (ULONGLONG)DiskGeometry.SectorsPerTrack *
153 (ULONGLONG)DiskGeometry.BytesPerSector;
154 PartitionInfo.Mbr.HiddenSectors = 0;
155 PartitionInfo.PartitionNumber = 0;
156 PartitionInfo.Mbr.BootIndicator = FALSE;
157 PartitionInfo.RewritePartition = FALSE;
158 PartitionInfo.Mbr.RecognizedPartition = FALSE;
159 }
160
161 /* If it already has a FAT FS, we'll use that type.
162 * If it doesn't, we will determine the FAT type based on size and offset */
163
164 if (PartitionInfo.PartitionStyle == PARTITION_STYLE_MBR)
165 {
166 if (PartitionInfo.Mbr.PartitionType == PARTITION_FAT_12)
167 {
168 FatType = FAT_12;
169 }
170 else if (PartitionInfo.Mbr.PartitionType == PARTITION_FAT_16 ||
171 PartitionInfo.Mbr.PartitionType == PARTITION_HUGE ||
172 PartitionInfo.Mbr.PartitionType == PARTITION_XINT13)
173 {
174 FatType = FAT_16;
175 }
176 else if (PartitionInfo.Mbr.PartitionType == PARTITION_FAT32 ||
177 PartitionInfo.Mbr.PartitionType == PARTITION_FAT32_XINT13)
178 {
179 FatType = FAT_32;
180 }
181
182 if (FatType == FAT_UNKNOWN)
183 {
184 /* Determine the correct type based upon size and offset (copied from usetup) */
185 if (PartitionInfo.PartitionLength.QuadPart < (4200LL * 1024LL))
186 {
187 /* FAT12 CHS partition (disk is smaller than 4.1MB) */
188 FatType = FAT_12;
189 }
190 else if (PartitionInfo.StartingOffset.QuadPart < (1024LL * 255LL * 63LL * 512LL))
191 {
192 /* Partition starts below the 8.4GB boundary ==> CHS partition */
193
194 if (PartitionInfo.PartitionLength.QuadPart < (32LL * 1024LL * 1024LL))
195 {
196 /* FAT16 CHS partition (partition size < 32MB) */
197 FatType = FAT_16;
198 }
199 else if (PartitionInfo.PartitionLength.QuadPart < (512LL * 1024LL * 1024LL))
200 {
201 /* FAT16 CHS partition (partition size < 512MB) */
202 FatType = FAT_16;
203 }
204 else
205 {
206 /* FAT32 CHS partition (partition size >= 512MB) */
207 FatType = FAT_32;
208 }
209 }
210 else
211 {
212 /* Partition starts above the 8.4GB boundary ==> LBA partition */
213
214 if (PartitionInfo.PartitionLength.QuadPart < (512LL * 1024LL * 1024LL))
215 {
216 /* FAT16 LBA partition (partition size < 512MB) */
217 FatType = FAT_16;
218 }
219 else
220 {
221 /* FAT32 LBA partition (partition size >= 512MB) */
222 FatType = FAT_32;
223 }
224 }
225 }
226
227 DPRINT("PartitionType 0x%x\n", PartitionInfo.Mbr.PartitionType);
228 DPRINT("StartingOffset %I64d\n", PartitionInfo.StartingOffset.QuadPart);
229 DPRINT("PartitionLength %I64d\n", PartitionInfo.PartitionLength.QuadPart);
230 DPRINT("HiddenSectors %lu\n", PartitionInfo.Mbr.HiddenSectors);
231 DPRINT("PartitionNumber %d\n", PartitionInfo.PartitionNumber);
232 DPRINT("BootIndicator 0x%x\n", PartitionInfo.Mbr.BootIndicator);
233 DPRINT("RewritePartition %d\n", PartitionInfo.RewritePartition);
234 DPRINT("RecognizedPartition %d\n", PartitionInfo.Mbr.RecognizedPartition);
235 }
236 else if (PartitionInfo.PartitionStyle == PARTITION_STYLE_GPT)
237 {
238 if (PartitionInfo.PartitionLength.QuadPart < (4200LL * 1024LL))
239 {
240 /* FAT12 CHS partition (disk is smaller than 4.1MB) */
241 FatType = FAT_12;
242 }
243 else if (PartitionInfo.PartitionLength.QuadPart < (512LL * 1024LL * 1024LL))
244 {
245 /* FAT16 partition (partition size < 512MB) */
246 FatType = FAT_16;
247 }
248 else if (PartitionInfo.PartitionLength.QuadPart <= (32LL * 1024LL * 1024LL * 1024LL))
249 {
250 /* FAT32 partition (partition size < 32GB) */
251 FatType = FAT_32;
252 }
253 else
254 {
255 DPRINT1("The partition ist too large (> 32 GB) for the FAT file system!\n");
257 return FALSE;
258 }
259
260 DPRINT("StartingOffset %I64d\n", PartitionInfo.StartingOffset.QuadPart);
261 DPRINT("PartitionLength %I64d\n", PartitionInfo.PartitionLength.QuadPart);
262 DPRINT("PartitionNumber %d\n", PartitionInfo.PartitionNumber);
263 DPRINT("RewritePartition %d\n", PartitionInfo.RewritePartition);
264 }
265
266 if (Callback != NULL)
267 {
268 Context.Percent = 0;
269 Callback(PROGRESS, 0, (PVOID)&Context.Percent);
270 }
271
272 LockStatus = NtFsControlFile(FileHandle,
273 NULL,
274 NULL,
275 NULL,
276 &Iosb,
278 NULL,
279 0,
280 NULL,
281 0);
282 if (!NT_SUCCESS(LockStatus))
283 {
284 DPRINT1("WARNING: Failed to lock volume for formatting! Format may fail! (Status: 0x%x)\n", LockStatus);
285 }
286
287 if (FatType == FAT_12)
288 {
289 /* FAT12 */
292 &DiskGeometry,
293 Label,
296 &Context);
297 }
298 else if (FatType == FAT_16)
299 {
300 /* FAT16 */
303 &DiskGeometry,
304 Label,
307 &Context);
308 }
309 else if (FatType == FAT_32)
310 {
311 /* FAT32 */
314 &DiskGeometry,
315 Label,
318 &Context);
319 }
320 else
321 {
323 }
324
325 /* Attempt to dismount formatted volume */
326 LockStatus = NtFsControlFile(FileHandle,
327 NULL,
328 NULL,
329 NULL,
330 &Iosb,
332 NULL,
333 0,
334 NULL,
335 0);
336 if (!NT_SUCCESS(LockStatus))
337 {
338 DPRINT1("Failed to umount volume (Status: 0x%x)\n", LockStatus);
339 }
340
341 LockStatus = NtFsControlFile(FileHandle,
342 NULL,
343 NULL,
344 NULL,
345 &Iosb,
347 NULL,
348 0,
349 NULL,
350 0);
351 if (!NT_SUCCESS(LockStatus))
352 {
353 DPRINT1("Failed to unlock volume (Status: 0x%x)\n", LockStatus);
354 }
355
357
358 DPRINT("VfatFormat() done. Status 0x%08x\n", Status);
359 return NT_SUCCESS(Status);
360}
#define DPRINT1
Definition: precomp.h:8
BOOL QuickFormat
Definition: format.c:65
PWCHAR Label
Definition: format.c:69
DWORD ClusterSize
Definition: format.c:66
#define IOCTL_DISK_GET_DRIVE_GEOMETRY
Definition: cdrw_usr.h:169
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
#define FILE_SHARE_READ
Definition: compat.h:136
return Iosb
Definition: create.c:4403
NTSTATUS Fat12Format(IN HANDLE FileHandle, IN PPARTITION_INFORMATION_EX PartitionInfo, IN PDISK_GEOMETRY DiskGeometry, IN PUNICODE_STRING Label, IN BOOLEAN QuickFormat, IN ULONG ClusterSize, IN OUT PFORMAT_CONTEXT Context)
Definition: fat12.c:239
NTSTATUS Fat16Format(IN HANDLE FileHandle, IN PPARTITION_INFORMATION_EX PartitionInfo, IN PDISK_GEOMETRY DiskGeometry, IN PUNICODE_STRING Label, IN BOOLEAN QuickFormat, IN ULONG ClusterSize, IN OUT PFORMAT_CONTEXT Context)
Definition: fat16.c:238
NTSTATUS Fat32Format(IN HANDLE FileHandle, IN PPARTITION_INFORMATION_EX PartitionInfo, IN PDISK_GEOMETRY DiskGeometry, IN PUNICODE_STRING Label, IN BOOLEAN QuickFormat, IN ULONG ClusterSize, IN OUT PFORMAT_CONTEXT Context)
Definition: fat32.c:386
#define IOCTL_DISK_GET_PARTITION_INFO_EX
Definition: ntddk_ex.h:206
_Must_inspect_result_ _In_opt_ PFLT_INSTANCE _Out_ PHANDLE FileHandle
Definition: fltkernel.h:1231
#define FILE_SYNCHRONOUS_IO_ALERT
Definition: from_kernel.h:30
FAT_TYPE
Definition: vfatlib.h:113
@ FAT_32
Definition: vfatlib.h:117
@ FAT_12
Definition: vfatlib.h:115
@ FAT_16
Definition: vfatlib.h:116
@ FAT_UNKNOWN
Definition: vfatlib.h:114
@ PARTITION_STYLE_GPT
Definition: imports.h:202
@ PARTITION_STYLE_MBR
Definition: imports.h:201
#define ULL(a, b)
Definition: format_msg.c:27
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
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:3950
#define SYNCHRONIZE
Definition: nt_native.h:61
#define FSCTL_LOCK_VOLUME
Definition: nt_native.h:832
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 FSCTL_UNLOCK_VOLUME
Definition: nt_native.h:833
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
Definition: obhandle.c:3402
#define FSCTL_DISMOUNT_VOLUME
Definition: nt_native.h:834
NTSYSAPI NTSTATUS NTAPI NtFsControlFile(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_GENERIC_READ
Definition: nt_native.h:653
#define FILE_GENERIC_WRITE
Definition: nt_native.h:660
@ FixedMedia
Definition: ntdddisk.h:383
#define PARTITION_XINT13
Definition: part_mbr.h:61
#define PARTITION_FAT32
Definition: part_mbr.h:59
#define PARTITION_FAT_12
Definition: part_mbr.h:51
#define PARTITION_HUGE
Definition: part_mbr.h:56
#define PARTITION_FAT_16
Definition: part_mbr.h:54
#define PARTITION_FAT32_XINT13
Definition: part_mbr.h:60
#define DPRINT
Definition: sndvol32.h:73
MEDIA_TYPE MediaType
Definition: ntdddisk.h:401
LARGE_INTEGER Cylinders
Definition: ntdddisk.h:400
ULONG TracksPerCylinder
Definition: ntdddisk.h:402
ULONG SectorsPerTrack
Definition: ntdddisk.h:403
ULONG BytesPerSector
Definition: ntdddisk.h:404
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
LONGLONG QuadPart
Definition: typedefs.h:114
_In_ ULONG _In_ struct _SET_PARTITION_INFORMATION_EX * PartitionInfo
Definition: iofuncs.h:2105

◆ VfatPrint()

VOID VfatPrint ( PCHAR  Format,
  ... 
)

Definition at line 405 of file vfatlib.c.

406{
408
411 va_end(args);
412}
#define va_end(v)
Definition: stdarg.h:28
#define va_start(v, l)
Definition: stdarg.h:26
char * va_list
Definition: vadefs.h:50
#define args
Definition: format.c:66
Definition: match.c:390
VOID VfatPrintV(PCHAR Format, va_list args)
Definition: vfatlib.c:385

Referenced by rename_file(), and VfatChkdsk().

◆ VfatPrintV()

VOID VfatPrintV ( PCHAR  Format,
va_list  args 
)

Definition at line 385 of file vfatlib.c.

386{
388 CHAR TextBuf[512];
389
390 _vsnprintf(TextBuf, sizeof(TextBuf), Format, args);
391
392 /* Prepare parameters */
393 TextOut.Lines = 1;
394 TextOut.Output = TextBuf;
395
396 DPRINT1("VfatPrint -- %s", TextBuf);
397
398 /* Do the callback */
399 if (ChkdskCallback)
401}
#define OUTPUT(ch)
#define _vsnprintf
Definition: _vsnprintf.c:28
char CHAR
Definition: pedump.c:57
#define TextOut
Definition: wingdi.h:4929

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

Variable Documentation

◆ ChkdskCallback

PFMIFSCALLBACK ChkdskCallback = NULL

Definition at line 43 of file vfatlib.c.

Referenced by CheckVolume(), ChkDskNow(), FsVolCallback(), StartCheck(), VfatChkdsk(), VfatPrintV(), and wmain().

◆ 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().