ReactOS 0.4.17-dev-806-gffa4164
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_opt_ PVOID pUnknown1, _In_opt_ PVOID pUnknown2, _In_opt_ PVOID pUnknown3, _In_opt_ PVOID pUnknown4, _Out_ 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
uint64_t ULONGLONG
Definition: typedefs.h:67
uint32_t ULONG
Definition: typedefs.h:59

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_opt_ PVOID  pUnknown1,
_In_opt_ PVOID  pUnknown2,
_In_opt_ PVOID  pUnknown3,
_In_opt_ PVOID  pUnknown4,
_Out_ 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 if (DriveRoot->Buffer[0] == '\\' && DriveRoot->Buffer[1] == '?' &&
549 DriveRoot->Buffer[2] == '?' && DriveRoot->Buffer[3] == '\\')
550 {
551 DriveLetter[0] = DriveRoot->Buffer[4] & 0x5F; // 0x5f for Uppercase letter
552 VfatPrint("Chkdsk complete for Volume %S.\n", DriveLetter);
553 VfatPrint("%10u files on disk.\n\n", FsCheckTotalFiles);
554 VfatPrint("%10u bytes per cluster.\n", fs.cluster_size);
555 VfatPrint("%10lu total clusters on the disk.\n", fs.data_clusters);
556 VfatPrint("%10lu clusters available on the disk.\n", free_clusters);
557 }
558 else
559 VfatPrint("%wZ: %u files, %lu/%lu clusters\n", DriveRoot,
560 FsCheckTotalFiles, fs.data_clusters - free_clusters, fs.data_clusters);
561
563 {
564 /* Dismount the volume */
565 fs_dismount();
566
567 /* Unlock the volume */
568 fs_lock(FALSE);
569 }
570
571 // https://technet.microsoft.com/en-us/library/cc730714.aspx
572 // https://support.microsoft.com/en-us/kb/265533
573
574 /* Close the volume */
577 return (Status == STATUS_SUCCESS);
578}
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
_In_ ULONG _In_ ULONG _In_opt_ DXGKCB_MIRACAST_SEND_MESSAGE_CALLBACK Callback
Definition: dispmprt.h:620
#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:24
#define fs
Definition: i386-dis.c:444
_In_ NTSTATUS ExitStatus
Definition: psfuncs.h:890
#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
#define FSCHECK_LIST_FILES
Definition: rosglue.h:24
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

◆ 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:115
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
#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:3429
#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().