// Copyright (c) 1998 Mark Russinovich
// Systems Internals
// http://www.sysinternals.com
+
+#define WIN32_NO_STATUS
#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <windows.h>
+#include <windef.h>
+#include <winbase.h>
+#include <winnls.h>
+#include <winuser.h>
#include <winternl.h>
#include <fmifs/fmifs.h>
#include <tchar.h>
+
#include "resource.h"
// Globals
BOOL GotALabel = FALSE;
LPTSTR Label = _T("");
LPTSTR Drive = NULL;
-LPTSTR Format = _T("FAT");
+LPTSTR FileSystem = _T("FAT");
TCHAR RootDirectory[MAX_PATH];
TCHAR LabelString[12];
};
+int LoadStringAndOem(HINSTANCE hInst,
+ UINT uID,
+ LPTSTR szStr,
+ int Siz
+)
+{
+ TCHAR szTmp[RC_STRING_MAX_SIZE];
+ int res = LoadString(hInst, uID, szTmp, sizeof(szTmp));
+ CharToOem(szTmp, szStr);
+ return(res);
+}
+
+
//----------------------------------------------------------------------
//
// PrintWin32Error
if( !_tcsnicmp( &argv[i][1], _T("FS:"), 3 )) {
if( gotFormat) return -1;
- Format = &argv[i][4];
+ FileSystem = &argv[i][4];
gotFormat = TRUE;
case PROGRESS:
percent = (PDWORD) Argument;
- LoadString( GetModuleHandle(NULL), STRING_COMPLETE, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
+ LoadStringAndOem( GetModuleHandle(NULL), STRING_COMPLETE, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
_tprintf(szMsg, *percent);
break;
status = (PBOOLEAN) Argument;
if( *status == FALSE ) {
- LoadString( GetModuleHandle(NULL), STRING_FORMAT_FAIL, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
+ LoadStringAndOem( GetModuleHandle(NULL), STRING_FORMAT_FAIL, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
_tprintf("%s", szMsg);
Error = TRUE;
}
case UNKNOWND:
case STRUCTUREPROGRESS:
case CLUSTERSIZETOOSMALL:
- LoadString( GetModuleHandle(NULL), STRING_NO_SUPPORT, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
+ LoadStringAndOem( GetModuleHandle(NULL), STRING_NO_SUPPORT, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
_tprintf("%s", szMsg);
return FALSE;
}
BOOLEAN LoadFMIFSEntryPoints()
{
HMODULE hFmifs = LoadLibrary( _T("fmifs.dll") );
- if( !(void*) GetProcAddress( hFmifs, "FormatEx" ) ) {
+ if (hFmifs == NULL) {
+ return FALSE;
+ }
+ if( !(void*) GetProcAddress( hFmifs, "FormatEx" ) ) {
+ FreeLibrary(hFmifs);
return FALSE;
}
if( !((void *) GetProcAddress( hFmifs,
"EnableVolumeCompression" )) ) {
-
+ FreeLibrary(hFmifs);
return FALSE;
}
if( !((void *) GetProcAddress( hFmifs,
"QueryAvailableFileSystemFormat" )) ) {
-
+ FreeLibrary(hFmifs);
return FALSE;
}
WCHAR szFormatW[MAX_PATH];
DWORD Index = 0;
BYTE dummy;
- BOOLEAN lastestVersion;
+ BOOLEAN latestVersion;
- LoadString( GetModuleHandle(NULL), STRING_HELP, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
+ LoadStringAndOem( GetModuleHandle(NULL), STRING_HELP, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
if (!LoadFMIFSEntryPoints())
{
_tprintf(szMsg, ProgramName, _T(""));
}
szFormats[0] = 0;
- while (QueryAvailableFileSystemFormat(Index++, szFormatW, &dummy, &dummy, &lastestVersion))
+ while (QueryAvailableFileSystemFormat(Index++, szFormatW, &dummy, &dummy, &latestVersion))
{
- if (!lastestVersion)
+ if (!latestVersion)
continue;
if (szFormats[0])
_tcscat(szFormats, _T(", "));
DWORD flags, maxComponent;
ULARGE_INTEGER freeBytesAvailableToCaller, totalNumberOfBytes, totalNumberOfFreeBytes;
#ifndef UNICODE
- WCHAR RootDirectoryW[MAX_PATH], FormatW[MAX_PATH], LabelW[MAX_PATH];
+ WCHAR RootDirectoryW[MAX_PATH], FileSystemW[MAX_PATH], LabelW[MAX_PATH];
#endif
TCHAR szMsg[RC_STRING_MAX_SIZE];
// Get function pointers
//
if( !LoadFMIFSEntryPoints()) {
- LoadString( GetModuleHandle(NULL), STRING_FMIFS_FAIL, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
+ LoadStringAndOem( GetModuleHandle(NULL), STRING_FMIFS_FAIL, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
_tprintf("%s", szMsg);
return -1;
}
//
if( (badArg = ParseCommandLine( argc, argv ))) {
- LoadString( GetModuleHandle(NULL), STRING_UNKNOW_ARG, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
+ LoadStringAndOem( GetModuleHandle(NULL), STRING_UNKNOW_ARG, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
_tprintf(szMsg, argv[badArg] );
Usage(argv[0]);
//
if( !Drive ) {
- LoadString( GetModuleHandle(NULL), STRING_DRIVE_PARM, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
+ LoadStringAndOem( GetModuleHandle(NULL), STRING_DRIVE_PARM, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
_tprintf(szMsg);
Usage( argv[0] );
return -1;
// See if the drive is removable or not
//
driveType = GetDriveType( RootDirectory );
-
- if( driveType == 0 ) {
- LoadString( 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;
- }
+ case DRIVE_UNKNOWN :
+ LoadStringAndOem( GetModuleHandle(NULL), STRING_ERROR_DRIVE_TYPE, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
+ PrintWin32Error( szMsg, GetLastError());
+ return -1;
- if( driveType != DRIVE_FIXED ) {
- LoadString( GetModuleHandle(NULL), STRING_INSERT_DISK, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
- _tprintf(szMsg, RootDirectory[0] );
- _fgetts( input, sizeof(input)/2, stdin );
+ 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;
- media = FMIFS_FLOPPY;
+ 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;
+ }
}
//
&serialNumber, &maxComponent, &flags,
fileSystem, sizeof(fileSystem)/2)) {
- LoadString( GetModuleHandle(NULL), STRING_NO_VOLUME, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
+ LoadStringAndOem( GetModuleHandle(NULL), STRING_NO_VOLUME, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
PrintWin32Error( szMsg, GetLastError());
return -1;
}
&totalNumberOfBytes,
&totalNumberOfFreeBytes )) {
- LoadString( GetModuleHandle(NULL), STRING_NO_VOLUME_SIZE, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
+ LoadStringAndOem( GetModuleHandle(NULL), STRING_NO_VOLUME_SIZE, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
PrintWin32Error( szMsg, GetLastError());
return -1;
}
- LoadString( GetModuleHandle(NULL), STRING_FILESYSTEM, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
+ LoadStringAndOem( GetModuleHandle(NULL), STRING_FILESYSTEM, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
_tprintf(szMsg, fileSystem );
//
while(1 ) {
- LoadString( GetModuleHandle(NULL), STRING_LABEL_NAME_EDIT, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
+ LoadStringAndOem( GetModuleHandle(NULL), STRING_LABEL_NAME_EDIT, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
_tprintf(szMsg, RootDirectory[0] );
_fgetts( input, sizeof(input)/2, stdin );
input[ _tcslen( input ) - 1] = 0;
break;
}
- LoadString( GetModuleHandle(NULL), STRING_ERROR_LABEL, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
+ LoadStringAndOem( GetModuleHandle(NULL), STRING_ERROR_LABEL, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
_tprintf("%s", szMsg);
}
}
- LoadString( GetModuleHandle(NULL), STRING_YN_FORMAT, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
+ LoadStringAndOem( GetModuleHandle(NULL), STRING_YN_FORMAT, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
_tprintf(szMsg, RootDirectory[0] );
- LoadString( GetModuleHandle(NULL), STRING_YES_NO_FAQ, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
+ LoadStringAndOem( GetModuleHandle(NULL), STRING_YES_NO_FAQ, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
while( 1 ) {
_fgetts( input, sizeof(input)/2, stdin );
return 0;
}
}
- media = FMIFS_HARDDISK;
}
//
}
} else {
- LoadString( GetModuleHandle(NULL), STRING_FAST_FMT, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
+ LoadStringAndOem( GetModuleHandle(NULL), STRING_FAST_FMT, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
if( totalNumberOfBytes.QuadPart > 1024*1024*10 ) {
_tprintf(_T("%s %luM\n"),szMsg, (DWORD) (totalNumberOfBytes.QuadPart/(1024*1024)));
_tprintf(_T("%s %.2fM\n"),szMsg,
((float)(LONGLONG)totalNumberOfBytes.QuadPart)/(float)(1024.0*1024.0));
}
- LoadString( GetModuleHandle(NULL), STRING_CREATE_FSYS, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
+ LoadStringAndOem( GetModuleHandle(NULL), STRING_CREATE_FSYS, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
_tprintf("%s", szMsg);
}
//
#ifndef UNICODE
MultiByteToWideChar(CP_ACP, 0, RootDirectory, -1, RootDirectoryW, MAX_PATH);
- MultiByteToWideChar(CP_ACP, 0, Format, -1, FormatW, MAX_PATH);
+ MultiByteToWideChar(CP_ACP, 0, FileSystem, -1, FileSystemW, MAX_PATH);
MultiByteToWideChar(CP_ACP, 0, Label, -1, LabelW, MAX_PATH);
- FormatEx( RootDirectoryW, media, FormatW, LabelW, QuickFormat,
+ FormatEx( RootDirectoryW, media, FileSystemW, LabelW, QuickFormat,
ClusterSize, FormatExCallback );
#else
- FormatEx( RootDirectory, media, Format, Label, QuickFormat,
+ FormatEx( RootDirectory, media, FileSystem, Label, QuickFormat,
ClusterSize, FormatExCallback );
#endif
if( Error ) return -1;
- LoadString( GetModuleHandle(NULL), STRING_FMT_COMPLETE, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
+ LoadStringAndOem( GetModuleHandle(NULL), STRING_FMT_COMPLETE, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
_tprintf("%s", szMsg);
//
if( !EnableVolumeCompression( RootDirectory, TRUE )) {
#endif
- LoadString( GetModuleHandle(NULL), STRING_VOL_COMPRESS, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
+ LoadStringAndOem( GetModuleHandle(NULL), STRING_VOL_COMPRESS, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
_tprintf("%s", szMsg);
}
}
input[ _tcslen(input)-1] = 0;
if( !SetVolumeLabel( RootDirectory, input )) {
- LoadString( GetModuleHandle(NULL), STRING_NO_LABEL, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
+ LoadStringAndOem( GetModuleHandle(NULL), STRING_NO_LABEL, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
PrintWin32Error(szMsg, GetLastError());
return -1;
}
&serialNumber, &maxComponent, &flags,
fileSystem, sizeof(fileSystem)/2)) {
- LoadString( GetModuleHandle(NULL), STRING_NO_VOLUME, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
+ LoadStringAndOem( GetModuleHandle(NULL), STRING_NO_VOLUME, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
PrintWin32Error( szMsg, GetLastError());
return -1;
}
&totalNumberOfBytes,
&totalNumberOfFreeBytes )) {
- LoadString( GetModuleHandle(NULL), STRING_NO_VOLUME_SIZE, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
+ LoadStringAndOem( GetModuleHandle(NULL), STRING_NO_VOLUME_SIZE, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
PrintWin32Error(szMsg, GetLastError());
return -1;
}
- LoadString( GetModuleHandle(NULL), STRING_FREE_SPACE, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
+ LoadStringAndOem( GetModuleHandle(NULL), STRING_FREE_SPACE, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
_tprintf(szMsg, totalNumberOfBytes.QuadPart, totalNumberOfFreeBytes.QuadPart );
//
&serialNumber, &maxComponent, &flags,
fileSystem, sizeof(fileSystem)/2)) {
- LoadString( GetModuleHandle(NULL), STRING_NO_VOLUME, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
+ LoadStringAndOem( GetModuleHandle(NULL), STRING_NO_VOLUME, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
PrintWin32Error( szMsg, GetLastError());
return -1;
}
- LoadString( GetModuleHandle(NULL), STRING_SERIAL_NUMBER, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
+ LoadStringAndOem( GetModuleHandle(NULL), STRING_SERIAL_NUMBER, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
_tprintf(szMsg, (unsigned int)(serialNumber >> 16),
(unsigned int)(serialNumber & 0xFFFF) );
return 0;
}
-