Reactos

[SETUPLIB] Move the filesystem recognition helpers to their own file.

+361 -332
+1
base/setup/lib/CMakeLists.txt
··· 9 9 utils/arcname.c 10 10 utils/bldrsup.c 11 11 utils/filesup.c 12 + utils/fsrec.c 12 13 utils/genlist.c 13 14 utils/inicache.c 14 15 utils/ntverrsrc.c
+2 -292
base/setup/lib/fsutil.c
··· 16 16 17 17 #include "precomp.h" 18 18 19 + #include "partlist.h" 20 + #include "fsrec.h" 19 21 #include "fsutil.h" 20 - #include "partlist.h" 21 22 22 23 #include <fslib/vfatlib.h> 23 24 #include <fslib/btrfslib.h> ··· 128 129 } 129 130 130 131 131 - // 132 - // FileSystem recognition, using NT OS functionality 133 - // 134 - 135 - /* NOTE: Ripped & adapted from base/system/autochk/autochk.c */ 136 - NTSTATUS 137 - GetFileSystemNameByHandle( 138 - IN HANDLE PartitionHandle, 139 - IN OUT PWSTR FileSystemName, 140 - IN SIZE_T FileSystemNameSize) 141 - { 142 - NTSTATUS Status; 143 - IO_STATUS_BLOCK IoStatusBlock; 144 - UCHAR Buffer[sizeof(FILE_FS_ATTRIBUTE_INFORMATION) + MAX_PATH * sizeof(WCHAR)]; 145 - PFILE_FS_ATTRIBUTE_INFORMATION FileFsAttribute = (PFILE_FS_ATTRIBUTE_INFORMATION)Buffer; 146 - 147 - /* Retrieve the FS attributes */ 148 - Status = NtQueryVolumeInformationFile(PartitionHandle, 149 - &IoStatusBlock, 150 - FileFsAttribute, 151 - sizeof(Buffer), 152 - FileFsAttributeInformation); 153 - if (!NT_SUCCESS(Status)) 154 - { 155 - DPRINT1("NtQueryVolumeInformationFile failed, Status 0x%08lx\n", Status); 156 - return Status; 157 - } 158 - 159 - if (FileSystemNameSize < FileFsAttribute->FileSystemNameLength + sizeof(WCHAR)) 160 - return STATUS_BUFFER_TOO_SMALL; 161 - 162 - return RtlStringCbCopyNW(FileSystemName, FileSystemNameSize, 163 - FileFsAttribute->FileSystemName, 164 - FileFsAttribute->FileSystemNameLength); 165 - } 166 - 167 - NTSTATUS 168 - GetFileSystemName_UStr( 169 - IN PUNICODE_STRING PartitionPath, 170 - IN OUT PWSTR FileSystemName, 171 - IN SIZE_T FileSystemNameSize) 172 - { 173 - NTSTATUS Status; 174 - OBJECT_ATTRIBUTES ObjectAttributes; 175 - HANDLE PartitionHandle; 176 - IO_STATUS_BLOCK IoStatusBlock; 177 - 178 - /* Open the partition */ 179 - InitializeObjectAttributes(&ObjectAttributes, 180 - PartitionPath, 181 - OBJ_CASE_INSENSITIVE, 182 - NULL, 183 - NULL); 184 - Status = NtOpenFile(&PartitionHandle, 185 - FILE_GENERIC_READ /* | SYNCHRONIZE */, 186 - &ObjectAttributes, 187 - &IoStatusBlock, 188 - FILE_SHARE_READ | FILE_SHARE_WRITE, 189 - 0 /* FILE_SYNCHRONOUS_IO_NONALERT */); 190 - if (!NT_SUCCESS(Status)) 191 - { 192 - DPRINT1("Failed to open partition '%wZ', Status 0x%08lx\n", PartitionPath, Status); 193 - return Status; 194 - } 195 - 196 - /* Retrieve the FS attributes */ 197 - Status = GetFileSystemNameByHandle(PartitionHandle, FileSystemName, FileSystemNameSize); 198 - if (!NT_SUCCESS(Status)) 199 - { 200 - DPRINT1("GetFileSystemNameByHandle() failed for partition '%wZ', Status 0x%08lx\n", 201 - PartitionPath, Status); 202 - } 203 - 204 - /* Close the partition */ 205 - NtClose(PartitionHandle); 206 - 207 - return Status; 208 - } 209 - 210 - NTSTATUS 211 - GetFileSystemName( 212 - IN PCWSTR Partition, 213 - IN OUT PWSTR FileSystemName, 214 - IN SIZE_T FileSystemNameSize) 215 - { 216 - UNICODE_STRING PartitionPath; 217 - 218 - RtlInitUnicodeString(&PartitionPath, Partition); 219 - return GetFileSystemName_UStr(&PartitionPath, 220 - FileSystemName, 221 - FileSystemNameSize); 222 - } 223 - 224 - NTSTATUS 225 - InferFileSystemByHandle( 226 - IN HANDLE PartitionHandle, 227 - IN UCHAR PartitionType, 228 - IN OUT PWSTR FileSystemName, 229 - IN SIZE_T FileSystemNameSize) 230 - { 231 - NTSTATUS Status; 232 - 233 - if (FileSystemNameSize < sizeof(WCHAR)) 234 - return STATUS_BUFFER_TOO_SMALL; 235 - 236 - *FileSystemName = L'\0'; 237 - 238 - /* Try to infer a file system using NT file system recognition */ 239 - Status = GetFileSystemNameByHandle(PartitionHandle, 240 - FileSystemName, 241 - FileSystemNameSize); 242 - if (NT_SUCCESS(Status) && *FileSystemName) 243 - { 244 - goto Quit; 245 - } 246 - 247 - /* 248 - * Try to infer a preferred file system for this partition, given its ID. 249 - * 250 - * WARNING: This is partly a hack, since partitions with the same ID can 251 - * be formatted with different file systems: for example, usual Linux 252 - * partitions that are formatted in EXT2/3/4, ReiserFS, etc... have the 253 - * same partition ID 0x83. 254 - * 255 - * The proper fix is to make a function that detects the existing FS 256 - * from a given partition (not based on the partition ID). 257 - * On the contrary, for unformatted partitions with a given ID, the 258 - * following code is OK. 259 - */ 260 - if ((PartitionType == PARTITION_FAT_12) || 261 - (PartitionType == PARTITION_FAT_16) || 262 - (PartitionType == PARTITION_HUGE ) || 263 - (PartitionType == PARTITION_XINT13)) 264 - { 265 - /* FAT12 or FAT16 */ 266 - Status = RtlStringCbCopyW(FileSystemName, FileSystemNameSize, L"FAT"); 267 - } 268 - else if ((PartitionType == PARTITION_FAT32) || 269 - (PartitionType == PARTITION_FAT32_XINT13)) 270 - { 271 - Status = RtlStringCbCopyW(FileSystemName, FileSystemNameSize, L"FAT32"); 272 - } 273 - else if (PartitionType == PARTITION_LINUX) 274 - { 275 - // WARNING: See the warning above. 276 - /* Could also be EXT2/3/4, ReiserFS, ... */ 277 - Status = RtlStringCbCopyW(FileSystemName, FileSystemNameSize, L"BTRFS"); 278 - } 279 - else if (PartitionType == PARTITION_IFS) 280 - { 281 - // WARNING: See the warning above. 282 - /* Could also be HPFS */ 283 - Status = RtlStringCbCopyW(FileSystemName, FileSystemNameSize, L"NTFS"); 284 - } 285 - 286 - Quit: 287 - if (*FileSystemName) 288 - { 289 - // WARNING: We cannot write on this FS yet! 290 - if (PartitionType == PARTITION_IFS) 291 - { 292 - DPRINT1("Recognized file system '%S' that doesn't have write support yet!\n", 293 - FileSystemName); 294 - } 295 - } 296 - 297 - DPRINT1("InferFileSystem -- PartitionType: 0x%02X ; FileSystem (guessed): %S\n", 298 - PartitionType, *FileSystemName ? FileSystemName : L"None"); 299 - 300 - return Status; 301 - } 302 - 303 - NTSTATUS 304 - InferFileSystem( 305 - IN PCWSTR Partition, 306 - IN UCHAR PartitionType, 307 - IN OUT PWSTR FileSystemName, 308 - IN SIZE_T FileSystemNameSize) 309 - { 310 - NTSTATUS Status; 311 - UNICODE_STRING PartitionPath; 312 - OBJECT_ATTRIBUTES ObjectAttributes; 313 - HANDLE PartitionHandle; 314 - IO_STATUS_BLOCK IoStatusBlock; 315 - 316 - /* Open the partition */ 317 - RtlInitUnicodeString(&PartitionPath, Partition); 318 - InitializeObjectAttributes(&ObjectAttributes, 319 - &PartitionPath, 320 - OBJ_CASE_INSENSITIVE, 321 - NULL, 322 - NULL); 323 - Status = NtOpenFile(&PartitionHandle, 324 - FILE_GENERIC_READ /* | SYNCHRONIZE */, 325 - &ObjectAttributes, 326 - &IoStatusBlock, 327 - FILE_SHARE_READ | FILE_SHARE_WRITE, 328 - 0 /* FILE_SYNCHRONOUS_IO_NONALERT */); 329 - if (!NT_SUCCESS(Status)) 330 - { 331 - DPRINT1("Failed to open partition '%wZ', Status 0x%08lx\n", &PartitionPath, Status); 332 - return Status; 333 - } 334 - 335 - /* Retrieve the FS */ 336 - Status = InferFileSystemByHandle(PartitionHandle, 337 - PartitionType, 338 - FileSystemName, 339 - FileSystemNameSize); 340 - 341 - /* Close the partition */ 342 - NtClose(PartitionHandle); 343 - 344 - return Status; 345 - } 346 - 347 132 /** ChkdskEx() **/ 348 133 NTSTATUS 349 134 ChkdskFileSystem_UStr( ··· 450 235 QuickFormat, 451 236 ClusterSize, 452 237 Callback); 453 - } 454 - 455 - 456 - UCHAR 457 - FileSystemToPartitionType( 458 - IN PCWSTR FileSystem, 459 - IN PULARGE_INTEGER StartSector, 460 - IN PULARGE_INTEGER SectorCount) 461 - { 462 - ASSERT(FileSystem && StartSector && SectorCount); 463 - 464 - if (wcsicmp(FileSystem, L"FAT") == 0 || 465 - wcsicmp(FileSystem, L"FAT32") == 0 || 466 - wcsicmp(FileSystem, L"RAW") == 0) 467 - { 468 - if (SectorCount->QuadPart < 8192) 469 - { 470 - /* FAT12 CHS partition (disk is smaller than 4.1MB) */ 471 - return PARTITION_FAT_12; 472 - } 473 - else if (StartSector->QuadPart < 1450560) 474 - { 475 - /* Partition starts below the 8.4GB boundary ==> CHS partition */ 476 - 477 - if (SectorCount->QuadPart < 65536) 478 - { 479 - /* FAT16 CHS partition (partition size < 32MB) */ 480 - return PARTITION_FAT_16; 481 - } 482 - else if (SectorCount->QuadPart < 1048576) 483 - { 484 - /* FAT16 CHS partition (partition size < 512MB) */ 485 - return PARTITION_HUGE; 486 - } 487 - else 488 - { 489 - /* FAT32 CHS partition (partition size >= 512MB) */ 490 - return PARTITION_FAT32; 491 - } 492 - } 493 - else 494 - { 495 - /* Partition starts above the 8.4GB boundary ==> LBA partition */ 496 - 497 - if (SectorCount->QuadPart < 1048576) 498 - { 499 - /* FAT16 LBA partition (partition size < 512MB) */ 500 - return PARTITION_XINT13; 501 - } 502 - else 503 - { 504 - /* FAT32 LBA partition (partition size >= 512MB) */ 505 - return PARTITION_FAT32_XINT13; 506 - } 507 - } 508 - } 509 - else if (wcsicmp(FileSystem, L"NTFS") == 0) 510 - { 511 - return PARTITION_IFS; 512 - } 513 - else if (wcsicmp(FileSystem, L"BTRFS") == 0 || 514 - wcsicmp(FileSystem, L"EXT2") == 0 || 515 - wcsicmp(FileSystem, L"EXT3") == 0 || 516 - wcsicmp(FileSystem, L"EXT4") == 0 || 517 - wcsicmp(FileSystem, L"FFS") == 0 || 518 - wcsicmp(FileSystem, L"REISERFS") == 0) 519 - { 520 - return PARTITION_LINUX; 521 - } 522 - else 523 - { 524 - /* Unknown file system */ 525 - DPRINT1("Unknown file system '%S'\n", FileSystem); 526 - return PARTITION_ENTRY_UNUSED; 527 - } 528 238 } 529 239 530 240
-39
base/setup/lib/fsutil.h
··· 16 16 IN ULONG Index, 17 17 OUT PCWSTR* FileSystemName); 18 18 19 - NTSTATUS 20 - GetFileSystemNameByHandle( 21 - IN HANDLE PartitionHandle, 22 - IN OUT PWSTR FileSystemName, 23 - IN SIZE_T FileSystemNameSize); 24 - 25 - NTSTATUS 26 - GetFileSystemName_UStr( 27 - IN PUNICODE_STRING PartitionPath, 28 - IN OUT PWSTR FileSystemName, 29 - IN SIZE_T FileSystemNameSize); 30 - 31 - NTSTATUS 32 - GetFileSystemName( 33 - IN PCWSTR Partition, 34 - IN OUT PWSTR FileSystemName, 35 - IN SIZE_T FileSystemNameSize); 36 - 37 - NTSTATUS 38 - InferFileSystemByHandle( 39 - IN HANDLE PartitionHandle, 40 - IN UCHAR PartitionType, 41 - IN OUT PWSTR FileSystemName, 42 - IN SIZE_T FileSystemNameSize); 43 - 44 - NTSTATUS 45 - InferFileSystem( 46 - IN PCWSTR Partition, 47 - IN UCHAR PartitionType, 48 - IN OUT PWSTR FileSystemName, 49 - IN SIZE_T FileSystemNameSize); 50 - 51 19 52 20 /** ChkdskEx() **/ 53 21 NTSTATUS ··· 91 59 IN BOOLEAN QuickFormat, 92 60 IN ULONG ClusterSize, 93 61 IN PFMIFSCALLBACK Callback); 94 - 95 - 96 - UCHAR 97 - FileSystemToPartitionType( 98 - IN PCWSTR FileSystem, 99 - IN PULARGE_INTEGER StartSector, 100 - IN PULARGE_INTEGER SectorCount); 101 62 102 63 103 64 //
+1
base/setup/lib/setuplib.h
··· 33 33 #include "utils/bldrsup.h" 34 34 #include "bootsup.h" 35 35 #include "utils/filesup.h" 36 + #include "utils/fsrec.h" 36 37 #include "fsutil.h" 37 38 #include "utils/genlist.h" 38 39 #include "utils/inicache.h"
+307
base/setup/lib/utils/fsrec.c
··· 1 + /* 2 + * PROJECT: ReactOS Setup Library 3 + * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) 4 + * PURPOSE: Filesystem Recognition support functions, 5 + * using NT OS functionality. 6 + * COPYRIGHT: Copyright 2017-2020 Hermes Belusca-Maito 7 + */ 8 + 9 + /* INCLUDES *****************************************************************/ 10 + 11 + #include "precomp.h" 12 + 13 + #include "fsrec.h" 14 + 15 + #define NDEBUG 16 + #include <debug.h> 17 + 18 + 19 + /* FUNCTIONS ****************************************************************/ 20 + 21 + /* NOTE: Ripped & adapted from base/system/autochk/autochk.c */ 22 + NTSTATUS 23 + GetFileSystemNameByHandle( 24 + IN HANDLE PartitionHandle, 25 + IN OUT PWSTR FileSystemName, 26 + IN SIZE_T FileSystemNameSize) 27 + { 28 + NTSTATUS Status; 29 + IO_STATUS_BLOCK IoStatusBlock; 30 + UCHAR Buffer[sizeof(FILE_FS_ATTRIBUTE_INFORMATION) + MAX_PATH * sizeof(WCHAR)]; 31 + PFILE_FS_ATTRIBUTE_INFORMATION FileFsAttribute = (PFILE_FS_ATTRIBUTE_INFORMATION)Buffer; 32 + 33 + /* Retrieve the FS attributes */ 34 + Status = NtQueryVolumeInformationFile(PartitionHandle, 35 + &IoStatusBlock, 36 + FileFsAttribute, 37 + sizeof(Buffer), 38 + FileFsAttributeInformation); 39 + if (!NT_SUCCESS(Status)) 40 + { 41 + DPRINT1("NtQueryVolumeInformationFile failed, Status 0x%08lx\n", Status); 42 + return Status; 43 + } 44 + 45 + if (FileSystemNameSize < FileFsAttribute->FileSystemNameLength + sizeof(WCHAR)) 46 + return STATUS_BUFFER_TOO_SMALL; 47 + 48 + return RtlStringCbCopyNW(FileSystemName, FileSystemNameSize, 49 + FileFsAttribute->FileSystemName, 50 + FileFsAttribute->FileSystemNameLength); 51 + } 52 + 53 + NTSTATUS 54 + GetFileSystemName_UStr( 55 + IN PUNICODE_STRING PartitionPath, 56 + IN OUT PWSTR FileSystemName, 57 + IN SIZE_T FileSystemNameSize) 58 + { 59 + NTSTATUS Status; 60 + OBJECT_ATTRIBUTES ObjectAttributes; 61 + HANDLE PartitionHandle; 62 + IO_STATUS_BLOCK IoStatusBlock; 63 + 64 + /* Open the partition */ 65 + InitializeObjectAttributes(&ObjectAttributes, 66 + PartitionPath, 67 + OBJ_CASE_INSENSITIVE, 68 + NULL, 69 + NULL); 70 + Status = NtOpenFile(&PartitionHandle, 71 + FILE_GENERIC_READ /* | SYNCHRONIZE */, 72 + &ObjectAttributes, 73 + &IoStatusBlock, 74 + FILE_SHARE_READ | FILE_SHARE_WRITE, 75 + 0 /* FILE_SYNCHRONOUS_IO_NONALERT */); 76 + if (!NT_SUCCESS(Status)) 77 + { 78 + DPRINT1("Failed to open partition '%wZ', Status 0x%08lx\n", PartitionPath, Status); 79 + return Status; 80 + } 81 + 82 + /* Retrieve the FS attributes */ 83 + Status = GetFileSystemNameByHandle(PartitionHandle, FileSystemName, FileSystemNameSize); 84 + if (!NT_SUCCESS(Status)) 85 + { 86 + DPRINT1("GetFileSystemNameByHandle() failed for partition '%wZ', Status 0x%08lx\n", 87 + PartitionPath, Status); 88 + } 89 + 90 + /* Close the partition */ 91 + NtClose(PartitionHandle); 92 + 93 + return Status; 94 + } 95 + 96 + NTSTATUS 97 + GetFileSystemName( 98 + IN PCWSTR Partition, 99 + IN OUT PWSTR FileSystemName, 100 + IN SIZE_T FileSystemNameSize) 101 + { 102 + UNICODE_STRING PartitionPath; 103 + 104 + RtlInitUnicodeString(&PartitionPath, Partition); 105 + return GetFileSystemName_UStr(&PartitionPath, 106 + FileSystemName, 107 + FileSystemNameSize); 108 + } 109 + 110 + NTSTATUS 111 + InferFileSystemByHandle( 112 + IN HANDLE PartitionHandle, 113 + IN UCHAR PartitionType, 114 + IN OUT PWSTR FileSystemName, 115 + IN SIZE_T FileSystemNameSize) 116 + { 117 + NTSTATUS Status; 118 + 119 + if (FileSystemNameSize < sizeof(WCHAR)) 120 + return STATUS_BUFFER_TOO_SMALL; 121 + 122 + *FileSystemName = L'\0'; 123 + 124 + /* Try to infer a file system using NT file system recognition */ 125 + Status = GetFileSystemNameByHandle(PartitionHandle, 126 + FileSystemName, 127 + FileSystemNameSize); 128 + if (NT_SUCCESS(Status) && *FileSystemName) 129 + { 130 + goto Quit; 131 + } 132 + 133 + /* 134 + * Try to infer a preferred file system for this partition, given its ID. 135 + * 136 + * WARNING: This is partly a hack, since partitions with the same ID can 137 + * be formatted with different file systems: for example, usual Linux 138 + * partitions that are formatted in EXT2/3/4, ReiserFS, etc... have the 139 + * same partition ID 0x83. 140 + * 141 + * The proper fix is to make a function that detects the existing FS 142 + * from a given partition (not based on the partition ID). 143 + * On the contrary, for unformatted partitions with a given ID, the 144 + * following code is OK. 145 + */ 146 + if ((PartitionType == PARTITION_FAT_12) || 147 + (PartitionType == PARTITION_FAT_16) || 148 + (PartitionType == PARTITION_HUGE ) || 149 + (PartitionType == PARTITION_XINT13)) 150 + { 151 + /* FAT12 or FAT16 */ 152 + Status = RtlStringCbCopyW(FileSystemName, FileSystemNameSize, L"FAT"); 153 + } 154 + else if ((PartitionType == PARTITION_FAT32) || 155 + (PartitionType == PARTITION_FAT32_XINT13)) 156 + { 157 + Status = RtlStringCbCopyW(FileSystemName, FileSystemNameSize, L"FAT32"); 158 + } 159 + else if (PartitionType == PARTITION_LINUX) 160 + { 161 + // WARNING: See the warning above. 162 + /* Could also be EXT2/3/4, ReiserFS, ... */ 163 + Status = RtlStringCbCopyW(FileSystemName, FileSystemNameSize, L"BTRFS"); 164 + } 165 + else if (PartitionType == PARTITION_IFS) 166 + { 167 + // WARNING: See the warning above. 168 + /* Could also be HPFS */ 169 + Status = RtlStringCbCopyW(FileSystemName, FileSystemNameSize, L"NTFS"); 170 + } 171 + 172 + Quit: 173 + if (*FileSystemName) 174 + { 175 + // WARNING: We cannot write on this FS yet! 176 + if (PartitionType == PARTITION_IFS) 177 + { 178 + DPRINT1("Recognized file system '%S' that doesn't have write support yet!\n", 179 + FileSystemName); 180 + } 181 + } 182 + 183 + DPRINT1("InferFileSystem -- PartitionType: 0x%02X ; FileSystem (guessed): %S\n", 184 + PartitionType, *FileSystemName ? FileSystemName : L"None"); 185 + 186 + return Status; 187 + } 188 + 189 + NTSTATUS 190 + InferFileSystem( 191 + IN PCWSTR Partition, 192 + IN UCHAR PartitionType, 193 + IN OUT PWSTR FileSystemName, 194 + IN SIZE_T FileSystemNameSize) 195 + { 196 + NTSTATUS Status; 197 + UNICODE_STRING PartitionPath; 198 + OBJECT_ATTRIBUTES ObjectAttributes; 199 + HANDLE PartitionHandle; 200 + IO_STATUS_BLOCK IoStatusBlock; 201 + 202 + /* Open the partition */ 203 + RtlInitUnicodeString(&PartitionPath, Partition); 204 + InitializeObjectAttributes(&ObjectAttributes, 205 + &PartitionPath, 206 + OBJ_CASE_INSENSITIVE, 207 + NULL, 208 + NULL); 209 + Status = NtOpenFile(&PartitionHandle, 210 + FILE_GENERIC_READ /* | SYNCHRONIZE */, 211 + &ObjectAttributes, 212 + &IoStatusBlock, 213 + FILE_SHARE_READ | FILE_SHARE_WRITE, 214 + 0 /* FILE_SYNCHRONOUS_IO_NONALERT */); 215 + if (!NT_SUCCESS(Status)) 216 + { 217 + DPRINT1("Failed to open partition '%wZ', Status 0x%08lx\n", &PartitionPath, Status); 218 + return Status; 219 + } 220 + 221 + /* Retrieve the FS */ 222 + Status = InferFileSystemByHandle(PartitionHandle, 223 + PartitionType, 224 + FileSystemName, 225 + FileSystemNameSize); 226 + 227 + /* Close the partition */ 228 + NtClose(PartitionHandle); 229 + 230 + return Status; 231 + } 232 + 233 + UCHAR 234 + FileSystemToPartitionType( 235 + IN PCWSTR FileSystem, 236 + IN PULARGE_INTEGER StartSector, 237 + IN PULARGE_INTEGER SectorCount) 238 + { 239 + ASSERT(FileSystem && StartSector && SectorCount); 240 + 241 + if (wcsicmp(FileSystem, L"FAT") == 0 || 242 + wcsicmp(FileSystem, L"FAT32") == 0 || 243 + wcsicmp(FileSystem, L"RAW") == 0) 244 + { 245 + if (SectorCount->QuadPart < 8192) 246 + { 247 + /* FAT12 CHS partition (disk is smaller than 4.1MB) */ 248 + return PARTITION_FAT_12; 249 + } 250 + else if (StartSector->QuadPart < 1450560) 251 + { 252 + /* Partition starts below the 8.4GB boundary ==> CHS partition */ 253 + 254 + if (SectorCount->QuadPart < 65536) 255 + { 256 + /* FAT16 CHS partition (partition size < 32MB) */ 257 + return PARTITION_FAT_16; 258 + } 259 + else if (SectorCount->QuadPart < 1048576) 260 + { 261 + /* FAT16 CHS partition (partition size < 512MB) */ 262 + return PARTITION_HUGE; 263 + } 264 + else 265 + { 266 + /* FAT32 CHS partition (partition size >= 512MB) */ 267 + return PARTITION_FAT32; 268 + } 269 + } 270 + else 271 + { 272 + /* Partition starts above the 8.4GB boundary ==> LBA partition */ 273 + 274 + if (SectorCount->QuadPart < 1048576) 275 + { 276 + /* FAT16 LBA partition (partition size < 512MB) */ 277 + return PARTITION_XINT13; 278 + } 279 + else 280 + { 281 + /* FAT32 LBA partition (partition size >= 512MB) */ 282 + return PARTITION_FAT32_XINT13; 283 + } 284 + } 285 + } 286 + else if (wcsicmp(FileSystem, L"NTFS") == 0) 287 + { 288 + return PARTITION_IFS; 289 + } 290 + else if (wcsicmp(FileSystem, L"BTRFS") == 0 || 291 + wcsicmp(FileSystem, L"EXT2") == 0 || 292 + wcsicmp(FileSystem, L"EXT3") == 0 || 293 + wcsicmp(FileSystem, L"EXT4") == 0 || 294 + wcsicmp(FileSystem, L"FFS") == 0 || 295 + wcsicmp(FileSystem, L"REISERFS") == 0) 296 + { 297 + return PARTITION_LINUX; 298 + } 299 + else 300 + { 301 + /* Unknown file system */ 302 + DPRINT1("Unknown file system '%S'\n", FileSystem); 303 + return PARTITION_ENTRY_UNUSED; 304 + } 305 + } 306 + 307 + /* EOF */
+49
base/setup/lib/utils/fsrec.h
··· 1 + /* 2 + * PROJECT: ReactOS Setup Library 3 + * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) 4 + * PURPOSE: Filesystem Recognition support functions, 5 + * using NT OS functionality. 6 + * COPYRIGHT: Copyright 2017-2020 Hermes Belusca-Maito 7 + */ 8 + 9 + #pragma once 10 + 11 + NTSTATUS 12 + GetFileSystemNameByHandle( 13 + IN HANDLE PartitionHandle, 14 + IN OUT PWSTR FileSystemName, 15 + IN SIZE_T FileSystemNameSize); 16 + 17 + NTSTATUS 18 + GetFileSystemName_UStr( 19 + IN PUNICODE_STRING PartitionPath, 20 + IN OUT PWSTR FileSystemName, 21 + IN SIZE_T FileSystemNameSize); 22 + 23 + NTSTATUS 24 + GetFileSystemName( 25 + IN PCWSTR Partition, 26 + IN OUT PWSTR FileSystemName, 27 + IN SIZE_T FileSystemNameSize); 28 + 29 + NTSTATUS 30 + InferFileSystemByHandle( 31 + IN HANDLE PartitionHandle, 32 + IN UCHAR PartitionType, 33 + IN OUT PWSTR FileSystemName, 34 + IN SIZE_T FileSystemNameSize); 35 + 36 + NTSTATUS 37 + InferFileSystem( 38 + IN PCWSTR Partition, 39 + IN UCHAR PartitionType, 40 + IN OUT PWSTR FileSystemName, 41 + IN SIZE_T FileSystemNameSize); 42 + 43 + UCHAR 44 + FileSystemToPartitionType( 45 + IN PCWSTR FileSystem, 46 + IN PULARGE_INTEGER StartSector, 47 + IN PULARGE_INTEGER SectorCount); 48 + 49 + /* EOF */
+1 -1
base/setup/lib/utils/partlist.c
··· 10 10 #include <ntddscsi.h> 11 11 12 12 #include "partlist.h" 13 - #include "fsutil.h" 13 + #include "fsrec.h" 14 14 #include "registry.h" 15 15 16 16 #define NDEBUG