116 lines
3.4 KiB
C++
116 lines
3.4 KiB
C++
/*++
|
|
|
|
Copyright (c) 2000-2001 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
|
|
|
|
--*/
|
|
|
|
#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 szLocCP[MAX_PATH];
|
|
WCHAR szLocCPX[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
|
|
GetSystemDirectoryW(szLocCP, sizeof(szLocCP)/sizeof(WCHAR));
|
|
lstrcatW(szLocCP, L"\\Macromed\\Shockwave\\");
|
|
if (GetFileAttributesW(szLocCP) != 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
|
|
RegSetValueExW(hKey, NULL, 0, REG_SZ, (BYTE*)szLocCP, (DWORD)((lstrlenW(szLocCP)+1)*sizeof(WCHAR)));
|
|
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
|
|
GetSystemDirectoryW(szLocCPX, sizeof(szLocCPX)/sizeof(WCHAR));
|
|
lstrcatW(szLocCPX, L"\\Macromed\\Shockwave\\Xtras\\");
|
|
if (GetFileAttributesW(szLocCPX) != 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
|
|
RegSetValueExW(hKey, NULL, 0, REG_SZ, (BYTE*)szLocCPX, (DWORD)((lstrlenW(szLocCPX)+1)*sizeof(WCHAR)));
|
|
RegCloseKey(hKey);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/*++
|
|
|
|
Register hooked functions
|
|
|
|
--*/
|
|
|
|
HOOK_BEGIN
|
|
|
|
CALL_NOTIFY_FUNCTION
|
|
|
|
HOOK_END
|
|
|
|
IMPLEMENT_SHIM_END
|