|
|
/////7/////////////////////////////////////////////////////////////////////////////////////////
//
// FApplicationManager.cpp
//
// Copyright (C) 1998, 1999 Microsoft Corporation. All rights reserved.
//
// Abstract :
//
// This is the class factory for the Windows Game Manager
//
// History :
//
// 05/06/1999 luish Created
// 4/09/2000 RichGr LoadDebugRuntime Registry setting delegates calls to Debug dll.
//
//////////////////////////////////////////////////////////////////////////////////////////////
#include <objbase.h>
#include <verinfo.h>
#include <string.h>
#include <tchar.h>
#include "FApplicationManager.h"
#include "ApplicationManager.h"
#include "RegistryKey.h"
#include "Win32API.h"
#include "AppManDebug.h"
#include "Global.h"
#include "StructIdentifiers.h"
#include "ExceptionHandler.h"
#ifdef DBG_MODULE
#undef DBG_MODULE
#endif
#define DBG_MODULE DBG_FAPPMAN
HANDLE g_hModule; LONG g_lDLLReferenceCount = 0; HINSTANCE g_hDebugDLL; LPFNGETCLASSOBJECT g_pfnDllGetClassObject = NULL; BOOL g_bUseDebugRuntime = FALSE;
#ifndef DX_FINAL_RELEASE
// Handy variable when debugging.
#ifdef _DEBUG
BOOL g_bThisIsDebugBuild = TRUE; #else
BOOL g_bThisIsDebugBuild = FALSE; #endif
#define APPMAN_RETAIL_FILENAME _T("AppMan.dll")
#define APPMAN_DEBUG_FILENAME _T("AppManD.dll")
#endif // DX_FINAL_RELEASE
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
STDAPI DllMain(HANDLE hModule, DWORD dwReason, LPVOID /*lpReserved*/) { FUNCTION(" ::DllMain()");
HRESULT hResult = S_OK;
////////////////////////////////////////////////////////////////////////////////////////////
try { TCHAR szFileAndPath[MAX_PATH] = {0}; DWORD dwLen = 0; TCHAR *pszFile = NULL; HKEY hKey = 0;
//
// Save the module handle. This is used to extract resources
//
g_hModule = hModule;
#ifndef _DEBUG
if (dwReason == DLL_PROCESS_ATTACH) { //
// Retail code
//
// Make sure we are in APPMAN_RETAIL_FILENAME - we don't want to recursively LoadLibrary(APPMAN_DEBUG_FILENAME)
// if someone renamed the dlls or the dlls built incorrectly.
//
g_bUseDebugRuntime = FALSE; dwLen = GetModuleFileName((HMODULE) hModule, &szFileAndPath[0], sizeof(szFileAndPath)); if (0 < dwLen) { //
// Find the position of the last '\'. This precedes the filename.
//
pszFile = _tcsrchr(szFileAndPath, _T('\\'));
if (NULL != pszFile) { pszFile += 1;
//
// Is module name valid? Exit with error if not.
//
if (0 == _tcsnicmp(APPMAN_RETAIL_FILENAME, pszFile, MAX_PATH)) { if ((!RegOpenKey(HKEY_LOCAL_MACHINE, REGPATH_APPMAN, &hKey))&&(hKey)) { DWORD type = 0; DWORD dwLoadDebugRuntime; DWORD cb = sizeof(dwLoadDebugRuntime);
if (!RegQueryValueEx(hKey, _T("LoadDebugRuntime"), NULL, &type, (CONST LPBYTE)&dwLoadDebugRuntime, &cb)) { if (dwLoadDebugRuntime) { g_hDebugDLL = LoadLibrary(APPMAN_DEBUG_FILENAME); if (NULL != g_hDebugDLL) { g_pfnDllGetClassObject = (LPFNGETCLASSOBJECT)GetProcAddress(g_hDebugDLL, "DllGetClassObject"); if (NULL != g_pfnDllGetClassObject) { g_bUseDebugRuntime = TRUE; } else { FreeLibrary(g_hDebugDLL); g_hDebugDLL = NULL; } } } }
//
// Close the registry key
//
RegCloseKey(hKey); } } } }
//
// Time bomb this
//
#ifndef DX_FINAL_RELEASE
#pragma message("BETA EXPIRATION TIME BOMB! Remove for final build!")
if (FALSE == g_bUseDebugRuntime) { SYSTEMTIME sSystemTime; GetSystemTime(&sSystemTime);
if ((sSystemTime.wYear > DX_EXPIRE_YEAR)||((sSystemTime.wYear == DX_EXPIRE_YEAR)&&(MAKELONG(sSystemTime.wDay, sSystemTime.wMonth) > MAKELONG(DX_EXPIRE_DAY, DX_EXPIRE_MONTH)))) { MessageBox(0, DX_EXPIRE_TEXT, TEXT("Microsoft Application Manager"), MB_OK); } }
#endif // DX_FINAL_RELEASE
} else if (dwReason == DLL_PROCESS_DETACH && g_bUseDebugRuntime) { FreeLibrary(g_hDebugDLL); g_hDebugDLL = NULL; }
#else // preprocessor #else...
if (dwReason == DLL_PROCESS_ATTACH) { //
// Debug code - AppManD.dll.
// If we are debug, then spew a string at level 1
//
#ifndef DX_FINAL_RELEASE
#pragma message("BETA EXPIRATION TIME BOMB! Remove for final build!")
SYSTEMTIME sSystemTime; GetSystemTime(&sSystemTime);
if ((sSystemTime.wYear > DX_EXPIRE_YEAR)||((sSystemTime.wYear == DX_EXPIRE_YEAR)&&(MAKELONG(sSystemTime.wDay, sSystemTime.wMonth) > MAKELONG(DX_EXPIRE_DAY, DX_EXPIRE_MONTH)))) { MessageBox(0, DX_EXPIRE_TEXT, TEXT("Microsoft Application Manager"), MB_OK); }
#endif // DX_FINAL_RELEASE
}
#endif
}
///////////////////////////////////////////////////////////////////////////////////////
catch(CAppManExceptionHandler * pException) { hResult = pException->GetResultCode(); delete pException; }
catch(...) { hResult = E_UNEXPECTED; }
///////////////////////////////////////////////////////////////////////////////////////
return TRUE; }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
STDAPI DllGetClassObject(REFCLSID ClassIDReference, REFIID RefIID, void ** lppVoidObject) { FUNCTION(" ::DllGetClassObject ()");
HRESULT hResult = S_OK;
////////////////////////////////////////////////////////////////////////////////////////////
try { LPCLASSFACTORY pClassFactory;
*lppVoidObject = NULL;
#ifndef _DEBUG
//
// 4/09/2000(RichGr): We want to delegate this call to the debug version if we've been asked to
// and everything's valid.
//
if (g_bUseDebugRuntime) { hResult = g_pfnDllGetClassObject(ClassIDReference, RefIID, lppVoidObject);
return hResult; }
#endif
//
// Make sure the ppVoidObject is not null
//
if (NULL == lppVoidObject) { return E_INVALIDARG; }
*lppVoidObject = NULL;
//
// Check to make sure that the proper CLSID is being specified
//
if (ClassIDReference != CLSID_ApplicationManager) { return CLASS_E_CLASSNOTAVAILABLE; }
//
// Create the class factory
//
pClassFactory = (LPCLASSFACTORY) new CFApplicationManager;
if (NULL == pClassFactory) { return E_OUTOFMEMORY; }
//
// Get the requested interface
//
hResult = pClassFactory->QueryInterface(RefIID, lppVoidObject); pClassFactory->Release(); }
///////////////////////////////////////////////////////////////////////////////////////
catch(CAppManExceptionHandler * pException) { hResult = pException->GetResultCode(); delete pException; }
catch(...) { hResult = E_UNEXPECTED; }
///////////////////////////////////////////////////////////////////////////////////////
return hResult; }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
STDAPI DllCanUnloadNow(void) { FUNCTION(" ::DllCanUnloadNow ()");
if (g_lDLLReferenceCount) { return S_FALSE; }
return S_OK; }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
STDAPI DllRegisterServer(void) { FUNCTION(" ::DllRegisterServer ()");
HRESULT hResult = S_OK;
///////////////////////////////////////////////////////////////////////////////////////
try { CRegistryKey oRegistryKey; APPLICATION_MANAGER_RECORD sApplicationManagerRecord; DWORD dwDisposition, dwDWORD; CHAR szString[MAX_PATH_CHARCOUNT]; CHAR szDLLFileName[MAX_PATH_CHARCOUNT];
//
// Get the current windows directory
//
GetModuleFileNameA((HMODULE) g_hModule, szDLLFileName, MAX_PATH_CHARCOUNT);
//
// Register [HKEY_CLASSES_ROOT\CLSID\{79FF4730-235C-11d3-A76C-00C04F8F8B94}]
//
wsprintfA(szString, "CLSID\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", CLSID_ApplicationManager.Data1, CLSID_ApplicationManager.Data2, CLSID_ApplicationManager.Data3, CLSID_ApplicationManager.Data4[0], CLSID_ApplicationManager.Data4[1], CLSID_ApplicationManager.Data4[2], CLSID_ApplicationManager.Data4[3], CLSID_ApplicationManager.Data4[4], CLSID_ApplicationManager.Data4[5], CLSID_ApplicationManager.Data4[6], CLSID_ApplicationManager.Data4[7]); oRegistryKey.CreateKey(HKEY_CLASSES_ROOT, szString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, FALSE, NULL); oRegistryKey.SetValue(NULL, REG_SZ, (LPBYTE) "Application Manager", sizeof("Application Manager") + 1); wsprintfA(szString, "{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", CLSID_ApplicationManager.Data1, CLSID_ApplicationManager.Data2, CLSID_ApplicationManager.Data3, CLSID_ApplicationManager.Data4[0], CLSID_ApplicationManager.Data4[1], CLSID_ApplicationManager.Data4[2], CLSID_ApplicationManager.Data4[3], CLSID_ApplicationManager.Data4[4], CLSID_ApplicationManager.Data4[5], CLSID_ApplicationManager.Data4[6], CLSID_ApplicationManager.Data4[7]); oRegistryKey.SetValue("AppID", REG_SZ, (LPBYTE) szString, MAX_PATH_CHARCOUNT); //
// Register [HKEY_CLASSES_ROOT\CLSID\{79FF4730-235C-11d3-A76C-00C04F8F8B94}\InProcServer32]
//
wsprintfA(szString, "CLSID\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\\InprocServer32", CLSID_ApplicationManager.Data1, CLSID_ApplicationManager.Data2, CLSID_ApplicationManager.Data3, CLSID_ApplicationManager.Data4[0], CLSID_ApplicationManager.Data4[1], CLSID_ApplicationManager.Data4[2], CLSID_ApplicationManager.Data4[3], CLSID_ApplicationManager.Data4[4], CLSID_ApplicationManager.Data4[5], CLSID_ApplicationManager.Data4[6], CLSID_ApplicationManager.Data4[7]); oRegistryKey.CreateKey(HKEY_CLASSES_ROOT, szString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, FALSE, NULL); oRegistryKey.SetValue(NULL, REG_SZ, (LPBYTE) szDLLFileName, MAX_PATH_CHARCOUNT); oRegistryKey.SetValue("ThreadingModel", REG_SZ, (LPBYTE) "Apartment", sizeof("Apartment") + 1);
//
// Now add icon for the disk cleaner
//
wsprintfA(szString, "CLSID\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\\DefaultIcon", CLSID_ApplicationManager.Data1, CLSID_ApplicationManager.Data2, CLSID_ApplicationManager.Data3, CLSID_ApplicationManager.Data4[0], CLSID_ApplicationManager.Data4[1], CLSID_ApplicationManager.Data4[2], CLSID_ApplicationManager.Data4[3], CLSID_ApplicationManager.Data4[4], CLSID_ApplicationManager.Data4[5], CLSID_ApplicationManager.Data4[6], CLSID_ApplicationManager.Data4[7]); oRegistryKey.CreateKey(HKEY_CLASSES_ROOT, szString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, FALSE, NULL); wsprintfA(szString,szDLLFileName); strcat(szString,", 0"); oRegistryKey.SetValue(NULL, REG_SZ, (LPBYTE) szString, sizeof(szString));
//
// Register [HKEY_CLASSES_ROOT\CLSID\{79FF4730-235C-11d3-A76C-00C04F8F8B94}\ProgID]
//
wsprintfA(szString, "CLSID\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\\ProgID", CLSID_ApplicationManager.Data1, CLSID_ApplicationManager.Data2, CLSID_ApplicationManager.Data3, CLSID_ApplicationManager.Data4[0], CLSID_ApplicationManager.Data4[1], CLSID_ApplicationManager.Data4[2], CLSID_ApplicationManager.Data4[3], CLSID_ApplicationManager.Data4[4], CLSID_ApplicationManager.Data4[5], CLSID_ApplicationManager.Data4[6], CLSID_ApplicationManager.Data4[7]); oRegistryKey.CreateKey(HKEY_CLASSES_ROOT, szString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, FALSE, NULL); wsprintfA(szString, "ApplicationManager.%d", GetAppManVersion()); oRegistryKey.SetValue(NULL, REG_SZ, (LPBYTE) szString, MAX_PATH_CHARCOUNT);
//
// Register [HKEY_CLASSES_ROOT\CLSID\{79FF4730-235C-11d3-A76C-00C04F8F8B94}\VersionIndependentProgID]
//
wsprintfA(szString, "CLSID\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\\VersionIndependentProgID", CLSID_ApplicationManager.Data1, CLSID_ApplicationManager.Data2, CLSID_ApplicationManager.Data3, CLSID_ApplicationManager.Data4[0], CLSID_ApplicationManager.Data4[1], CLSID_ApplicationManager.Data4[2], CLSID_ApplicationManager.Data4[3], CLSID_ApplicationManager.Data4[4], CLSID_ApplicationManager.Data4[5], CLSID_ApplicationManager.Data4[6], CLSID_ApplicationManager.Data4[7]); oRegistryKey.CreateKey(HKEY_CLASSES_ROOT, szString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, FALSE, NULL); oRegistryKey.SetValue(NULL, REG_SZ, (LPBYTE) "ApplicationManager", sizeof("ApplicationManager") + 1);
//
// Register [HKEY_CLASSES_ROOT\ApplicationManager]
//
oRegistryKey.CreateKey(HKEY_CLASSES_ROOT, "ApplicationManager", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, FALSE, NULL); oRegistryKey.SetValue(NULL, REG_SZ, (LPBYTE) "Application Manager", sizeof("Application Manager") + 1);
//
// Register [HKEY_CLASSES_ROOT\ApplicationManager\CLSID]
//
oRegistryKey.CreateKey(HKEY_CLASSES_ROOT, "ApplicationManager\\CLSID", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, FALSE, NULL); wsprintfA(szString, "{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", CLSID_ApplicationManager.Data1, CLSID_ApplicationManager.Data2, CLSID_ApplicationManager.Data3, CLSID_ApplicationManager.Data4[0], CLSID_ApplicationManager.Data4[1], CLSID_ApplicationManager.Data4[2], CLSID_ApplicationManager.Data4[3], CLSID_ApplicationManager.Data4[4], CLSID_ApplicationManager.Data4[5], CLSID_ApplicationManager.Data4[6], CLSID_ApplicationManager.Data4[7]); oRegistryKey.SetValue(NULL, REG_SZ, (LPBYTE) szString, MAX_PATH_CHARCOUNT);
//
// Register [HKEY_CLASSES_ROOT\ApplicationManager\CurVer]
//
oRegistryKey.CreateKey(HKEY_CLASSES_ROOT, "ApplicationManager\\CurVer", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, FALSE, NULL); wsprintfA(szString, "ApplicationManager.%d", GetAppManVersion()); oRegistryKey.SetValue(NULL, REG_SZ, (LPBYTE) szString, MAX_PATH_CHARCOUNT);
//
// Register [HKEY_CLASSES_ROOT\ApplicationManager.%d]
//
wsprintfA(szString, "ApplicationManager.%d", GetAppManVersion()); oRegistryKey.CreateKey(HKEY_CLASSES_ROOT, szString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, FALSE, NULL); oRegistryKey.SetValue(NULL, REG_SZ, (LPBYTE) "Application Manager", sizeof("Application Manager") + 1);
//
// Register [HKEY_CLASSES_ROOT\ApplicationManager.%d\CLSID]
//
wsprintfA(szString, "ApplicationManager.%d\\CLSID", GetAppManVersion()); oRegistryKey.CreateKey(HKEY_CLASSES_ROOT, szString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, FALSE, NULL); wsprintfA(szString, "{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", CLSID_ApplicationManager.Data1, CLSID_ApplicationManager.Data2, CLSID_ApplicationManager.Data3, CLSID_ApplicationManager.Data4[0], CLSID_ApplicationManager.Data4[1], CLSID_ApplicationManager.Data4[2], CLSID_ApplicationManager.Data4[3], CLSID_ApplicationManager.Data4[4], CLSID_ApplicationManager.Data4[5], CLSID_ApplicationManager.Data4[6], CLSID_ApplicationManager.Data4[7]); oRegistryKey.SetValue(NULL, REG_SZ, (LPBYTE) szString, MAX_PATH_CHARCOUNT);
//
// Register [HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Explorer/VolumeCaches/Delete Game Manager Files]
//
wsprintfA(szString, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\VolumeCaches\\Delete Game Manager Files"); oRegistryKey.CreateKey(HKEY_LOCAL_MACHINE, szString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, FALSE, NULL); wsprintfA(szString, "{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", CLSID_ApplicationManager.Data1, CLSID_ApplicationManager.Data2, CLSID_ApplicationManager.Data3, CLSID_ApplicationManager.Data4[0], CLSID_ApplicationManager.Data4[1], CLSID_ApplicationManager.Data4[2], CLSID_ApplicationManager.Data4[3], CLSID_ApplicationManager.Data4[4], CLSID_ApplicationManager.Data4[5], CLSID_ApplicationManager.Data4[6], CLSID_ApplicationManager.Data4[7]); oRegistryKey.SetValue(NULL, REG_SZ, (LPBYTE) szString, MAX_PATH_CHARCOUNT); DWORD dwDiskCleanerDayThreshold = DISKCLEANER_DAY_THRESHOLD; oRegistryKey.SetValue("DiskCleanerDayThreshold", REG_DWORD, (unsigned char *)&dwDiskCleanerDayThreshold, sizeof(DWORD));
//
// Open the root key if possible
//
if (S_OK == oRegistryKey.CheckForExistingKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\AppMan")) { oRegistryKey.OpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\AppMan", KEY_ALL_ACCESS);
//
// Make sure the AppMan version is the right version
//
if (S_OK == oRegistryKey.CheckForExistingValue("AppManVersion")) { DWORD dwDataLen, dwDataValue, dwDataType;
dwDataLen = sizeof(dwDataValue); oRegistryKey.GetValue("AppManVersion", &dwDataType, (BYTE *) &dwDataValue, &dwDataLen); if (REG_VERSION > dwDataValue) { oRegistryKey.DeleteKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\AppMan"); } } }
//
// Create the application manager registry keys
//
oRegistryKey.CreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\AppMan", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, TRUE, &dwDisposition);
//
// Initialize the AppMan\Version value
//
dwDWORD = REG_VERSION; oRegistryKey.SetValue("AppManVersion", REG_DWORD, (const BYTE *) &dwDWORD, sizeof(dwDWORD));
//
// Initialize wait event extra wait vars
//
dwDWORD = 0; oRegistryKey.SetValue("WaitEntryEventExtraTime", REG_DWORD, (const BYTE *) &dwDWORD, sizeof(dwDWORD));
dwDWORD = 0; oRegistryKey.SetValue("WaitLeaveEventExtraTime", REG_DWORD, (const BYTE *) &dwDWORD, sizeof(dwDWORD));
//
// Initialize the AppMan\DefaultCacheSize
//
dwDWORD = DEFAULT_PERCENT_CACHE_SIZE; oRegistryKey.SetValue("DefaultPercentCacheSize", REG_DWORD, (const BYTE *) &dwDWORD, sizeof(dwDWORD));
//
// Insert the original APPLICATION_MANAGER_RECORD
//
sApplicationManagerRecord.dwSize = sizeof(APPLICATION_MANAGER_RECORD); sApplicationManagerRecord.dwStructId = APPLICATION_MANAGER_STRUCT; if (FAILED(CoCreateGuid(&sApplicationManagerRecord.sSystemGuid))) { THROW(E_UNEXPECTED); } sApplicationManagerRecord.dwAdvancedMode = FALSE; oRegistryKey.SetValue("Vector000", REG_BINARY, (LPBYTE) &sApplicationManagerRecord, sizeof(APPLICATION_MANAGER_RECORD));
//
// Create the AppMan\Devices key.
//
oRegistryKey.CreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\AppMan\\Devices", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, TRUE, &dwDisposition);
//
// Create the AppMan\Applications key
//
oRegistryKey.CreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\AppMan\\Applications", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, TRUE, &dwDisposition);
//
// Create the AppMan\Associations key
//
oRegistryKey.CreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\AppMan\\Associations", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, TRUE, &dwDisposition);
//
// Create the AppMan\TempAllocation key
//
oRegistryKey.CreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\AppMan\\TempSpaceAllocation", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, TRUE, &dwDisposition);
//
// Create the AppMan\Cleanup key
//
oRegistryKey.CreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\AppMan\\Cleanup", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, TRUE, &dwDisposition);
//
// Create the AppMan\Lock key
//
oRegistryKey.CreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\AppMan\\Lock", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, TRUE, &dwDisposition);
//
// Create the AppMan\Lock key
//
oRegistryKey.CreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\AppMan\\WaitEvent", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, TRUE, &dwDisposition);
oRegistryKey.CloseKey(); }
///////////////////////////////////////////////////////////////////////////////////////
catch(CAppManExceptionHandler * pException) { hResult = pException->GetResultCode(); delete pException; }
catch(...) { hResult = E_UNEXPECTED; }
///////////////////////////////////////////////////////////////////////////////////////
return hResult; return S_OK; }
//////////////////////////////////////////////////////////////////////////////////////////////
//
// TODO : Replace literal .1 with actual version number
//
//////////////////////////////////////////////////////////////////////////////////////////////
STDAPI DllUnregisterServer(void) { FUNCTION(" ::DllUnregisterServer ()");
HRESULT hResult = S_OK;
///////////////////////////////////////////////////////////////////////////////////////
try { CRegistryKey oRegistryKey; CHAR szString[MAX_PATH_CHARCOUNT];
//
// Delete the registry keys
//
wsprintfA(szString, "ApplicationManager.%d\\CLSID", GetAppManVersion()); if (S_OK == oRegistryKey.CheckForExistingKey(HKEY_CLASSES_ROOT, szString)) { oRegistryKey.DeleteKey(HKEY_CLASSES_ROOT, szString); }
wsprintfA(szString, "ApplicationManager.%d", GetAppManVersion()); if (S_OK == oRegistryKey.CheckForExistingKey(HKEY_CLASSES_ROOT, szString)) { oRegistryKey.DeleteKey(HKEY_CLASSES_ROOT, szString); }
if (S_OK == oRegistryKey.CheckForExistingKey(HKEY_CLASSES_ROOT, "ApplicationManager\\CurVer")) { oRegistryKey.DeleteKey(HKEY_CLASSES_ROOT, "ApplicationManager\\CurVer"); }
if (S_OK == oRegistryKey.CheckForExistingKey(HKEY_CLASSES_ROOT, "ApplicationManager\\CLSID")) { oRegistryKey.DeleteKey(HKEY_CLASSES_ROOT, "ApplicationManager\\CLSID"); }
if (S_OK == oRegistryKey.CheckForExistingKey(HKEY_CLASSES_ROOT, "ApplicationManager")) { oRegistryKey.DeleteKey(HKEY_CLASSES_ROOT, "ApplicationManager"); }
wsprintfA(szString, "CLSID\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\\VersionIndependentProgID", CLSID_ApplicationManager.Data1, CLSID_ApplicationManager.Data2, CLSID_ApplicationManager.Data3, CLSID_ApplicationManager.Data4[0], CLSID_ApplicationManager.Data4[1], CLSID_ApplicationManager.Data4[2], CLSID_ApplicationManager.Data4[3], CLSID_ApplicationManager.Data4[4], CLSID_ApplicationManager.Data4[5], CLSID_ApplicationManager.Data4[6], CLSID_ApplicationManager.Data4[7]); if (S_OK == oRegistryKey.CheckForExistingKey(HKEY_CLASSES_ROOT, szString)) { oRegistryKey.DeleteKey(HKEY_CLASSES_ROOT, szString); }
wsprintfA(szString, "CLSID\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\\ProgID", CLSID_ApplicationManager.Data1, CLSID_ApplicationManager.Data2, CLSID_ApplicationManager.Data3, CLSID_ApplicationManager.Data4[0], CLSID_ApplicationManager.Data4[1], CLSID_ApplicationManager.Data4[2], CLSID_ApplicationManager.Data4[3], CLSID_ApplicationManager.Data4[4], CLSID_ApplicationManager.Data4[5], CLSID_ApplicationManager.Data4[6], CLSID_ApplicationManager.Data4[7]); if (S_OK == oRegistryKey.CheckForExistingKey(HKEY_CLASSES_ROOT, szString)) { oRegistryKey.DeleteKey(HKEY_CLASSES_ROOT, szString); }
wsprintfA(szString, "CLSID\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\\InprocServer32", CLSID_ApplicationManager.Data1, CLSID_ApplicationManager.Data2, CLSID_ApplicationManager.Data3, CLSID_ApplicationManager.Data4[0], CLSID_ApplicationManager.Data4[1], CLSID_ApplicationManager.Data4[2], CLSID_ApplicationManager.Data4[3], CLSID_ApplicationManager.Data4[4], CLSID_ApplicationManager.Data4[5], CLSID_ApplicationManager.Data4[6], CLSID_ApplicationManager.Data4[7]); if (S_OK == oRegistryKey.CheckForExistingKey(HKEY_CLASSES_ROOT, szString)) { oRegistryKey.DeleteKey(HKEY_CLASSES_ROOT, szString); }
wsprintfA(szString, "CLSID\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", CLSID_ApplicationManager.Data1, CLSID_ApplicationManager.Data2, CLSID_ApplicationManager.Data3, CLSID_ApplicationManager.Data4[0], CLSID_ApplicationManager.Data4[1], CLSID_ApplicationManager.Data4[2], CLSID_ApplicationManager.Data4[3], CLSID_ApplicationManager.Data4[4], CLSID_ApplicationManager.Data4[5], CLSID_ApplicationManager.Data4[6], CLSID_ApplicationManager.Data4[7]); if (S_OK == oRegistryKey.CheckForExistingKey(HKEY_CLASSES_ROOT, szString)) { oRegistryKey.DeleteKey(HKEY_CLASSES_ROOT, szString); }
wsprintfA(szString, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\VolumeCaches\\Delete Game Manager Files"); if (S_OK == oRegistryKey.CheckForExistingKey(HKEY_LOCAL_MACHINE, szString)) { oRegistryKey.DeleteKey(HKEY_LOCAL_MACHINE, szString); }
//
// Close oRegistryKey
//
oRegistryKey.CloseKey(); }
///////////////////////////////////////////////////////////////////////////////////////
catch(CAppManExceptionHandler * pException) { hResult = pException->GetResultCode(); delete pException; }
catch(...) { hResult = E_UNEXPECTED; }
///////////////////////////////////////////////////////////////////////////////////////
return hResult; }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
CFApplicationManager::CFApplicationManager(void) { FUNCTION("CFApplicationManager::CFApplicationManager (void)");
m_lReferenceCount = 1; }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
CFApplicationManager::~CFApplicationManager(void) { FUNCTION("CFApplicationManager::~CFApplicationManager (void)"); }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CFApplicationManager::QueryInterface(REFIID RefIID, void ** lppVoidObject) { FUNCTION("CFApplicationManager::QueryInterface ()");
HRESULT hResult = S_OK;
///////////////////////////////////////////////////////////////////////////////////////
try { //
// Check to make sure that &RefIID is not null
//
if (NULL == &RefIID) { return E_UNEXPECTED; }
//
// Check to make sure that ppVoidObject is not null
//
if (NULL == lppVoidObject) { return E_INVALIDARG; }
*lppVoidObject = NULL;
//
// Check for known interfaces
//
if (RefIID == IID_IUnknown) { *lppVoidObject = (LPVOID) this; AddRef(); hResult = S_OK; } else { if (RefIID == IID_IClassFactory) { *lppVoidObject = (LPVOID) this; AddRef(); hResult = S_OK; } else { hResult = E_NOINTERFACE; } } }
///////////////////////////////////////////////////////////////////////////////////////
catch(CAppManExceptionHandler * pException) { hResult = pException->GetResultCode(); delete pException; }
catch(...) { hResult = E_UNEXPECTED; }
///////////////////////////////////////////////////////////////////////////////////////
return hResult; }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
ULONG STDMETHODCALLTYPE CFApplicationManager::AddRef(void) { FUNCTION("CFApplicationManager::AddRef ()");
return InterlockedIncrement(&m_lReferenceCount); }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
ULONG STDMETHODCALLTYPE CFApplicationManager::Release(void) { FUNCTION("CFApplicationManager::Release ()");
DWORD dwReferenceCount;
dwReferenceCount = InterlockedDecrement(&m_lReferenceCount); if (0 == dwReferenceCount) { delete this; }
return dwReferenceCount; }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CFApplicationManager::CreateInstance(IUnknown * lpoParent, REFIID RefIID, LPVOID * lppVoidObject) { FUNCTION("CFApplicationManager::CreateInstance ()");
HRESULT hResult = S_OK;
///////////////////////////////////////////////////////////////////////////////////////
try { CApplicationManagerRoot * lpoApplicationManagerRoot; IUnknown * lpoUnknownObject;
//
// Make sure no one is trying to aggregrate this interface
//
if (NULL != lpoParent) { return CLASS_E_NOAGGREGATION; }
//
// Check that parameters are valid
//
if (NULL == lppVoidObject) { return E_INVALIDARG; }
//
// Ok, let's create a new CWindowsGameManager instance.
//
lpoApplicationManagerRoot = new CApplicationManagerRoot; if (NULL == lpoApplicationManagerRoot) { return E_OUTOFMEMORY; } else if (lpoApplicationManagerRoot->m_bInsufficientAccessToRun) { return E_ACCESSDENIED; }
//
// Cast the CWindowsGameManager object to an IUnknown
//
lpoUnknownObject = (IUnknown *) lpoApplicationManagerRoot;
//
// Get an interface pointer for RefIID
//
hResult = lpoUnknownObject->QueryInterface(RefIID, lppVoidObject); lpoUnknownObject->Release(); }
///////////////////////////////////////////////////////////////////////////////////////
catch(CAppManExceptionHandler * pException) { hResult = pException->GetResultCode(); delete pException; }
catch(...) { hResult = E_UNEXPECTED; }
///////////////////////////////////////////////////////////////////////////////////////
return hResult; }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CFApplicationManager::LockServer(BOOL fLock) { FUNCTION("CFApplicationManager::LockServer ()");
if (TRUE == fLock) { InterlockedIncrement(&g_lDLLReferenceCount); } else { InterlockedDecrement(&g_lDLLReferenceCount); }
return S_OK; }
//////////////////////////////////////////////////////////////////////////////////////////////
|