1*c2c66affSColin Finck /*
2*c2c66affSColin Finck * COPYRIGHT: See COPYING in the top level directory
3*c2c66affSColin Finck * PROJECT: ReactOS VFATX filesystem library
4*c2c66affSColin Finck * FILE: fatx.c
5*c2c66affSColin Finck * PURPOSE: Fatx support
6*c2c66affSColin Finck * PROGRAMMERS:
7*c2c66affSColin Finck * REVISIONS:
8*c2c66affSColin Finck */
9*c2c66affSColin Finck
10*c2c66affSColin Finck #include "vfatxlib.h"
11*c2c66affSColin Finck
12*c2c66affSColin Finck #include <ndk/kefuncs.h>
13*c2c66affSColin Finck #include <ndk/rtlfuncs.h>
14*c2c66affSColin Finck
15*c2c66affSColin Finck #define NDEBUG
16*c2c66affSColin Finck #include <debug.h>
17*c2c66affSColin Finck
18*c2c66affSColin Finck static ULONG
GetShiftCount(IN ULONG Value)19*c2c66affSColin Finck GetShiftCount(IN ULONG Value)
20*c2c66affSColin Finck {
21*c2c66affSColin Finck ULONG i = 1;
22*c2c66affSColin Finck
23*c2c66affSColin Finck while (Value > 0)
24*c2c66affSColin Finck {
25*c2c66affSColin Finck i++;
26*c2c66affSColin Finck Value /= 2;
27*c2c66affSColin Finck }
28*c2c66affSColin Finck
29*c2c66affSColin Finck return i - 2;
30*c2c66affSColin Finck }
31*c2c66affSColin Finck
32*c2c66affSColin Finck
33*c2c66affSColin Finck static ULONG
CalcVolumeSerialNumber(VOID)34*c2c66affSColin Finck CalcVolumeSerialNumber(VOID)
35*c2c66affSColin Finck {
36*c2c66affSColin Finck LARGE_INTEGER SystemTime;
37*c2c66affSColin Finck TIME_FIELDS TimeFields;
38*c2c66affSColin Finck ULONG Serial;
39*c2c66affSColin Finck PUCHAR Buffer;
40*c2c66affSColin Finck
41*c2c66affSColin Finck NtQuerySystemTime (&SystemTime);
42*c2c66affSColin Finck RtlTimeToTimeFields (&SystemTime, &TimeFields);
43*c2c66affSColin Finck
44*c2c66affSColin Finck Buffer = (PUCHAR)&Serial;
45*c2c66affSColin Finck Buffer[0] = (UCHAR)(TimeFields.Year & 0xFF) + (UCHAR)(TimeFields.Hour & 0xFF);
46*c2c66affSColin Finck Buffer[1] = (UCHAR)(TimeFields.Year >> 8) + (UCHAR)(TimeFields.Minute & 0xFF);
47*c2c66affSColin Finck Buffer[2] = (UCHAR)(TimeFields.Month & 0xFF) + (UCHAR)(TimeFields.Second & 0xFF);
48*c2c66affSColin Finck Buffer[3] = (UCHAR)(TimeFields.Day & 0xFF) + (UCHAR)(TimeFields.Milliseconds & 0xFF);
49*c2c66affSColin Finck
50*c2c66affSColin Finck return Serial;
51*c2c66affSColin Finck }
52*c2c66affSColin Finck
53*c2c66affSColin Finck
54*c2c66affSColin Finck static NTSTATUS
FatxWriteBootSector(IN HANDLE FileHandle,IN PFATX_BOOT_SECTOR BootSector,IN OUT PFORMAT_CONTEXT Context)55*c2c66affSColin Finck FatxWriteBootSector(IN HANDLE FileHandle,
56*c2c66affSColin Finck IN PFATX_BOOT_SECTOR BootSector,
57*c2c66affSColin Finck IN OUT PFORMAT_CONTEXT Context)
58*c2c66affSColin Finck {
59*c2c66affSColin Finck IO_STATUS_BLOCK IoStatusBlock;
60*c2c66affSColin Finck NTSTATUS Status;
61*c2c66affSColin Finck PUCHAR NewBootSector;
62*c2c66affSColin Finck LARGE_INTEGER FileOffset;
63*c2c66affSColin Finck
64*c2c66affSColin Finck /* Allocate buffer for new bootsector */
65*c2c66affSColin Finck NewBootSector = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
66*c2c66affSColin Finck 0,
67*c2c66affSColin Finck sizeof(FATX_BOOT_SECTOR));
68*c2c66affSColin Finck if (NewBootSector == NULL)
69*c2c66affSColin Finck return STATUS_INSUFFICIENT_RESOURCES;
70*c2c66affSColin Finck
71*c2c66affSColin Finck /* Zero the new bootsector */
72*c2c66affSColin Finck memset(NewBootSector, 0, sizeof(FATX_BOOT_SECTOR));
73*c2c66affSColin Finck
74*c2c66affSColin Finck /* Copy FAT16 BPB to new bootsector */
75*c2c66affSColin Finck memcpy(NewBootSector, BootSector, 18); /* FAT16 BPB length (up to (not including) Res2) */
76*c2c66affSColin Finck
77*c2c66affSColin Finck /* Write sector 0 */
78*c2c66affSColin Finck FileOffset.QuadPart = 0ULL;
79*c2c66affSColin Finck Status = NtWriteFile(FileHandle,
80*c2c66affSColin Finck NULL,
81*c2c66affSColin Finck NULL,
82*c2c66affSColin Finck NULL,
83*c2c66affSColin Finck &IoStatusBlock,
84*c2c66affSColin Finck NewBootSector,
85*c2c66affSColin Finck sizeof(FATX_BOOT_SECTOR),
86*c2c66affSColin Finck &FileOffset,
87*c2c66affSColin Finck NULL);
88*c2c66affSColin Finck if (!NT_SUCCESS(Status))
89*c2c66affSColin Finck {
90*c2c66affSColin Finck DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
91*c2c66affSColin Finck RtlFreeHeap(RtlGetProcessHeap(), 0, NewBootSector);
92*c2c66affSColin Finck return Status;
93*c2c66affSColin Finck }
94*c2c66affSColin Finck
95*c2c66affSColin Finck VfatxUpdateProgress(Context, 1);
96*c2c66affSColin Finck
97*c2c66affSColin Finck /* Free the new boot sector */
98*c2c66affSColin Finck RtlFreeHeap(RtlGetProcessHeap(), 0, NewBootSector);
99*c2c66affSColin Finck
100*c2c66affSColin Finck return Status;
101*c2c66affSColin Finck }
102*c2c66affSColin Finck
103*c2c66affSColin Finck
104*c2c66affSColin Finck static NTSTATUS
Fatx16WriteFAT(IN HANDLE FileHandle,IN ULONG SectorOffset,IN ULONG FATSectors,IN OUT PFORMAT_CONTEXT Context)105*c2c66affSColin Finck Fatx16WriteFAT(IN HANDLE FileHandle,
106*c2c66affSColin Finck IN ULONG SectorOffset,
107*c2c66affSColin Finck IN ULONG FATSectors,
108*c2c66affSColin Finck IN OUT PFORMAT_CONTEXT Context)
109*c2c66affSColin Finck {
110*c2c66affSColin Finck IO_STATUS_BLOCK IoStatusBlock;
111*c2c66affSColin Finck NTSTATUS Status;
112*c2c66affSColin Finck PUCHAR Buffer;
113*c2c66affSColin Finck LARGE_INTEGER FileOffset;
114*c2c66affSColin Finck ULONG i;
115*c2c66affSColin Finck ULONG Sectors;
116*c2c66affSColin Finck
117*c2c66affSColin Finck /* Allocate buffer */
118*c2c66affSColin Finck Buffer = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
119*c2c66affSColin Finck 0,
120*c2c66affSColin Finck 32 * 1024);
121*c2c66affSColin Finck if (Buffer == NULL)
122*c2c66affSColin Finck return STATUS_INSUFFICIENT_RESOURCES;
123*c2c66affSColin Finck
124*c2c66affSColin Finck /* Zero the buffer */
125*c2c66affSColin Finck memset(Buffer, 0, 32 * 1024);
126*c2c66affSColin Finck
127*c2c66affSColin Finck /* FAT cluster 0 */
128*c2c66affSColin Finck Buffer[0] = 0xf8; /* Media type */
129*c2c66affSColin Finck Buffer[1] = 0xff;
130*c2c66affSColin Finck
131*c2c66affSColin Finck /* FAT cluster 1 */
132*c2c66affSColin Finck Buffer[2] = 0xff; /* Clean shutdown, no disk read/write errors, end-of-cluster (EOC) mark */
133*c2c66affSColin Finck Buffer[3] = 0xff;
134*c2c66affSColin Finck
135*c2c66affSColin Finck /* Write first sector of the FAT */
136*c2c66affSColin Finck FileOffset.QuadPart = (SectorOffset * 512) + sizeof(FATX_BOOT_SECTOR);
137*c2c66affSColin Finck Status = NtWriteFile(FileHandle,
138*c2c66affSColin Finck NULL,
139*c2c66affSColin Finck NULL,
140*c2c66affSColin Finck NULL,
141*c2c66affSColin Finck &IoStatusBlock,
142*c2c66affSColin Finck Buffer,
143*c2c66affSColin Finck 512,
144*c2c66affSColin Finck &FileOffset,
145*c2c66affSColin Finck NULL);
146*c2c66affSColin Finck if (!NT_SUCCESS(Status))
147*c2c66affSColin Finck {
148*c2c66affSColin Finck DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
149*c2c66affSColin Finck RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
150*c2c66affSColin Finck return Status;
151*c2c66affSColin Finck }
152*c2c66affSColin Finck
153*c2c66affSColin Finck VfatxUpdateProgress(Context, 1);
154*c2c66affSColin Finck
155*c2c66affSColin Finck /* Zero the begin of the buffer */
156*c2c66affSColin Finck memset(Buffer, 0, 4);
157*c2c66affSColin Finck
158*c2c66affSColin Finck /* Zero the rest of the FAT */
159*c2c66affSColin Finck Sectors = 32 * 1024 / 512;
160*c2c66affSColin Finck for (i = 1; i < FATSectors; i += Sectors)
161*c2c66affSColin Finck {
162*c2c66affSColin Finck /* Zero some sectors of the FAT */
163*c2c66affSColin Finck FileOffset.QuadPart = (SectorOffset + i) * 512 + sizeof(FATX_BOOT_SECTOR) ;
164*c2c66affSColin Finck if ((FATSectors - i) <= Sectors)
165*c2c66affSColin Finck {
166*c2c66affSColin Finck Sectors = FATSectors - i;
167*c2c66affSColin Finck }
168*c2c66affSColin Finck
169*c2c66affSColin Finck Status = NtWriteFile(FileHandle,
170*c2c66affSColin Finck NULL,
171*c2c66affSColin Finck NULL,
172*c2c66affSColin Finck NULL,
173*c2c66affSColin Finck &IoStatusBlock,
174*c2c66affSColin Finck Buffer,
175*c2c66affSColin Finck Sectors * 512,
176*c2c66affSColin Finck &FileOffset,
177*c2c66affSColin Finck NULL);
178*c2c66affSColin Finck if (!NT_SUCCESS(Status))
179*c2c66affSColin Finck {
180*c2c66affSColin Finck DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
181*c2c66affSColin Finck RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
182*c2c66affSColin Finck return Status;
183*c2c66affSColin Finck }
184*c2c66affSColin Finck
185*c2c66affSColin Finck VfatxUpdateProgress(Context, Sectors);
186*c2c66affSColin Finck }
187*c2c66affSColin Finck
188*c2c66affSColin Finck /* Free the buffer */
189*c2c66affSColin Finck RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
190*c2c66affSColin Finck
191*c2c66affSColin Finck return Status;
192*c2c66affSColin Finck }
193*c2c66affSColin Finck
194*c2c66affSColin Finck static NTSTATUS
Fatx32WriteFAT(IN HANDLE FileHandle,IN ULONG SectorOffset,IN ULONG FATSectors,IN OUT PFORMAT_CONTEXT Context)195*c2c66affSColin Finck Fatx32WriteFAT(IN HANDLE FileHandle,
196*c2c66affSColin Finck IN ULONG SectorOffset,
197*c2c66affSColin Finck IN ULONG FATSectors,
198*c2c66affSColin Finck IN OUT PFORMAT_CONTEXT Context)
199*c2c66affSColin Finck {
200*c2c66affSColin Finck IO_STATUS_BLOCK IoStatusBlock;
201*c2c66affSColin Finck NTSTATUS Status;
202*c2c66affSColin Finck PUCHAR Buffer;
203*c2c66affSColin Finck LARGE_INTEGER FileOffset;
204*c2c66affSColin Finck ULONG i;
205*c2c66affSColin Finck ULONG Sectors;
206*c2c66affSColin Finck
207*c2c66affSColin Finck /* Allocate buffer */
208*c2c66affSColin Finck Buffer = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
209*c2c66affSColin Finck 0,
210*c2c66affSColin Finck 64 * 1024);
211*c2c66affSColin Finck if (Buffer == NULL)
212*c2c66affSColin Finck return STATUS_INSUFFICIENT_RESOURCES;
213*c2c66affSColin Finck
214*c2c66affSColin Finck /* Zero the buffer */
215*c2c66affSColin Finck memset(Buffer, 0, 64 * 1024);
216*c2c66affSColin Finck
217*c2c66affSColin Finck /* FAT cluster 0 */
218*c2c66affSColin Finck Buffer[0] = 0xf8; /* Media type */
219*c2c66affSColin Finck Buffer[1] = 0xff;
220*c2c66affSColin Finck Buffer[2] = 0xff;
221*c2c66affSColin Finck Buffer[3] = 0x0f;
222*c2c66affSColin Finck
223*c2c66affSColin Finck /* FAT cluster 1 */
224*c2c66affSColin Finck Buffer[4] = 0xff; /* Clean shutdown, no disk read/write errors, end-of-cluster (EOC) mark */
225*c2c66affSColin Finck Buffer[5] = 0xff;
226*c2c66affSColin Finck Buffer[6] = 0xff;
227*c2c66affSColin Finck Buffer[7] = 0x0f;
228*c2c66affSColin Finck
229*c2c66affSColin Finck /* Write first sector of the FAT */
230*c2c66affSColin Finck FileOffset.QuadPart = (SectorOffset * 512) + sizeof(FATX_BOOT_SECTOR);
231*c2c66affSColin Finck Status = NtWriteFile(FileHandle,
232*c2c66affSColin Finck NULL,
233*c2c66affSColin Finck NULL,
234*c2c66affSColin Finck NULL,
235*c2c66affSColin Finck &IoStatusBlock,
236*c2c66affSColin Finck Buffer,
237*c2c66affSColin Finck 512,
238*c2c66affSColin Finck &FileOffset,
239*c2c66affSColin Finck NULL);
240*c2c66affSColin Finck if (!NT_SUCCESS(Status))
241*c2c66affSColin Finck {
242*c2c66affSColin Finck DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
243*c2c66affSColin Finck RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
244*c2c66affSColin Finck return Status;
245*c2c66affSColin Finck }
246*c2c66affSColin Finck
247*c2c66affSColin Finck VfatxUpdateProgress(Context, 1);
248*c2c66affSColin Finck
249*c2c66affSColin Finck /* Zero the begin of the buffer */
250*c2c66affSColin Finck memset(Buffer, 0, 8);
251*c2c66affSColin Finck
252*c2c66affSColin Finck /* Zero the rest of the FAT */
253*c2c66affSColin Finck Sectors = 64 * 1024 / 512;
254*c2c66affSColin Finck for (i = 1; i < FATSectors; i += Sectors)
255*c2c66affSColin Finck {
256*c2c66affSColin Finck /* Zero some sectors of the FAT */
257*c2c66affSColin Finck FileOffset.QuadPart = (SectorOffset + i) * 512 + sizeof(FATX_BOOT_SECTOR);
258*c2c66affSColin Finck
259*c2c66affSColin Finck if ((FATSectors - i) <= Sectors)
260*c2c66affSColin Finck {
261*c2c66affSColin Finck Sectors = FATSectors - i;
262*c2c66affSColin Finck }
263*c2c66affSColin Finck
264*c2c66affSColin Finck Status = NtWriteFile(FileHandle,
265*c2c66affSColin Finck NULL,
266*c2c66affSColin Finck NULL,
267*c2c66affSColin Finck NULL,
268*c2c66affSColin Finck &IoStatusBlock,
269*c2c66affSColin Finck Buffer,
270*c2c66affSColin Finck Sectors * 512,
271*c2c66affSColin Finck &FileOffset,
272*c2c66affSColin Finck NULL);
273*c2c66affSColin Finck if (!NT_SUCCESS(Status))
274*c2c66affSColin Finck {
275*c2c66affSColin Finck DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
276*c2c66affSColin Finck RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
277*c2c66affSColin Finck return Status;
278*c2c66affSColin Finck }
279*c2c66affSColin Finck
280*c2c66affSColin Finck VfatxUpdateProgress(Context, Sectors);
281*c2c66affSColin Finck }
282*c2c66affSColin Finck
283*c2c66affSColin Finck /* Free the buffer */
284*c2c66affSColin Finck RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
285*c2c66affSColin Finck
286*c2c66affSColin Finck return Status;
287*c2c66affSColin Finck }
288*c2c66affSColin Finck
289*c2c66affSColin Finck static NTSTATUS
FatxWriteRootDirectory(IN HANDLE FileHandle,IN ULONG FATSectors,IN OUT PFORMAT_CONTEXT Context)290*c2c66affSColin Finck FatxWriteRootDirectory(IN HANDLE FileHandle,
291*c2c66affSColin Finck IN ULONG FATSectors,
292*c2c66affSColin Finck IN OUT PFORMAT_CONTEXT Context)
293*c2c66affSColin Finck {
294*c2c66affSColin Finck IO_STATUS_BLOCK IoStatusBlock;
295*c2c66affSColin Finck NTSTATUS Status = STATUS_SUCCESS;
296*c2c66affSColin Finck PUCHAR Buffer;
297*c2c66affSColin Finck LARGE_INTEGER FileOffset;
298*c2c66affSColin Finck ULONG FirstRootDirSector;
299*c2c66affSColin Finck ULONG RootDirSectors;
300*c2c66affSColin Finck
301*c2c66affSColin Finck /* Write cluster */
302*c2c66affSColin Finck RootDirSectors = 256 * 64 / 512;
303*c2c66affSColin Finck FirstRootDirSector = sizeof(FATX_BOOT_SECTOR) / 512 + FATSectors;
304*c2c66affSColin Finck
305*c2c66affSColin Finck DPRINT("RootDirSectors = %lu\n", RootDirSectors);
306*c2c66affSColin Finck DPRINT("FirstRootDirSector = %lu\n", FirstRootDirSector);
307*c2c66affSColin Finck
308*c2c66affSColin Finck /* Allocate buffer for the cluster */
309*c2c66affSColin Finck Buffer = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
310*c2c66affSColin Finck 0,
311*c2c66affSColin Finck RootDirSectors * 512);
312*c2c66affSColin Finck if (Buffer == NULL)
313*c2c66affSColin Finck return STATUS_INSUFFICIENT_RESOURCES;
314*c2c66affSColin Finck
315*c2c66affSColin Finck /* Zero the buffer */
316*c2c66affSColin Finck memset(Buffer, 0xff, RootDirSectors * 512);
317*c2c66affSColin Finck
318*c2c66affSColin Finck /* Zero some sectors of the root directory */
319*c2c66affSColin Finck FileOffset.QuadPart = FirstRootDirSector * 512;
320*c2c66affSColin Finck
321*c2c66affSColin Finck Status = NtWriteFile(FileHandle,
322*c2c66affSColin Finck NULL,
323*c2c66affSColin Finck NULL,
324*c2c66affSColin Finck NULL,
325*c2c66affSColin Finck &IoStatusBlock,
326*c2c66affSColin Finck Buffer,
327*c2c66affSColin Finck RootDirSectors * 512,
328*c2c66affSColin Finck &FileOffset,
329*c2c66affSColin Finck NULL);
330*c2c66affSColin Finck if (!NT_SUCCESS(Status))
331*c2c66affSColin Finck {
332*c2c66affSColin Finck DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
333*c2c66affSColin Finck }
334*c2c66affSColin Finck
335*c2c66affSColin Finck /* Free the buffer */
336*c2c66affSColin Finck RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
337*c2c66affSColin Finck
338*c2c66affSColin Finck return Status;
339*c2c66affSColin Finck }
340*c2c66affSColin Finck
341*c2c66affSColin Finck
342*c2c66affSColin Finck NTSTATUS
FatxFormat(IN HANDLE FileHandle,IN PPARTITION_INFORMATION PartitionInfo,IN PDISK_GEOMETRY DiskGeometry,IN BOOLEAN QuickFormat,IN OUT PFORMAT_CONTEXT Context)343*c2c66affSColin Finck FatxFormat(IN HANDLE FileHandle,
344*c2c66affSColin Finck IN PPARTITION_INFORMATION PartitionInfo,
345*c2c66affSColin Finck IN PDISK_GEOMETRY DiskGeometry,
346*c2c66affSColin Finck IN BOOLEAN QuickFormat,
347*c2c66affSColin Finck IN OUT PFORMAT_CONTEXT Context)
348*c2c66affSColin Finck {
349*c2c66affSColin Finck FATX_BOOT_SECTOR BootSector;
350*c2c66affSColin Finck ULONGLONG SectorCount;
351*c2c66affSColin Finck ULONG ClusterCount;
352*c2c66affSColin Finck ULONG RootDirSectors;
353*c2c66affSColin Finck ULONG FATSectors;
354*c2c66affSColin Finck NTSTATUS Status;
355*c2c66affSColin Finck
356*c2c66affSColin Finck SectorCount = PartitionInfo->PartitionLength.QuadPart >> GetShiftCount(512); /* Use shifting to avoid 64-bit division */
357*c2c66affSColin Finck
358*c2c66affSColin Finck memset(&BootSector, 0, sizeof(FATX_BOOT_SECTOR));
359*c2c66affSColin Finck memcpy(&BootSector.SysType[0], "FATX", 4);
360*c2c66affSColin Finck BootSector.SectorsPerCluster = 32;
361*c2c66affSColin Finck BootSector.FATCount = 1;
362*c2c66affSColin Finck BootSector.VolumeID = CalcVolumeSerialNumber();
363*c2c66affSColin Finck RootDirSectors = 256 * 64 / 512;
364*c2c66affSColin Finck
365*c2c66affSColin Finck /* Calculate number of FAT sectors */
366*c2c66affSColin Finck ClusterCount = SectorCount >> GetShiftCount(32);
367*c2c66affSColin Finck
368*c2c66affSColin Finck if (ClusterCount > 65525)
369*c2c66affSColin Finck {
370*c2c66affSColin Finck FATSectors = (((ClusterCount * 4) + 4095) & ~4095) >> GetShiftCount(512);
371*c2c66affSColin Finck }
372*c2c66affSColin Finck else
373*c2c66affSColin Finck {
374*c2c66affSColin Finck FATSectors = (((ClusterCount * 2) + 4095) & ~4095) >> GetShiftCount(512);
375*c2c66affSColin Finck }
376*c2c66affSColin Finck DPRINT("FATSectors = %hu\n", FATSectors);
377*c2c66affSColin Finck
378*c2c66affSColin Finck /* Init context data */
379*c2c66affSColin Finck if (QuickFormat)
380*c2c66affSColin Finck {
381*c2c66affSColin Finck Context->TotalSectorCount =
382*c2c66affSColin Finck 1 + FATSectors + RootDirSectors;
383*c2c66affSColin Finck }
384*c2c66affSColin Finck else
385*c2c66affSColin Finck {
386*c2c66affSColin Finck Context->TotalSectorCount = SectorCount;
387*c2c66affSColin Finck }
388*c2c66affSColin Finck
389*c2c66affSColin Finck Status = FatxWriteBootSector(FileHandle,
390*c2c66affSColin Finck &BootSector,
391*c2c66affSColin Finck Context);
392*c2c66affSColin Finck if (!NT_SUCCESS(Status))
393*c2c66affSColin Finck {
394*c2c66affSColin Finck DPRINT("FatxWriteBootSector() failed with status 0x%.08x\n", Status);
395*c2c66affSColin Finck return Status;
396*c2c66affSColin Finck }
397*c2c66affSColin Finck
398*c2c66affSColin Finck /* Write first FAT copy */
399*c2c66affSColin Finck if (ClusterCount > 65525)
400*c2c66affSColin Finck {
401*c2c66affSColin Finck Status = Fatx32WriteFAT(FileHandle,
402*c2c66affSColin Finck 0,
403*c2c66affSColin Finck FATSectors,
404*c2c66affSColin Finck Context);
405*c2c66affSColin Finck }
406*c2c66affSColin Finck else
407*c2c66affSColin Finck {
408*c2c66affSColin Finck Status = Fatx16WriteFAT(FileHandle,
409*c2c66affSColin Finck 0,
410*c2c66affSColin Finck FATSectors,
411*c2c66affSColin Finck Context);
412*c2c66affSColin Finck }
413*c2c66affSColin Finck
414*c2c66affSColin Finck if (!NT_SUCCESS(Status))
415*c2c66affSColin Finck {
416*c2c66affSColin Finck DPRINT("FatxWriteFAT() failed with status 0x%.08x\n", Status);
417*c2c66affSColin Finck return Status;
418*c2c66affSColin Finck }
419*c2c66affSColin Finck
420*c2c66affSColin Finck Status = FatxWriteRootDirectory(FileHandle,
421*c2c66affSColin Finck FATSectors,
422*c2c66affSColin Finck Context);
423*c2c66affSColin Finck if (!NT_SUCCESS(Status))
424*c2c66affSColin Finck {
425*c2c66affSColin Finck DPRINT("FatxWriteRootDirectory() failed with status 0x%.08x\n", Status);
426*c2c66affSColin Finck }
427*c2c66affSColin Finck
428*c2c66affSColin Finck if (!QuickFormat)
429*c2c66affSColin Finck {
430*c2c66affSColin Finck /* FIXME: Fill remaining sectors */
431*c2c66affSColin Finck }
432*c2c66affSColin Finck
433*c2c66affSColin Finck return Status;
434*c2c66affSColin Finck }
435