Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290/* * PROJECT: ReactOS DiskPart * LICENSE: GPL - See COPYING in the top level directory * FILE: base/system/diskpart/format.c * PURPOSE: Manages all the partitions of the OS in an interactive way. * PROGRAMMERS: Lee Schroeder */
#include "diskpart.h"
#include <fmifs/fmifs.h>
#define NDEBUG#include <debug.h>
staticBOOLGetFsModule( _In_ PWSTR pszFileSystem, _Out_ HMODULE *phModule){ WCHAR szDllNameBuffer[32]; HKEY hKey; DWORD dwLength, dwErr;
*phModule = NULL;
dwErr = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\ReactOS\\ReactOS\\CurrentVersion\\IFS", 0, KEY_READ, &hKey); if (dwErr != ERROR_SUCCESS) { DPRINT1("Failed to open!\n"); return FALSE; }
dwLength = sizeof(szDllNameBuffer); dwErr = RegQueryValueExW(hKey, pszFileSystem, NULL, NULL, (PBYTE)szDllNameBuffer, &dwLength);
RegCloseKey(hKey);
if (dwErr != ERROR_SUCCESS) { DPRINT1("Failed to query!\n"); return FALSE; }
*phModule = LoadLibraryW(szDllNameBuffer); if (*phModule == NULL) { DPRINT1("Failed to load!\n"); return FALSE; }
return TRUE;}
BOOLEANWINAPIFormatCallback( CALLBACKCOMMAND Command, ULONG Size, PVOID Argument){ PDWORD percent;
switch (Command) { case PROGRESS: percent = (PDWORD)Argument; ConResPrintf(StdOut, IDS_FORMAT_PROGRESS, *percent); break;
case DONE: break;
default: DPRINT1("Callback (%u %lu %p)\n", Command, Size, Argument); break; }
return TRUE;}
EXIT_CODEformat_main( _In_ INT argc, _In_ PWSTR *argv){ UNICODE_STRING usDriveRoot; UNICODE_STRING LabelString; PWSTR pszSuffix = NULL; PWSTR pszFileSystem = NULL; PWSTR pszLabel = NULL; BOOLEAN bQuickFormat = FALSE; ULONG ulClusterSize = 0; HMODULE hModule = NULL; PULIB_FORMAT pFormat = NULL;// FMIFS_MEDIA_FLAG MediaType = FMIFS_HARDDISK; INT i; BOOLEAN Success = FALSE;
if (CurrentVolume == NULL) { ConResPuts(StdOut, IDS_SELECT_NO_VOLUME); return EXIT_SUCCESS; }
for (i = 1; i < argc; i++) { if (_wcsicmp(argv[i], L"noerr") == 0) { /* noerr */ DPRINT("NoErr\n", pszSuffix); ConPuts(StdOut, L"The NOERR option is not supported yet!\n");#if 0 bNoErr = TRUE;#endif } }
for (i = 1; i < argc; i++) { ConPrintf(StdOut, L"%s\n", argv[i]);
if (HasPrefix(argv[i], L"fs=", &pszSuffix)) { /* fs=<fs> */ pszFileSystem = pszSuffix; } else if (HasPrefix(argv[i], L"revision=", &pszSuffix)) { /* revision=<X.XX> */ ConPuts(StdOut, L"The REVISION option is not supported yet!\n"); } else if (HasPrefix(argv[i], L"label=", &pszSuffix)) { /* label=<"label"> */ pszLabel = pszSuffix; } else if (HasPrefix(argv[i], L"unit=", &pszSuffix)) { /* unit=<N> */ ulClusterSize = wcstoul(pszSuffix, NULL, 0); if ((ulClusterSize == 0) && (errno == ERANGE)) { ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS); goto done; } } else if (_wcsicmp(argv[i], L"recommended") == 0) { /* recommended */ ConPuts(StdOut, L"The RECOMMENDED option is not supported yet!\n"); } else if (_wcsicmp(argv[i], L"quick") == 0) { /* quick */ bQuickFormat = TRUE; } else if (_wcsicmp(argv[i], L"compress") == 0) { /* compress */ ConPuts(StdOut, L"The COMPRESS option is not supported yet!\n"); } else if (_wcsicmp(argv[i], L"override") == 0) { /* override */ ConPuts(StdOut, L"The OVERRIDE option is not supported yet!\n"); } else if (_wcsicmp(argv[i], L"duplicate") == 0) { /* duplicate */ ConPuts(StdOut, L"The DUPLICATE option is not supported yet!\n"); } else if (_wcsicmp(argv[i], L"nowait") == 0) { /* nowait */ ConPuts(StdOut, L"The NOWAIT option is not supported yet!\n"); } else if (_wcsicmp(argv[i], L"noerr") == 0) { /* noerr - Already handled above */ } else { ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS); return EXIT_SUCCESS; } }
DPRINT("VolumeName : %S\n", CurrentVolume->VolumeName); DPRINT("DeviceName : %S\n", CurrentVolume->DeviceName); DPRINT("DriveLetter : %C\n", CurrentVolume->DriveLetter);#if 0 switch (CurrentVolume->VolumeType) { case VOLUME_TYPE_CDROM: MediaType = FMIFS_REMOVABLE; // ??? break;
case VOLUME_TYPE_PARTITION: MediaType = FMIFS_HARDDISK; break;
case VOLUME_TYPE_REMOVABLE: MediaType = FMIFS_REMOVABLE; // ??? break;
case VOLUME_TYPE_UNKNOWN: default: MediaType = FMIFS_REMOVABLE; // ??? break; }#endif
DPRINT("FileSystem: %S\n", pszFileSystem); DPRINT("Label: %S\n", pszLabel); DPRINT("Quick: %d\n", bQuickFormat); DPRINT("ClusterSize: %lu\n", ulClusterSize);
RtlDosPathNameToNtPathName_U(CurrentVolume->VolumeName, &usDriveRoot, NULL, NULL);
/* Remove trailing backslash */ if (usDriveRoot.Buffer[(usDriveRoot.Length / sizeof(WCHAR)) - 1] == L'\\') { usDriveRoot.Buffer[(usDriveRoot.Length / sizeof(WCHAR)) - 1] = UNICODE_NULL; usDriveRoot.Length -= sizeof(WCHAR); }
DPRINT("DriveRoot: %wZ\n", &usDriveRoot);
/* Use the FAT filesystem as default */ if (pszFileSystem == NULL) pszFileSystem = L"FAT";
BOOLEAN bBackwardCompatible = FALSE; // Default to latest FS versions. if (_wcsicmp(pszFileSystem, L"FAT") == 0) bBackwardCompatible = TRUE; // else if (wcsicmp(pszFileSystem, L"FAT32") == 0) // bBackwardCompatible = FALSE;
if (pszLabel == NULL) pszLabel = L"";
RtlInitUnicodeString(&LabelString, pszLabel);
if (!GetFsModule(pszFileSystem, &hModule)) { DPRINT1("GetFsModule() failed\n"); goto done; }
pFormat = (PULIB_FORMAT)GetProcAddress(hModule, "Format"); if (pFormat) { Success = (pFormat)(&usDriveRoot, FormatCallback, bQuickFormat, bBackwardCompatible, FMIFS_HARDDISK, //MediaType, &LabelString, ulClusterSize); }
done: ConPuts(StdOut, L"\n"); if (Success) ConResPrintf(StdOut, IDS_FORMAT_SUCCESS); else ConResPrintf(StdOut, IDS_FORMAT_FAIL);
if (hModule) FreeLibrary(hModule);
RtlFreeUnicodeString(&usDriveRoot);
return EXIT_SUCCESS;}