/*++ Copyright (c) 1999 Microsoft Corporation Module Name: asrsfgen.cpp Abstract: Utility program to generate an ASR state-file (asr.sif) Author: Guhan Suriyanarayanan (guhans) 10-Jul-2000 Environment: User-mode only. Revision History: 10-Jul-2000 guhans Initial creation --*/ #include #include #include #include #include #include #include "critdrv.h" #include "log.h" BOOL pAcquirePrivilege( IN CONST PCWSTR szPrivilegeName ) { HANDLE hToken = NULL; BOOL bResult = FALSE; LUID luid; TOKEN_PRIVILEGES tNewState; bResult = OpenProcessToken(GetCurrentProcess(), MAXIMUM_ALLOWED, &hToken ); if (!bResult) { return FALSE; } bResult = LookupPrivilegeValue(NULL, szPrivilegeName, &luid); if (!bResult) { CloseHandle(hToken); return FALSE; } tNewState.PrivilegeCount = 1; tNewState.Privileges[0].Luid = luid; tNewState.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // // We will always call GetLastError below, so clear // any prior error values on this thread. // SetLastError(ERROR_SUCCESS); bResult = AdjustTokenPrivileges( hToken, // Token Handle FALSE, // DisableAllPrivileges &tNewState, // NewState (DWORD) 0, // BufferLength NULL, // PreviousState NULL // ReturnLength ); // // Supposedly, AdjustTokenPriveleges always returns TRUE // (even when it fails). So, call GetLastError to be // extra sure everything's cool. // if (ERROR_SUCCESS != GetLastError()) { bResult = FALSE; } if (!bResult) { AsrpPrintDbgMsg(s_Warning, "AdjustTokenPrivileges for %ws failed (%lu)", szPrivilegeName, GetLastError() ); } CloseHandle(hToken); return bResult; } int __cdecl wmain( int argc, WCHAR *argv[], WCHAR *envp[] ) /*++ Routine Description: Entry point to asrsfgen.exe. Generates an asr.sif file using the ASR API. Takes an optional command-line parameter to specify the location where the asr.sif is to be generated. The default location is %systemroot%\repair\asr.sif. Arguments: argc - Number of command-line parameters used to invoke the app argv - The command-line parameters as an array of strings envp - The process environment block, not currently used Return Values: If the function succeeds, the exit code is zero. If the function fails, the exit code is a win-32 error code. --*/ { DWORD_PTR asrContext = 0; LPWSTR szCriticalVolumes = NULL; BOOL bResult = FALSE; int iReturn = 0; AsrpInitialiseLogFiles(); AsrpPrintDbgMsg(s_Info, "Creating ASR state file at %ws", (argc > 1 ? argv[1] : L"default location (%systemroot%\\repair\\asr.sif)") ); // // We need to acquire the backup privileges to create asr.sif // if (!pAcquirePrivilege(SE_BACKUP_NAME)) { AsrpPrintDbgMsg(s_Error, "Could not get backup privilege (%lu)", GetLastError()); return ERROR_PRIVILEGE_NOT_HELD; } // // Get the critical volume list // szCriticalVolumes = pFindCriticalVolumes(); if (!szCriticalVolumes) { AsrpPrintDbgMsg(s_Warning, "Critical Volume List is NULL"); } // // Create the state file // bResult = AsrCreateStateFile( (argc > 1 ? argv[1] : NULL), // sif path L"ASR Sif Generation Test Application v 0.1", // Provider name TRUE, // auto-extend szCriticalVolumes, // list of critical volumes &asrContext ); if (!bResult) { AsrpPrintDbgMsg(s_Error, "Could not create state file (%lu == 0x%x)", GetLastError(), GetLastError()); iReturn = 1; } else { AsrpPrintDbgMsg(s_Info, "ASR state file successfully created"); } // // We're done with these, clean them up // if (szCriticalVolumes) { delete szCriticalVolumes; szCriticalVolumes = NULL; } AsrFreeContext(&asrContext); AsrpCloseLogFiles(); return iReturn; }