ReactOS  0.4.15-dev-5496-g599ba9c
fsutil.c
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS Setup Library
3  * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4  * PURPOSE: Filesystem Format and ChkDsk support functions.
5  * COPYRIGHT: Copyright 2003-2019 Casper S. Hornstrup (chorns@users.sourceforge.net)
6  * Copyright 2017-2020 Hermes Belusca-Maito
7  */
8 
9 //
10 // See also: https://git.reactos.org/?p=reactos.git;a=blob;f=reactos/dll/win32/fmifs/init.c;h=e895f5ef9cae4806123f6bbdd3dfed37ec1c8d33;hb=b9db9a4e377a2055f635b2fb69fef4e1750d219c
11 // for how to get FS providers in a dynamic way. In the (near) future we may
12 // consider merging some of this code with us into a fmifs / fsutil / fslib library...
13 //
14 
15 /* INCLUDES *****************************************************************/
16 
17 #include "precomp.h"
18 
19 #include "partlist.h"
20 #include "fsrec.h"
21 #include "bootcode.h"
22 #include "fsutil.h"
23 
24 #include <fslib/vfatlib.h>
25 #include <fslib/btrfslib.h>
26 // #include <fslib/ext2lib.h>
27 // #include <fslib/ntfslib.h>
28 
29 #define NDEBUG
30 #include <debug.h>
31 
32 
33 /* TYPEDEFS *****************************************************************/
34 
35 #include <pshpack1.h>
36 typedef struct _FAT_BOOTSECTOR
37 {
38  UCHAR JumpBoot[3]; // Jump instruction to boot code
39  CHAR OemName[8]; // "MSWIN4.1" for MS formatted volumes
40  USHORT BytesPerSector; // Bytes per sector
41  UCHAR SectorsPerCluster; // Number of sectors in a cluster
42  USHORT ReservedSectors; // Reserved sectors, usually 1 (the bootsector)
43  UCHAR NumberOfFats; // Number of FAT tables
44  USHORT RootDirEntries; // Number of root directory entries (fat12/16)
45  USHORT TotalSectors; // Number of total sectors on the drive, 16-bit
46  UCHAR MediaDescriptor; // Media descriptor byte
47  USHORT SectorsPerFat; // Sectors per FAT table (fat12/16)
48  USHORT SectorsPerTrack; // Number of sectors in a track
49  USHORT NumberOfHeads; // Number of heads on the disk
50  ULONG HiddenSectors; // Hidden sectors (sectors before the partition start like the partition table)
51  ULONG TotalSectorsBig; // This field is the new 32-bit total count of sectors on the volume
52  UCHAR DriveNumber; // Int 0x13 drive number (e.g. 0x80)
53  UCHAR Reserved1; // Reserved (used by Windows NT). Code that formats FAT volumes should always set this byte to 0.
54  UCHAR BootSignature; // Extended boot signature (0x29). This is a signature byte that indicates that the following three fields in the boot sector are present.
55  ULONG VolumeSerialNumber; // Volume serial number
56  CHAR VolumeLabel[11]; // Volume label. This field matches the 11-byte volume label recorded in the root directory
57  CHAR FileSystemType[8]; // One of the strings "FAT12 ", "FAT16 ", or "FAT "
58 
59  UCHAR BootCodeAndData[448]; // The remainder of the boot sector
60 
62 
65 
66 typedef struct _FAT32_BOOTSECTOR
67 {
68  UCHAR JumpBoot[3]; // Jump instruction to boot code
69  CHAR OemName[8]; // "MSWIN4.1" for MS formatted volumes
70  USHORT BytesPerSector; // Bytes per sector
71  UCHAR SectorsPerCluster; // Number of sectors in a cluster
72  USHORT ReservedSectors; // Reserved sectors, usually 1 (the bootsector)
73  UCHAR NumberOfFats; // Number of FAT tables
74  USHORT RootDirEntries; // Number of root directory entries (fat12/16)
75  USHORT TotalSectors; // Number of total sectors on the drive, 16-bit
76  UCHAR MediaDescriptor; // Media descriptor byte
77  USHORT SectorsPerFat; // Sectors per FAT table (fat12/16)
78  USHORT SectorsPerTrack; // Number of sectors in a track
79  USHORT NumberOfHeads; // Number of heads on the disk
80  ULONG HiddenSectors; // Hidden sectors (sectors before the partition start like the partition table)
81  ULONG TotalSectorsBig; // This field is the new 32-bit total count of sectors on the volume
82  ULONG SectorsPerFatBig; // This field is the FAT32 32-bit count of sectors occupied by ONE FAT. BPB_FATSz16 must be 0
83  USHORT ExtendedFlags; // Extended flags (fat32)
84  USHORT FileSystemVersion; // File system version (fat32)
85  ULONG RootDirStartCluster; // Starting cluster of the root directory (fat32)
86  USHORT FsInfo; // Sector number of FSINFO structure in the reserved area of the FAT32 volume. Usually 1.
87  USHORT BackupBootSector; // If non-zero, indicates the sector number in the reserved area of the volume of a copy of the boot record. Usually 6.
88  UCHAR Reserved[12]; // Reserved for future expansion
89  UCHAR DriveNumber; // Int 0x13 drive number (e.g. 0x80)
90  UCHAR Reserved1; // Reserved (used by Windows NT). Code that formats FAT volumes should always set this byte to 0.
91  UCHAR BootSignature; // Extended boot signature (0x29). This is a signature byte that indicates that the following three fields in the boot sector are present.
92  ULONG VolumeSerialNumber; // Volume serial number
93  CHAR VolumeLabel[11]; // Volume label. This field matches the 11-byte volume label recorded in the root directory
94  CHAR FileSystemType[8]; // Always set to the string "FAT32 "
95 
96  UCHAR BootCodeAndData[420]; // The remainder of the boot sector
97 
99 
102 
103 typedef struct _BTRFS_BOOTSECTOR
104 {
109  UCHAR Fill[1521]; // 1536 - 15
113 
114 typedef struct _NTFS_BOOTSECTOR
115 {
139  UCHAR BootCodeAndData[7680]; // The remainder of the boot sector (8192 - 512)
142 
143 // TODO: Add more bootsector structures!
144 
145 #include <poppack.h>
146 
147 
148 /* LOCALS *******************************************************************/
149 
151 typedef struct _FILE_SYSTEM
152 {
157 
158 /* The list of file systems on which we can install ReactOS */
160 {
161  /* NOTE: The FAT formatter will automatically
162  * determine whether to use FAT12/16 or FAT32. */
163  { L"FAT" , VfatFormat, VfatChkdsk },
164  { L"FAT32", VfatFormat, VfatChkdsk },
165 #if 0
166  { L"FATX" , VfatxFormat, VfatxChkdsk },
167  { L"NTFS" , NtfsFormat, NtfsChkdsk },
168 #endif
169  { L"BTRFS", BtrfsFormat, BtrfsChkdsk },
170 #if 0
171  { L"EXT2" , Ext2Format, Ext2Chkdsk },
172  { L"EXT3" , Ext2Format, Ext2Chkdsk },
173  { L"EXT4" , Ext2Format, Ext2Chkdsk },
174 #endif
175 };
176 
177 
178 /* FUNCTIONS ****************************************************************/
179 
181 BOOLEAN
183  IN ULONG Index,
184  OUT PCWSTR* FileSystemName)
185 {
187  return FALSE;
188 
189  *FileSystemName = RegisteredFileSystems[Index].FileSystemName;
190 
191  return TRUE;
192 }
193 
194 
196 static PFILE_SYSTEM
198  IN PCWSTR FileSystemName)
199 {
200 #if 0 // Reenable when the list of registered FSes will again be dynamic
201 
202  PLIST_ENTRY ListEntry;
204 
205  ListEntry = List->ListHead.Flink;
206  while (ListEntry != &List->ListHead)
207  {
208  Item = CONTAINING_RECORD(ListEntry, FILE_SYSTEM_ITEM, ListEntry);
209  if (Item->FileSystemName &&
210  (wcsicmp(FileSystemName, Item->FileSystemName) == 0))
211  {
212  return Item;
213  }
214 
215  ListEntry = ListEntry->Flink;
216  }
217 
218 #else
219 
222 
223  ASSERT(FileSystems && Count != 0);
224 
225  while (Count--)
226  {
227  if (FileSystems->FileSystemName &&
228  (wcsicmp(FileSystemName, FileSystems->FileSystemName) == 0))
229  {
230  return FileSystems;
231  }
232 
233  ++FileSystems;
234  }
235 
236 #endif
237 
238  return NULL;
239 }
240 
241 
243 NTSTATUS
245  IN PUNICODE_STRING DriveRoot,
246  IN PCWSTR FileSystemName,
249  IN BOOLEAN CheckOnlyIfDirty,
250  IN BOOLEAN ScanDrive,
252 {
256 
257  FileSystem = GetFileSystemByName(FileSystemName);
258 
259  if (!FileSystem || !FileSystem->ChkdskFunc)
260  {
261  // Success = FALSE;
262  // Callback(DONE, 0, &Success);
263  return STATUS_NOT_SUPPORTED;
264  }
265 
267  Success = FileSystem->ChkdskFunc(DriveRoot,
268  Callback,
269  FixErrors,
270  Verbose,
271  CheckOnlyIfDirty,
272  ScanDrive,
273  NULL,
274  NULL,
275  NULL,
276  NULL,
277  (PULONG)&Status);
278  if (!Success)
279  DPRINT1("ChkdskFunc() failed with Status 0x%lx\n", Status);
280 
281  // Callback(DONE, 0, &Success);
282 
283  return Status;
284 }
285 
286 NTSTATUS
288  IN PCWSTR DriveRoot,
289  IN PCWSTR FileSystemName,
292  IN BOOLEAN CheckOnlyIfDirty,
293  IN BOOLEAN ScanDrive,
295 {
296  UNICODE_STRING DriveRootU;
297 
298  RtlInitUnicodeString(&DriveRootU, DriveRoot);
299  return ChkdskFileSystem_UStr(&DriveRootU,
300  FileSystemName,
301  FixErrors,
302  Verbose,
303  CheckOnlyIfDirty,
304  ScanDrive,
305  Callback);
306 }
307 
308 
310 NTSTATUS
312  IN PUNICODE_STRING DriveRoot,
313  IN PCWSTR FileSystemName,
314  IN FMIFS_MEDIA_FLAG MediaFlag,
319 {
322  BOOLEAN BackwardCompatible = FALSE; // Default to latest FS versions.
323  MEDIA_TYPE MediaType;
324 
325  FileSystem = GetFileSystemByName(FileSystemName);
326 
327  if (!FileSystem || !FileSystem->FormatFunc)
328  {
329  // Success = FALSE;
330  // Callback(DONE, 0, &Success);
331  return STATUS_NOT_SUPPORTED;
332  }
333 
334  /* Set the BackwardCompatible flag in case we format with older FAT12/16 */
335  if (wcsicmp(FileSystemName, L"FAT") == 0)
336  BackwardCompatible = TRUE;
337  // else if (wcsicmp(FileSystemName, L"FAT32") == 0)
338  // BackwardCompatible = FALSE;
339 
340  /* Convert the FMIFS MediaFlag to a NT MediaType */
341  // FIXME: Actually covert all the possible flags.
342  switch (MediaFlag)
343  {
344  case FMIFS_FLOPPY:
345  MediaType = F5_320_1024; // FIXME: This is hardfixed!
346  break;
347  case FMIFS_REMOVABLE:
348  MediaType = RemovableMedia;
349  break;
350  case FMIFS_HARDDISK:
351  MediaType = FixedMedia;
352  break;
353  default:
354  DPRINT1("Unknown FMIFS MediaFlag %d, converting 1-to-1 to NT MediaType\n",
355  MediaFlag);
356  MediaType = (MEDIA_TYPE)MediaFlag;
357  break;
358  }
359 
360  Success = FileSystem->FormatFunc(DriveRoot,
361  Callback,
362  QuickFormat,
363  BackwardCompatible,
364  MediaType,
365  Label,
366  ClusterSize);
367  if (!Success)
368  DPRINT1("FormatFunc() failed\n");
369 
370  // Callback(DONE, 0, &Success);
371 
373 }
374 
375 NTSTATUS
377  IN PCWSTR DriveRoot,
378  IN PCWSTR FileSystemName,
379  IN FMIFS_MEDIA_FLAG MediaFlag,
380  IN PCWSTR Label,
384 {
385  UNICODE_STRING DriveRootU;
386  UNICODE_STRING LabelU;
387 
388  RtlInitUnicodeString(&DriveRootU, DriveRoot);
389  RtlInitUnicodeString(&LabelU, Label);
390 
391  return FormatFileSystem_UStr(&DriveRootU,
392  FileSystemName,
393  MediaFlag,
394  &LabelU,
395  QuickFormat,
396  ClusterSize,
397  Callback);
398 }
399 
400 
401 //
402 // Bootsector routines
403 //
404 
405 NTSTATUS
407  IN PCWSTR SrcPath, // FAT12/16 bootsector source file (on the installation medium)
408  IN HANDLE DstPath, // Where to save the bootsector built from the source + partition information
409  IN HANDLE RootPartition) // Partition holding the (old) FAT12/16 information
410 {
415  BOOTCODE OrigBootSector = {0};
416  BOOTCODE NewBootSector = {0};
417 
418  /* Allocate and read the current original partition bootsector */
419  Status = ReadBootCodeByHandle(&OrigBootSector,
422  if (!NT_SUCCESS(Status))
423  return Status;
424 
425  /* Allocate and read the new bootsector from SrcPath */
426  RtlInitUnicodeString(&Name, SrcPath);
427  Status = ReadBootCodeFromFile(&NewBootSector,
428  &Name,
430  if (!NT_SUCCESS(Status))
431  {
432  FreeBootCode(&OrigBootSector);
433  return Status;
434  }
435 
436  /* Adjust the bootsector (copy a part of the FAT12/16 BPB) */
437  RtlCopyMemory(&((PFAT_BOOTSECTOR)NewBootSector.BootCode)->OemName,
438  &((PFAT_BOOTSECTOR)OrigBootSector.BootCode)->OemName,
439  FIELD_OFFSET(FAT_BOOTSECTOR, BootCodeAndData) -
441 
442  /* Free the original bootsector */
443  FreeBootCode(&OrigBootSector);
444 
445  /* Write the new bootsector to DstPath */
446  FileOffset.QuadPart = 0ULL;
448  NULL,
449  NULL,
450  NULL,
451  &IoStatusBlock,
452  NewBootSector.BootCode,
453  NewBootSector.Length,
454  &FileOffset,
455  NULL);
456 
457  /* Free the new bootsector */
458  FreeBootCode(&NewBootSector);
459 
460  return Status;
461 }
462 
463 NTSTATUS
465  IN PCWSTR SrcPath, // FAT32 bootsector source file (on the installation medium)
466  IN HANDLE DstPath, // Where to save the bootsector built from the source + partition information
467  IN HANDLE RootPartition) // Partition holding the (old) FAT32 information
468 {
474  BOOTCODE OrigBootSector = {0};
475  BOOTCODE NewBootSector = {0};
476 
477  /* Allocate and read the current original partition bootsector */
478  Status = ReadBootCodeByHandle(&OrigBootSector,
481  if (!NT_SUCCESS(Status))
482  return Status;
483 
484  /* Allocate and read the new bootsector (2 sectors) from SrcPath */
485  RtlInitUnicodeString(&Name, SrcPath);
486  Status = ReadBootCodeFromFile(&NewBootSector,
487  &Name,
489  if (!NT_SUCCESS(Status))
490  {
491  FreeBootCode(&OrigBootSector);
492  return Status;
493  }
494 
495  /* Adjust the bootsector (copy a part of the FAT32 BPB) */
496  RtlCopyMemory(&((PFAT32_BOOTSECTOR)NewBootSector.BootCode)->OemName,
497  &((PFAT32_BOOTSECTOR)OrigBootSector.BootCode)->OemName,
498  FIELD_OFFSET(FAT32_BOOTSECTOR, BootCodeAndData) -
500 
501  /*
502  * We know we copy the boot code to a file only when DstPath != RootPartition,
503  * otherwise the boot code is copied to the specified root partition.
504  */
505  if (DstPath != RootPartition)
506  {
507  /* Copy to a file: Disable the backup bootsector */
508  ((PFAT32_BOOTSECTOR)NewBootSector.BootCode)->BackupBootSector = 0;
509  }
510  else
511  {
512  /* Copy to a disk: Get the location of the backup bootsector */
513  BackupBootSector = ((PFAT32_BOOTSECTOR)OrigBootSector.BootCode)->BackupBootSector;
514  }
515 
516  /* Free the original bootsector */
517  FreeBootCode(&OrigBootSector);
518 
519  /* Write the first sector of the new bootcode to DstPath sector 0 */
520  FileOffset.QuadPart = 0ULL;
522  NULL,
523  NULL,
524  NULL,
525  &IoStatusBlock,
526  NewBootSector.BootCode,
528  &FileOffset,
529  NULL);
530  if (!NT_SUCCESS(Status))
531  {
532  DPRINT1("NtWriteFile() failed (Status %lx)\n", Status);
533  FreeBootCode(&NewBootSector);
534  return Status;
535  }
536 
537  if (DstPath == RootPartition)
538  {
539  /* Copy to a disk: Write the backup bootsector */
540  if ((BackupBootSector != 0x0000) && (BackupBootSector != 0xFFFF))
541  {
544  NULL,
545  NULL,
546  NULL,
547  &IoStatusBlock,
548  NewBootSector.BootCode,
550  &FileOffset,
551  NULL);
552  if (!NT_SUCCESS(Status))
553  {
554  DPRINT1("NtWriteFile() failed (Status %lx)\n", Status);
555  FreeBootCode(&NewBootSector);
556  return Status;
557  }
558  }
559  }
560 
561  /* Write the second sector of the new bootcode to boot disk sector 14 */
562  // FileOffset.QuadPart = (ULONGLONG)(14 * FAT32_BOOTSECTOR_SIZE);
563  FileOffset.QuadPart = 14 * FAT32_BOOTSECTOR_SIZE;
564  Status = NtWriteFile(DstPath, // or really RootPartition ???
565  NULL,
566  NULL,
567  NULL,
568  &IoStatusBlock,
569  ((PUCHAR)NewBootSector.BootCode + FAT32_BOOTSECTOR_SIZE),
571  &FileOffset,
572  NULL);
573  if (!NT_SUCCESS(Status))
574  {
575  DPRINT1("NtWriteFile() failed (Status %lx)\n", Status);
576  }
577 
578  /* Free the new bootsector */
579  FreeBootCode(&NewBootSector);
580 
581  return Status;
582 }
583 
584 NTSTATUS
586  IN PCWSTR SrcPath, // BTRFS bootsector source file (on the installation medium)
587  IN HANDLE DstPath, // Where to save the bootsector built from the source + partition information
588  IN HANDLE RootPartition) // Partition holding the (old) BTRFS information
589 {
591  NTSTATUS LockStatus;
595  PARTITION_INFORMATION_EX PartInfo;
596  BOOTCODE NewBootSector = {0};
597 
598  /* Allocate and read the new bootsector from SrcPath */
599  RtlInitUnicodeString(&Name, SrcPath);
600  Status = ReadBootCodeFromFile(&NewBootSector,
601  &Name,
603  if (!NT_SUCCESS(Status))
604  return Status;
605 
606  /*
607  * The BTRFS driver requires the volume to be locked in order to modify
608  * the first sectors of the partition, even though they are outside the
609  * file-system space / in the reserved area (they are situated before
610  * the super-block at 0x1000) and is in principle allowed by the NT
611  * storage stack.
612  * So we lock here in order to write the bootsector at sector 0.
613  * If locking fails, we ignore and continue nonetheless.
614  */
615  LockStatus = NtFsControlFile(DstPath,
616  NULL,
617  NULL,
618  NULL,
619  &IoStatusBlock,
621  NULL,
622  0,
623  NULL,
624  0);
625  if (!NT_SUCCESS(LockStatus))
626  {
627  DPRINT1("WARNING: Failed to lock BTRFS volume for writing bootsector! Operations may fail! (Status 0x%lx)\n", LockStatus);
628  }
629 
630  /* Obtain partition info and write it to the bootsector */
632  NULL,
633  NULL,
634  NULL,
635  &IoStatusBlock,
637  NULL,
638  0,
639  &PartInfo,
640  sizeof(PartInfo));
641  if (!NT_SUCCESS(Status))
642  {
643  DPRINT1("IOCTL_DISK_GET_PARTITION_INFO_EX failed (Status %lx)\n", Status);
644  goto Quit;
645  }
646 
647  /* Write new bootsector to RootPath */
648  ((PBTRFS_BOOTSECTOR)NewBootSector.BootCode)->PartitionStartLBA =
650 
651  /* Write sector 0 */
652  FileOffset.QuadPart = 0ULL;
654  NULL,
655  NULL,
656  NULL,
657  &IoStatusBlock,
658  NewBootSector.BootCode,
659  NewBootSector.Length,
660  &FileOffset,
661  NULL);
662  if (!NT_SUCCESS(Status))
663  {
664  DPRINT1("NtWriteFile() failed (Status %lx)\n", Status);
665  goto Quit;
666  }
667 
668 Quit:
669  /* Unlock the volume */
670  LockStatus = NtFsControlFile(DstPath,
671  NULL,
672  NULL,
673  NULL,
674  &IoStatusBlock,
676  NULL,
677  0,
678  NULL,
679  0);
680  if (!NT_SUCCESS(LockStatus))
681  {
682  DPRINT1("Failed to unlock BTRFS volume (Status 0x%lx)\n", LockStatus);
683  }
684 
685  /* Free the new bootsector */
686  FreeBootCode(&NewBootSector);
687 
688  return Status;
689 }
690 
691 NTSTATUS
693  IN PCWSTR SrcPath, // NTFS bootsector source file (on the installation medium)
694  IN HANDLE DstPath, // Where to save the bootsector built from the source + partition information
695  IN HANDLE RootPartition) // Partition holding the (old) NTFS information
696 {
701  BOOTCODE OrigBootSector = {0};
702  BOOTCODE NewBootSector = {0};
703 
704  /* Allocate and read the current original partition bootsector */
706  if (!NT_SUCCESS(Status))
707  {
708  DPRINT1("InstallNtfsBootCode: Status %lx\n", Status);
709  return Status;
710  }
711 
712  /* Allocate and read the new bootsector (16 sectors) from SrcPath */
713  RtlInitUnicodeString(&Name, SrcPath);
715  if (!NT_SUCCESS(Status))
716  {
717  DPRINT1("InstallNtfsBootCode: Status %lx\n", Status);
718  FreeBootCode(&OrigBootSector);
719  return Status;
720  }
721 
722  /* Adjust the bootsector (copy a part of the NTFS BPB) */
723  RtlCopyMemory(&((PNTFS_BOOTSECTOR)NewBootSector.BootCode)->OEMID,
724  &((PNTFS_BOOTSECTOR)OrigBootSector.BootCode)->OEMID,
726 
727  /* Write sector 0 */
728  FileOffset.QuadPart = 0ULL;
730  NULL,
731  NULL,
732  NULL,
733  &IoStatusBlock,
734  NewBootSector.BootCode,
735  NewBootSector.Length,
736  &FileOffset,
737  NULL);
738  if (!NT_SUCCESS(Status))
739  {
740  DPRINT1("NtWriteFile() failed (Status %lx)\n", Status);
741  goto Quit;
742  }
743 
744 Quit:
745  /* Free the new bootsector */
746  FreeBootCode(&NewBootSector);
747 
748  return Status;
749 }
750 
751 
752 //
753 // Formatting routines
754 //
755 
756 NTSTATUS
758  IN PPARTENTRY PartEntry,
761  IN BOOLEAN CheckOnlyIfDirty,
762  IN BOOLEAN ScanDrive,
764 {
766  PDISKENTRY DiskEntry = PartEntry->DiskEntry;
767  // UNICODE_STRING PartitionRootPath;
768  WCHAR PartitionRootPath[MAX_PATH]; // PathBuffer
769 
770  ASSERT(PartEntry->IsPartitioned && PartEntry->PartitionNumber != 0);
771 
772  /* HACK: Do not try to check a partition with an unknown filesystem */
773  if (!*PartEntry->FileSystem)
774  {
775  PartEntry->NeedsCheck = FALSE;
776  return STATUS_SUCCESS;
777  }
778 
779  /* Set PartitionRootPath */
780  RtlStringCchPrintfW(PartitionRootPath, ARRAYSIZE(PartitionRootPath),
781  L"\\Device\\Harddisk%lu\\Partition%lu",
782  DiskEntry->DiskNumber,
783  PartEntry->PartitionNumber);
784  DPRINT("PartitionRootPath: %S\n", PartitionRootPath);
785 
786  /* Check the partition */
787  Status = ChkdskFileSystem(PartitionRootPath,
788  PartEntry->FileSystem,
789  FixErrors,
790  Verbose,
791  CheckOnlyIfDirty,
792  ScanDrive,
793  Callback);
794  if (!NT_SUCCESS(Status))
795  return Status;
796 
797  PartEntry->NeedsCheck = FALSE;
798  return STATUS_SUCCESS;
799 }
800 
801 NTSTATUS
803  IN PPARTENTRY PartEntry,
804  IN PCWSTR FileSystemName,
805  IN FMIFS_MEDIA_FLAG MediaFlag,
806  IN PCWSTR Label,
810 {
812  PDISKENTRY DiskEntry = PartEntry->DiskEntry;
814  // UNICODE_STRING PartitionRootPath;
815  WCHAR PartitionRootPath[MAX_PATH]; // PathBuffer
816 
817  ASSERT(PartEntry->IsPartitioned && PartEntry->PartitionNumber != 0);
818 
819  if (!FileSystemName || !*FileSystemName)
820  {
821  DPRINT1("No file system specified?\n");
823  }
824 
825  /*
826  * Prepare the partition for formatting (for MBR disks, reset the
827  * partition type), and adjust the filesystem name in case of FAT
828  * vs. FAT32, depending on the geometry of the partition.
829  */
830 
831 // FIXME: Do this only if QuickFormat == FALSE? What about FAT handling?
832 
833  /*
834  * Retrieve a partition type as a hint only. It will be used to determine
835  * whether to actually use FAT12/16 or FAT32 filesystem, depending on the
836  * geometry of the partition. If the partition resides on an MBR disk,
837  * the partition style will be reset to this value as well, unless the
838  * partition is OEM.
839  */
841  PartEntry->StartSector.QuadPart,
842  PartEntry->SectorCount.QuadPart);
844  {
845  /* Unknown file system */
846  DPRINT1("Unknown file system '%S'\n", FileSystemName);
848  }
849 
850  /* Reset the MBR partition type, unless this is an OEM partition */
851  if (DiskEntry->DiskStyle == PARTITION_STYLE_MBR)
852  {
853  if (!IsOEMPartition(PartEntry->PartitionType))
855  }
856 
857  /*
858  * Adjust the filesystem name in case of FAT vs. FAT32, according to
859  * the type of partition returned by FileSystemToMBRPartitionType().
860  */
861  if (wcsicmp(FileSystemName, L"FAT") == 0)
862  {
863  if ((PartitionType == PARTITION_FAT32) ||
865  {
866  FileSystemName = L"FAT32";
867  }
868  }
869 
870  /* Commit the partition changes to the disk */
871  Status = WritePartitions(DiskEntry);
872  if (!NT_SUCCESS(Status))
873  {
874  DPRINT1("WritePartitions(disk %lu) failed, Status 0x%08lx\n",
875  DiskEntry->DiskNumber, Status);
877  }
878 
879  /* Set PartitionRootPath */
880  RtlStringCchPrintfW(PartitionRootPath, ARRAYSIZE(PartitionRootPath),
881  L"\\Device\\Harddisk%lu\\Partition%lu",
882  DiskEntry->DiskNumber,
883  PartEntry->PartitionNumber);
884  DPRINT("PartitionRootPath: %S\n", PartitionRootPath);
885 
886  /* Format the partition */
887  Status = FormatFileSystem(PartitionRootPath,
888  FileSystemName,
889  MediaFlag,
890  Label,
891  QuickFormat,
892  ClusterSize,
893  Callback);
894  if (!NT_SUCCESS(Status))
895  return Status;
896 
897 //
898 // TODO: Here, call a partlist.c function that update the actual
899 // FS name and the label fields of the volume.
900 //
901  PartEntry->FormatState = Formatted;
902 
903  /* Set the new partition's file system proper */
904  RtlStringCbCopyW(PartEntry->FileSystem,
905  sizeof(PartEntry->FileSystem),
906  FileSystemName);
907 
908  PartEntry->New = FALSE;
909 
910  return STATUS_SUCCESS;
911 }
912 
913 /* EOF */
USHORT BytesPerSector
Definition: fsutil.c:70
BOOLEAN NTAPI Ext2Chkdsk(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: Mke2fs.c:1007
UCHAR SectorsPerCluster
Definition: fsutil.c:41
#define PARTITION_FAT32
Definition: disk.h:95
NTSTRSAFEAPI RtlStringCbCopyW(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_ NTSTRSAFE_PCWSTR pszSrc)
Definition: ntstrsafe.h:174
#define FAT_BOOTSECTOR_SIZE
Definition: fsutil.h:68
struct _FILE_SYSTEM FILE_SYSTEM
const uint16_t * PCWSTR
Definition: typedefs.h:57
#define IN
Definition: typedefs.h:39
return STATUS_NOT_SUPPORTED
BOOLEAN NTAPI BtrfsFormat(IN PUNICODE_STRING DriveRoot, IN PFMIFSCALLBACK Callback, IN BOOLEAN QuickFormat, IN BOOLEAN BackwardCompatible, IN MEDIA_TYPE MediaType, IN PUNICODE_STRING Label, IN ULONG ClusterSize)
#define FSCTL_UNLOCK_VOLUME
Definition: nt_native.h:833
PWCHAR FileSystem
Definition: format.c:72
UCHAR SectorsPerCluster
Definition: fsutil.c:71
USHORT TotalSectors
Definition: fsutil.c:45
UCHAR Reserved1
Definition: fsutil.c:90
#define NTFS_BOOTSECTOR_SIZE
Definition: fsutil.h:71
UCHAR Unused1[2]
Definition: fsutil.c:122
ULONGLONG PartitionStartLBA
Definition: fsutil.c:108
BOOL Verbose
Definition: chkdsk.c:72
USHORT BootSectorMagic
Definition: fsutil.c:98
#define TRUE
Definition: types.h:120
UCHAR OEMID[8]
Definition: fsutil.c:117
ULONGLONG MftMirrLocation
Definition: fsutil.c:130
ULONGLONG SerialNumber
Definition: fsutil.c:135
NTSTRSAFEVAPI RtlStringCchPrintfW(_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cchDest, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
Definition: ntstrsafe.h:1110
unsigned char * PUCHAR
Definition: retypes.h:3
char CHAR
Definition: xmlstorage.h:175
#define BTRFS_BOOTSECTOR_SIZE
Definition: fsutil.h:70
UCHAR JumpBoot[3]
Definition: fsutil.c:105
BOOLEAN NTAPI NtfsChkdsk(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: ntfslib.c:33
LONG NTSTATUS
Definition: precomp.h:26
USHORT BootSectorMagic
Definition: fsutil.c:110
UCHAR JumpBoot[3]
Definition: fsutil.c:68
PULIB_FORMAT FormatFunc
Definition: fsutil.c:154
ULONG Length
Definition: bootcode.h:18
ULONG DiskNumber
Definition: partlist.h:111
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
NTSTATUS ReadBootCodeFromFile(IN OUT PBOOTCODE BootCodeInfo, IN PUNICODE_STRING FilePath, IN ULONG Length OPTIONAL)
Definition: bootcode.c:69
ULONG TotalSectorsBig
Definition: fsutil.c:81
enum _MEDIA_TYPE MEDIA_TYPE
BOOLEAN NTAPI VfatxChkdsk(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: vfatxlib.c:162
CHAR ClustersPerMftRecord
Definition: fsutil.c:131
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)
NTSTATUS InstallBtrfsBootCode(IN PCWSTR SrcPath, IN HANDLE DstPath, IN HANDLE RootPartition)
Definition: fsutil.c:585
USHORT EndSector
Definition: fsutil.c:138
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: vfatlib.c:50
UCHAR Unused4[3]
Definition: fsutil.c:132
UCHAR Checksum[4]
Definition: fsutil.c:136
struct _BTRFS_BOOTSECTOR * PBTRFS_BOOTSECTOR
BOOL BackupBootSector(LPCTSTR lpszVolumeName)
Definition: install.c:61
ULONG VolumeSerialNumber
Definition: fsutil.c:92
NTSTATUS ChkdskFileSystem(IN PCWSTR DriveRoot, IN PCWSTR FileSystemName, IN BOOLEAN FixErrors, IN BOOLEAN Verbose, IN BOOLEAN CheckOnlyIfDirty, IN BOOLEAN ScanDrive, IN PFMIFSCALLBACK Callback)
Definition: fsutil.c:287
ULONGLONG MftLocation
Definition: fsutil.c:129
USHORT BytesPerSector
Definition: fsutil.c:40
#define PARTITION_ENTRY_UNUSED
Definition: disk.h:86
CHAR VolumeLabel[11]
Definition: fsutil.c:56
#define L(x)
Definition: ntvdm.h:50
PARTITION_STYLE DiskStyle
Definition: partlist.h:121
struct _FAT_BOOTSECTOR FAT_BOOTSECTOR
UCHAR ChunkMapSize
Definition: fsutil.c:106
#define FALSE
Definition: types.h:117
IN HANDLE DstPath
Definition: fsutil.h:76
ULONG SectorsPerFatBig
Definition: fsutil.c:82
#define STATUS_UNRECOGNIZED_VOLUME
Definition: udferr_usr.h:173
USHORT RootDirEntries
Definition: fsutil.c:44
C_ASSERT(sizeof(FAT_BOOTSECTOR)==FAT_BOOTSECTOR_SIZE)
CHAR OemName[8]
Definition: fsutil.c:39
struct NameRec_ * Name
Definition: cdprocs.h:459
UCHAR JumpBoot[3]
Definition: fsutil.c:38
BOOLEAN NTAPI Ext2Format(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: Mke2fs.c:803
UCHAR Unused2[4]
Definition: fsutil.c:125
unsigned char BOOLEAN
BOOLEAN(NTAPI * PULIB_FORMAT)(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: fmifs.h:217
USHORT NumberOfHeads
Definition: fsutil.c:49
UCHAR BootCodeAndData[448]
Definition: fsutil.c:59
_Reserved_ PVOID Reserved
Definition: winddi.h:3974
struct _FAT32_BOOTSECTOR * PFAT32_BOOTSECTOR
UCHAR BootStrap[426]
Definition: fsutil.c:137
BOOL QuickFormat
Definition: format.c:66
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
#define ULL(a, b)
Definition: format_msg.c:27
CHAR FileSystemType[8]
Definition: fsutil.c:94
PULIB_CHKDSK ChkdskFunc
Definition: fsutil.c:155
UCHAR BootSignature
Definition: fsutil.c:54
Status
Definition: gdiplustypes.h:24
BOOLEAN NTAPI BtrfsChkdsk(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)
USHORT RootDirEntries
Definition: fsutil.c:74
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
int Count
Definition: noreturn.cpp:7
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 ASSERT(a)
Definition: mode.c:44
USHORT ReservedSectors
Definition: fsutil.c:42
USHORT ReservedSectors
Definition: fsutil.c:72
UCHAR MediaId
Definition: fsutil.c:121
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
CHAR OemName[8]
Definition: fsutil.c:69
BOOLEAN NTAPI VfatxFormat(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: vfatxlib.c:20
_In_ WDFCOLLECTION _In_ ULONG Index
uint64_t ULONGLONG
Definition: typedefs.h:67
USHORT Heads
Definition: fsutil.c:124
static FILE_SYSTEM RegisteredFileSystems[]
Definition: fsutil.c:159
#define MAX_PATH
Definition: compat.h:34
DWORD ClusterSize
Definition: format.c:67
UCHAR Reserved1
Definition: fsutil.c:53
USHORT SectorsPerFat
Definition: fsutil.c:47
UCHAR BootSignature
Definition: fsutil.c:91
USHORT BackupBootSector
Definition: fsutil.c:87
PVOID BootCode
Definition: bootcode.h:17
UCHAR FileSystemToMBRPartitionType(IN PCWSTR FileSystem, IN ULONGLONG StartSector, IN ULONGLONG SectorCount)
Definition: fsrec.c:333
USHORT BootSectorMagic
Definition: fsutil.c:61
IN HANDLE IN HANDLE RootPartition
Definition: fsutil.h:76
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
UCHAR NumberOfFats
Definition: fsutil.c:43
CHAR VolumeLabel[11]
Definition: fsutil.c:93
#define wcsicmp
Definition: compat.h:15
UCHAR DriveNumber
Definition: fsutil.c:89
LARGE_INTEGER StartingOffset
Definition: imports.h:221
unsigned char UCHAR
Definition: xmlstorage.h:181
BOOLEAN GetRegisteredFileSystems(IN ULONG Index, OUT PCWSTR *FileSystemName)
Definition: fsutil.c:182
UCHAR Fill[1521]
Definition: fsutil.c:109
NTSTATUS ChkdskFileSystem_UStr(IN PUNICODE_STRING DriveRoot, IN PCWSTR FileSystemName, IN BOOLEAN FixErrors, IN BOOLEAN Verbose, IN BOOLEAN CheckOnlyIfDirty, IN BOOLEAN ScanDrive, IN PFMIFSCALLBACK Callback)
Definition: fsutil.c:244
USHORT TotalSectors
Definition: fsutil.c:75
UCHAR BootCodeAndData[7680]
Definition: fsutil.c:139
_Must_inspect_result_ _In_ WDFCMRESLIST List
Definition: wdfresource.h:550
UCHAR Jump[3]
Definition: fsutil.c:116
NTSYSAPI NTSTATUS NTAPI NtWriteFile(IN HANDLE hFile, IN HANDLE hEvent OPTIONAL, IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL, IN PVOID IoApcContext OPTIONAL, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN PVOID WriteBuffer, IN ULONG WriteBufferLength, IN PLARGE_INTEGER FileOffset OPTIONAL, IN PULONG LockOperationKey OPTIONAL)
NTSTATUS FormatPartition(IN PPARTENTRY PartEntry, IN PCWSTR FileSystemName, IN FMIFS_MEDIA_FLAG MediaFlag, IN PCWSTR Label, IN BOOLEAN QuickFormat, IN ULONG ClusterSize, IN PFMIFSCALLBACK Callback)
Definition: fsutil.c:802
USHORT SectorsPerTrack
Definition: fsutil.c:78
ULONG VolumeSerialNumber
Definition: fsutil.c:55
Definition: typedefs.h:119
UCHAR MediaDescriptor
Definition: fsutil.c:76
UCHAR SectorsPerCluster
Definition: fsutil.c:119
NTSTATUS FormatFileSystem(IN PCWSTR DriveRoot, IN PCWSTR FileSystemName, IN FMIFS_MEDIA_FLAG MediaFlag, IN PCWSTR Label, IN BOOLEAN QuickFormat, IN ULONG ClusterSize, IN PFMIFSCALLBACK Callback)
Definition: fsutil.c:376
USHORT SectorsPerTrack
Definition: fsutil.c:48
NTSTATUS ReadBootCodeByHandle(IN OUT PBOOTCODE BootCodeInfo, IN HANDLE FileHandle, IN ULONG Length OPTIONAL)
Definition: bootcode.c:21
_In_ WDFINTERRUPT _In_ PFN_WDF_INTERRUPT_SYNCHRONIZE Callback
Definition: wdfinterrupt.h:456
NTSTATUS ChkdskPartition(IN PPARTENTRY PartEntry, IN BOOLEAN FixErrors, IN BOOLEAN Verbose, IN BOOLEAN CheckOnlyIfDirty, IN BOOLEAN ScanDrive, IN PFMIFSCALLBACK Callback)
Definition: fsutil.c:757
struct _FAT32_BOOTSECTOR FAT32_BOOTSECTOR
static PFILE_SYSTEM GetFileSystemByName(IN PCWSTR FileSystemName)
Definition: fsutil.c:197
UCHAR Unused0[7]
Definition: fsutil.c:120
USHORT SectorsPerTrack
Definition: fsutil.c:123
USHORT FileSystemVersion
Definition: fsutil.c:84
ULONGLONG SectorCount
Definition: fsutil.c:128
VOID FreeBootCode(IN OUT PBOOTCODE BootCodeInfo)
Definition: bootcode.c:104
USHORT FsInfo
Definition: fsutil.c:86
NTSTATUS InstallNtfsBootCode(IN PCWSTR SrcPath, IN HANDLE DstPath, IN HANDLE RootPartition)
Definition: fsutil.c:692
BOOLEAN(NTAPI * PFMIFSCALLBACK)(IN CALLBACKCOMMAND Command, IN ULONG SubAction, IN PVOID ActionInfo)
Definition: fmifs.h:89
FILESYSTEM_CHKDSK FileSystems[]
Definition: autochk.c:47
struct _FAT_BOOTSECTOR * PFAT_BOOTSECTOR
struct _NTFS_BOOTSECTOR NTFS_BOOTSECTOR
unsigned short USHORT
Definition: pedump.c:61
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: vfatlib.c:374
_In_ PFCB _In_ LONGLONG FileOffset
Definition: cdprocs.h:159
USHORT BytesPerSector
Definition: fsutil.c:118
UCHAR MediaDescriptor
Definition: fsutil.c:46
CHAR FileSystemType[8]
Definition: fsutil.c:57
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
USHORT SectorsPerFat
Definition: fsutil.c:77
static OUT PIO_STATUS_BLOCK IoStatusBlock
Definition: pipe.c:75
UCHAR NumberOfFats
Definition: fsutil.c:73
unsigned int * PULONG
Definition: retypes.h:1
#define NULL
Definition: types.h:112
BOOLEAN(NTAPI * PULIB_CHKDSK)(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: fmifs.h:201
NTSTATUS InstallFat32BootCode(IN PCWSTR SrcPath, IN HANDLE DstPath, IN HANDLE RootPartition)
Definition: fsutil.c:464
struct _FILE_SYSTEM * PFILE_SYSTEM
_In_ WDFCOLLECTION _In_ WDFOBJECT Item
BOOL FixErrors
Definition: chkdsk.c:69
USHORT NumberOfHeads
Definition: fsutil.c:79
#define DPRINT1
Definition: precomp.h:8
ULONG TotalSectorsBig
Definition: fsutil.c:51
ULONG HiddenSectors
Definition: fsutil.c:50
NTSTATUS WritePartitions(IN PDISKENTRY DiskEntry)
Definition: partlist.c:3619
#define OUT
Definition: typedefs.h:40
ULONG HiddenSectors
Definition: fsutil.c:80
#define FSCTL_LOCK_VOLUME
Definition: nt_native.h:832
CHAR PartitionType
Definition: part_xbox.c:32
NTSTATUS FormatFileSystem_UStr(IN PUNICODE_STRING DriveRoot, IN PCWSTR FileSystemName, IN FMIFS_MEDIA_FLAG MediaFlag, IN PUNICODE_STRING Label, IN BOOLEAN QuickFormat, IN ULONG ClusterSize, IN PFMIFSCALLBACK Callback)
Definition: fsutil.c:311
unsigned int ULONG
Definition: retypes.h:1
UCHAR BootCodeAndData[420]
Definition: fsutil.c:96
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
PWCHAR Label
Definition: format.c:70
UCHAR BootDrive
Definition: fsutil.c:107
struct _BTRFS_BOOTSECTOR BTRFS_BOOTSECTOR
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define PARTITION_FAT32_XINT13
Definition: disk.h:96
#define STATUS_SUCCESS
Definition: shellext.h:65
#define FAT32_BOOTSECTOR_SIZE
Definition: fsutil.h:69
PCWSTR FileSystemName
Definition: fsutil.c:153
#define DPRINT
Definition: sndvol32.h:71
IN PDCB IN POEM_STRING OemName
Definition: fatprocs.h:1303
struct _NTFS_BOOTSECTOR * PNTFS_BOOTSECTOR
#define SECTORSIZE
Definition: bootcode.h:13
USHORT Unknown[2]
Definition: fsutil.c:127
UCHAR Unused5[3]
Definition: fsutil.c:134
#define IsOEMPartition(PartitionType)
Definition: partlist.h:22
BOOLEAN NTAPI NtfsFormat(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: ntfslib.c:18
#define IOCTL_DISK_GET_PARTITION_INFO_EX
Definition: ntddk_ex.h:206
UCHAR Unused3[4]
Definition: fsutil.c:126
VOID SetMBRPartitionType(IN PPARTENTRY PartEntry, IN UCHAR PartitionType)
Definition: partlist.c:3937
UCHAR DriveNumber
Definition: fsutil.c:52
LONGLONG QuadPart
Definition: typedefs.h:114
#define STATUS_PARTITION_FAILURE
Definition: ntstatus.h:604
ULONG RootDirStartCluster
Definition: fsutil.c:85
FMIFS_MEDIA_FLAG
Definition: fmifs.h:37
NTSTATUS InstallFatBootCode(IN PCWSTR SrcPath, IN HANDLE DstPath, IN HANDLE RootPartition)
Definition: fsutil.c:406
USHORT ExtendedFlags
Definition: fsutil.c:83
CHAR ClustersPerIndexRecord
Definition: fsutil.c:133