144 lines
3.6 KiB
C
144 lines
3.6 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1998 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
regsav.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module contains routine for compacting the hive file
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Dragos C. Sambotin (dragoss) 30-Dec-1998
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
#include "chkreg.h"
|
||
|
|
||
|
#define TEMP_KEY_NAME TEXT("chkreg___$$Temp$Hive$$___")
|
||
|
|
||
|
extern TCHAR *Hive;
|
||
|
|
||
|
// to store the name of the compacted hive
|
||
|
TCHAR CompactedHive[MAX_PATH];
|
||
|
|
||
|
VOID
|
||
|
DoCompactHive()
|
||
|
/*
|
||
|
Routine Description:
|
||
|
|
||
|
Compacts a hive. It uses the LoadKey/SaveKey/UnloadKey sequence.
|
||
|
The hive is temporary loaded under the key HKLM\TEMP_KEY_NAME.
|
||
|
After compacting, the hive is unloaded (cleaning process).
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
NONE.
|
||
|
|
||
|
*/
|
||
|
{
|
||
|
NTSTATUS Status;
|
||
|
BOOLEAN OldPrivState;
|
||
|
LONG Err;
|
||
|
HKEY hkey;
|
||
|
|
||
|
// construct the file name for the compacted hive
|
||
|
if(!lstrcpy(CompactedHive,Hive) ) {
|
||
|
fprintf(stderr,"Unable to generate new Hive file name\n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if(!lstrcat(CompactedHive,TEXT(".BAK")) ) {
|
||
|
fprintf(stderr,"Unable to generate new Hive file name\n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Attempt to get restore privilege
|
||
|
Status = RtlAdjustPrivilege(SE_RESTORE_PRIVILEGE,
|
||
|
TRUE,
|
||
|
FALSE,
|
||
|
&OldPrivState);
|
||
|
if (!NT_SUCCESS(Status)) {
|
||
|
printf("Could not adjust privilege; status = 0x%lx\n",Status);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Load the hive into registry
|
||
|
Err = RegLoadKey(HKEY_LOCAL_MACHINE,TEMP_KEY_NAME,Hive);
|
||
|
|
||
|
if( Err != ERROR_SUCCESS ) {
|
||
|
fprintf(stderr,"Failed to load the Hive; error 0x%lx \n",Err);
|
||
|
} else {
|
||
|
Err = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
|
||
|
TEMP_KEY_NAME,
|
||
|
REG_OPTION_RESERVED,
|
||
|
KEY_READ,
|
||
|
&hkey);
|
||
|
|
||
|
if (Err == ERROR_SUCCESS) {
|
||
|
|
||
|
// Restore old privilege if necessary.
|
||
|
|
||
|
if (!OldPrivState) {
|
||
|
|
||
|
RtlAdjustPrivilege(SE_RESTORE_PRIVILEGE,
|
||
|
FALSE,
|
||
|
FALSE,
|
||
|
&OldPrivState);
|
||
|
}
|
||
|
|
||
|
|
||
|
RtlAdjustPrivilege(SE_BACKUP_PRIVILEGE,
|
||
|
TRUE,
|
||
|
FALSE,
|
||
|
&OldPrivState);
|
||
|
|
||
|
// Save the key into the new file name.
|
||
|
// The CmpCopyTree function will take care of compacting also.
|
||
|
Err = RegSaveKey(hkey,CompactedHive,NULL);
|
||
|
if( Err != ERROR_SUCCESS ) {
|
||
|
fprintf(stderr,"Failed to Save the Hive; error 0x%lx \n",Err);
|
||
|
}
|
||
|
|
||
|
if (!OldPrivState) {
|
||
|
|
||
|
RtlAdjustPrivilege(SE_BACKUP_PRIVILEGE,
|
||
|
FALSE,
|
||
|
FALSE,
|
||
|
&OldPrivState);
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hkey);
|
||
|
|
||
|
}
|
||
|
|
||
|
RtlAdjustPrivilege(SE_RESTORE_PRIVILEGE,
|
||
|
TRUE,
|
||
|
FALSE,
|
||
|
&OldPrivState);
|
||
|
|
||
|
// cleanup the registry machine hive.
|
||
|
Err = RegUnLoadKey(HKEY_LOCAL_MACHINE,TEMP_KEY_NAME);
|
||
|
if( Err != ERROR_SUCCESS ) {
|
||
|
fprintf(stderr,"Failed to unload the Hive; error 0x%lx \n",Err);
|
||
|
}
|
||
|
if (!OldPrivState) {
|
||
|
|
||
|
RtlAdjustPrivilege(SE_RESTORE_PRIVILEGE,
|
||
|
FALSE,
|
||
|
FALSE,
|
||
|
&OldPrivState);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|