58{
67
68 DPRINT(
"VfatFormat(DriveRoot '%wZ')\n", DriveRoot);
69
70
73
79
81 DriveRoot,
82 0,
85
93 {
96 }
97
105 0,
106 &DiskGeometry,
109 {
110 DPRINT(
"IOCTL_DISK_GET_DRIVE_GEOMETRY failed with status 0x%08x\n",
Status);
113 }
114
116 {
121 DPRINT(
"DiskSize %I64d\n",
126
134 0,
138 {
139 DPRINT(
"IOCTL_DISK_GET_PARTITION_INFO_EX failed with status 0x%08x\n",
Status);
142 }
143 }
144 else
145 {
159 }
160
161
162
163
165 {
167 {
169 }
173 {
175 }
178 {
180 }
181
183 {
184
185 if (
PartitionInfo.PartitionLength.QuadPart < (4200LL * 1024LL))
186 {
187
189 }
190 else if (
PartitionInfo.StartingOffset.QuadPart < (1024LL * 255LL * 63LL * 512LL))
191 {
192
193
194 if (
PartitionInfo.PartitionLength.QuadPart < (32LL * 1024LL * 1024LL))
195 {
196
198 }
199 else if (
PartitionInfo.PartitionLength.QuadPart < (512LL * 1024LL * 1024LL))
200 {
201
203 }
204 else
205 {
206
208 }
209 }
210 else
211 {
212
213
214 if (
PartitionInfo.PartitionLength.QuadPart < (512LL * 1024LL * 1024LL))
215 {
216
218 }
219 else
220 {
221
223 }
224 }
225 }
226
235 }
237 {
238 if (
PartitionInfo.PartitionLength.QuadPart < (4200LL * 1024LL))
239 {
240
242 }
243 else if (
PartitionInfo.PartitionLength.QuadPart < (512LL * 1024LL * 1024LL))
244 {
245
247 }
248 else if (
PartitionInfo.PartitionLength.QuadPart <= (32LL * 1024LL * 1024LL * 1024LL))
249 {
250
252 }
253 else
254 {
255 DPRINT1(
"The partition ist too large (> 32 GB) for the FAT file system!\n");
258 }
259
264 }
265
267 {
270 }
271
279 0,
281 0);
283 {
284 DPRINT1(
"WARNING: Failed to lock volume for formatting! Format may fail! (Status: 0x%x)\n", LockStatus);
285 }
286
288 {
289
292 &DiskGeometry,
297 }
298 else if (FatType ==
FAT_16)
299 {
300
303 &DiskGeometry,
308 }
309 else if (FatType ==
FAT_32)
310 {
311
314 &DiskGeometry,
319 }
320 else
321 {
323 }
324
325
333 0,
335 0);
337 {
338 DPRINT1(
"Failed to umount volume (Status: 0x%x)\n", LockStatus);
339 }
340
348 0,
350 0);
352 {
353 DPRINT1(
"Failed to unlock volume (Status: 0x%x)\n", LockStatus);
354 }
355
357
360}
#define PARTITION_FAT32_XINT13
#define IOCTL_DISK_GET_DRIVE_GEOMETRY
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
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)
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)
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)
#define IOCTL_DISK_GET_PARTITION_INFO_EX
_Must_inspect_result_ _In_opt_ PFLT_INSTANCE _Out_ PHANDLE FileHandle
#define FILE_SYNCHRONOUS_IO_ALERT
#define InitializeObjectAttributes(p, n, a, r, s)
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)
#define FSCTL_LOCK_VOLUME
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
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
#define FSCTL_DISMOUNT_VOLUME
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
#define FILE_GENERIC_WRITE
#define STATUS_INVALID_PARAMETER
_In_ ULONG _In_ struct _SET_PARTITION_INFORMATION_EX * PartitionInfo