extern "C" void __declspec(dllexport) RemoveFromGameExplorer( HWND hwndParent, int string_size, char *variables, stack_t **stacktop) { EXDLL_INIT(); char *cGuid = NULL; cGuid = (char*)GlobalAlloc(GPTR, string_size); popstring( cGuid ); HRESULT hr = CoInitialize(NULL); if( FAILED(hr) ) { MessageBox( hwndParent, L"Failed to remove Darwinia: Vista Edition from Games Explorer\nCoInitialize Failed", L"Darwinia: Vista Edition", MB_OK|MB_ICONERROR ); return; } IGameExplorer *gameExplorerInterface = NULL; hr = CoCreateInstance(__uuidof(GameExplorer), 0, CLSCTX_INPROC_SERVER, __uuidof(IGameExplorer), (LPVOID *)&gameExplorerInterface); if( FAILED(hr) ) { MessageBox( hwndParent, L"Failed to remove Darwinia: Vista Edition from Games Explorer\nFailed to create IGameExplorer Instance", L"Darwinia: Vista Edition", MB_OK|MB_ICONERROR ); return; } GUID guid = GUID_NULL; StringToGuid( &guid, cGuid ); //CoCreateGuid( &guid ); hr = gameExplorerInterface->RemoveGame( guid ); if( FAILED( hr ) ) { MessageBox( hwndParent, L"Failed to remove Darwinia: Vista Edition from Games Explorer\nRemoveGame Failed", L"Darwinia: Vista Edition", MB_OK|MB_ICONERROR ); } RemoveRichSavedGamesW(SAVE_EXTENTION); return; }
EFI_HANDLE ParseGuidedSectionToolsMemoryFile ( IN EFI_HANDLE InputFile ) /*++ Routine Description: This function parses the tools_def.txt file. It returns a EFI_HANDLE object which can be used for the other library functions and should be passed to FreeParsedGuidedSectionToolsHandle to free resources when the tools_def.txt information is no longer needed. Arguments: InputFile Memory file image. Returns: NULL if error or EOF InputBuffer otherwise --*/ { EFI_STATUS Status; CHAR8 *NextLine; STRING_LIST *Tool; EFI_GUID Guid; GUID_SEC_TOOL_ENTRY *FirstGuidTool; GUID_SEC_TOOL_ENTRY *LastGuidTool; GUID_SEC_TOOL_ENTRY *NewGuidTool; FirstGuidTool = NULL; LastGuidTool = NULL; while (TRUE) { NextLine = ReadMemoryFileLine (InputFile); if (NextLine == NULL) { break; } Status = StripInfDscStringInPlace (NextLine); if (EFI_ERROR (Status)) { free (NextLine); break; } if (NextLine[0] == '\0') { free (NextLine); continue; } Tool = SplitStringByWhitespace (NextLine); if ((Tool != NULL) && (Tool->Count == 3) ) { Status = StringToGuid (Tool->Strings[0], &Guid); if (!EFI_ERROR (Status)) { NewGuidTool = malloc (sizeof (GUID_SEC_TOOL_ENTRY)); if (NewGuidTool != NULL) { memcpy (&(NewGuidTool->Guid), &Guid, sizeof (Guid)); NewGuidTool->Name = CloneString(Tool->Strings[1]); NewGuidTool->Path = CloneString(Tool->Strings[2]); NewGuidTool->Next = NULL; if (FirstGuidTool == NULL) { FirstGuidTool = NewGuidTool; } else { LastGuidTool->Next = NewGuidTool; } LastGuidTool = NewGuidTool; } } } if (Tool != NULL) { FreeStringList (Tool); } free (NextLine); } return FirstGuidTool; }
VOID CVfrCompiler::OptionInitialization ( IN INT32 Argc, IN CHAR8 **Argv ) { INT32 Index; EFI_STATUS Status; Status = EFI_SUCCESS; SetUtilityName ((CHAR8*) PROGRAM_NAME); mOptions.VfrFileName[0] = '\0'; mOptions.RecordListFile[0] = '\0'; mOptions.CreateRecordListFile = FALSE; mOptions.CreateIfrPkgFile = FALSE; mOptions.PkgOutputFileName[0] = '\0'; mOptions.COutputFileName[0] = '\0'; mOptions.OutputDirectory[0] = '\0'; mOptions.PreprocessorOutputFileName[0] = '\0'; mOptions.VfrBaseFileName[0] = '\0'; mOptions.IncludePaths = NULL; mOptions.SkipCPreprocessor = TRUE; mOptions.CPreprocessorOptions = NULL; mOptions.CompatibleMode = FALSE; mOptions.HasOverrideClassGuid = FALSE; mOptions.WarningAsError = FALSE; memset (&mOptions.OverrideClassGuid, 0, sizeof (EFI_GUID)); if (Argc == 1) { Usage (); SET_RUN_STATUS (STATUS_DEAD); return; } for (Index = 1; (Index < Argc) && (Argv[Index][0] == '-'); Index++) { if ((stricmp(Argv[Index], "-h") == 0) || (stricmp(Argv[Index], "--help") == 0)) { Usage (); SET_RUN_STATUS (STATUS_DEAD); return; } else if (stricmp(Argv[Index], "-l") == 0) { mOptions.CreateRecordListFile = TRUE; gCIfrRecordInfoDB.TurnOn (); } else if (stricmp(Argv[Index], "-i") == 0) { Index++; if ((Index >= Argc) || (Argv[Index][0] == '-')) { DebugError (NULL, 0, 1001, "Missing option", "-i missing path argument"); goto Fail; } AppendIncludePath(Argv[Index]); } else if (stricmp(Argv[Index], "-o") == 0 || stricmp(Argv[Index], "--output-directory") == 0 || stricmp(Argv[Index], "-od") == 0) { Index++; if ((Index >= Argc) || (Argv[Index][0] == '-')) { DebugError (NULL, 0, 1001, "Missing option", "-o missing output directory name"); goto Fail; } strcpy (mOptions.OutputDirectory, Argv[Index]); CHAR8 lastChar = mOptions.OutputDirectory[strlen(mOptions.OutputDirectory) - 1]; if ((lastChar != '/') && (lastChar != '\\')) { if (strchr(mOptions.OutputDirectory, '/') != NULL) { strcat (mOptions.OutputDirectory, "/"); } else { strcat (mOptions.OutputDirectory, "\\"); } } DebugMsg (NULL, 0, 9, (CHAR8 *) "Output Directory", mOptions.OutputDirectory); } else if (stricmp(Argv[Index], "-b") == 0 || stricmp(Argv[Index], "--create-ifr-package") == 0 || stricmp(Argv[Index], "-ibin") == 0) { mOptions.CreateIfrPkgFile = TRUE; } else if (stricmp(Argv[Index], "-n") == 0 || stricmp(Argv[Index], "--no-pre-processing") == 0 || stricmp(Argv[Index], "-nopp") == 0) { mOptions.SkipCPreprocessor = TRUE; } else if (stricmp(Argv[Index], "-f") == 0 || stricmp(Argv[Index], "--pre-processing-flag") == 0 || stricmp(Argv[Index], "-ppflag") == 0) { Index++; if ((Index >= Argc) || (Argv[Index][0] == '-')) { DebugError (NULL, 0, 1001, "Missing option", "-od - missing C-preprocessor argument"); goto Fail; } AppendCPreprocessorOptions (Argv[Index]); } else if (stricmp(Argv[Index], "-c") == 0 || stricmp(Argv[Index], "--compatible-framework") == 0) { mOptions.CompatibleMode = TRUE; } else if (stricmp(Argv[Index], "-s") == 0|| stricmp(Argv[Index], "--string-db") == 0) { Index++; if ((Index >= Argc) || (Argv[Index][0] == '-')) { DebugError (NULL, 0, 1001, "Missing option", "-s missing input string file name"); goto Fail; } gCVfrStringDB.SetStringFileName(Argv[Index]); DebugMsg (NULL, 0, 9, (CHAR8 *) "Input string file path", Argv[Index]); } else if ((stricmp (Argv[Index], "-g") == 0) || (stricmp (Argv[Index], "--guid") == 0)) { Index++; Status = StringToGuid (Argv[Index], &mOptions.OverrideClassGuid); if (EFI_ERROR (Status)) { DebugError (NULL, 0, 1000, "Invalid format:", "%s", Argv[Index]); goto Fail; } mOptions.HasOverrideClassGuid = TRUE; } else if (stricmp(Argv[Index], "-w") == 0 || stricmp(Argv[Index], "--warning-as-error") == 0) { mOptions.WarningAsError = TRUE; } else { DebugError (NULL, 0, 1000, "Unknown option", "unrecognized option %s", Argv[Index]); goto Fail; } } if (Index != Argc - 1) { DebugError (NULL, 0, 1001, "Missing option", "VFR file name is not specified."); goto Fail; } else { strcpy (mOptions.VfrFileName, Argv[Index]); } if (SetBaseFileName() != 0) { goto Fail; } if (SetPkgOutputFileName () != 0) { goto Fail; } if (SetCOutputFileName() != 0) { goto Fail; } if (SetPreprocessorOutputFileName () != 0) { goto Fail; } if (SetRecordListFileName () != 0) { goto Fail; } return; Fail: SET_RUN_STATUS (STATUS_DEAD); mOptions.VfrFileName[0] = '\0'; mOptions.RecordListFile[0] = '\0'; mOptions.CreateRecordListFile = FALSE; mOptions.CreateIfrPkgFile = FALSE; mOptions.PkgOutputFileName[0] = '\0'; mOptions.COutputFileName[0] = '\0'; mOptions.OutputDirectory[0] = '\0'; mOptions.PreprocessorOutputFileName[0] = '\0'; mOptions.VfrBaseFileName[0] = '\0'; if (mOptions.IncludePaths != NULL) { delete mOptions.IncludePaths; mOptions.IncludePaths = NULL; } if (mOptions.CPreprocessorOptions != NULL) { delete mOptions.CPreprocessorOptions; mOptions.CPreprocessorOptions = NULL; } }
static STATUS ProcessArgs ( int Argc, char *Argv[] ) /*++ Routine Description: Process the command line arguments Arguments: As per standard C main() Returns: STATUS_SUCCESS - if successful STATUS_ERROR - otherwise --*/ { FILE_NAME_LIST *NewList; STATUS Status; Status = STATUS_SUCCESS; memset ((void *) &mGlobals, 0, sizeof (mGlobals)); // // Skip program name // Argc--; Argv++; if (Argc == 0) { Usage (); return STATUS_ERROR; } if (_stricmp (Argv[0], "-h") == 0 || _stricmp (Argv[0], "-?") == 0) { Usage (); return STATUS_ERROR; } // // Process until no more args. // while (Argc > 0) { if (_stricmp (Argv[0], "-rc") == 0) { Argc--; Argv++; if (Argc == 0) { Error (UTILITY_NAME, 0, 0, "mising HII resource file name", NULL); Status = STATUS_ERROR; goto Done; } strcpy (mGlobals.ResourceFileName, Argv[0]); mGlobals.Mode |= MODE_CREATE_HII_RESOURCE_FILE; } else if (_stricmp (Argv[0], "-hii") == 0) { Argc--; Argv++; if (Argc == 0) { Error (UTILITY_NAME, 0, 0, "mising HII package list file name", NULL); Status = STATUS_ERROR; goto Done; } strcpy (mGlobals.PackageListFileName, Argv[0]); mGlobals.Mode |= MODE_CREATE_HII_PACKAGE_LIST; } else if (_stricmp (Argv[0], "-g") == 0) { Argc--; Argv++; if (Argc == 0) { Error (UTILITY_NAME, 0, 0, "mising package list GUID", NULL); Status = STATUS_ERROR; goto Done; } Status = StringToGuid (Argv[0], &mGlobals.Guid); if (Status != STATUS_SUCCESS) { goto Done; } mGlobals.GuidSpecified = TRUE; } else { // // This is a package file // NewList = malloc (sizeof (FILE_NAME_LIST)); if (NewList == NULL) { Error (UTILITY_NAME, 0, 0, "memory allocation failure", NULL); Status = STATUS_ERROR; goto Done; } memset (NewList, 0, sizeof (FILE_NAME_LIST)); strcpy (NewList->FileName, Argv[0]); if (mGlobals.PackageFile == NULL) { mGlobals.PackageFile = NewList; } else { mGlobals.LastPackageFile->Next = NewList; } mGlobals.LastPackageFile = NewList; Status = LoadPackage (NewList); if (Status != STATUS_SUCCESS) { goto Done; } } Argc--; Argv++; } if (!mGlobals.GuidSpecified) { Error (UTILITY_NAME, 0, 0, "please specify HII pakcage list GUID", NULL); Status = STATUS_ERROR; } Done: if (Status != STATUS_SUCCESS) { FreeGlobals (); } return Status; }
bool ff::Value::Convert(Type type, Value **ppValue) const { assertRetVal(ppValue, false); *ppValue = nullptr; if (type == GetType()) { *ppValue = GetAddRef(const_cast<Value *>(this)); return true; } wchar_t buf[256]; switch (GetType()) { case Type::Null: switch (type) { case Type::String: CreateString(String(L"null"), ppValue); break; } break; case Type::Bool: switch (type) { case Type::Double: CreateDouble(AsBool() ? 1.0 : 0.0, ppValue); break; case Type::Float: CreateFloat(AsBool() ? 1.0f : 0.0f, ppValue); break; case Type::Int: CreateInt(AsBool() ? 1 : 0, ppValue); break; case Type::String: CreateString(AsBool() ? String(L"true") : String(L"false"), ppValue); break; } break; case Type::Double: switch (type) { case Type::Bool: CreateBool(AsDouble() != 0, ppValue); break; case Type::Float: CreateFloat((float)AsDouble(), ppValue); break; case Type::Int: CreateInt((int)AsDouble(), ppValue); break; case Type::String: _snwprintf_s(buf, _countof(buf), _TRUNCATE, L"%g", AsDouble()); CreateString(String(buf), ppValue); break; } break; case Type::Float: switch (type) { case Type::Bool: CreateBool(AsFloat() != 0, ppValue); break; case Type::Double: CreateDouble((double)AsFloat(), ppValue); break; case Type::Int: CreateInt((int)AsFloat(), ppValue); break; case Type::String: _snwprintf_s(buf, _countof(buf), _TRUNCATE, L"%g", AsFloat()); CreateString(String(buf), ppValue); break; } break; case Type::Int: switch (type) { case Type::Bool: CreateBool(AsInt() != 0, ppValue); break; case Type::Double: CreateDouble((double)AsInt(), ppValue); break; case Type::Float: CreateFloat((float)AsInt(), ppValue); break; case Type::String: _snwprintf_s(buf, _countof(buf), _TRUNCATE, L"%d", AsInt()); CreateString(String(buf), ppValue); break; } break; case Type::Point: switch (type) { case Type::String: _snwprintf_s(buf, _countof(buf), _TRUNCATE, L"(%d,%d)", AsPoint().x, AsPoint().y); CreateString(String(buf), ppValue); break; } break; case Type::PointF: switch (type) { case Type::String: _snwprintf_s(buf, _countof(buf), _TRUNCATE, L"(%g,%g)", AsPointF().x, AsPointF().y); CreateString(String(buf), ppValue); break; } break; case Type::Rect: switch (type) { case Type::String: _snwprintf_s(buf, _countof(buf), _TRUNCATE, L"(%d,%d,%d,%d)", AsRect().left, AsRect().top, AsRect().right, AsRect().bottom); CreateString(String(buf), ppValue); break; } break; case Type::RectF: switch (type) { case Type::String: _snwprintf_s(buf, _countof(buf), _TRUNCATE, L"(%g,%g,%g,%g)", AsRectF().left, AsRectF().top, AsRectF().right, AsRectF().bottom); CreateString(String(buf), ppValue); break; } break; case Type::String: switch (type) { case Type::Bool: if (AsString().empty() || AsString() == L"false" || AsString() == L"no" || AsString() == L"0") { CreateBool(false, ppValue); } else if (AsString() == L"true" || AsString() == L"yes" || AsString() == L"1") { CreateBool(true, ppValue); } break; case Type::Double: { const wchar_t *start = AsString().c_str(); wchar_t *end = nullptr; double val = wcstod(start, &end); if (end > start && !*end) { CreateDouble(val, ppValue); } } break; case Type::Float: { const wchar_t *start = AsString().c_str(); wchar_t *end = nullptr; double val = wcstod(start, &end); if (end > start && !*end) { CreateFloat((float)val, ppValue); } } break; case Type::Int: { const wchar_t *start = AsString().c_str(); wchar_t *end = nullptr; long val = wcstol(start, &end, 10); if (end > start && !*end) { CreateInt((int)val, ppValue); } } break; case Type::Guid: { GUID guid; if (StringToGuid(AsString(), guid)) { CreateGuid(guid, ppValue); } } break; } break; case Type::Object: switch (type) { case Type::Bool: CreateBool(AsObject() != nullptr, ppValue); break; } break; case Type::Guid: switch (type) { case Type::String: CreateString(StringFromGuid(AsGuid()), ppValue); break; } break; case Type::Data: switch (type) { case Type::SavedData: { ff::ComPtr<ff::ISavedData> savedData; if (ff::CreateLoadedDataFromMemory(AsData(), false, &savedData)) { CreateSavedData(savedData, ppValue); } } break; } break; case Type::SavedData: switch (type) { case Type::Data: { ff::ComPtr<ff::ISavedData> savedData; if (AsSavedData()->Clone(&savedData)) { ff::ComPtr<ff::IData> data = savedData->Load(); if (data) { CreateData(data, ppValue); } } } break; } break; case Type::Dict: switch (type) { case Type::Data: case Type::SavedData: case Type::SavedDict: { ff::ComPtr<ff::IData> data; ff::ComPtr<ff::ISavedData> savedData; if (ff::SaveDict(AsDict(), true, false, &data)) { if (type == Type::Data) { CreateData(data, ppValue); } else if (ff::CreateLoadedDataFromMemory(data, true, &savedData)) { if (type == Type::SavedData) { CreateSavedData(savedData, ppValue); } else { CreateSavedDict(savedData, ppValue); } } } } break; } break; case Type::SavedDict: switch (type) { case Type::Data: { ff::ComPtr<ff::ISavedData> savedData; if (AsSavedData()->Clone(&savedData)) { ff::ComPtr<ff::IData> data = savedData->Load(); if (data) { CreateData(data, ppValue); } } } break; case Type::SavedData: CreateSavedData(AsSavedData(), ppValue); break; case Type::Dict: { ff::ComPtr<ff::ISavedData> savedData; if (AsSavedData()->Clone(&savedData)) { ff::ComPtr<ff::IData> data = savedData->Load(); ff::ComPtr<ff::IDataReader> dataReader; Dict dict; if (data && ff::CreateDataReader(data, 0, &dataReader) && ff::LoadDict(dataReader, dict)) { CreateDict(std::move(dict), ppValue); } } } break; } break; case Type::Resource: AsResource()->GetValue()->Convert(type, ppValue); break; case Type::IntVector: switch (type) { case Type::Point: if (AsIntVector().Size() == 2) { PointInt point( AsIntVector().GetAt(0), AsIntVector().GetAt(1)); CreatePoint(point, ppValue); } break; case Type::Rect: if (AsIntVector().Size() == 4) { RectInt rect( AsIntVector().GetAt(0), AsIntVector().GetAt(1), AsIntVector().GetAt(2), AsIntVector().GetAt(3)); CreateRect(rect, ppValue); } break; } break; case Type::FloatVector: switch (type) { case Type::PointF: if (AsFloatVector().Size() == 2) { PointFloat point( AsFloatVector().GetAt(0), AsFloatVector().GetAt(1)); CreatePointF(point, ppValue); } break; case Type::RectF: if (AsFloatVector().Size() == 4) { RectFloat rect( AsFloatVector().GetAt(0), AsFloatVector().GetAt(1), AsFloatVector().GetAt(2), AsFloatVector().GetAt(3)); CreateRectF(rect, ppValue); } break; } break; case Type::ValueVector: switch (type) { case Type::Point: if (AsValueVector().Size() == 2) { ValuePtr newValues[2]; const Vector<ValuePtr> &values = AsValueVector(); if (values[0]->Convert(Type::Int, &newValues[0]) && values[1]->Convert(Type::Int, &newValues[1])) { CreatePoint(PointInt(newValues[0]->AsInt(), newValues[1]->AsInt()), ppValue); } } break; case Type::PointF: if (AsValueVector().Size() == 2) { ValuePtr newValues[2]; const Vector<ValuePtr> &values = AsValueVector(); if (values[0]->Convert(Type::Float, &newValues[0]) && values[1]->Convert(Type::Float, &newValues[1])) { CreatePointF(PointFloat(newValues[0]->AsFloat(), newValues[1]->AsFloat()), ppValue); } } break; case Type::Rect: if (AsValueVector().Size() == 4) { ValuePtr newValues[4]; const Vector<ValuePtr> &values = AsValueVector(); if (values[0]->Convert(Type::Int, &newValues[0]) && values[1]->Convert(Type::Int, &newValues[1]) && values[2]->Convert(Type::Int, &newValues[2]) && values[3]->Convert(Type::Int, &newValues[3])) { CreateRect(RectInt( newValues[0]->AsInt(), newValues[1]->AsInt(), newValues[2]->AsInt(), newValues[3]->AsInt()), ppValue); } } break; case Type::RectF: if (AsValueVector().Size() == 4) { ValuePtr newValues[4]; const Vector<ValuePtr> &values = AsValueVector(); if (values[0]->Convert(Type::Float, &newValues[0]) && values[1]->Convert(Type::Float, &newValues[1]) && values[2]->Convert(Type::Float, &newValues[2]) && values[3]->Convert(Type::Float, &newValues[3])) { CreateRectF(RectFloat( newValues[0]->AsFloat(), newValues[1]->AsFloat(), newValues[2]->AsFloat(), newValues[3]->AsFloat()), ppValue); } } break; case Type::StringVector: { bool valid = true; Vector<String> newValues; const Vector<ValuePtr> &values = AsValueVector(); for (ValuePtr oldValue : values) { ValuePtr newValue; valid = oldValue->Convert(Type::String, &newValue); if (valid) { newValues.Push(newValue->AsString()); } else { break; } } if (valid) { CreateStringVector(std::move(newValues), ppValue); } } break; case Type::IntVector: { bool valid = true; Vector<int> newValues; const Vector<ValuePtr> &values = AsValueVector(); for (ValuePtr oldValue : values) { ValuePtr newValue; valid = oldValue->Convert(Type::Int, &newValue); if (valid) { newValues.Push(newValue->AsInt()); } else { break; } } if (valid) { CreateIntVector(std::move(newValues), ppValue); } } break; case Type::DoubleVector: { bool valid = true; Vector<double> newValues; const Vector<ValuePtr> &values = AsValueVector(); for (ValuePtr oldValue : values) { ValuePtr newValue; valid = oldValue->Convert(Type::Double, &newValue); if (valid) { newValues.Push(newValue->AsDouble()); } else { break; } } if (valid) { CreateDoubleVector(std::move(newValues), ppValue); } } break; case Type::FloatVector: { bool valid = true; Vector<float> newValues; const Vector<ValuePtr> &values = AsValueVector(); for (ValuePtr oldValue : values) { ValuePtr newValue; valid = oldValue->Convert(Type::Float, &newValue); if (valid) { newValues.Push(newValue->AsFloat()); } else { break; } } if (valid) { CreateFloatVector(std::move(newValues), ppValue); } } break; } break; } if (*ppValue) { return true; } return false; }
STDAPI RetrieveGUIDForApplication( WCHAR* szPathToGDFdll, GUID* pGUID ) { HRESULT hr; IWbemLocator* pIWbemLocator = NULL; IWbemServices* pIWbemServices = NULL; BSTR pNamespace = NULL; IEnumWbemClassObject* pEnum = NULL; bool bFound = false; CoInitialize(0); hr = CoCreateInstance( __uuidof(WbemLocator), NULL, CLSCTX_INPROC_SERVER, __uuidof(IWbemLocator), (LPVOID*) &pIWbemLocator ); if( SUCCEEDED(hr) && pIWbemLocator ) { // Using the locator, connect to WMI in the given namespace. pNamespace = SysAllocString( L"\\\\.\\root\\cimv2\\Applications\\Games" ); hr = pIWbemLocator->ConnectServer( pNamespace, NULL, NULL, 0L, 0L, NULL, NULL, &pIWbemServices ); if( SUCCEEDED(hr) && pIWbemServices != NULL ) { // Switch security level to IMPERSONATE. CoSetProxyBlanket( pIWbemServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, 0 ); BSTR bstrQueryType = SysAllocString( L"WQL" ); // Double up the '\' marks for the WQL query WCHAR szDoubleSlash[2048]; int iDest = 0, iSource = 0; for( ;; ) { if( szPathToGDFdll[iSource] == 0 || iDest > 2000 ) break; szDoubleSlash[iDest] = szPathToGDFdll[iSource]; if( szPathToGDFdll[iSource] == L'\\' ) { iDest++; szDoubleSlash[iDest] = L'\\'; } iDest++; iSource++; } szDoubleSlash[iDest] = 0; WCHAR szQuery[1024]; StringCchPrintf( szQuery, 1024, L"SELECT * FROM GAME WHERE GDFBinaryPath = \"%s\"", szDoubleSlash ); BSTR bstrQuery = SysAllocString( szQuery ); hr = pIWbemServices->ExecQuery( bstrQueryType, bstrQuery, WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnum ); if( SUCCEEDED(hr) ) { IWbemClassObject* pGameClass = NULL; DWORD uReturned = 0; BSTR pPropName = NULL; // Get the first one in the list hr = pEnum->Next( 5000, 1, &pGameClass, &uReturned ); if( SUCCEEDED(hr) && uReturned != 0 && pGameClass != NULL ) { VARIANT var; // Get the InstanceID string pPropName = SysAllocString( L"InstanceID" ); hr = pGameClass->Get( pPropName, 0L, &var, NULL, NULL ); if( SUCCEEDED(hr) && var.vt == VT_BSTR ) { bFound = true; if( pGUID ) StringToGuid( pGUID, (const char *)var.cVal ); } if( pPropName ) SysFreeString( pPropName ); } SAFE_RELEASE( pGameClass ); } SAFE_RELEASE( pEnum ); } if( pNamespace ) SysFreeString( pNamespace ); SAFE_RELEASE( pIWbemServices ); } SAFE_RELEASE( pIWbemLocator ); #ifdef SHOW_DEBUG_MSGBOXES WCHAR sz[1024]; StringCchPrintf( sz, 1024, L"szPathToGDFdll=%s bFound=%d", szPathToGDFdll, bFound ); MessageBox( NULL, sz, L"RetrieveGUIDForApplicationW", MB_OK ); #endif return (bFound) ? S_OK : E_FAIL; }