Author: hbelusca
Date: Wed Mar 2 22:05:19 2016
New Revision: 70868
URL:
http://svn.reactos.org/svn/reactos?rev=70868&view=rev
Log:
[CHKDSK]
- Integrate chkdsk into our build system.
- Whitespace fixes.
Modified:
trunk/reactos/base/system/chkdsk/CMakeLists.txt
trunk/reactos/base/system/chkdsk/chkdsk.c
trunk/reactos/base/system/chkdsk/chkdsk.rc
Modified: trunk/reactos/base/system/chkdsk/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/chkdsk/CMakeLi…
==============================================================================
--- trunk/reactos/base/system/chkdsk/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/reactos/base/system/chkdsk/CMakeLists.txt [iso-8859-1] Wed Mar 2 22:05:19 2016
@@ -1,7 +1,7 @@
+
+include_directories(${REACTOS_SOURCE_DIR}/include/reactos/libs/fmifs)
add_executable(chkdsk chkdsk.c chkdsk.rc)
-include_directories(${REACTOS_SOURCE_DIR}/include/reactos/libs/fmifs)
set_module_type(chkdsk win32cui UNICODE)
-target_link_libraries(chkdsk win32err)
add_importlibs(chkdsk fmifs msvcrt kernel32 ntdll)
add_cd_file(TARGET chkdsk DESTINATION reactos/system32 FOR all)
Modified: trunk/reactos/base/system/chkdsk/chkdsk.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/chkdsk/chkdsk.…
==============================================================================
--- trunk/reactos/base/system/chkdsk/chkdsk.c [iso-8859-1] (original)
+++ trunk/reactos/base/system/chkdsk/chkdsk.c [iso-8859-1] Wed Mar 2 22:05:19 2016
@@ -3,8 +3,11 @@
// Chkdskx
//
// Copyright (c) 1998 Mark Russinovich
-// Systems Internals
-//
http://www.sysinternals.com/
+// Systems Internals
+//
http://www.sysinternals.com/
+//
+// Chkdsk clone that demonstrates the use of the FMIFS file system
+// utility library.
//
// --------------------------------------------------------------------
//
@@ -25,49 +28,69 @@
//
// --------------------------------------------------------------------
//
-// Chkdsk clone that demonstrates the use of the FMIFS file system
-// utility library.
-//
// 1999 February (Emanuele Aliberti)
-// Adapted for ReactOS and lcc-win32.
+// Adapted for ReactOS and lcc-win32.
//
// 1999 April (Emanuele Aliberti)
-// Adapted for ReactOS and egcs.
+// Adapted for ReactOS and egcs.
//
// 2008 July (Aleksey Bragin)
-// Cleanup, use ReactOS's fmifs.h
+// Cleanup, use ReactOS's fmifs.h
//
//======================================================================
+
+#include <stdio.h>
+
+/* PSDK/NDK Headers */
#define WIN32_NO_STATUS
+#include <windows.h>
+
#define NTOS_MODE_USER
-#include <windows.h>
-#include <stdio.h>
#include <ndk/ntndk.h>
#include <fmifs/fmifs.h>
-#define _UNICODE 1
-#include <tchar.h>
-#include "../config.h"
-#include "../win32err.h"
+
+#define FMIFS_IMPORT_DLL
//
// Globals
//
-BOOL Error = FALSE;
+BOOL Error = FALSE;
// switches
-BOOL FixErrors = FALSE;
-BOOL SkipClean = FALSE;
-BOOL ScanSectors = FALSE;
-BOOL Verbose = FALSE;
+BOOL FixErrors = FALSE;
+BOOL SkipClean = FALSE;
+BOOL ScanSectors = FALSE;
+BOOL Verbose = FALSE;
PWCHAR Drive = NULL;
-WCHAR CurrentDirectory[1024];
+WCHAR CurrentDirectory[1024];
#ifndef FMIFS_IMPORT_DLL
//
// FMIFS function
//
-//PCHKDSK Chkdsk;
+// PCHKDSK Chkdsk;
#endif /* ndef FMIFS_IMPORT_DLL */
+
+
+//----------------------------------------------------------------------
+//
+// PrintWin32Error
+//
+// Takes the win32 error code and prints the text version.
+//
+//----------------------------------------------------------------------
+static VOID PrintWin32Error(LPWSTR Message, DWORD ErrorCode)
+{
+ LPWSTR lpMsgBuf;
+
+ FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL, ErrorCode,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPWSTR)&lpMsgBuf, 0, NULL);
+
+ wprintf(L"%s: %s\n", Message, lpMsgBuf);
+ LocalFree(lpMsgBuf);
+}
//--------------------------------------------------------------------
@@ -80,12 +103,12 @@
//--------------------------------------------------------------------
BOOL
WINAPI
-CtrlCIntercept( DWORD dwCtrlType )
-{
- //
- // Handle the event so that the default handler doesn't
- //
- return TRUE;
+CtrlCIntercept(DWORD dwCtrlType)
+{
+ //
+ // Handle the event so that the default handler doesn't
+ //
+ return TRUE;
}
@@ -98,18 +121,15 @@
// 19990216 EA Missing printf %s argument
//----------------------------------------------------------------------
VOID
-Usage( PWCHAR ProgramName )
-{
- _tprintf(
- L"\
-Usage: %s [drive:] [-F] [-V] [-R] [-C]\n\n\
- [drive:] Specifies the drive to check.\n\
- -F Fixes errors on the disk.\n\
- -V Displays the full path of every file on the disk.\n\
- -R Locates bad sectors and recovers readable information.\n\
- -C Checks the drive only if it is dirty.\n\n",
- ProgramName
- );
+Usage(PWCHAR ProgramName)
+{
+ wprintf(L"Usage: %s [drive:] [-F] [-V] [-R] [-C]\n\n"
+ L"[drive:] Specifies the drive to check.\n"
+ L"-F Fixes errors on the disk.\n"
+ L"-V Displays the full path of every file on the disk.\n"
+ L"-R Locates bad sectors and recovers readable
information.\n"
+ L"-C Checks the drive only if it is dirty.\n\n",
+ ProgramName);
}
@@ -122,75 +142,76 @@
//----------------------------------------------------------------------
int
ParseCommandLine(
- int argc,
- WCHAR *argv []
- )
-{
- int i;
- BOOLEAN gotFix = FALSE;
- BOOLEAN gotVerbose = FALSE;
- BOOLEAN gotClean = FALSE;
- /*BOOLEAN gotScan = FALSE;*/
-
-
- for ( i = 1;
- (i < argc);
- i++
- ) {
- switch( argv[i][0] )
- {
- case L'-':
- case L'/':
-
- switch( argv[i][1] )
- {
- case L'F':
- case L'f':
-
- if( gotFix ) return i;
- FixErrors = TRUE;
- gotFix = TRUE;
- break;
-
- case L'V':
- case L'v':
-
- if( gotVerbose) return i;
- Verbose = TRUE;
- gotVerbose = TRUE;
- break;
-
- case L'R':
- case L'r':
-
- if( gotFix ) return i;
- ScanSectors = TRUE;
- gotFix = TRUE;
- break;
-
- case L'C':
- case L'c':
-
- if( gotClean ) return i;
- SkipClean = TRUE;
- gotClean = TRUE;
- break;
-
- default:
- return i;
- }
- break;
-
- default:
-
- if( Drive ) return i;
- if( argv[i][1] != L':' ) return i;
-
- Drive = argv[i];
- break;
- }
- }
- return 0;
+ int argc,
+ WCHAR *argv[]
+ )
+{
+ int i;
+ BOOLEAN gotFix = FALSE;
+ BOOLEAN gotVerbose = FALSE;
+ BOOLEAN gotClean = FALSE;
+ // BOOLEAN gotScan = FALSE;
+
+ for (i = 1; i < argc; i++)
+ {
+ switch (argv[i][0])
+ {
+ case L'-': case L'/':
+
+ switch (argv[i][1])
+ {
+ case L'?':
+ Usage(argv[0]);
+ break;
+
+ case L'F': case L'f':
+ {
+ if (gotFix) return i;
+ FixErrors = TRUE;
+ gotFix = TRUE;
+ break;
+ }
+
+ case L'V': case L'v':
+ {
+ if (gotVerbose) return i;
+ Verbose = TRUE;
+ gotVerbose = TRUE;
+ break;
+ }
+
+ case L'R': case L'r':
+ {
+ if (gotFix) return i;
+ ScanSectors = TRUE;
+ gotFix = TRUE;
+ break;
+ }
+
+ case L'C': case L'c':
+ {
+ if (gotClean) return i;
+ SkipClean = TRUE;
+ gotClean = TRUE;
+ break;
+ }
+
+ default:
+ return i;
+ }
+ break;
+
+ default:
+ {
+ if (Drive) return i;
+ if (argv[i][1] != L':') return i;
+
+ Drive = argv[i];
+ break;
+ }
+ }
+ }
+ return 0;
}
@@ -205,97 +226,97 @@
BOOLEAN
WINAPI
ChkdskCallback(
- CALLBACKCOMMAND Command,
- DWORD Modifier,
- PVOID Argument
- )
-{
- PDWORD percent;
- PBOOLEAN status;
- PTEXTOUTPUT output;
-
- //
- // We get other types of commands,
- // but we don't have to pay attention to them
- //
- switch( Command )
- {
- case UNKNOWN2:
- wprintf(L"UNKNOWN2\r");
- break;
-
- case UNKNOWN3:
- wprintf(L"UNKNOWN3\r");
- break;
-
- case UNKNOWN4:
- wprintf(L"UNKNOWN4\r");
- break;
-
- case UNKNOWN5:
- wprintf(L"UNKNOWN5\r");
- break;
-
- case FSNOTSUPPORTED:
- wprintf(L"FSNOTSUPPORTED\r");
- break;
-
- case VOLUMEINUSE:
- wprintf(L"VOLUMEINUSE\r");
- break;
-
- case UNKNOWN9:
- wprintf(L"UNKNOWN9\r");
- break;
-
- case UNKNOWNA:
- wprintf(L"UNKNOWNA\r");
- break;
-
- case UNKNOWNC:
- wprintf(L"UNKNOWNC\r");
- break;
-
- case UNKNOWND:
- wprintf(L"UNKNOWND\r");
- break;
-
- case INSUFFICIENTRIGHTS:
- wprintf(L"INSUFFICIENTRIGHTS\r");
- break;
-
- case STRUCTUREPROGRESS:
- wprintf(L"STRUCTUREPROGRESS\r");
- break;
-
- case DONEWITHSTRUCTURE:
- wprintf(L"DONEWITHSTRUCTURE\r");
- break;
-
- case CLUSTERSIZETOOSMALL:
- wprintf(L"CLUSTERSIZETOOSMALL\r");
- break;
-
- case PROGRESS:
- percent = (PDWORD) Argument;
- wprintf(L"%d percent completed.\r", *percent);
- break;
-
- case OUTPUT:
- output = (PTEXTOUTPUT) Argument;
- fwprintf(stdout, L"%s", output->Output);
- break;
-
- case DONE:
- status = (PBOOLEAN) Argument;
- if ( *status == TRUE )
- {
- wprintf(L"Chkdsk was unable to complete successfully.\n\n");
- Error = TRUE;
- }
- break;
- }
- return TRUE;
+ CALLBACKCOMMAND Command,
+ DWORD Modifier,
+ PVOID Argument
+ )
+{
+ PDWORD percent;
+ PBOOLEAN status;
+ PTEXTOUTPUT output;
+
+ //
+ // We get other types of commands,
+ // but we don't have to pay attention to them
+ //
+ switch (Command)
+ {
+ case UNKNOWN2:
+ wprintf(L"UNKNOWN2\r");
+ break;
+
+ case UNKNOWN3:
+ wprintf(L"UNKNOWN3\n");
+ break;
+
+ case UNKNOWN4:
+ wprintf(L"UNKNOWN4\n");
+ break;
+
+ case UNKNOWN5:
+ wprintf(L"UNKNOWN5\n");
+ break;
+
+ case FSNOTSUPPORTED:
+ wprintf(L"FSNOTSUPPORTED\n");
+ break;
+
+ case VOLUMEINUSE:
+ wprintf(L"VOLUMEINUSE\n");
+ break;
+
+ case UNKNOWN9:
+ wprintf(L"UNKNOWN9\n");
+ break;
+
+ case UNKNOWNA:
+ wprintf(L"UNKNOWNA\n");
+ break;
+
+ case UNKNOWNC:
+ wprintf(L"UNKNOWNC\n");
+ break;
+
+ case UNKNOWND:
+ wprintf(L"UNKNOWND\n");
+ break;
+
+ case INSUFFICIENTRIGHTS:
+ wprintf(L"INSUFFICIENTRIGHTS\n");
+ break;
+
+ case STRUCTUREPROGRESS:
+ wprintf(L"STRUCTUREPROGRESS\n");
+ break;
+
+ case DONEWITHSTRUCTURE:
+ wprintf(L"DONEWITHSTRUCTURE\n");
+ break;
+
+ case CLUSTERSIZETOOSMALL:
+ wprintf(L"CLUSTERSIZETOOSMALL\n");
+ break;
+
+ case PROGRESS:
+ percent = (PDWORD)Argument;
+ wprintf(L"%d percent completed.\r", *percent);
+ break;
+
+ case OUTPUT:
+ output = (PTEXTOUTPUT)Argument;
+ wprintf(L"%S", output->Output);
+ break;
+
+ case DONE:
+ status = (PBOOLEAN)Argument;
+ if (*status == TRUE)
+ {
+ wprintf(L"Chkdsk was unable to complete successfully.\n\n");
+ Error = TRUE;
+ }
+ break;
+ }
+ return TRUE;
}
#ifndef FMIFS_IMPORT_DLL
@@ -311,17 +332,19 @@
BOOLEAN
LoadFMIFSEntryPoints(VOID)
{
- LoadLibraryW( L"fmifs.dll" );
-
- if( !(Chkdsk =
- (void *) GetProcAddress(
- GetModuleHandleW(L"fmifs.dll"),
- "Chkdsk" ))
- )
- {
- return FALSE;
- }
- return TRUE;
+ HMODULE hFmifs = LoadLibraryW(L"fmifs.dll");
+ if (hFmifs == NULL)
+ return FALSE;
+
+ Chkdsk = (PCHKDSK)GetProcAddress(hFmifs, "Chkdsk");
+
+ if (!Chkdsk)
+ {
+ FreeLibrary(hFmifs);
+ return FALSE;
+ }
+
+ return TRUE;
}
#endif /* ndef FMIFS_IMPORT_DLL */
@@ -339,147 +362,120 @@
//
//----------------------------------------------------------------------
int
-wmain( int argc, WCHAR *argv[] )
-{
- int badArg;
- HANDLE volumeHandle;
- WCHAR fileSystem [1024];
- WCHAR volumeName [1024];
- DWORD serialNumber;
- DWORD flags,
- maxComponent;
-
- wprintf(
- L"\n\
+wmain(int argc, WCHAR *argv[])
+{
+ int badArg;
+ HANDLE volumeHandle;
+ WCHAR fileSystem[1024];
+ WCHAR volumeName[1024];
+ DWORD serialNumber;
+ DWORD flags, maxComponent;
+
+ wprintf(L"\n\
Chkdskx v1.0.1 by Mark Russinovich\n\
Systems Internals -
http://www.sysinternals.com/\n\
-ReactOS adaptation 1999 by Emanuele Aliberti\n\n"
- );
+ReactOS adaptation 1999 by Emanuele Aliberti\n\n");
+
#ifndef FMIFS_IMPORT_DLL
- //
- // Get function pointers
- //
- if( !LoadFMIFSEntryPoints())
- {
- wprintf(L"Could not located FMIFS entry points.\n\n");
- return -1;
- }
+ //
+ // Get function pointers
+ //
+ if (!LoadFMIFSEntryPoints())
+ {
+ wprintf(L"Could not located FMIFS entry points.\n\n");
+ return -1;
+ }
#endif /* ndef FMIFS_IMPORT_DLL */
- //
- // Parse command line
- //
- if( (badArg = ParseCommandLine( argc, argv )))
- {
- wprintf(
- L"Unknown argument: %s\n",
- argv[badArg]
- );
-
- Usage(argv[0]);
- return -1;
- }
-
- //
- // Get the drive's format
- //
- if( !Drive )
- {
- if( !GetCurrentDirectoryW(
- sizeof(CurrentDirectory),
- CurrentDirectory
- )
- ) {
-
- PrintWin32Error(
- L"Could not get current directory",
- GetLastError()
- );
- return -1;
- }
-
- } else {
-
- wcscpy( CurrentDirectory, Drive );
- }
- CurrentDirectory[2] = L'\\';
- CurrentDirectory[3] = L'\0';
- Drive = CurrentDirectory;
-
- //
- // Determine the drive's file system format, which we need to
- // tell chkdsk
- //
- if( !GetVolumeInformationW(
- Drive,
- volumeName,
- sizeof volumeName,
- & serialNumber,
- & maxComponent,
- & flags,
- fileSystem,
- sizeof fileSystem
- )
- ) {
- PrintWin32Error(
- L"Could not query volume",
- GetLastError()
- );
- return -1;
- }
-
- //
- // If they want to fix, we need to have access to the drive
- //
- if ( FixErrors )
- {
- swprintf(
- volumeName,
- L"\\\\.\\%C:",
- Drive[0]
- );
- volumeHandle = CreateFileW(
- volumeName,
- GENERIC_WRITE,
- 0,
- NULL,
- OPEN_EXISTING,
- 0,
- 0
- );
- if( volumeHandle == INVALID_HANDLE_VALUE )
- {
- wprintf(L"Chdskx cannot run because the volume is in use by another
process.\n\n");
- return -1;
- }
- CloseHandle( volumeHandle );
-
- //
- // Can't let the user break out of a chkdsk that can modify the drive
- //
- SetConsoleCtrlHandler( CtrlCIntercept, TRUE );
- }
-
- //
- // Just do it
- //
- wprintf(
- L"The type of file system is %s.\n",
- fileSystem
- );
- Chkdsk(
- Drive,
- fileSystem,
- FixErrors,
- Verbose,
- SkipClean,
- ScanSectors,
- NULL,
- NULL,
- ChkdskCallback
- );
-
- if ( Error ) return -1;
- return 0;
+
+ //
+ // Parse command line
+ //
+ badArg = ParseCommandLine(argc, argv);
+ if (badArg)
+ {
+ wprintf(L"Unknown argument: %s\n", argv[badArg]);
+ Usage(argv[0]);
+ return -1;
+ }
+
+ //
+ // Get the drive's format
+ //
+ if (!Drive)
+ {
+ if (!GetCurrentDirectoryW(ARRAYSIZE(CurrentDirectory), CurrentDirectory))
+ {
+ PrintWin32Error(L"Could not get current directory",
GetLastError());
+ return -1;
+ }
+ }
+ else
+ {
+ wcscpy(CurrentDirectory, Drive);
+ }
+ CurrentDirectory[2] = L'\\';
+ CurrentDirectory[3] = L'\0';
+ Drive = CurrentDirectory;
+
+ //
+ // Determine the drive's file system format, which we need to
+ // tell chkdsk
+ //
+ if (!GetVolumeInformationW(Drive,
+ volumeName,
+ ARRAYSIZE(volumeName),
+ &serialNumber,
+ &maxComponent,
+ &flags,
+ fileSystem,
+ ARRAYSIZE(fileSystem)))
+ {
+ PrintWin32Error(L"Could not query volume", GetLastError());
+ return -1;
+ }
+
+ //
+ // If they want to fix, we need to have access to the drive
+ //
+ if (FixErrors)
+ {
+ swprintf(volumeName, L"\\\\.\\%C:", Drive[0]);
+ volumeHandle = CreateFileW(volumeName,
+ GENERIC_WRITE,
+ 0,
+ NULL,
+ OPEN_EXISTING,
+ 0,
+ 0);
+ if (volumeHandle == INVALID_HANDLE_VALUE)
+ {
+ wprintf(L"Chdskx cannot run because the volume is in use by another
process.\n\n");
+ return -1;
+ }
+ CloseHandle(volumeHandle);
+
+ //
+ // Can't let the user break out of a chkdsk that can modify the drive
+ //
+ SetConsoleCtrlHandler(CtrlCIntercept, TRUE);
+ }
+
+ //
+ // Just do it
+ //
+ wprintf(L"The type of file system is %s.\n", fileSystem);
+ Chkdsk(Drive,
+ fileSystem,
+ FixErrors,
+ Verbose,
+ SkipClean,
+ ScanSectors,
+ NULL,
+ NULL,
+ ChkdskCallback);
+
+ if (Error) return -1;
+ return 0;
}
/* EOF */
Modified: trunk/reactos/base/system/chkdsk/chkdsk.rc
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/chkdsk/chkdsk.…
==============================================================================
--- trunk/reactos/base/system/chkdsk/chkdsk.rc [iso-8859-1] (original)
+++ trunk/reactos/base/system/chkdsk/chkdsk.rc [iso-8859-1] Wed Mar 2 22:05:19 2016
@@ -1,6 +1,6 @@
-#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Disk Checking Utility\0"
-#define REACTOS_STR_INTERNAL_NAME "chkdsk\0"
-#define REACTOS_STR_ORIGINAL_FILENAME "chkdsk.exe\0"
-#define REACTOS_STR_ORIGINAL_COPYRIGHT "1998 Mark Russinovich\0"
+#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Disk Checking Utility"
+#define REACTOS_STR_INTERNAL_NAME "chkdsk"
+#define REACTOS_STR_ORIGINAL_FILENAME "chkdsk.exe"
+#define REACTOS_STR_ORIGINAL_COPYRIGHT "1998 Mark Russinovich"
#include <reactos/version.rc>