//+-------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1994 - 1997. // // File: rsoputil.cpp // // Contents: helper functions for working with the RSOP databases // // History: 10-18-1999 stevebl Created // //--------------------------------------------------------------------------- #include "main.h" #include "rsoputil.h" #pragma warning(4:4535) // set_se_translator used w/o /EHa from sdkinc\provexce.h #include "wbemtime.h" //+-------------------------------------------------------------------------- // // Function: SetParameter // // Synopsis: sets a paramter's value in a WMI parameter list // // Arguments: [pInst] - instance on which to set the value // [szParam] - the name of the parameter // [xData] - the data // // History: 10-08-1999 stevebl Created // // Notes: There may be several flavors of this procedure, one for // each data type. // //--------------------------------------------------------------------------- HRESULT SetParameter(IWbemClassObject * pInst, TCHAR * szParam, TCHAR * szData) { VARIANT var; HRESULT hr = S_OK; var.vt = VT_BSTR; var.bstrVal = SysAllocString(szData); hr = pInst->Put(szParam, 0, &var, 0); SysFreeString(var.bstrVal); return hr; } HRESULT SetParameter(IWbemClassObject * pInst, TCHAR * szParam, SAFEARRAY * psa) { VARIANT var; HRESULT hr = S_OK; var.vt = VT_BSTR | VT_ARRAY; var.parray = psa; hr = pInst->Put(szParam, 0, &var, 0); return hr; } HRESULT SetParameter(IWbemClassObject * pInst, TCHAR * szParam, UINT uiData) { VARIANT var; HRESULT hr = S_OK; var.vt = VT_I4; var.lVal = uiData; hr = pInst->Put(szParam, 0, &var, 0); return hr; } //+-------------------------------------------------------------------------- // // Function: SetParameterToNull // // Synopsis: sets a paramter's value in a WMI parameter list to null // // Arguments: [pInst] - instance on which to set the value // [szParam] - the name of the parameter // // History: 03-01-2000 ericflo Created // // Notes: // //--------------------------------------------------------------------------- HRESULT SetParameterToNull(IWbemClassObject * pInst, TCHAR * szParam) { VARIANT var; var.vt = VT_NULL; return (pInst->Put(szParam, 0, &var, 0)); } //+-------------------------------------------------------------------------- // // Function: GetParameter // // Synopsis: retrieves a parameter value from a WMI paramter list // // Arguments: [pInst] - instance to get the paramter value from // [szParam] - the name of the paramter // [xData] - [out] data // // History: 10-08-1999 stevebl Created // // Notes: There are several flavors of this procedure, one for each // data type. // //--------------------------------------------------------------------------- HRESULT GetParameter(IWbemClassObject * pInst, TCHAR * szParam, TCHAR * &szData) { VARIANT var; HRESULT hr = S_OK; if (!pInst) return E_INVALIDARG; VariantInit(&var); hr = pInst->Get(szParam, 0, &var, 0, 0); if (SUCCEEDED(hr)) { if (var.vt == VT_BSTR) { if (szData) { delete [] szData; szData = NULL; } szData = new TCHAR[_tcslen(var.bstrVal) + 1]; if (szData) { _tcscpy(szData, var.bstrVal); } else { hr = E_OUTOFMEMORY; } } else { hr = E_UNEXPECTED; } } VariantClear(&var); return hr; } HRESULT GetParameterBSTR(IWbemClassObject * pInst, TCHAR * szParam, BSTR &bstrData) { VARIANT var; HRESULT hr = S_OK; if (!pInst) return E_INVALIDARG; VariantInit(&var); hr = pInst->Get(szParam, 0, &var, 0, 0); if (SUCCEEDED(hr)) { if (var.vt == VT_BSTR) { if (bstrData) { SysFreeString(bstrData); } bstrData = SysAllocStringLen(var.bstrVal, SysStringLen(var.bstrVal)); if (NULL == bstrData) { hr = E_OUTOFMEMORY; } } else { hr = E_UNEXPECTED; } } VariantClear(&var); return hr; } HRESULT GetParameter(IWbemClassObject * pInst, TCHAR * szParam, BOOL &fData) { VARIANT var; HRESULT hr = S_OK; if (!pInst) return E_INVALIDARG; VariantInit(&var); hr = pInst->Get(szParam, 0, &var, 0, 0); if (SUCCEEDED(hr)) { if (var.vt == VT_BOOL) { fData = var.bVal; } else { hr = E_UNEXPECTED; } } VariantClear(&var); return hr; } HRESULT GetParameter(IWbemClassObject * pInst, TCHAR * szParam, HRESULT &hrData) { VARIANT var; HRESULT hr = S_OK; if (!pInst) return E_INVALIDARG; VariantInit(&var); hr = pInst->Get(szParam, 0, &var, 0, 0); if (SUCCEEDED(hr)) { if (var.vt == VT_I4) { hrData = (HRESULT) var.lVal; } else { hr = E_UNEXPECTED; } } VariantClear(&var); return hr; } HRESULT GetParameter(IWbemClassObject * pInst, TCHAR * szParam, ULONG &ulData) { VARIANT var; HRESULT hr = S_OK; if (!pInst) return E_INVALIDARG; VariantInit(&var); hr = pInst->Get(szParam, 0, &var, 0, 0); if (SUCCEEDED(hr)) { if ((var.vt == VT_UI4) || (var.vt == VT_I4)) { ulData = var.ulVal; } else { hr = E_UNEXPECTED; } } VariantClear(&var); return hr; } HRESULT GetParameterBytes(IWbemClassObject * pInst, TCHAR * szParam, LPBYTE * lpData, DWORD *dwDataSize) { VARIANT var; HRESULT hr = S_OK; SAFEARRAY * pSafeArray; DWORD dwSrcDataSize; LPBYTE lpSrcData; if (!pInst) return E_INVALIDARG; VariantInit(&var); hr = pInst->Get(szParam, 0, &var, 0, 0); if (SUCCEEDED(hr)) { if (var.vt != VT_NULL) { pSafeArray = var.parray; dwSrcDataSize = pSafeArray->rgsabound[0].cElements; lpSrcData = (LPBYTE) pSafeArray->pvData; *lpData = (LPBYTE)LocalAlloc (LPTR, dwSrcDataSize); if (!(*lpData)) { return HRESULT_FROM_WIN32(GetLastError()); } CopyMemory (*lpData, lpSrcData, dwSrcDataSize); *dwDataSize = dwSrcDataSize; } else { hr = E_UNEXPECTED; } } VariantClear(&var); return hr; } HRESULT WINAPI ImportRSoPData (LPOLESTR lpNameSpace, LPOLESTR lpFileName) { IMofCompiler * pIMofCompiler; HRESULT hr; WBEM_COMPILE_STATUS_INFO info; // // Check args // if (!lpNameSpace) { DebugMsg((DM_WARNING, TEXT("LoadNameSpaceFromFile: Null namespace arg"))); return E_INVALIDARG; } if (!lpFileName) { DebugMsg((DM_WARNING, TEXT("LoadNameSpaceFromFile: Null filename arg"))); return E_INVALIDARG; } // // Create an instance of the mof compiler // hr = CoCreateInstance(CLSID_MofCompiler, NULL, CLSCTX_INPROC_SERVER, IID_IMofCompiler, (LPVOID *) &pIMofCompiler); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("LoadNameSpaceFromFile: CoCreateInstance failed with 0x%x"), hr)); return hr; } // // Compile the file // ZeroMemory (&info, sizeof(info)); hr = pIMofCompiler->CompileFile (lpFileName, lpNameSpace, NULL, NULL, NULL, 0, 0, 0, &info); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("LoadNameSpaceFromFile: CompileFile failed with 0x%x"), hr)); } pIMofCompiler->Release(); return hr; } BOOL WriteMofFile (HANDLE hFile, LPTSTR lpData) { DWORD dwBytesWritten, dwAnsiDataSize, dwByteCount, dwLFCount = 0; LPSTR lpAnsiData; LPTSTR lpTemp, lpRealData, lpDest; // // The lpData argument contains linefeed characters only. We need to convert // these to CR LF characters. Loop through the data to determine how many LFs // need to be converted. // lpTemp = lpData; while (*lpTemp) { if (*lpTemp == 0x0A) { dwLFCount++; } lpTemp++; } // // Allocate a new buffer to hold the string plus CR characters // lpRealData = (LPTSTR) LocalAlloc (LPTR, (lstrlen(lpData) + dwLFCount + 1) * sizeof(TCHAR)); if (!lpRealData) { DebugMsg((DM_WARNING, TEXT("WriteMofFile: LocalAlloc failed with %d"), GetLastError())); return FALSE; } // // Copy the string replacing LF with CRLF as we find them // lpDest = lpRealData; lpTemp = lpData; while (*lpTemp) { if (*lpTemp == 0x0A) { *lpDest = 0x0D; lpDest++; } *lpDest = *lpTemp; lpDest++; lpTemp++; } // // Allocate a buffer to hold the ANSI data // dwAnsiDataSize = lstrlen (lpRealData) * 2; lpAnsiData = (LPSTR) LocalAlloc (LPTR, dwAnsiDataSize); if (!lpAnsiData) { DebugMsg((DM_WARNING, TEXT("WriteMofFile: LocalAlloc failed with %d"), GetLastError())); LocalFree (lpRealData); return FALSE; } // // Convert the buffer // dwByteCount = (DWORD) WideCharToMultiByte (CP_ACP, 0, lpRealData, lstrlen(lpRealData), lpAnsiData, dwAnsiDataSize, NULL, NULL); LocalFree (lpRealData); if (!dwByteCount) { DebugMsg((DM_WARNING, TEXT("WriteMofFile: WriteFile failed with %d"), GetLastError())); LocalFree (lpAnsiData); return FALSE; } // // Write the mof description to the file // if (!WriteFile (hFile, lpAnsiData, dwByteCount, &dwBytesWritten, NULL)) { DebugMsg((DM_WARNING, TEXT("WriteMofFile: WriteFile failed with %d"), GetLastError())); LocalFree (lpAnsiData); return FALSE; } LocalFree (lpAnsiData); // // Make sure it was all written to the file // if (dwByteCount != dwBytesWritten) { DebugMsg((DM_WARNING, TEXT("WriteMofFile: Failed to write the correct amount of data."))); SetLastError(ERROR_INVALID_DATA); return FALSE; } return TRUE; } HRESULT EnumInstances (IWbemServices * pIWbemServices, BSTR pClassName, HANDLE hFile) { IWbemClassObject *pObjects[2], *pObject; IEnumWbemClassObject *pEnum = NULL; ULONG ulCount; HRESULT hr; BSTR bstrClass; DWORD dwError; // // Create the instance enumerator // hr = pIWbemServices->CreateInstanceEnum (pClassName, WBEM_FLAG_DEEP | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnum); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("EnumInstances: CreateInstanceEnum failed with 0x%x"), hr)); return hr; } // // Walk through the list // while (pEnum->Next(WBEM_INFINITE, 1, pObjects, &ulCount) == S_OK) { pObject = pObjects[0]; // // Get the mof description of this class // hr = pObject->GetObjectText (0, &bstrClass); pObject->Release(); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("EnumInstances: GetObjectText failed with 0x%x"), hr)); pEnum->Release(); return hr; } // // Write the mof description to the file // if (!WriteMofFile (hFile, bstrClass)) { dwError = GetLastError(); DebugMsg((DM_WARNING, TEXT("EnumInstances: WriteMofFile failed with %d"), dwError)); SysFreeString (bstrClass); pEnum->Release(); return HRESULT_FROM_WIN32(dwError); } SysFreeString (bstrClass); } pEnum->Release(); return hr; } HRESULT EnumNameSpace (IWbemServices * pIWbemServices, HANDLE hFile) { IWbemClassObject *pObjects[2], *pObject; IEnumWbemClassObject *pEnum = NULL; ULONG ulCount; HRESULT hr; VARIANT var; BSTR bstrClass; DWORD dwError; // // Create the class enumerator // hr = pIWbemServices->CreateClassEnum (NULL, WBEM_FLAG_DEEP | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnum); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("EnumNameSpace: CreateClassEnum failed with 0x%x"), hr)); return hr; } // // Walk through the list // while (pEnum->Next(WBEM_INFINITE, 1, pObjects, &ulCount) == S_OK) { pObject = pObjects[0]; // // Get the class name // hr = pObject->Get (TEXT("__CLASS"), 0, &var, NULL, NULL); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("EnumNameSpace: Failed to get class name with 0x%x"), hr)); pEnum->Release(); return hr; } // // Check if this is a system class. System classes start with "_" // if (var.bstrVal[0] != TEXT('_')) { // // Get the mof description of this class // hr = pObject->GetObjectText (0, &bstrClass); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("EnumNameSpace: GetObjectText failed with 0x%x"), hr)); VariantClear (&var); pEnum->Release(); return hr; } // // Write the mof description to the file // if (!WriteMofFile (hFile, bstrClass)) { dwError = GetLastError(); DebugMsg((DM_WARNING, TEXT("EnumNameSpace: WriteMofFile failed with %d"), dwError)); SysFreeString (bstrClass); VariantClear (&var); pEnum->Release(); return HRESULT_FROM_WIN32(dwError); } SysFreeString (bstrClass); // // Now enumerate the instances of this class // hr = EnumInstances (pIWbemServices, var.bstrVal, hFile); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("EnumNameSpace: EnumInstances failed with 0x%x"), hr)); VariantClear (&var); pEnum->Release(); return hr; } } VariantClear (&var); } pEnum->Release(); return hr; } HRESULT WINAPI ExportRSoPData (LPTSTR lpNameSpace, LPTSTR lpFileName) { IWbemLocator *pIWbemLocator; IWbemServices *pIWbemServices; HANDLE hFile; HRESULT hr; DWORD dwError; // // Open the data file // hFile = CreateFile (lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { dwError = GetLastError(); DebugMsg((DM_WARNING, TEXT("ExportRSoPData: CreateFile for %s failed with %d"), lpFileName, dwError)); return HRESULT_FROM_WIN32(dwError); } // // Create a locater instance // hr = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pIWbemLocator); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("ExportRSoPData: CoCreateInstance failed with 0x%x"), hr)); CloseHandle (hFile); return hr; } // // Connect to the server // hr = pIWbemLocator->ConnectServer(lpNameSpace, NULL, NULL, 0, 0, NULL, NULL, &pIWbemServices); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("ExportRSoPData: ConnectServer to %s failed with 0x%x"), lpNameSpace, hr)); pIWbemLocator->Release(); CloseHandle (hFile); return hr; } // // Enumerate the classes and instances // hr = EnumNameSpace (pIWbemServices, hFile); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("ExportRSoPData: EnumNameSpace failed with 0x%x"), hr)); } CloseHandle (hFile); pIWbemServices->Release(); pIWbemLocator->Release(); return hr; } //****************************************************************************** // // Function: WbemTimeToSystemTime // // Description: // // Parameters: // // Return: // // History: 08-16-2000 stevebl rewrote to use WBEMTime class // //****************************************************************************** HRESULT WbemTimeToSystemTime(XBStr& xbstrWbemTime, SYSTEMTIME& sysTime) { HRESULT hr = E_FAIL; WBEMTime wt(xbstrWbemTime); if (wt.GetSYSTEMTIME(&sysTime)) { hr = S_OK; } return hr; }