164 lines
4.5 KiB
C++
164 lines
4.5 KiB
C++
|
#include <windows.h>
|
||
|
#include <wbemidl.h>
|
||
|
#include <wbemint.h>
|
||
|
#include <assert.h>
|
||
|
#include <stdio.h>
|
||
|
#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;
|
||
|
}
|