/*++ 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