windows-nt/Source/XPSP1/NT/windows/appcompat/shims/specific/shockwavelocation.cpp
2020-09-26 16:20:57 +08:00

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