···16161717#include "precomp.h"
18181919+#include "partlist.h"
2020+#include "fsrec.h"
1921#include "fsutil.h"
2020-#include "partlist.h"
21222223#include <fslib/vfatlib.h>
2324#include <fslib/btrfslib.h>
···128129}
129130130131131131-//
132132-// FileSystem recognition, using NT OS functionality
133133-//
134134-135135-/* NOTE: Ripped & adapted from base/system/autochk/autochk.c */
136136-NTSTATUS
137137-GetFileSystemNameByHandle(
138138- IN HANDLE PartitionHandle,
139139- IN OUT PWSTR FileSystemName,
140140- IN SIZE_T FileSystemNameSize)
141141-{
142142- NTSTATUS Status;
143143- IO_STATUS_BLOCK IoStatusBlock;
144144- UCHAR Buffer[sizeof(FILE_FS_ATTRIBUTE_INFORMATION) + MAX_PATH * sizeof(WCHAR)];
145145- PFILE_FS_ATTRIBUTE_INFORMATION FileFsAttribute = (PFILE_FS_ATTRIBUTE_INFORMATION)Buffer;
146146-147147- /* Retrieve the FS attributes */
148148- Status = NtQueryVolumeInformationFile(PartitionHandle,
149149- &IoStatusBlock,
150150- FileFsAttribute,
151151- sizeof(Buffer),
152152- FileFsAttributeInformation);
153153- if (!NT_SUCCESS(Status))
154154- {
155155- DPRINT1("NtQueryVolumeInformationFile failed, Status 0x%08lx\n", Status);
156156- return Status;
157157- }
158158-159159- if (FileSystemNameSize < FileFsAttribute->FileSystemNameLength + sizeof(WCHAR))
160160- return STATUS_BUFFER_TOO_SMALL;
161161-162162- return RtlStringCbCopyNW(FileSystemName, FileSystemNameSize,
163163- FileFsAttribute->FileSystemName,
164164- FileFsAttribute->FileSystemNameLength);
165165-}
166166-167167-NTSTATUS
168168-GetFileSystemName_UStr(
169169- IN PUNICODE_STRING PartitionPath,
170170- IN OUT PWSTR FileSystemName,
171171- IN SIZE_T FileSystemNameSize)
172172-{
173173- NTSTATUS Status;
174174- OBJECT_ATTRIBUTES ObjectAttributes;
175175- HANDLE PartitionHandle;
176176- IO_STATUS_BLOCK IoStatusBlock;
177177-178178- /* Open the partition */
179179- InitializeObjectAttributes(&ObjectAttributes,
180180- PartitionPath,
181181- OBJ_CASE_INSENSITIVE,
182182- NULL,
183183- NULL);
184184- Status = NtOpenFile(&PartitionHandle,
185185- FILE_GENERIC_READ /* | SYNCHRONIZE */,
186186- &ObjectAttributes,
187187- &IoStatusBlock,
188188- FILE_SHARE_READ | FILE_SHARE_WRITE,
189189- 0 /* FILE_SYNCHRONOUS_IO_NONALERT */);
190190- if (!NT_SUCCESS(Status))
191191- {
192192- DPRINT1("Failed to open partition '%wZ', Status 0x%08lx\n", PartitionPath, Status);
193193- return Status;
194194- }
195195-196196- /* Retrieve the FS attributes */
197197- Status = GetFileSystemNameByHandle(PartitionHandle, FileSystemName, FileSystemNameSize);
198198- if (!NT_SUCCESS(Status))
199199- {
200200- DPRINT1("GetFileSystemNameByHandle() failed for partition '%wZ', Status 0x%08lx\n",
201201- PartitionPath, Status);
202202- }
203203-204204- /* Close the partition */
205205- NtClose(PartitionHandle);
206206-207207- return Status;
208208-}
209209-210210-NTSTATUS
211211-GetFileSystemName(
212212- IN PCWSTR Partition,
213213- IN OUT PWSTR FileSystemName,
214214- IN SIZE_T FileSystemNameSize)
215215-{
216216- UNICODE_STRING PartitionPath;
217217-218218- RtlInitUnicodeString(&PartitionPath, Partition);
219219- return GetFileSystemName_UStr(&PartitionPath,
220220- FileSystemName,
221221- FileSystemNameSize);
222222-}
223223-224224-NTSTATUS
225225-InferFileSystemByHandle(
226226- IN HANDLE PartitionHandle,
227227- IN UCHAR PartitionType,
228228- IN OUT PWSTR FileSystemName,
229229- IN SIZE_T FileSystemNameSize)
230230-{
231231- NTSTATUS Status;
232232-233233- if (FileSystemNameSize < sizeof(WCHAR))
234234- return STATUS_BUFFER_TOO_SMALL;
235235-236236- *FileSystemName = L'\0';
237237-238238- /* Try to infer a file system using NT file system recognition */
239239- Status = GetFileSystemNameByHandle(PartitionHandle,
240240- FileSystemName,
241241- FileSystemNameSize);
242242- if (NT_SUCCESS(Status) && *FileSystemName)
243243- {
244244- goto Quit;
245245- }
246246-247247- /*
248248- * Try to infer a preferred file system for this partition, given its ID.
249249- *
250250- * WARNING: This is partly a hack, since partitions with the same ID can
251251- * be formatted with different file systems: for example, usual Linux
252252- * partitions that are formatted in EXT2/3/4, ReiserFS, etc... have the
253253- * same partition ID 0x83.
254254- *
255255- * The proper fix is to make a function that detects the existing FS
256256- * from a given partition (not based on the partition ID).
257257- * On the contrary, for unformatted partitions with a given ID, the
258258- * following code is OK.
259259- */
260260- if ((PartitionType == PARTITION_FAT_12) ||
261261- (PartitionType == PARTITION_FAT_16) ||
262262- (PartitionType == PARTITION_HUGE ) ||
263263- (PartitionType == PARTITION_XINT13))
264264- {
265265- /* FAT12 or FAT16 */
266266- Status = RtlStringCbCopyW(FileSystemName, FileSystemNameSize, L"FAT");
267267- }
268268- else if ((PartitionType == PARTITION_FAT32) ||
269269- (PartitionType == PARTITION_FAT32_XINT13))
270270- {
271271- Status = RtlStringCbCopyW(FileSystemName, FileSystemNameSize, L"FAT32");
272272- }
273273- else if (PartitionType == PARTITION_LINUX)
274274- {
275275- // WARNING: See the warning above.
276276- /* Could also be EXT2/3/4, ReiserFS, ... */
277277- Status = RtlStringCbCopyW(FileSystemName, FileSystemNameSize, L"BTRFS");
278278- }
279279- else if (PartitionType == PARTITION_IFS)
280280- {
281281- // WARNING: See the warning above.
282282- /* Could also be HPFS */
283283- Status = RtlStringCbCopyW(FileSystemName, FileSystemNameSize, L"NTFS");
284284- }
285285-286286-Quit:
287287- if (*FileSystemName)
288288- {
289289- // WARNING: We cannot write on this FS yet!
290290- if (PartitionType == PARTITION_IFS)
291291- {
292292- DPRINT1("Recognized file system '%S' that doesn't have write support yet!\n",
293293- FileSystemName);
294294- }
295295- }
296296-297297- DPRINT1("InferFileSystem -- PartitionType: 0x%02X ; FileSystem (guessed): %S\n",
298298- PartitionType, *FileSystemName ? FileSystemName : L"None");
299299-300300- return Status;
301301-}
302302-303303-NTSTATUS
304304-InferFileSystem(
305305- IN PCWSTR Partition,
306306- IN UCHAR PartitionType,
307307- IN OUT PWSTR FileSystemName,
308308- IN SIZE_T FileSystemNameSize)
309309-{
310310- NTSTATUS Status;
311311- UNICODE_STRING PartitionPath;
312312- OBJECT_ATTRIBUTES ObjectAttributes;
313313- HANDLE PartitionHandle;
314314- IO_STATUS_BLOCK IoStatusBlock;
315315-316316- /* Open the partition */
317317- RtlInitUnicodeString(&PartitionPath, Partition);
318318- InitializeObjectAttributes(&ObjectAttributes,
319319- &PartitionPath,
320320- OBJ_CASE_INSENSITIVE,
321321- NULL,
322322- NULL);
323323- Status = NtOpenFile(&PartitionHandle,
324324- FILE_GENERIC_READ /* | SYNCHRONIZE */,
325325- &ObjectAttributes,
326326- &IoStatusBlock,
327327- FILE_SHARE_READ | FILE_SHARE_WRITE,
328328- 0 /* FILE_SYNCHRONOUS_IO_NONALERT */);
329329- if (!NT_SUCCESS(Status))
330330- {
331331- DPRINT1("Failed to open partition '%wZ', Status 0x%08lx\n", &PartitionPath, Status);
332332- return Status;
333333- }
334334-335335- /* Retrieve the FS */
336336- Status = InferFileSystemByHandle(PartitionHandle,
337337- PartitionType,
338338- FileSystemName,
339339- FileSystemNameSize);
340340-341341- /* Close the partition */
342342- NtClose(PartitionHandle);
343343-344344- return Status;
345345-}
346346-347132/** ChkdskEx() **/
348133NTSTATUS
349134ChkdskFileSystem_UStr(
···450235 QuickFormat,
451236 ClusterSize,
452237 Callback);
453453-}
454454-455455-456456-UCHAR
457457-FileSystemToPartitionType(
458458- IN PCWSTR FileSystem,
459459- IN PULARGE_INTEGER StartSector,
460460- IN PULARGE_INTEGER SectorCount)
461461-{
462462- ASSERT(FileSystem && StartSector && SectorCount);
463463-464464- if (wcsicmp(FileSystem, L"FAT") == 0 ||
465465- wcsicmp(FileSystem, L"FAT32") == 0 ||
466466- wcsicmp(FileSystem, L"RAW") == 0)
467467- {
468468- if (SectorCount->QuadPart < 8192)
469469- {
470470- /* FAT12 CHS partition (disk is smaller than 4.1MB) */
471471- return PARTITION_FAT_12;
472472- }
473473- else if (StartSector->QuadPart < 1450560)
474474- {
475475- /* Partition starts below the 8.4GB boundary ==> CHS partition */
476476-477477- if (SectorCount->QuadPart < 65536)
478478- {
479479- /* FAT16 CHS partition (partition size < 32MB) */
480480- return PARTITION_FAT_16;
481481- }
482482- else if (SectorCount->QuadPart < 1048576)
483483- {
484484- /* FAT16 CHS partition (partition size < 512MB) */
485485- return PARTITION_HUGE;
486486- }
487487- else
488488- {
489489- /* FAT32 CHS partition (partition size >= 512MB) */
490490- return PARTITION_FAT32;
491491- }
492492- }
493493- else
494494- {
495495- /* Partition starts above the 8.4GB boundary ==> LBA partition */
496496-497497- if (SectorCount->QuadPart < 1048576)
498498- {
499499- /* FAT16 LBA partition (partition size < 512MB) */
500500- return PARTITION_XINT13;
501501- }
502502- else
503503- {
504504- /* FAT32 LBA partition (partition size >= 512MB) */
505505- return PARTITION_FAT32_XINT13;
506506- }
507507- }
508508- }
509509- else if (wcsicmp(FileSystem, L"NTFS") == 0)
510510- {
511511- return PARTITION_IFS;
512512- }
513513- else if (wcsicmp(FileSystem, L"BTRFS") == 0 ||
514514- wcsicmp(FileSystem, L"EXT2") == 0 ||
515515- wcsicmp(FileSystem, L"EXT3") == 0 ||
516516- wcsicmp(FileSystem, L"EXT4") == 0 ||
517517- wcsicmp(FileSystem, L"FFS") == 0 ||
518518- wcsicmp(FileSystem, L"REISERFS") == 0)
519519- {
520520- return PARTITION_LINUX;
521521- }
522522- else
523523- {
524524- /* Unknown file system */
525525- DPRINT1("Unknown file system '%S'\n", FileSystem);
526526- return PARTITION_ENTRY_UNUSED;
527527- }
528238}
529239530240
-39
base/setup/lib/fsutil.h
···1616 IN ULONG Index,
1717 OUT PCWSTR* FileSystemName);
18181919-NTSTATUS
2020-GetFileSystemNameByHandle(
2121- IN HANDLE PartitionHandle,
2222- IN OUT PWSTR FileSystemName,
2323- IN SIZE_T FileSystemNameSize);
2424-2525-NTSTATUS
2626-GetFileSystemName_UStr(
2727- IN PUNICODE_STRING PartitionPath,
2828- IN OUT PWSTR FileSystemName,
2929- IN SIZE_T FileSystemNameSize);
3030-3131-NTSTATUS
3232-GetFileSystemName(
3333- IN PCWSTR Partition,
3434- IN OUT PWSTR FileSystemName,
3535- IN SIZE_T FileSystemNameSize);
3636-3737-NTSTATUS
3838-InferFileSystemByHandle(
3939- IN HANDLE PartitionHandle,
4040- IN UCHAR PartitionType,
4141- IN OUT PWSTR FileSystemName,
4242- IN SIZE_T FileSystemNameSize);
4343-4444-NTSTATUS
4545-InferFileSystem(
4646- IN PCWSTR Partition,
4747- IN UCHAR PartitionType,
4848- IN OUT PWSTR FileSystemName,
4949- IN SIZE_T FileSystemNameSize);
5050-51195220/** ChkdskEx() **/
5321NTSTATUS
···9159 IN BOOLEAN QuickFormat,
9260 IN ULONG ClusterSize,
9361 IN PFMIFSCALLBACK Callback);
9494-9595-9696-UCHAR
9797-FileSystemToPartitionType(
9898- IN PCWSTR FileSystem,
9999- IN PULARGE_INTEGER StartSector,
100100- IN PULARGE_INTEGER SectorCount);
101621026310364//
···11+/*
22+ * PROJECT: ReactOS Setup Library
33+ * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
44+ * PURPOSE: Filesystem Recognition support functions,
55+ * using NT OS functionality.
66+ * COPYRIGHT: Copyright 2017-2020 Hermes Belusca-Maito
77+ */
88+99+/* INCLUDES *****************************************************************/
1010+1111+#include "precomp.h"
1212+1313+#include "fsrec.h"
1414+1515+#define NDEBUG
1616+#include <debug.h>
1717+1818+1919+/* FUNCTIONS ****************************************************************/
2020+2121+/* NOTE: Ripped & adapted from base/system/autochk/autochk.c */
2222+NTSTATUS
2323+GetFileSystemNameByHandle(
2424+ IN HANDLE PartitionHandle,
2525+ IN OUT PWSTR FileSystemName,
2626+ IN SIZE_T FileSystemNameSize)
2727+{
2828+ NTSTATUS Status;
2929+ IO_STATUS_BLOCK IoStatusBlock;
3030+ UCHAR Buffer[sizeof(FILE_FS_ATTRIBUTE_INFORMATION) + MAX_PATH * sizeof(WCHAR)];
3131+ PFILE_FS_ATTRIBUTE_INFORMATION FileFsAttribute = (PFILE_FS_ATTRIBUTE_INFORMATION)Buffer;
3232+3333+ /* Retrieve the FS attributes */
3434+ Status = NtQueryVolumeInformationFile(PartitionHandle,
3535+ &IoStatusBlock,
3636+ FileFsAttribute,
3737+ sizeof(Buffer),
3838+ FileFsAttributeInformation);
3939+ if (!NT_SUCCESS(Status))
4040+ {
4141+ DPRINT1("NtQueryVolumeInformationFile failed, Status 0x%08lx\n", Status);
4242+ return Status;
4343+ }
4444+4545+ if (FileSystemNameSize < FileFsAttribute->FileSystemNameLength + sizeof(WCHAR))
4646+ return STATUS_BUFFER_TOO_SMALL;
4747+4848+ return RtlStringCbCopyNW(FileSystemName, FileSystemNameSize,
4949+ FileFsAttribute->FileSystemName,
5050+ FileFsAttribute->FileSystemNameLength);
5151+}
5252+5353+NTSTATUS
5454+GetFileSystemName_UStr(
5555+ IN PUNICODE_STRING PartitionPath,
5656+ IN OUT PWSTR FileSystemName,
5757+ IN SIZE_T FileSystemNameSize)
5858+{
5959+ NTSTATUS Status;
6060+ OBJECT_ATTRIBUTES ObjectAttributes;
6161+ HANDLE PartitionHandle;
6262+ IO_STATUS_BLOCK IoStatusBlock;
6363+6464+ /* Open the partition */
6565+ InitializeObjectAttributes(&ObjectAttributes,
6666+ PartitionPath,
6767+ OBJ_CASE_INSENSITIVE,
6868+ NULL,
6969+ NULL);
7070+ Status = NtOpenFile(&PartitionHandle,
7171+ FILE_GENERIC_READ /* | SYNCHRONIZE */,
7272+ &ObjectAttributes,
7373+ &IoStatusBlock,
7474+ FILE_SHARE_READ | FILE_SHARE_WRITE,
7575+ 0 /* FILE_SYNCHRONOUS_IO_NONALERT */);
7676+ if (!NT_SUCCESS(Status))
7777+ {
7878+ DPRINT1("Failed to open partition '%wZ', Status 0x%08lx\n", PartitionPath, Status);
7979+ return Status;
8080+ }
8181+8282+ /* Retrieve the FS attributes */
8383+ Status = GetFileSystemNameByHandle(PartitionHandle, FileSystemName, FileSystemNameSize);
8484+ if (!NT_SUCCESS(Status))
8585+ {
8686+ DPRINT1("GetFileSystemNameByHandle() failed for partition '%wZ', Status 0x%08lx\n",
8787+ PartitionPath, Status);
8888+ }
8989+9090+ /* Close the partition */
9191+ NtClose(PartitionHandle);
9292+9393+ return Status;
9494+}
9595+9696+NTSTATUS
9797+GetFileSystemName(
9898+ IN PCWSTR Partition,
9999+ IN OUT PWSTR FileSystemName,
100100+ IN SIZE_T FileSystemNameSize)
101101+{
102102+ UNICODE_STRING PartitionPath;
103103+104104+ RtlInitUnicodeString(&PartitionPath, Partition);
105105+ return GetFileSystemName_UStr(&PartitionPath,
106106+ FileSystemName,
107107+ FileSystemNameSize);
108108+}
109109+110110+NTSTATUS
111111+InferFileSystemByHandle(
112112+ IN HANDLE PartitionHandle,
113113+ IN UCHAR PartitionType,
114114+ IN OUT PWSTR FileSystemName,
115115+ IN SIZE_T FileSystemNameSize)
116116+{
117117+ NTSTATUS Status;
118118+119119+ if (FileSystemNameSize < sizeof(WCHAR))
120120+ return STATUS_BUFFER_TOO_SMALL;
121121+122122+ *FileSystemName = L'\0';
123123+124124+ /* Try to infer a file system using NT file system recognition */
125125+ Status = GetFileSystemNameByHandle(PartitionHandle,
126126+ FileSystemName,
127127+ FileSystemNameSize);
128128+ if (NT_SUCCESS(Status) && *FileSystemName)
129129+ {
130130+ goto Quit;
131131+ }
132132+133133+ /*
134134+ * Try to infer a preferred file system for this partition, given its ID.
135135+ *
136136+ * WARNING: This is partly a hack, since partitions with the same ID can
137137+ * be formatted with different file systems: for example, usual Linux
138138+ * partitions that are formatted in EXT2/3/4, ReiserFS, etc... have the
139139+ * same partition ID 0x83.
140140+ *
141141+ * The proper fix is to make a function that detects the existing FS
142142+ * from a given partition (not based on the partition ID).
143143+ * On the contrary, for unformatted partitions with a given ID, the
144144+ * following code is OK.
145145+ */
146146+ if ((PartitionType == PARTITION_FAT_12) ||
147147+ (PartitionType == PARTITION_FAT_16) ||
148148+ (PartitionType == PARTITION_HUGE ) ||
149149+ (PartitionType == PARTITION_XINT13))
150150+ {
151151+ /* FAT12 or FAT16 */
152152+ Status = RtlStringCbCopyW(FileSystemName, FileSystemNameSize, L"FAT");
153153+ }
154154+ else if ((PartitionType == PARTITION_FAT32) ||
155155+ (PartitionType == PARTITION_FAT32_XINT13))
156156+ {
157157+ Status = RtlStringCbCopyW(FileSystemName, FileSystemNameSize, L"FAT32");
158158+ }
159159+ else if (PartitionType == PARTITION_LINUX)
160160+ {
161161+ // WARNING: See the warning above.
162162+ /* Could also be EXT2/3/4, ReiserFS, ... */
163163+ Status = RtlStringCbCopyW(FileSystemName, FileSystemNameSize, L"BTRFS");
164164+ }
165165+ else if (PartitionType == PARTITION_IFS)
166166+ {
167167+ // WARNING: See the warning above.
168168+ /* Could also be HPFS */
169169+ Status = RtlStringCbCopyW(FileSystemName, FileSystemNameSize, L"NTFS");
170170+ }
171171+172172+Quit:
173173+ if (*FileSystemName)
174174+ {
175175+ // WARNING: We cannot write on this FS yet!
176176+ if (PartitionType == PARTITION_IFS)
177177+ {
178178+ DPRINT1("Recognized file system '%S' that doesn't have write support yet!\n",
179179+ FileSystemName);
180180+ }
181181+ }
182182+183183+ DPRINT1("InferFileSystem -- PartitionType: 0x%02X ; FileSystem (guessed): %S\n",
184184+ PartitionType, *FileSystemName ? FileSystemName : L"None");
185185+186186+ return Status;
187187+}
188188+189189+NTSTATUS
190190+InferFileSystem(
191191+ IN PCWSTR Partition,
192192+ IN UCHAR PartitionType,
193193+ IN OUT PWSTR FileSystemName,
194194+ IN SIZE_T FileSystemNameSize)
195195+{
196196+ NTSTATUS Status;
197197+ UNICODE_STRING PartitionPath;
198198+ OBJECT_ATTRIBUTES ObjectAttributes;
199199+ HANDLE PartitionHandle;
200200+ IO_STATUS_BLOCK IoStatusBlock;
201201+202202+ /* Open the partition */
203203+ RtlInitUnicodeString(&PartitionPath, Partition);
204204+ InitializeObjectAttributes(&ObjectAttributes,
205205+ &PartitionPath,
206206+ OBJ_CASE_INSENSITIVE,
207207+ NULL,
208208+ NULL);
209209+ Status = NtOpenFile(&PartitionHandle,
210210+ FILE_GENERIC_READ /* | SYNCHRONIZE */,
211211+ &ObjectAttributes,
212212+ &IoStatusBlock,
213213+ FILE_SHARE_READ | FILE_SHARE_WRITE,
214214+ 0 /* FILE_SYNCHRONOUS_IO_NONALERT */);
215215+ if (!NT_SUCCESS(Status))
216216+ {
217217+ DPRINT1("Failed to open partition '%wZ', Status 0x%08lx\n", &PartitionPath, Status);
218218+ return Status;
219219+ }
220220+221221+ /* Retrieve the FS */
222222+ Status = InferFileSystemByHandle(PartitionHandle,
223223+ PartitionType,
224224+ FileSystemName,
225225+ FileSystemNameSize);
226226+227227+ /* Close the partition */
228228+ NtClose(PartitionHandle);
229229+230230+ return Status;
231231+}
232232+233233+UCHAR
234234+FileSystemToPartitionType(
235235+ IN PCWSTR FileSystem,
236236+ IN PULARGE_INTEGER StartSector,
237237+ IN PULARGE_INTEGER SectorCount)
238238+{
239239+ ASSERT(FileSystem && StartSector && SectorCount);
240240+241241+ if (wcsicmp(FileSystem, L"FAT") == 0 ||
242242+ wcsicmp(FileSystem, L"FAT32") == 0 ||
243243+ wcsicmp(FileSystem, L"RAW") == 0)
244244+ {
245245+ if (SectorCount->QuadPart < 8192)
246246+ {
247247+ /* FAT12 CHS partition (disk is smaller than 4.1MB) */
248248+ return PARTITION_FAT_12;
249249+ }
250250+ else if (StartSector->QuadPart < 1450560)
251251+ {
252252+ /* Partition starts below the 8.4GB boundary ==> CHS partition */
253253+254254+ if (SectorCount->QuadPart < 65536)
255255+ {
256256+ /* FAT16 CHS partition (partition size < 32MB) */
257257+ return PARTITION_FAT_16;
258258+ }
259259+ else if (SectorCount->QuadPart < 1048576)
260260+ {
261261+ /* FAT16 CHS partition (partition size < 512MB) */
262262+ return PARTITION_HUGE;
263263+ }
264264+ else
265265+ {
266266+ /* FAT32 CHS partition (partition size >= 512MB) */
267267+ return PARTITION_FAT32;
268268+ }
269269+ }
270270+ else
271271+ {
272272+ /* Partition starts above the 8.4GB boundary ==> LBA partition */
273273+274274+ if (SectorCount->QuadPart < 1048576)
275275+ {
276276+ /* FAT16 LBA partition (partition size < 512MB) */
277277+ return PARTITION_XINT13;
278278+ }
279279+ else
280280+ {
281281+ /* FAT32 LBA partition (partition size >= 512MB) */
282282+ return PARTITION_FAT32_XINT13;
283283+ }
284284+ }
285285+ }
286286+ else if (wcsicmp(FileSystem, L"NTFS") == 0)
287287+ {
288288+ return PARTITION_IFS;
289289+ }
290290+ else if (wcsicmp(FileSystem, L"BTRFS") == 0 ||
291291+ wcsicmp(FileSystem, L"EXT2") == 0 ||
292292+ wcsicmp(FileSystem, L"EXT3") == 0 ||
293293+ wcsicmp(FileSystem, L"EXT4") == 0 ||
294294+ wcsicmp(FileSystem, L"FFS") == 0 ||
295295+ wcsicmp(FileSystem, L"REISERFS") == 0)
296296+ {
297297+ return PARTITION_LINUX;
298298+ }
299299+ else
300300+ {
301301+ /* Unknown file system */
302302+ DPRINT1("Unknown file system '%S'\n", FileSystem);
303303+ return PARTITION_ENTRY_UNUSED;
304304+ }
305305+}
306306+307307+/* EOF */
+49
base/setup/lib/utils/fsrec.h
···11+/*
22+ * PROJECT: ReactOS Setup Library
33+ * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
44+ * PURPOSE: Filesystem Recognition support functions,
55+ * using NT OS functionality.
66+ * COPYRIGHT: Copyright 2017-2020 Hermes Belusca-Maito
77+ */
88+99+#pragma once
1010+1111+NTSTATUS
1212+GetFileSystemNameByHandle(
1313+ IN HANDLE PartitionHandle,
1414+ IN OUT PWSTR FileSystemName,
1515+ IN SIZE_T FileSystemNameSize);
1616+1717+NTSTATUS
1818+GetFileSystemName_UStr(
1919+ IN PUNICODE_STRING PartitionPath,
2020+ IN OUT PWSTR FileSystemName,
2121+ IN SIZE_T FileSystemNameSize);
2222+2323+NTSTATUS
2424+GetFileSystemName(
2525+ IN PCWSTR Partition,
2626+ IN OUT PWSTR FileSystemName,
2727+ IN SIZE_T FileSystemNameSize);
2828+2929+NTSTATUS
3030+InferFileSystemByHandle(
3131+ IN HANDLE PartitionHandle,
3232+ IN UCHAR PartitionType,
3333+ IN OUT PWSTR FileSystemName,
3434+ IN SIZE_T FileSystemNameSize);
3535+3636+NTSTATUS
3737+InferFileSystem(
3838+ IN PCWSTR Partition,
3939+ IN UCHAR PartitionType,
4040+ IN OUT PWSTR FileSystemName,
4141+ IN SIZE_T FileSystemNameSize);
4242+4343+UCHAR
4444+FileSystemToPartitionType(
4545+ IN PCWSTR FileSystem,
4646+ IN PULARGE_INTEGER StartSector,
4747+ IN PULARGE_INTEGER SectorCount);
4848+4949+/* EOF */