90 lines
1.8 KiB
C++
90 lines
1.8 KiB
C++
/*++
|
|
|
|
Copyright (c) 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
Omikron.cpp
|
|
|
|
Abstract:
|
|
|
|
Shims RegQueryValueExA so that when the app asks for the shell command
|
|
for opening an rtffile, it gets what it expected to see under Win95:
|
|
"C:\WINDOWS\WORDPAD.EXE %1" This is, of course, wrong, but we then apply
|
|
CorrectFilePaths, so when it actually goes out to launch wordpad, it has
|
|
the right path.
|
|
|
|
This is necessary because it can't have a path name with spaces in it
|
|
|
|
Notes:
|
|
|
|
This is specific to Omikron.
|
|
|
|
History:
|
|
|
|
3/27/2000 dmunsil Created
|
|
|
|
|
|
--*/
|
|
#include "precomp.h"
|
|
|
|
IMPLEMENT_SHIM_BEGIN(Omikron)
|
|
#include "ShimHookMacro.h"
|
|
|
|
APIHOOK_ENUM_BEGIN
|
|
APIHOOK_ENUM_ENTRY(RegQueryValueExA)
|
|
APIHOOK_ENUM_END
|
|
|
|
LONG
|
|
APIHOOK(RegQueryValueExA)(
|
|
HKEY hKey,
|
|
LPSTR lpValueName,
|
|
LPDWORD lpReserved,
|
|
LPDWORD lpType,
|
|
LPBYTE lpData,
|
|
LPDWORD lpcbData
|
|
)
|
|
{
|
|
LONG lReturn;
|
|
|
|
// Remember the size of the dest buffer
|
|
DWORD ccbData = lpcbData ? *lpcbData : 0;
|
|
|
|
lReturn = ORIGINAL_API(RegQueryValueExA)(hKey, lpValueName, lpReserved, lpType, lpData, lpcbData);
|
|
|
|
if (lReturn != ERROR_SUCCESS)
|
|
{
|
|
return lReturn;
|
|
}
|
|
|
|
if (lpType && lpcbData && lpData && (*lpType == REG_SZ || *lpType == REG_EXPAND_SZ))
|
|
{
|
|
CSTRING_TRY
|
|
{
|
|
LPSTR lpszData = (LPSTR)lpData;
|
|
|
|
CString csData(lpszData);
|
|
if (csData.Find(L"wordpad.exe \"%1\"") >= 0)
|
|
{
|
|
StringCbCopyA(lpszData, ccbData, "c:\\windows\\wordpad.exe \"%1\"");
|
|
}
|
|
}
|
|
CSTRING_CATCH
|
|
{
|
|
// Do nothing
|
|
}
|
|
}
|
|
|
|
return lReturn;
|
|
}
|
|
|
|
|
|
HOOK_BEGIN
|
|
|
|
APIHOOK_ENTRY(ADVAPI32.DLL, RegQueryValueExA )
|
|
|
|
HOOK_END
|
|
|
|
IMPLEMENT_SHIM_END
|
|
|