mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
164 lines
4.5 KiB
164 lines
4.5 KiB
#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;
|
|
}
|