xref: /reactos/dll/win32/fmifs/format.c (revision 6d8aafb6)
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