static HRESULT WINAPI GameExplorer2Impl_InstallGame( IGameExplorer2 *iface, LPCWSTR binaryGDFPath, LPCWSTR installDirectory, GAME_INSTALL_SCOPE installScope) { HRESULT hr; GUID instanceId; GameExplorerImpl *This = impl_from_IGameExplorer2(iface); TRACE("(%p, %s, %s, 0x%x)\n", This, debugstr_w(binaryGDFPath), debugstr_w(installDirectory), installScope); if(!binaryGDFPath) return E_INVALIDARG; hr = GAMEUX_FindGameInstanceId(binaryGDFPath, GIS_CURRENT_USER, &instanceId); if(hr == S_FALSE) hr = GAMEUX_FindGameInstanceId(binaryGDFPath, GIS_ALL_USERS, &instanceId); if(hr == S_FALSE) { /* if game isn't yet registered, then install it */ instanceId = GUID_NULL; hr = GAMEUX_RegisterGame(binaryGDFPath, installDirectory, installScope, &instanceId); } else if(hr == S_OK) /* otherwise, update game */ hr = GAMEUX_UpdateGame(&instanceId); return hr; }
/******************************************************************************* * GAMEUX_getAppIdFromGDFPath * * Loads application identifier associated with given GDF binary. * Routine reads identifier from registry, so will fail if game * is not registered. * * Parameters: * GDFBinaryPath [I] path to gdf binary * lpApplicationId [O] place to store application id. * must be at least 49 characters * to store guid and termination 0 */ static HRESULT GAMEUX_getAppIdFromGDFPath( LPCWSTR GDFBinaryPath, LPWSTR lpApplicationId) { static const WCHAR sApplicationId[] = {'A','p','p','l','i','c','a','t','i','o','n','I','d',0}; HRESULT hr; GAME_INSTALL_SCOPE installScope; GUID instanceId; LPWSTR lpRegistryPath = NULL; HKEY hKey; DWORD dwLength = 49*sizeof(WCHAR);/* place for GUID */ TRACE("(%s, %p)\n", debugstr_w(GDFBinaryPath), lpApplicationId); if(!GDFBinaryPath) return E_INVALIDARG; installScope = GIS_CURRENT_USER; hr = GAMEUX_FindGameInstanceId(GDFBinaryPath, installScope, &instanceId); if(hr == S_FALSE) { installScope = GIS_ALL_USERS; hr = GAMEUX_FindGameInstanceId(GDFBinaryPath, installScope, &instanceId); } if(hr == S_FALSE) /* game not registered, so statistics cannot be used */ hr = E_FAIL; if(SUCCEEDED(hr)) /* game is registered, let's read it's application id from registry */ hr = GAMEUX_buildGameRegistryPath(installScope, &instanceId, &lpRegistryPath); if(SUCCEEDED(hr)) { hr = HRESULT_FROM_WIN32(RegOpenKeyExW(HKEY_LOCAL_MACHINE, lpRegistryPath, 0, KEY_READ | KEY_WOW64_64KEY, &hKey)); if(SUCCEEDED(hr)) { hr = HRESULT_FROM_WIN32(RegGetValueW(hKey, NULL, sApplicationId, RRF_RT_REG_SZ, NULL, lpApplicationId, &dwLength)); RegCloseKey(hKey); } } HeapFree(GetProcessHeap(), 0, lpRegistryPath); TRACE("found app id: %s, return: %#x\n", debugstr_w(lpApplicationId), hr); return hr; }
static HRESULT WINAPI GameExplorer2Impl_UninstallGame( IGameExplorer2 *iface, LPCWSTR binaryGDFPath) { HRESULT hr; GUID instanceId; GameExplorerImpl *This = impl_from_IGameExplorer2(iface); TRACE("(%p, %s)\n", This, debugstr_w(binaryGDFPath)); if(!binaryGDFPath) return E_INVALIDARG; hr = GAMEUX_FindGameInstanceId(binaryGDFPath, GIS_CURRENT_USER, &instanceId); if(hr == S_FALSE) hr = GAMEUX_FindGameInstanceId(binaryGDFPath, GIS_ALL_USERS, &instanceId); if(hr == S_OK) hr = GAMEUX_RemoveRegistryRecord(&instanceId); return hr; }