/******************************************************************************* * GAMEUX_UpdateGame * * Helper function, updates stored data about game with given InstanceID */ static HRESULT GAMEUX_UpdateGame(LPGUID InstanceID) { static const WCHAR sConfigGDFBinaryPath[] = {'C','o','n','f','i','g','G','D','F','B','i','n','a','r','y','P','a','t','h',0}; static const WCHAR sConfigApplicationPath[] = {'C','o','n','f','i','g','A','p','p','l','i','c','a','t','i','o','n','P','a','t','h',0}; HRESULT hr; GAME_INSTALL_SCOPE installScope; LPWSTR lpRegistryPath; LPWSTR lpGDFBinaryPath; TRACE("(%s)\n", debugstr_guid(InstanceID)); /* first, check is game exists in CURRENT_USER scope */ installScope = GIS_CURRENT_USER; hr = GAMEUX_IsGameKeyExist(installScope, InstanceID, &lpRegistryPath); if(hr == S_FALSE) { /* game not found in CURRENT_USER scope, let's check in ALL_USERS */ installScope = GIS_ALL_USERS; hr = GAMEUX_IsGameKeyExist(installScope, InstanceID, &lpRegistryPath); } if(hr == S_FALSE) /* still not found? let's inform user that game does not exists */ hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); if(SUCCEEDED(hr)) { WCHAR *lpGameInstallDirectory = NULL; /* game found, its registry path is in lpRegistryPath and install * scope in installScope */ TRACE("game found in registry (path %s), updating\n", debugstr_w(lpRegistryPath)); /* first, read required data about game */ hr = GAMEUX_LoadRegistryString(HKEY_LOCAL_MACHINE, lpRegistryPath, sConfigGDFBinaryPath, &lpGDFBinaryPath); if(SUCCEEDED(hr)) hr = GAMEUX_LoadRegistryString(HKEY_LOCAL_MACHINE, lpRegistryPath, sConfigApplicationPath, &lpGameInstallDirectory); /* now remove currently existing registry key */ if(SUCCEEDED(hr)) hr = GAMEUX_RemoveRegistryRecord(InstanceID); /* and add it again, it will cause in reparsing of whole GDF */ if(SUCCEEDED(hr)) hr = GAMEUX_RegisterGame(lpGDFBinaryPath, lpGameInstallDirectory, installScope, InstanceID); HeapFree(GetProcessHeap(), 0, lpGDFBinaryPath); HeapFree(GetProcessHeap(), 0, lpGameInstallDirectory); } HeapFree(GetProcessHeap(), 0, lpRegistryPath); TRACE("returning 0x%x\n", hr); return hr; }
/******************************************************************************* * GAMEUX_FindGameInstanceId * * Internal helper function. Description available in gameux_private.h file */ HRESULT GAMEUX_FindGameInstanceId( LPCWSTR sGDFBinaryPath, GAME_INSTALL_SCOPE installScope, GUID* pInstanceId) { static const WCHAR sConfigGDFBinaryPath[] = {'C','o','n','f','i','g','G','D','F','B','i','n','a','r','y','P','a','t','h',0}; HRESULT hr; BOOL found = FALSE; LPWSTR lpRegistryPath = NULL; HKEY hRootKey; DWORD dwSubKeys, dwSubKeyLen, dwMaxSubKeyLen, i; LPWSTR lpName = NULL, lpValue = NULL; hr = GAMEUX_buildGameRegistryPath(installScope, NULL, &lpRegistryPath); if(SUCCEEDED(hr)) /* enumerate all subkeys of received one and search them for value "ConfigGGDFBinaryPath" */ hr = HRESULT_FROM_WIN32(RegOpenKeyExW(HKEY_LOCAL_MACHINE, lpRegistryPath, 0, KEY_READ | KEY_WOW64_64KEY, &hRootKey)); if(SUCCEEDED(hr)) { hr = HRESULT_FROM_WIN32(RegQueryInfoKeyW(hRootKey, NULL, NULL, NULL, &dwSubKeys, &dwMaxSubKeyLen, NULL, NULL, NULL, NULL, NULL, NULL)); if(SUCCEEDED(hr)) { ++dwMaxSubKeyLen; /* for string terminator */ lpName = CoTaskMemAlloc(dwMaxSubKeyLen*sizeof(WCHAR)); if(!lpName) hr = E_OUTOFMEMORY; } if(SUCCEEDED(hr)) { for(i=0; i<dwSubKeys && !found; ++i) { dwSubKeyLen = dwMaxSubKeyLen; hr = HRESULT_FROM_WIN32(RegEnumKeyExW(hRootKey, i, lpName, &dwSubKeyLen, NULL, NULL, NULL, NULL)); if(SUCCEEDED(hr)) hr = GAMEUX_LoadRegistryString(hRootKey, lpName, sConfigGDFBinaryPath, &lpValue); if(SUCCEEDED(hr)) if(lstrcmpW(lpValue, sGDFBinaryPath)==0) { /* key found, let's copy instance id and exit */ hr = (GUIDFromStringW(lpName, pInstanceId) ? S_OK : E_FAIL); found = TRUE; } HeapFree(GetProcessHeap(), 0, lpValue); } } HeapFree(GetProcessHeap(), 0, lpName); RegCloseKey(hRootKey); } HeapFree(GetProcessHeap(), 0, lpRegistryPath); if((SUCCEEDED(hr) && !found) || hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)) hr = S_FALSE; return hr; }