xref: /reactos/sdk/lib/fslib/vfatxlib/vfatxlib.c (revision 34593d93)
1 /*
2  * COPYRIGHT:   See COPYING in the top level directory
3  * PROJECT:     ReactOS VFATx filesystem library
4  * FILE:        vfatxlib.c
5  * PURPOSE:     Main API
6  * PROGRAMMERS:
7  * REVISIONS:
8  *   CSH 05/04-2003 Created
9  */
10 
11 #include "vfatxlib.h"
12 
13 #include <ndk/obfuncs.h>
14 
15 #define NDEBUG
16 #include <debug.h>
17 
18 BOOLEAN
19 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)20 VfatxFormat(
21     IN PUNICODE_STRING DriveRoot,
22     IN PFMIFSCALLBACK Callback,
23     IN BOOLEAN QuickFormat,
24     IN BOOLEAN BackwardCompatible,
25     IN MEDIA_TYPE MediaType,
26     IN PUNICODE_STRING Label,
27     IN ULONG ClusterSize)
28 {
29     OBJECT_ATTRIBUTES ObjectAttributes;
30     DISK_GEOMETRY DiskGeometry;
31     IO_STATUS_BLOCK Iosb;
32     HANDLE FileHandle;
33     PARTITION_INFORMATION PartitionInfo;
34     FORMAT_CONTEXT Context;
35     NTSTATUS Status;
36 
37     DPRINT("VfatxFormat(DriveRoot '%wZ')\n", DriveRoot);
38 
39     // FIXME:
40     UNREFERENCED_PARAMETER(MediaType);
41 
42     if (BackwardCompatible)
43     {
44         DPRINT1("BackwardCompatible == TRUE is unsupported!\n");
45         return FALSE;
46     }
47 
48     Context.TotalSectorCount = 0;
49     Context.CurrentSectorCount = 0;
50     Context.Callback = Callback;
51     Context.Success = FALSE;
52     Context.Percent = 0;
53 
54     InitializeObjectAttributes(&ObjectAttributes,
55                                DriveRoot,
56                                0,
57                                NULL,
58                                NULL);
59 
60     Status = NtOpenFile(&FileHandle,
61                         FILE_GENERIC_READ | FILE_GENERIC_WRITE,
62                         &ObjectAttributes,
63                         &Iosb,
64                         FILE_SHARE_READ,
65                         FILE_SYNCHRONOUS_IO_ALERT);
66     if (!NT_SUCCESS(Status))
67     {
68         DPRINT("NtOpenFile() failed with status 0x%08x\n", Status);
69         return FALSE;
70     }
71 
72     Status = NtDeviceIoControlFile(FileHandle,
73                                    NULL,
74                                    NULL,
75                                    NULL,
76                                    &Iosb,
77                                    IOCTL_DISK_GET_DRIVE_GEOMETRY,
78                                    NULL,
79                                    0,
80                                    &DiskGeometry,
81                                    sizeof(DISK_GEOMETRY));
82     if (!NT_SUCCESS(Status))
83     {
84         DPRINT("IOCTL_DISK_GET_DRIVE_GEOMETRY failed with status 0x%08x\n", Status);
85         NtClose(FileHandle);
86         return FALSE;
87     }
88 
89     if (DiskGeometry.MediaType == FixedMedia)
90     {
91         DPRINT("Cylinders %I64d\n", DiskGeometry.Cylinders.QuadPart);
92         DPRINT("TracksPerCylinder %ld\n", DiskGeometry.TracksPerCylinder);
93         DPRINT("SectorsPerTrack %ld\n", DiskGeometry.SectorsPerTrack);
94         DPRINT("BytesPerSector %ld\n", DiskGeometry.BytesPerSector);
95         DPRINT("DiskSize %I64d\n",
96                DiskGeometry.Cylinders.QuadPart *
97                (ULONGLONG)DiskGeometry.TracksPerCylinder *
98                (ULONGLONG)DiskGeometry.SectorsPerTrack *
99                (ULONGLONG)DiskGeometry.BytesPerSector);
100 
101         Status = NtDeviceIoControlFile(FileHandle,
102                                        NULL,
103                                        NULL,
104                                        NULL,
105                                        &Iosb,
106                                        IOCTL_DISK_GET_PARTITION_INFO,
107                                        NULL,
108                                        0,
109                                        &PartitionInfo,
110                                        sizeof(PARTITION_INFORMATION));
111         if (!NT_SUCCESS(Status))
112         {
113             DPRINT("IOCTL_DISK_GET_PARTITION_INFO failed with status 0x%08x\n", Status);
114             NtClose(FileHandle);
115             return FALSE;
116         }
117     }
118     else
119     {
120         PartitionInfo.PartitionType = 0;
121         PartitionInfo.StartingOffset.QuadPart = 0ULL;
122         PartitionInfo.PartitionLength.QuadPart =
123             DiskGeometry.Cylinders.QuadPart *
124             (ULONGLONG)DiskGeometry.TracksPerCylinder *
125             (ULONGLONG)DiskGeometry.SectorsPerTrack *
126             (ULONGLONG)DiskGeometry.BytesPerSector;
127         PartitionInfo.HiddenSectors = 0;
128         PartitionInfo.PartitionNumber = 0;
129         PartitionInfo.BootIndicator = FALSE;
130         PartitionInfo.RewritePartition = FALSE;
131         PartitionInfo.RecognizedPartition = FALSE;
132     }
133 
134     DPRINT("PartitionType 0x%x\n", PartitionInfo.PartitionType);
135     DPRINT("StartingOffset %I64d\n", PartitionInfo.StartingOffset.QuadPart);
136     DPRINT("PartitionLength %I64d\n", PartitionInfo.PartitionLength.QuadPart);
137     DPRINT("HiddenSectors %lu\n", PartitionInfo.HiddenSectors);
138     DPRINT("PartitionNumber %d\n", PartitionInfo.PartitionNumber);
139     DPRINT("BootIndicator 0x%x\n", PartitionInfo.BootIndicator);
140     DPRINT("RewritePartition %d\n", PartitionInfo.RewritePartition);
141     DPRINT("RecognizedPartition %d\n", PartitionInfo.RecognizedPartition);
142 
143     if (Callback != NULL)
144     {
145         Context.Percent = 0;
146         Callback(PROGRESS, 0, (PVOID)&Context.Percent);
147     }
148 
149     Status = FatxFormat(FileHandle,
150                         &PartitionInfo,
151                         &DiskGeometry,
152                         QuickFormat,
153                         &Context);
154     NtClose(FileHandle);
155 
156     DPRINT("VfatxFormat() done. Status 0x%08x\n", Status);
157     return NT_SUCCESS(Status);
158 }
159 
160 BOOLEAN
161 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)162 VfatxChkdsk(
163     IN PUNICODE_STRING DriveRoot,
164     IN PFMIFSCALLBACK Callback,
165     IN BOOLEAN FixErrors,
166     IN BOOLEAN Verbose,
167     IN BOOLEAN CheckOnlyIfDirty,
168     IN BOOLEAN ScanDrive,
169     IN PVOID pUnknown1,
170     IN PVOID pUnknown2,
171     IN PVOID pUnknown3,
172     IN PVOID pUnknown4,
173     IN PULONG ExitStatus)
174 {
175     UNIMPLEMENTED;
176     *ExitStatus = (ULONG)STATUS_SUCCESS;
177     return TRUE;
178 }
179 
180 VOID
VfatxUpdateProgress(IN PFORMAT_CONTEXT Context,IN ULONG Increment)181 VfatxUpdateProgress(IN PFORMAT_CONTEXT Context,
182                     IN ULONG Increment)
183 {
184     ULONG NewPercent;
185 
186     Context->CurrentSectorCount += (ULONGLONG)Increment;
187 
188     NewPercent = (Context->CurrentSectorCount * 100ULL) / Context->TotalSectorCount;
189 
190     if (NewPercent > Context->Percent)
191     {
192         Context->Percent = NewPercent;
193         if (Context->Callback != NULL)
194         {
195             Context->Callback(PROGRESS, 0, &Context->Percent);
196         }
197     }
198 }
199 
200 /* EOF */
201