255 lines
6.1 KiB
C++
255 lines
6.1 KiB
C++
|
/******************************************************************************
|
||
|
*
|
||
|
* Copyright (c) 2000 Microsoft Corporation
|
||
|
*
|
||
|
* Module Name:
|
||
|
* chglog.cpp
|
||
|
*
|
||
|
* Abstract:
|
||
|
* Tool for enumerating the change log - forward/reverse
|
||
|
*
|
||
|
* Revision History:
|
||
|
* Brijesh Krishnaswami (brijeshk) 04/09/2000
|
||
|
* created
|
||
|
*
|
||
|
*****************************************************************************/
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include <shellapi.h>
|
||
|
#include <snapshot.h>
|
||
|
#include <stdio.h>
|
||
|
|
||
|
// use the _ASSERT and _VERIFY in dbgtrace.h
|
||
|
#ifdef _ASSERT
|
||
|
#undef _ASSERT
|
||
|
#endif
|
||
|
|
||
|
#ifdef _VERIFY
|
||
|
#undef _VERIFY
|
||
|
#endif
|
||
|
|
||
|
#include <dbgtrace.h>
|
||
|
#include <utils.h>
|
||
|
#include <srdefs.h>
|
||
|
|
||
|
CSnapshot g_CSnapshot;
|
||
|
DWORD SetPrivilegeInAccessToken(WCHAR * pszPrivilegeName);
|
||
|
|
||
|
DWORD DeleteAllChangeLogs(WCHAR * pszRestorePointPath)
|
||
|
{
|
||
|
TraceFunctEnter("DeleteAllFilesBySuffix");
|
||
|
|
||
|
DWORD dwErr, dwReturn=ERROR_INTERNAL_ERROR;
|
||
|
WCHAR szFindFileData[MAX_PATH];
|
||
|
|
||
|
// first construct the prefix of the file that stores the HKLM registry
|
||
|
// snapshot.
|
||
|
wsprintf(szFindFileData, L"%s\\%s*", pszRestorePointPath,
|
||
|
s_cszCurrentChangeLog);
|
||
|
|
||
|
dwErr = ProcessGivenFiles(pszRestorePointPath, DeleteGivenFile,
|
||
|
szFindFileData);
|
||
|
|
||
|
if (ERROR_SUCCESS != dwErr)
|
||
|
{
|
||
|
ErrorTrace(0, "Deleting files failed error %ld", dwErr);
|
||
|
dwReturn = dwErr;
|
||
|
goto cleanup;
|
||
|
}
|
||
|
|
||
|
dwReturn = ERROR_SUCCESS;
|
||
|
|
||
|
cleanup:
|
||
|
TraceFunctLeave();
|
||
|
return dwReturn;
|
||
|
}
|
||
|
|
||
|
|
||
|
DWORD SaveRegKey(HKEY hKey, // handle to parent key
|
||
|
WCHAR * pszSubKeyName, // name of subkey to backup
|
||
|
WCHAR * pszFileName, // filename of backup file
|
||
|
WCHAR * pszDirName); // directory to create above file
|
||
|
|
||
|
void __cdecl
|
||
|
main()
|
||
|
{
|
||
|
PWSTR * argv = NULL;
|
||
|
int argc;
|
||
|
WCHAR szSystemHive[MAX_PATH];
|
||
|
DWORD dwReturn;
|
||
|
|
||
|
InitAsyncTrace();
|
||
|
|
||
|
|
||
|
argv = CommandLineToArgvW(GetCommandLine(), &argc);
|
||
|
|
||
|
if (! argv)
|
||
|
{
|
||
|
printf("Error parsing arguments");
|
||
|
goto done;
|
||
|
}
|
||
|
|
||
|
if (argc !=3)
|
||
|
{
|
||
|
printf("Usage: snaputest c|r path");
|
||
|
goto done;
|
||
|
}
|
||
|
|
||
|
if (0==lstrcmp(argv[1],L"c"))
|
||
|
{
|
||
|
_VERIFY(ERROR_SUCCESS==g_CSnapshot.CreateSnapshot(argv[2], NULL,NULL, TRUE));
|
||
|
}
|
||
|
else if (0==lstrcmp(argv[1], L"r" ))
|
||
|
{
|
||
|
dwReturn = g_CSnapshot.InitRestoreSnapshot(argv[2]);
|
||
|
|
||
|
_ASSERT(ERROR_SUCCESS==dwReturn);
|
||
|
|
||
|
dwReturn = g_CSnapshot.GetSystemHivePath(argv[2],
|
||
|
szSystemHive,
|
||
|
MAX_PATH);
|
||
|
_ASSERT(ERROR_SUCCESS==dwReturn);
|
||
|
|
||
|
dwReturn= DoesFileExist(szSystemHive);
|
||
|
|
||
|
_ASSERT(TRUE==dwReturn);
|
||
|
|
||
|
dwReturn=g_CSnapshot.GetSoftwareHivePath(argv[2],
|
||
|
szSystemHive,
|
||
|
MAX_PATH);
|
||
|
|
||
|
_ASSERT(ERROR_SUCCESS==dwReturn);
|
||
|
|
||
|
|
||
|
dwReturn= DoesFileExist(szSystemHive);
|
||
|
_ASSERT(TRUE==dwReturn);
|
||
|
|
||
|
dwReturn = g_CSnapshot.RestoreSnapshot(argv[2]);
|
||
|
|
||
|
_ASSERT(ERROR_SUCCESS==dwReturn);
|
||
|
}
|
||
|
|
||
|
else if (0==lstrcmp(argv[1], L"d" ))
|
||
|
{
|
||
|
_VERIFY(ERROR_SUCCESS==g_CSnapshot.CleanupAfterRestore(argv[2]));
|
||
|
}
|
||
|
else if (0==lstrcmp(argv[1], L"D" ))
|
||
|
{
|
||
|
_VERIFY(ERROR_SUCCESS==g_CSnapshot.DeleteSnapshot(argv[2]));
|
||
|
}
|
||
|
|
||
|
else
|
||
|
{
|
||
|
printf("Usage: snaputest c|r path");
|
||
|
goto done;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
done:
|
||
|
#if 0
|
||
|
SetPrivilegeInAccessToken(SE_BACKUP_NAME);
|
||
|
SetPrivilegeInAccessToken(SE_RESTORE_NAME);
|
||
|
CopyFileTimes(L"d:\\a.dll", L"d:\\c.dll");
|
||
|
|
||
|
|
||
|
WCHAR wcsBuffer[MAX_PATH];
|
||
|
if (GetVolumeNameForVolumeMountPoint (L"c:\\", wcsBuffer, MAX_PATH))
|
||
|
{
|
||
|
lstrcat(wcsBuffer, L"temp1\\temp2\\foo.dll");
|
||
|
CreateBaseDirectory(wcsBuffer);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
TermAsyncTrace();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
DWORD SetPrivilegeInAccessToken(WCHAR * pszPrivilegeName)
|
||
|
{
|
||
|
TraceFunctEnter("CSnapshot::SetPrivilegeInAccessToken");
|
||
|
|
||
|
HANDLE hProcess;
|
||
|
HANDLE hAccessToken=NULL;
|
||
|
LUID luidPrivilegeLUID;
|
||
|
TOKEN_PRIVILEGES tpTokenPrivilege;
|
||
|
DWORD dwReturn = ERROR_INTERNAL_ERROR, dwErr;
|
||
|
|
||
|
|
||
|
|
||
|
hProcess = GetCurrentProcess();
|
||
|
if (!hProcess)
|
||
|
{
|
||
|
dwReturn = GetLastError();
|
||
|
ErrorTrace(0, "GetCurrentProcess failed ec=%d", dwReturn);
|
||
|
goto done;
|
||
|
}
|
||
|
|
||
|
if (!OpenProcessToken(hProcess,
|
||
|
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
|
||
|
&hAccessToken))
|
||
|
{
|
||
|
dwErr=GetLastError();
|
||
|
ErrorTrace(0, "OpenProcessToken failed ec=%d", dwErr);
|
||
|
if (ERROR_SUCCESS != dwErr)
|
||
|
{
|
||
|
dwReturn = dwErr;
|
||
|
}
|
||
|
goto done;
|
||
|
}
|
||
|
|
||
|
if (!LookupPrivilegeValue(NULL,
|
||
|
pszPrivilegeName,
|
||
|
&luidPrivilegeLUID))
|
||
|
{
|
||
|
dwErr=GetLastError();
|
||
|
ErrorTrace(0, "LookupPrivilegeValue failed ec=%d",dwErr);
|
||
|
if (ERROR_SUCCESS != dwErr)
|
||
|
{
|
||
|
dwReturn = dwErr;
|
||
|
}
|
||
|
goto done;
|
||
|
}
|
||
|
|
||
|
tpTokenPrivilege.PrivilegeCount = 1;
|
||
|
tpTokenPrivilege.Privileges[0].Luid = luidPrivilegeLUID;
|
||
|
tpTokenPrivilege.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
|
||
|
|
||
|
if (!AdjustTokenPrivileges(hAccessToken,
|
||
|
FALSE, // Do not disable all
|
||
|
&tpTokenPrivilege,
|
||
|
sizeof(TOKEN_PRIVILEGES),
|
||
|
NULL, // Ignore previous info
|
||
|
NULL)) // Ignore previous info
|
||
|
{
|
||
|
dwErr=GetLastError();
|
||
|
ErrorTrace(0, "AdjustTokenPrivileges");
|
||
|
if (dwErr != NO_ERROR)
|
||
|
{
|
||
|
dwReturn = dwErr;
|
||
|
}
|
||
|
goto done;
|
||
|
}
|
||
|
|
||
|
dwReturn = ERROR_SUCCESS;
|
||
|
|
||
|
done:
|
||
|
if (hAccessToken != NULL)
|
||
|
{
|
||
|
_VERIFY(TRUE==CloseHandle(hAccessToken));
|
||
|
}
|
||
|
|
||
|
TraceFunctLeave();
|
||
|
return dwReturn;
|
||
|
}
|