|
|
/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
Worker.cpp
Abstract:
These are the worker functions for virtual registry. They are called whenever a non-static value is queried.
Notes:
History:
07/18/2000 linstev Created 10/11/2001 mikrause Added protectors.
--*/
#include "precomp.h"
IMPLEMENT_SHIM_BEGIN(VirtualRegistry) #include "ShimHookMacro.h"
#include "VRegistry.h"
#include "VRegistry_Worker.h"
/*++
Expand REG_EXPAND_SZ for this value
--*/
LONG WINAPI VR_Expand( OPENKEY *key, VIRTUALKEY*, VIRTUALVAL *vvalue ) { DWORD dwType; WCHAR wSrc[MAX_PATH]; DWORD dwSize = sizeof(wSrc);
//
// Query the original value
//
LONG lRet = ORIGINAL_API(RegQueryValueExW)( key->hkOpen, vvalue->wName, NULL, &dwType, (LPBYTE)wSrc, &dwSize); //
// Query failed - this should never happen
//
if (FAILURE(lRet)) { DPFN( eDbgLevelError, "Failed to query %S for expansion", vvalue->wName); goto Exit; }
//
// Not a string type!
//
if (!((dwType == REG_EXPAND_SZ) || (dwType == REG_SZ)) && (dwSize > sizeof(wSrc))) { DPFN( eDbgLevelError, "Expander: Not a string type"); lRet = ERROR_BAD_ARGUMENTS; goto Exit; }
//
// Expand the string and store it in the value
//
vvalue->cbData = ExpandEnvironmentStringsW(wSrc, NULL, 0) * 2;
if (vvalue->cbData == 0) { lRet = ERROR_BAD_ARGUMENTS; goto Exit; }
vvalue->lpData = (LPBYTE) malloc(vvalue->cbData); if (!vvalue->lpData) { DPFN( eDbgLevelError, szOutOfMemory); lRet = ERROR_NOT_ENOUGH_MEMORY; goto Exit; }
if (ExpandEnvironmentStringsW(wSrc, (PWSTR)vvalue->lpData, vvalue->cbData / 2) != vvalue->cbData / sizeof(WCHAR)) { lRet = ERROR_NOT_ENOUGH_MEMORY; goto Exit; }
//
// Value is now cached, so we don't need to get called again
//
vvalue->pfnQueryValue = NULL;
lRet = ERROR_SUCCESS;
DPFN( eDbgLevelInfo, "Expanded Value=%S\n", vvalue->lpData);
Exit: return lRet; }
/*++
Do nothing, the SetValue is ignored.
--*/
LONG WINAPI VR_Protect( OPENKEY*, VIRTUALKEY*, VIRTUALVAL*, DWORD, const BYTE*, DWORD) { return ERROR_SUCCESS; }
IMPLEMENT_SHIM_END
|