131 lines
4.1 KiB
C++
131 lines
4.1 KiB
C++
/*++
|
|
|
|
Copyright (c) 2000-2002 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
ShockwaveLocation.cpp
|
|
|
|
Abstract:
|
|
|
|
In Encarta Encyclopedia 2000 J DVD, Shockwave is accessible only by installed user's HKCU.
|
|
\WINDOWS\System32\Macromed\Director\SwDir.dll is looking for Shockwave location in HKCU.
|
|
For other users, this shim will create Shockwave location registry in HKCU if Shockwave folder exist
|
|
and not exist in registry.
|
|
|
|
Example:
|
|
HKCU\Software\Macromedia\Shockwave\location\coreplayer
|
|
(Default) REG_SZ "C:\WINDOWS\System32\Macromed\Shockwave\"
|
|
HKCU\Software\Macromedia\Shockwave\location\coreplayerxtras
|
|
(Default) REG_SZ "C:\WINDOWS\System32\Macromed\Shockwave\Xtras\"
|
|
|
|
Notes:
|
|
|
|
PopulateDefaultHKCUSettings shim does not work for this case 'cause the location include
|
|
WINDOWS directry as REG_SZ and cannot be a static data.
|
|
VirtualRegistry shim Redirector also not work 'cause sw70inst.exe does not use Reg API
|
|
and use SWDIR.INF to install in HKCU.
|
|
|
|
History:
|
|
|
|
04/27/2001 hioh Created
|
|
03/07/2002 robkenny Security review.
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
|
|
|
|
IMPLEMENT_SHIM_BEGIN(ShockwaveLocation)
|
|
#include "ShimHookMacro.h"
|
|
|
|
APIHOOK_ENUM_BEGIN
|
|
APIHOOK_ENUM_END
|
|
|
|
/*++
|
|
|
|
Add coreplayer & coreplayerxtras location in registry
|
|
|
|
--*/
|
|
|
|
BOOL
|
|
NOTIFY_FUNCTION(
|
|
DWORD fdwReason)
|
|
{
|
|
if (fdwReason == SHIM_STATIC_DLLS_INITIALIZED)
|
|
{
|
|
HKEY hKey;
|
|
WCHAR szRegCP[] = L"Software\\Macromedia\\Shockwave\\location\\coreplayer";
|
|
WCHAR szRegCPX[] = L"Software\\Macromedia\\Shockwave\\location\\coreplayerxtras";
|
|
WCHAR szLoc[MAX_PATH];
|
|
|
|
// coreplayer
|
|
if (ERROR_SUCCESS == RegOpenKeyExW(HKEY_CURRENT_USER, szRegCP, 0, KEY_QUERY_VALUE, &hKey))
|
|
{ // key exist, do nothing
|
|
RegCloseKey(hKey);
|
|
}
|
|
else
|
|
{ // key not exist, set key
|
|
UINT cchSystemDir = GetSystemDirectoryW(szLoc, ARRAYSIZE(szLoc));
|
|
if (cchSystemDir > 0 && cchSystemDir < ARRAYSIZE(szLoc))
|
|
{
|
|
if (StringCchCatW(szLoc, MAX_PATH, L"\\Macromed\\Shockwave\\") == S_OK)
|
|
{
|
|
if (GetFileAttributesW(szLoc) != 0xffffffff)
|
|
{ // folder exist, create key
|
|
if (ERROR_SUCCESS == RegCreateKeyExW(HKEY_CURRENT_USER, szRegCP, 0, 0, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL))
|
|
{ // set location
|
|
DWORD ccbLoc = (lstrlenW(szLoc) + 1) * sizeof(WCHAR);
|
|
RegSetValueExW(hKey, NULL, 0, REG_SZ, (BYTE*)szLoc, ccbLoc);
|
|
|
|
RegCloseKey(hKey);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// coreplayerxtras
|
|
if (ERROR_SUCCESS == RegOpenKeyExW(HKEY_CURRENT_USER, szRegCPX, 0, KEY_QUERY_VALUE, &hKey))
|
|
{ // key exist, do nothing
|
|
RegCloseKey(hKey);
|
|
}
|
|
else
|
|
{ // key not exist, set key
|
|
|
|
UINT cchSystemDir = GetSystemDirectoryW(szLoc, ARRAYSIZE(szLoc));
|
|
if (cchSystemDir > 0 && cchSystemDir < ARRAYSIZE(szLoc))
|
|
{
|
|
if (StringCchCatW(szLoc, MAX_PATH, L"\\Macromed\\Shockwave\\Xtras\\") == S_OK)
|
|
{
|
|
if (GetFileAttributesW(szLoc) != 0xffffffff)
|
|
{ // folder exist, create key
|
|
if (ERROR_SUCCESS == RegCreateKeyExW(HKEY_CURRENT_USER, szRegCPX, 0, 0, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL))
|
|
{ // set location
|
|
DWORD ccbLoc = (lstrlenW(szLoc) + 1) * sizeof(WCHAR);
|
|
RegSetValueExW(hKey, NULL, 0, REG_SZ, (BYTE*)szLoc, ccbLoc);
|
|
|
|
RegCloseKey(hKey);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/*++
|
|
|
|
Register hooked functions
|
|
|
|
--*/
|
|
|
|
HOOK_BEGIN
|
|
|
|
CALL_NOTIFY_FUNCTION
|
|
|
|
HOOK_END
|
|
|
|
IMPLEMENT_SHIM_END
|