windows-nt/Source/XPSP1/NT/base/screg/winreg/cntrtext/common/mofcomp.cpp
2020-09-26 16:20:57 +08:00

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;
}