#include #include #include #include #include #include "mofcomp.h" static CONST WCHAR cszWmiLoadEventName[] = {L"WMI_SysEvent_LodCtr"}; static CONST WCHAR cszWmiUnloadEventName[] = {L"WMI_SysEvent_UnLodCtr"}; DWORD SignalWmiWithNewData (DWORD dwEventId) { HANDLE hEvent; DWORD dwStatus = ERROR_SUCCESS; LPWSTR szEventName = NULL; switch (dwEventId) { case WMI_LODCTR_EVENT: szEventName = (LPWSTR)cszWmiLoadEventName; break; case WMI_UNLODCTR_EVENT: szEventName = (LPWSTR)cszWmiUnloadEventName; break; default: dwStatus = ERROR_INVALID_PARAMETER; break; } if (dwStatus == ERROR_SUCCESS) { hEvent = OpenEventW ( EVENT_MODIFY_STATE | SYNCHRONIZE, FALSE, szEventName); if (hEvent != NULL) { // set event SetEvent (hEvent); CloseHandle (hEvent); } else { dwStatus = GetLastError(); } } return dwStatus; } DWORD LodctrCompileMofFile ( LPCWSTR szComputerName, LPCWSTR szMofFileName ) { HRESULT hRes; IMofCompiler *pMofComp = NULL; DWORD dwReturn = ERROR_SUCCESS; WBEM_COMPILE_STATUS_INFO Info; WCHAR szLocalServerName[1024]; LPWSTR szServerPath; hRes = CoInitializeEx (0, COINIT_MULTITHREADED); if (hRes == S_OK) { // open the COM interface to the mof compiler object hRes = CoCreateInstance( CLSID_MofCompiler, NULL, CLSCTX_INPROC_SERVER, IID_IMofCompiler, (LPVOID *)&pMofComp); if (hRes == S_OK) { // load mof assert (pMofComp != NULL); if (szComputerName == NULL) { szServerPath = NULL; } else { assert (lstrlenW(szComputerName) < MAX_PATH); lstrcpyW (szLocalServerName, szComputerName); lstrcatW (szLocalServerName, L"\\root\\default"); szServerPath = &szLocalServerName[0]; } hRes = pMofComp->CompileFile ( (LPWSTR)szMofFileName, NULL, // load into namespace specified in MOF file NULL, // use default User NULL, // use default Authority NULL, // use default Password 0, // no options 0, // no class flags 0, // no instance flags &Info); if (hRes != S_OK) { dwReturn = (DWORD)Info.hRes; } // close COM interface pMofComp->Release(); } else { dwReturn = (DWORD)hRes; } CoUninitialize(); } else { dwReturn = (DWORD)hRes; } return dwReturn; } DWORD LodctrCompileMofBuffer ( LPCWSTR szComputerName, LPVOID pMofBuffer, DWORD dwBufSize ) { HRESULT hRes; IMofCompiler *pMofComp = NULL; DWORD dwReturn = ERROR_SUCCESS; WBEM_COMPILE_STATUS_INFO Info; DBG_UNREFERENCED_PARAMETER (szComputerName); hRes = CoInitializeEx (0, COINIT_MULTITHREADED); if (hRes == S_OK) { // open the COM interface to the mof compiler object hRes = CoCreateInstance( CLSID_MofCompiler, NULL, CLSCTX_INPROC_SERVER, IID_IMofCompiler, (LPVOID *)&pMofComp); if (hRes == S_OK) { // load mof assert (pMofComp != NULL); hRes = pMofComp->CompileBuffer ( dwBufSize, (LPBYTE) pMofBuffer, NULL, // load into Root\Default on local mashine NULL, // use default User NULL, // use default Authority NULL, // use default Password 0, // no options WBEM_FLAG_UPDATE_FORCE_MODE, // no class flags 0, // no instance flags &Info); if (hRes != S_OK) { // return the detailed error code dwReturn = (DWORD)Info.hRes; } // close COM interface pMofComp->Release(); } else { dwReturn = (DWORD)hRes; } CoUninitialize(); } else { dwReturn = (DWORD)hRes; } return dwReturn; }