Author: spetreolle Date: Tue Jun 26 21:31:10 2012 New Revision: 56808
URL: http://svn.reactos.org/svn/reactos?rev=56808&view=rev Log: [FORMAT] Handle read only devices and report them unsupported. Forbid the formatting of the system drive.
Patch by Mikael Lyngvig. See bug 2081 for more details.
Modified: trunk/reactos/base/system/format/format.c
Modified: trunk/reactos/base/system/format/format.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/format/format.c... ============================================================================== --- trunk/reactos/base/system/format/format.c [iso-8859-1] (original) +++ trunk/reactos/base/system/format/format.c [iso-8859-1] Tue Jun 26 21:31:10 2012 @@ -370,25 +370,52 @@ // See if the drive is removable or not // driveType = GetDriveType( RootDirectory ); - - if( driveType == 0 ) { - LoadStringAndOem( GetModuleHandle(NULL), STRING_ERROR_DRIVE_TYPE, (LPTSTR) szMsg,RC_STRING_MAX_SIZE); - PrintWin32Error( szMsg, GetLastError()); - return -1; - } - else if ( driveType == 1 ) + switch (driveType) { - LoadString( GetModuleHandle(NULL), STRING_NO_VOLUME, (LPTSTR) szMsg,RC_STRING_MAX_SIZE); - PrintWin32Error( szMsg, GetLastError()); - return -1; - } - - if( driveType != DRIVE_FIXED ) { - LoadStringAndOem( GetModuleHandle(NULL), STRING_INSERT_DISK, (LPTSTR) szMsg,RC_STRING_MAX_SIZE); - _tprintf(szMsg, RootDirectory[0] ); - _fgetts( input, sizeof(input)/2, stdin ); - - media = FMIFS_FLOPPY; + case DRIVE_UNKNOWN : + LoadStringAndOem( GetModuleHandle(NULL), STRING_ERROR_DRIVE_TYPE, (LPTSTR) szMsg,RC_STRING_MAX_SIZE); + PrintWin32Error( szMsg, GetLastError()); + return -1; + + case DRIVE_REMOTE: + case DRIVE_CDROM: + LoadStringAndOem( GetModuleHandle(NULL), STRING_NO_SUPPORT, (LPTSTR) szMsg, RC_STRING_MAX_SIZE); + _tprintf(szMsg); + return -1; + + case DRIVE_NO_ROOT_DIR: + LoadString( GetModuleHandle(NULL), STRING_NO_VOLUME, (LPTSTR) szMsg,RC_STRING_MAX_SIZE); + PrintWin32Error( szMsg, GetLastError()); + return -1; + + case DRIVE_REMOVABLE: + LoadStringAndOem( GetModuleHandle(NULL), STRING_INSERT_DISK, (LPTSTR) szMsg,RC_STRING_MAX_SIZE); + _tprintf(szMsg, RootDirectory[0] ); + _fgetts( input, sizeof(input)/2, stdin ); + media = FMIFS_FLOPPY; + break; + + case DRIVE_FIXED: + case DRIVE_RAMDISK: + media = FMIFS_HARDDISK; + break; + } + + // Reject attempts to format the system drive + { + TCHAR path[MAX_PATH + 1]; + UINT rc; + rc = GetWindowsDirectory(path, MAX_PATH); + if (rc == 0 || rc > MAX_PATH) + // todo: Report "Unable to query system directory" + return -1; + if (_totlower(path[0]) == _totlower(Drive[0])) + { + // todo: report "Cannot format system drive" + LoadStringAndOem( GetModuleHandle(NULL), STRING_NO_SUPPORT, (LPTSTR) szMsg, RC_STRING_MAX_SIZE); + _tprintf(szMsg); + return -1; + } }
// @@ -452,7 +479,6 @@ return 0; } } - media = FMIFS_HARDDISK; }
//