205 lines
4.3 KiB
C++
205 lines
4.3 KiB
C++
|
/*++
|
||
|
|
||
|
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 <nt.h>
|
||
|
#include <ntrtl.h>
|
||
|
#include <nturtl.h>
|
||
|
#include <stdio.h>
|
||
|
#include <windows.h>
|
||
|
#include <winasr.h>
|
||
|
#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;
|
||
|
}
|