Initial commit, hook into StarWarsI.exe
This commit is contained in:
100
proxy.cpp
Normal file
100
proxy.cpp
Normal file
@@ -0,0 +1,100 @@
|
||||
#include "proxy.h"
|
||||
|
||||
HMODULE g_hRealPowrprof = nullptr;
|
||||
|
||||
// NTSTATUS = LONG, POWER_INFORMATION_LEVEL = int; using primitive types
|
||||
// avoids pulling in powerbase.h / ntstatus.h for a simple passthrough.
|
||||
typedef LONG (WINAPI* fn_CallNtPowerInformation)(int, PVOID, ULONG, PVOID, ULONG);
|
||||
typedef DWORD (WINAPI* fn_PowerReadACValueIndex)(HKEY, const GUID*, const GUID*, const GUID*, LPDWORD);
|
||||
typedef DWORD (WINAPI* fn_PowerGetActiveScheme)(HKEY, GUID**);
|
||||
typedef DWORD (WINAPI* fn_PowerSettingRegisterNotification)(LPCGUID, DWORD, HANDLE, HANDLE*);
|
||||
typedef DWORD (WINAPI* fn_PowerSettingUnregisterNotification)(HANDLE);
|
||||
|
||||
static fn_CallNtPowerInformation real_CallNtPowerInformation = nullptr;
|
||||
static fn_PowerReadACValueIndex real_PowerReadACValueIndex = nullptr;
|
||||
static fn_PowerReadACValueIndex real_PowerReadDCValueIndex = nullptr;
|
||||
static fn_PowerGetActiveScheme real_PowerGetActiveScheme = nullptr;
|
||||
static fn_PowerSettingRegisterNotification real_PowerSettingRegisterNotification = nullptr;
|
||||
static fn_PowerSettingUnregisterNotification real_PowerSettingUnregisterNotification = nullptr;
|
||||
|
||||
bool Proxy_Init() {
|
||||
char path[MAX_PATH];
|
||||
|
||||
GetSystemDirectoryA(path, MAX_PATH);
|
||||
lstrcatA(path, "\\powrprof.dll");
|
||||
g_hRealPowrprof = LoadLibraryA(path);
|
||||
|
||||
if (!g_hRealPowrprof) {
|
||||
return false;
|
||||
}
|
||||
|
||||
real_CallNtPowerInformation = (fn_CallNtPowerInformation)
|
||||
GetProcAddress(g_hRealPowrprof, "CallNtPowerInformation");
|
||||
real_PowerReadACValueIndex = (fn_PowerReadACValueIndex)
|
||||
GetProcAddress(g_hRealPowrprof, "PowerReadACValueIndex");
|
||||
real_PowerReadDCValueIndex = (fn_PowerReadACValueIndex)
|
||||
GetProcAddress(g_hRealPowrprof, "PowerReadDCValueIndex");
|
||||
real_PowerGetActiveScheme = (fn_PowerGetActiveScheme)
|
||||
GetProcAddress(g_hRealPowrprof, "PowerGetActiveScheme");
|
||||
real_PowerSettingRegisterNotification = (fn_PowerSettingRegisterNotification)
|
||||
GetProcAddress(g_hRealPowrprof, "PowerSettingRegisterNotification");
|
||||
real_PowerSettingUnregisterNotification = (fn_PowerSettingUnregisterNotification)
|
||||
GetProcAddress(g_hRealPowrprof, "PowerSettingUnregisterNotification");
|
||||
|
||||
return real_CallNtPowerInformation != nullptr;
|
||||
}
|
||||
|
||||
void Proxy_Shutdown() {
|
||||
if (g_hRealPowrprof) {
|
||||
FreeLibrary(g_hRealPowrprof);
|
||||
g_hRealPowrprof = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
__declspec(dllexport) LONG WINAPI CallNtPowerInformation(
|
||||
int level, PVOID inBuf, ULONG inSize, PVOID outBuf, ULONG outSize)
|
||||
{
|
||||
return real_CallNtPowerInformation(level, inBuf, inSize, outBuf, outSize);
|
||||
}
|
||||
|
||||
__declspec(dllexport) DWORD WINAPI PowerReadACValueIndex(
|
||||
HKEY rootKey, const GUID* scheme, const GUID* subgroup, const GUID* setting, LPDWORD index)
|
||||
{
|
||||
if (real_PowerReadACValueIndex)
|
||||
return real_PowerReadACValueIndex(rootKey, scheme, subgroup, setting, index);
|
||||
return ERROR_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
__declspec(dllexport) DWORD WINAPI PowerReadDCValueIndex(
|
||||
HKEY rootKey, const GUID* scheme, const GUID* subgroup, const GUID* setting, LPDWORD index)
|
||||
{
|
||||
if (real_PowerReadDCValueIndex)
|
||||
return real_PowerReadDCValueIndex(rootKey, scheme, subgroup, setting, index);
|
||||
return ERROR_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
__declspec(dllexport) DWORD WINAPI PowerGetActiveScheme(
|
||||
HKEY userRootPowerKey, GUID** activePolicyGuid)
|
||||
{
|
||||
if (real_PowerGetActiveScheme)
|
||||
return real_PowerGetActiveScheme(userRootPowerKey, activePolicyGuid);
|
||||
return ERROR_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
__declspec(dllexport) DWORD WINAPI PowerSettingRegisterNotification(
|
||||
LPCGUID settingGuid, DWORD flags, HANDLE recipient, HANDLE* registrationHandle)
|
||||
{
|
||||
if (real_PowerSettingRegisterNotification)
|
||||
return real_PowerSettingRegisterNotification(settingGuid, flags, recipient, registrationHandle);
|
||||
return ERROR_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
__declspec(dllexport) DWORD WINAPI PowerSettingUnregisterNotification(
|
||||
HANDLE registrationHandle)
|
||||
{
|
||||
if (real_PowerSettingUnregisterNotification)
|
||||
return real_PowerSettingUnregisterNotification(registrationHandle);
|
||||
return ERROR_NOT_SUPPORTED;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user