Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS FS utility tool * FILE: base/applications/cmdutils/common.c * PURPOSE: FSutil common functions * PROGRAMMERS: Pierre Schweitzer <pierre@reactos.org> */
#include "fsutil.h"
int FindHandler(int argc, const TCHAR *argv[], HandlerItem * HandlersList, int HandlerListCount, void (*UsageHelper)(const TCHAR *)){ int i; int ret; const TCHAR * Command;
ret = 1; Command = NULL; i = HandlerListCount;
/* If we have a command, does it match a known one? */ if (argc > 1) { /* Browse all the known commands finding the right one */ Command = argv[1]; for (i = 0; i < HandlerListCount; ++i) { if (_tcsicmp(Command, HandlersList[i].Command) == 0) { ret = HandlersList[i].Handler(argc - 1, &argv[1]); break; } } }
/* We failed finding someone to handle the caller's needs, print out */ if (i == HandlerListCount) { UsageHelper(Command); }
return ret;}
HANDLE OpenVolume(const TCHAR * Volume, BOOLEAN AllowRemote, BOOLEAN NtfsOnly){ UINT Type; HANDLE hVolume; TCHAR VolumeID[PATH_MAX];
/* Get volume type */ if (!AllowRemote && Volume[1] == L':') { Type = GetDriveType(Volume); if (Type == DRIVE_REMOTE) { _ftprintf(stderr, _T("FSUTIL needs a local device\n")); return INVALID_HANDLE_VALUE; } }
/* Get filesystem type */ if (NtfsOnly) { TCHAR FileSystem[MAX_PATH + 1];
_stprintf(VolumeID, _T("\\\\.\\%s\\"), Volume); if (!GetVolumeInformation(VolumeID, NULL, 0, NULL, NULL, NULL, FileSystem, MAX_PATH + 1)) { PrintErrorMessage(GetLastError()); return INVALID_HANDLE_VALUE; }
if (_tcscmp(FileSystem, _T("NTFS")) != 0) { _ftprintf(stderr, _T("FSUTIL needs a NTFS device\n")); return INVALID_HANDLE_VALUE; } }
/* Create full name */ _stprintf(VolumeID, _T("\\\\.\\%s"), Volume);
/* Open the volume */ hVolume = CreateFile(VolumeID, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hVolume == INVALID_HANDLE_VALUE) { PrintErrorMessage(GetLastError()); return INVALID_HANDLE_VALUE; }
return hVolume;}
void PrintDefaultUsage(const TCHAR * Command, const TCHAR * SubCommand, HandlerItem * HandlersList, int HandlerListCount){ int i;
/* If we were given a command, print it's not supported */ if (SubCommand != NULL) { _ftprintf(stderr, _T("Unhandled%scommand: %s\n"), Command, SubCommand); }
/* And dump any available command */ _ftprintf(stderr, _T("---- Handled%scommands ----\n\n"), Command); for (i = 0; i < HandlerListCount; ++i) { _ftprintf(stderr, _T("%s\t%s\n"), HandlersList[i].Command, HandlersList[i].Desc); }}
int PrintErrorMessage(DWORD Error){ TCHAR * String;
/* Try to get textual error */ if (FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, Error, 0, (TCHAR *)&String, 0, NULL) != 0) { /* And print it */ _ftprintf(stderr, _T("Error: %s\n"), String); LocalFree(String); } else { /* Otherwise, just print the error number */ _ftprintf(stderr, _T("Error: %d\n"), Error); }
return Error;}