1 /* 2 * COPYRIGHT: See COPYING in the top level directory 3 * PROJECT: File Management IFS Utility functions 4 * FILE: reactos/dll/win32/fmifs/format.c 5 * PURPOSE: Volume format 6 * 7 * PROGRAMMERS: Emanuele Aliberti 8 * Herv� Poussineau (hpoussin@reactos.org) 9 */ 10 11 #include "precomp.h" 12 13 #define NDEBUG 14 #include <debug.h> 15 16 /* FMIFS.6 */ 17 VOID NTAPI 18 Format( 19 IN PWCHAR DriveRoot, 20 IN FMIFS_MEDIA_FLAG MediaFlag, 21 IN PWCHAR Format, 22 IN PWCHAR Label, 23 IN BOOLEAN QuickFormat, 24 IN PFMIFSCALLBACK Callback) 25 { 26 FormatEx(DriveRoot, 27 MediaFlag, 28 Format, 29 Label, 30 QuickFormat, 31 0, 32 Callback); 33 } 34 35 /* FMIFS.7 */ 36 VOID 37 NTAPI 38 FormatEx( 39 IN PWCHAR DriveRoot, 40 IN FMIFS_MEDIA_FLAG MediaFlag, 41 IN PWCHAR Format, 42 IN PWCHAR Label, 43 IN BOOLEAN QuickFormat, 44 IN ULONG ClusterSize, 45 IN PFMIFSCALLBACK Callback) 46 { 47 PIFS_PROVIDER Provider; 48 UNICODE_STRING usDriveRoot; 49 UNICODE_STRING usLabel; 50 BOOLEAN Success = FALSE; 51 BOOLEAN BackwardCompatible = FALSE; // Default to latest FS versions. 52 MEDIA_TYPE MediaType; 53 WCHAR VolumeName[MAX_PATH]; 54 //CURDIR CurDir; 55 56 // 57 // TODO: Convert filesystem Format into ULIB format string. 58 // 59 60 Provider = GetProvider(Format); 61 if (!Provider) 62 { 63 /* Unknown file system */ 64 Callback(DONE, 0, &Success); 65 return; 66 } 67 68 #if 1 69 DPRINT1("Warning: use GetVolumeNameForVolumeMountPointW() instead!\n"); 70 swprintf(VolumeName, L"\\??\\%c:", towupper(DriveRoot[0])); 71 RtlCreateUnicodeString(&usDriveRoot, VolumeName); 72 /* Code disabled as long as our storage stack doesn't understand IOCTL_MOUNTDEV_QUERY_DEVICE_NAME */ 73 #else 74 if (!GetVolumeNameForVolumeMountPointW(DriveRoot, VolumeName, RTL_NUMBER_OF(VolumeName)) || 75 !RtlDosPathNameToNtPathName_U(VolumeName, &usDriveRoot, NULL, &CurDir)) 76 { 77 /* Report an error */ 78 Callback(DONE, 0, &Success); 79 return; 80 } 81 #endif 82 83 RtlInitUnicodeString(&usLabel, Label); 84 85 /* Set the BackwardCompatible flag in case we format with older FAT12/16 */ 86 if (wcsicmp(Format, L"FAT") == 0) 87 BackwardCompatible = TRUE; 88 // else if (wcsicmp(Format, L"FAT32") == 0) 89 // BackwardCompatible = FALSE; 90 91 /* Convert the FMIFS MediaFlag to a NT MediaType */ 92 // FIXME: Actually covert all the possible flags. 93 switch (MediaFlag) 94 { 95 case FMIFS_FLOPPY: 96 MediaType = F5_320_1024; // FIXME: This is hardfixed! 97 break; 98 case FMIFS_REMOVABLE: 99 MediaType = RemovableMedia; 100 break; 101 case FMIFS_HARDDISK: 102 MediaType = FixedMedia; 103 break; 104 default: 105 DPRINT1("Unknown FMIFS MediaFlag %d, converting 1-to-1 to NT MediaType\n", 106 MediaFlag); 107 MediaType = (MEDIA_TYPE)MediaFlag; 108 break; 109 } 110 111 DPRINT("Format() - %S\n", Format); 112 Success = Provider->Format(&usDriveRoot, 113 Callback, 114 QuickFormat, 115 BackwardCompatible, 116 MediaType, 117 &usLabel, 118 ClusterSize); 119 if (!Success) 120 DPRINT1("Format() failed\n"); 121 122 /* Report success */ 123 Callback(DONE, 0, &Success); 124 125 RtlFreeUnicodeString(&usDriveRoot); 126 } 127 128 /* EOF */ 129