422 lines
8.8 KiB
C
422 lines
8.8 KiB
C
|
#ifndef _VREGISTRY_H_
|
||
|
#define _VREGISTRY_H_
|
||
|
|
||
|
#include "StrSafe.h"
|
||
|
#include "precomp.h"
|
||
|
|
||
|
#define SUCCESS(x) ((x) == ERROR_SUCCESS)
|
||
|
#define FAILURE(x) (!SUCCESS(x))
|
||
|
#define szOutOfMemory "ERROR OUT OF MEMORY"
|
||
|
|
||
|
struct VIRTUALKEY;
|
||
|
struct VIRTUALVAL;
|
||
|
struct ENUMENTRY;
|
||
|
struct OPENKEY;
|
||
|
|
||
|
//
|
||
|
// Callback for QueryValue
|
||
|
//
|
||
|
|
||
|
typedef LONG (WINAPI *_pfn_QueryValue)(
|
||
|
OPENKEY *key,
|
||
|
VIRTUALKEY *vkey,
|
||
|
VIRTUALVAL *vvalue);
|
||
|
|
||
|
//
|
||
|
// Callback for SetValue
|
||
|
//
|
||
|
typedef LONG (WINAPI *_pfn_SetValue)(
|
||
|
OPENKEY *key,
|
||
|
VIRTUALKEY *vkey,
|
||
|
VIRTUALVAL *vvalue,
|
||
|
DWORD dwType,
|
||
|
const BYTE* pbData,
|
||
|
DWORD cbData);
|
||
|
|
||
|
//
|
||
|
// Callback for OpenKey, called before virtual keys are searched.
|
||
|
//
|
||
|
typedef LONG (WINAPI *_pfn_OpenKeyTrigger)(WCHAR* wszKey);
|
||
|
|
||
|
//
|
||
|
// A generic prototype for RegEnumValue and RegEnumKeyEx.
|
||
|
// This is used to simplify the enumeration code.
|
||
|
// When using this function pointer, the last four parameters
|
||
|
// must be NULL.
|
||
|
//
|
||
|
typedef LONG (WINAPI *_pfn_EnumFunction)(HKEY hKey, DWORD dwIndex, LPWSTR lpName,
|
||
|
LPDWORD lpcName, void*, void*, void*, void*);
|
||
|
//
|
||
|
// Redirector: maps a key from one location to another
|
||
|
//
|
||
|
|
||
|
struct REDIRECTOR
|
||
|
{
|
||
|
REDIRECTOR *next;
|
||
|
|
||
|
LPWSTR wzPath;
|
||
|
LPWSTR wzPathNew;
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// Protector: Prevents the key in the path from being deleted or modified.
|
||
|
//
|
||
|
|
||
|
struct PROTECTOR
|
||
|
{
|
||
|
PROTECTOR *next;
|
||
|
|
||
|
LPWSTR wzPath;
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// Open registry key as opened with RegCreateKey/Ex or RegOpenKey/Ex
|
||
|
//
|
||
|
|
||
|
struct OPENKEY
|
||
|
{
|
||
|
OPENKEY *next;
|
||
|
|
||
|
HKEY hkOpen;
|
||
|
BOOL bVirtual;
|
||
|
BOOL bRedirected;
|
||
|
VIRTUALKEY *vkey;
|
||
|
LPWSTR wzPath;
|
||
|
|
||
|
ENUMENTRY* enumKeys;
|
||
|
ENUMENTRY* enumValues;
|
||
|
|
||
|
template<class T>
|
||
|
ENUMENTRY* AddEnumEntries(T* entryHead, _pfn_EnumFunction enumFunc);
|
||
|
|
||
|
VOID BuildEnumList();
|
||
|
VOID FlushEnumList();
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// Virtual value: holds virtual registry value, owned by VIRTUALKEY
|
||
|
//
|
||
|
|
||
|
struct VIRTUALVAL
|
||
|
{
|
||
|
VIRTUALVAL *next;
|
||
|
|
||
|
WCHAR wName[MAX_PATH];
|
||
|
DWORD dwType;
|
||
|
BYTE *lpData;
|
||
|
DWORD cbData;
|
||
|
_pfn_QueryValue pfnQueryValue;
|
||
|
_pfn_SetValue pfnSetValue;
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// Virtual key: holds virtual key and values, owned by other virtualkeys
|
||
|
//
|
||
|
|
||
|
struct VIRTUALKEY
|
||
|
{
|
||
|
VIRTUALKEY *next;
|
||
|
VIRTUALKEY *keys;
|
||
|
VIRTUALVAL *values;
|
||
|
|
||
|
WCHAR wName[MAX_PATH];
|
||
|
|
||
|
VIRTUALKEY *AddKey(
|
||
|
LPCWSTR lpPath
|
||
|
);
|
||
|
|
||
|
VIRTUALVAL *AddValue(
|
||
|
LPCWSTR lpValueName,
|
||
|
DWORD dwType,
|
||
|
BYTE *lpData,
|
||
|
DWORD cbData = 0
|
||
|
);
|
||
|
|
||
|
VIRTUALVAL *AddValueDWORD(
|
||
|
LPCWSTR lpValueName,
|
||
|
DWORD dwValue
|
||
|
);
|
||
|
|
||
|
VIRTUALVAL *AddExpander(LPCWSTR lpValueName);
|
||
|
VIRTUALVAL *AddProtector(LPCWSTR lpValueName);
|
||
|
|
||
|
VIRTUALVAL *AddCustom(
|
||
|
LPCWSTR lpValueName,
|
||
|
_pfn_QueryValue pfnQueryValue
|
||
|
);
|
||
|
|
||
|
VIRTUALVAL *AddCustomSet(
|
||
|
LPCWSTR lpValueName,
|
||
|
_pfn_SetValue pfnSetValue
|
||
|
);
|
||
|
|
||
|
VIRTUALKEY *FindKey(LPCWSTR lpKeyName);
|
||
|
|
||
|
VIRTUALVAL *FindValue(
|
||
|
LPCWSTR lpValueName
|
||
|
);
|
||
|
|
||
|
VOID Free();
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// Enum entry: An entry in a list of all enumerated items belonging to a key.
|
||
|
//
|
||
|
struct ENUMENTRY
|
||
|
{
|
||
|
ENUMENTRY* next;
|
||
|
|
||
|
LPWSTR wzName;
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// Open Key Trigger: Describes a function to be called when a key is opened.
|
||
|
//
|
||
|
struct OPENKEYTRIGGER
|
||
|
{
|
||
|
OPENKEYTRIGGER* next;
|
||
|
|
||
|
LPWSTR wzPath;
|
||
|
|
||
|
_pfn_OpenKeyTrigger pfnTrigger;
|
||
|
};
|
||
|
|
||
|
// Class to wrap the virtual registry functionality
|
||
|
class CVirtualRegistry
|
||
|
{
|
||
|
private:
|
||
|
OPENKEY *OpenKeys;
|
||
|
VIRTUALKEY *Root;
|
||
|
REDIRECTOR *Redirectors;
|
||
|
PROTECTOR *KeyProtectors;
|
||
|
OPENKEYTRIGGER *OpenKeyTriggers;
|
||
|
|
||
|
HKEY CreateDummyKey();
|
||
|
|
||
|
OPENKEY *FindOpenKey(HKEY hKey);
|
||
|
|
||
|
BOOL CheckRedirect(
|
||
|
LPWSTR *lpPath
|
||
|
);
|
||
|
|
||
|
BOOL CheckProtected(
|
||
|
LPWSTR lpPath
|
||
|
);
|
||
|
|
||
|
VOID CheckTriggers(
|
||
|
LPWSTR lpPath
|
||
|
);
|
||
|
|
||
|
VOID FlushEnumLists();
|
||
|
|
||
|
public:
|
||
|
BOOL Init();
|
||
|
VOID Free();
|
||
|
|
||
|
REDIRECTOR *AddRedirect(
|
||
|
LPCWSTR lpPath,
|
||
|
LPCWSTR lpPathNew);
|
||
|
|
||
|
PROTECTOR *AddKeyProtector(
|
||
|
LPCWSTR lpPath);
|
||
|
|
||
|
OPENKEYTRIGGER* AddOpenKeyTrigger(
|
||
|
LPCWSTR lpPath,
|
||
|
_pfn_OpenKeyTrigger pfnOpenKey);
|
||
|
|
||
|
VIRTUALKEY *AddKey(LPCWSTR lpPath);
|
||
|
|
||
|
LONG OpenKeyA(
|
||
|
HKEY hKey,
|
||
|
LPCSTR lpSubKey,
|
||
|
LPSTR lpClass,
|
||
|
DWORD dwOptions,
|
||
|
REGSAM samDesired,
|
||
|
LPSECURITY_ATTRIBUTES pSecurityAttributes,
|
||
|
HKEY *phkResult,
|
||
|
LPDWORD lpdwDisposition,
|
||
|
BOOL bCreate
|
||
|
);
|
||
|
|
||
|
LONG OpenKeyW(
|
||
|
HKEY hKey,
|
||
|
LPCWSTR lpSubKey,
|
||
|
LPWSTR lpClass,
|
||
|
DWORD dwOptions,
|
||
|
REGSAM samDesired,
|
||
|
LPSECURITY_ATTRIBUTES pSecurityAttributes,
|
||
|
HKEY *phkResult,
|
||
|
LPDWORD lpdwDisposition,
|
||
|
BOOL bCreate,
|
||
|
BOOL bRemote = FALSE,
|
||
|
LPCWSTR lpMachineName = NULL
|
||
|
);
|
||
|
|
||
|
LONG QueryValueA(
|
||
|
HKEY hKey,
|
||
|
LPSTR lpValueName,
|
||
|
LPDWORD lpType,
|
||
|
LPBYTE lpData,
|
||
|
LPDWORD lpcbData
|
||
|
);
|
||
|
|
||
|
LONG QueryValueW(
|
||
|
HKEY hKey,
|
||
|
LPWSTR lpValueName,
|
||
|
LPDWORD lpType,
|
||
|
LPBYTE lpData,
|
||
|
LPDWORD lpcbData
|
||
|
);
|
||
|
|
||
|
LONG EnumKeyA(
|
||
|
HKEY hKey,
|
||
|
DWORD dwIndex,
|
||
|
LPSTR lpName,
|
||
|
LPDWORD lpcbName
|
||
|
);
|
||
|
|
||
|
LONG EnumKeyW(
|
||
|
HKEY hKey,
|
||
|
DWORD dwIndex,
|
||
|
LPWSTR lpName,
|
||
|
LPDWORD lpcbName
|
||
|
);
|
||
|
|
||
|
LONG EnumValueA(
|
||
|
HKEY hKey,
|
||
|
DWORD dwIndex,
|
||
|
LPSTR lpValueName,
|
||
|
LPDWORD lpcbValueName,
|
||
|
LPDWORD lpType,
|
||
|
LPBYTE lpData,
|
||
|
LPDWORD lpcbData
|
||
|
);
|
||
|
|
||
|
LONG EnumValueW(
|
||
|
HKEY hKey,
|
||
|
DWORD dwIndex,
|
||
|
LPWSTR lpValueName,
|
||
|
LPDWORD lpcbValueName,
|
||
|
LPDWORD lpType,
|
||
|
LPBYTE lpData,
|
||
|
LPDWORD lpcbData
|
||
|
);
|
||
|
|
||
|
LONG QueryInfoA(
|
||
|
HKEY hKey,
|
||
|
LPSTR lpClass,
|
||
|
LPDWORD lpcbClass,
|
||
|
LPDWORD lpReserved,
|
||
|
LPDWORD lpcSubKeys,
|
||
|
LPDWORD lpcbMaxSubKeyLen,
|
||
|
LPDWORD lpcbMaxClassLen,
|
||
|
LPDWORD lpcValues,
|
||
|
LPDWORD lpcbMaxValueNameLen,
|
||
|
LPDWORD lpcbMaxValueLen,
|
||
|
LPDWORD lpcbSecurityDescriptor,
|
||
|
PFILETIME lpftLastWriteTime
|
||
|
);
|
||
|
|
||
|
LONG QueryInfoW(
|
||
|
HKEY hKey,
|
||
|
LPWSTR lpClass,
|
||
|
LPDWORD lpcbClass,
|
||
|
LPDWORD lpReserved,
|
||
|
LPDWORD lpcSubKeys,
|
||
|
LPDWORD lpcbMaxSubKeyLen,
|
||
|
LPDWORD lpcbMaxClassLen,
|
||
|
LPDWORD lpcValues,
|
||
|
LPDWORD lpcbMaxValueNameLen,
|
||
|
LPDWORD lpcbMaxValueLen,
|
||
|
LPDWORD lpcbSecurityDescriptor,
|
||
|
PFILETIME lpftLastWriteTime
|
||
|
);
|
||
|
|
||
|
LONG SetValueA(
|
||
|
HKEY hKey,
|
||
|
LPCSTR lpValueName,
|
||
|
DWORD dwType,
|
||
|
CONST BYTE* lpData,
|
||
|
DWORD cbData
|
||
|
);
|
||
|
|
||
|
LONG SetValueW(
|
||
|
HKEY hKey,
|
||
|
LPCWSTR lpValueName,
|
||
|
DWORD dwType,
|
||
|
CONST BYTE* lpData,
|
||
|
DWORD cbData
|
||
|
);
|
||
|
|
||
|
LONG DeleteKeyA(
|
||
|
HKEY hKey,
|
||
|
LPCSTR lpSubKey
|
||
|
);
|
||
|
|
||
|
LONG DeleteKeyW(
|
||
|
HKEY hKey,
|
||
|
LPCWSTR lpSubKey
|
||
|
);
|
||
|
|
||
|
LONG CloseKey(HKEY hKey);
|
||
|
};
|
||
|
|
||
|
APIHOOK_ENUM_BEGIN
|
||
|
|
||
|
APIHOOK_ENUM_ENTRY(RegConnectRegistryA)
|
||
|
APIHOOK_ENUM_ENTRY(RegConnectRegistryW)
|
||
|
APIHOOK_ENUM_ENTRY(RegOpenKeyExA)
|
||
|
APIHOOK_ENUM_ENTRY(RegOpenKeyExW)
|
||
|
APIHOOK_ENUM_ENTRY(RegQueryValueExA)
|
||
|
APIHOOK_ENUM_ENTRY(RegQueryValueExW)
|
||
|
APIHOOK_ENUM_ENTRY(RegCloseKey)
|
||
|
APIHOOK_ENUM_ENTRY(RegOpenKeyA)
|
||
|
APIHOOK_ENUM_ENTRY(RegOpenKeyW)
|
||
|
APIHOOK_ENUM_ENTRY(RegQueryValueA)
|
||
|
APIHOOK_ENUM_ENTRY(RegQueryValueW)
|
||
|
APIHOOK_ENUM_ENTRY(RegCreateKeyA)
|
||
|
APIHOOK_ENUM_ENTRY(RegCreateKeyW)
|
||
|
APIHOOK_ENUM_ENTRY(RegCreateKeyExA)
|
||
|
APIHOOK_ENUM_ENTRY(RegCreateKeyExW)
|
||
|
APIHOOK_ENUM_ENTRY(RegEnumValueA)
|
||
|
APIHOOK_ENUM_ENTRY(RegEnumValueW)
|
||
|
APIHOOK_ENUM_ENTRY(RegEnumKeyA)
|
||
|
APIHOOK_ENUM_ENTRY(RegEnumKeyW)
|
||
|
APIHOOK_ENUM_ENTRY(RegEnumKeyExA)
|
||
|
APIHOOK_ENUM_ENTRY(RegEnumKeyExW)
|
||
|
APIHOOK_ENUM_ENTRY(RegQueryInfoKeyA)
|
||
|
APIHOOK_ENUM_ENTRY(RegQueryInfoKeyW)
|
||
|
APIHOOK_ENUM_ENTRY(RegSetValueExA)
|
||
|
APIHOOK_ENUM_ENTRY(RegSetValueExW)
|
||
|
APIHOOK_ENUM_ENTRY(RegDeleteKeyA)
|
||
|
APIHOOK_ENUM_ENTRY(RegDeleteKeyW)
|
||
|
|
||
|
APIHOOK_ENUM_END
|
||
|
|
||
|
extern CVirtualRegistry VRegistry;
|
||
|
extern LPWSTR MakePath(HKEY hkBase, LPCWSTR lpKey, LPCWSTR lpSubKey);
|
||
|
extern LPWSTR SplitPath(LPCWSTR lpPath, HKEY *hkBase);
|
||
|
|
||
|
// Type for the functions that build the keys
|
||
|
typedef VOID (*_pfn_Builder)(char* szParam);
|
||
|
|
||
|
enum PURPOSE {eWin9x, eWinNT, eWin2K, eWinXP, eCustom};
|
||
|
|
||
|
// Entry in the table of custom registry settings
|
||
|
struct VENTRY
|
||
|
{
|
||
|
WCHAR cName[64];
|
||
|
_pfn_Builder pfnBuilder;
|
||
|
PURPOSE ePurpose;
|
||
|
|
||
|
// Indicates if this entry should be called as part of VRegistry initialization
|
||
|
BOOL bShouldCall;
|
||
|
|
||
|
// Parameter
|
||
|
char* szParam;
|
||
|
};
|
||
|
|
||
|
extern VENTRY *g_pVList;
|
||
|
|
||
|
#endif //_VREGISTRY_H_
|