#include #include #include #include "regprep.h" int ProgramStatus = 0; BOOL EnableRestorePrivilege( VOID ); VOID PerformRegMods ( HANDLE HiveHandle ); int __cdecl main( int argc, char *argv[] ) { PCHAR hivePath; HANDLE hiveHandle; BOOL result; if (argc != 2) { printf("Usage: regprep \n"); exit(-1); } result = EnableRestorePrivilege(); if (result == FALSE) { printf("Could not enable restore privileges\n"); exit(-1); } hivePath = argv[1]; hiveHandle = OpenHive(hivePath); RASSERT(hiveHandle != NULL,"Could not load %s",hivePath); PerformRegMods(hiveHandle); CloseHive(hiveHandle); return ProgramStatus; } VOID PerformRegMods ( HANDLE HiveHandle ) { HKEY subKey; ULONG index; UCHAR driveLetter; UCHAR buffer[MAX_PATH]; LONG result; PUCHAR pch; printf("Processing registry\n"); // // Remove the volume names for hard drives from the "MountedDevices" // hive, i.e. // // \DosDevices\C: // \DosDevices\D: // ... // pch = "MountedDevices"; result = RegOpenKey(HiveHandle,pch,&subKey); RASSERT(result == ERROR_SUCCESS,"Could not open %s\n",pch); for (driveLetter = 'C'; driveLetter <= 'Z'; driveLetter++) { sprintf(buffer,"\\DosDevices\\%c:", driveLetter); result = RegDeleteValue(subKey,buffer); } RegCloseKey(subKey); // // Add // // CurrentControlSet\Control\Session Manager\KnownDLLs\DllDirectory32 // index = 1; while (TRUE) { sprintf(buffer, "ControlSet%03d\\Control\\Session Manager\\KnownDLLs", index); result = RegOpenKey(HiveHandle,buffer,&subKey); if (result != ERROR_SUCCESS) { break; } pch = "%SystemRoot%\\SysWow64"; result = RegSetValueEx(subKey, "DllDirectory32", 0, REG_EXPAND_SZ, pch, strlen(pch)+1); RASSERT(result == ERROR_SUCCESS,"Could not set value %s",pch); RegCloseKey(subKey); index += 1; } printf("Finished.\n"); } BOOL EnableRestorePrivilege( VOID ) { BOOL result; HANDLE hToken; TOKEN_PRIVILEGES NewPrivileges; LUID Luid; // // Open our process' security token. // result = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken); if (result == FALSE) { return result; } // // Convert privi name to an LUID. // result = LookupPrivilegeValue(NULL, "SeRestorePrivilege", &Luid); if (result == FALSE) { CloseHandle(hToken); return FALSE; } // // Construct new data struct to enable / disable the privi. // NewPrivileges.PrivilegeCount = 1; NewPrivileges.Privileges[0].Luid = Luid; NewPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // // Adjust the privileges. // result = AdjustTokenPrivileges(hToken, FALSE, &NewPrivileges, 0, NULL, NULL); CloseHandle(hToken); return result; }