Я написал код ниже, чтобы прослушивать события создания и удаления, когда создаются/удаляются определенные приложения, а также получать имя их процесса, идентификатор, командную строку, используя WMI, NotificationQuery, ExecQuery.
Я заметил, что WmiPrvSE.exe использует «слишком много» процессора, когда моя программа «простаивает», он использует около 1,5-2%.
Мой текущий код:
#include
#include
#include
#include
#include
#include
#include
#include
#pragma comment(lib, "wbemuuid.lib")
enum EventType { QUERY, PROCESS_CREATION, PROCESS_DELETION };
class EventSink : public IWbemObjectSink
{
LONG m_lRef = 0;
public:
EventSink(){}
virtual ULONG STDMETHODCALLTYPE AddRef()
{
return InterlockedIncrement(&m_lRef);
}
virtual ULONG STDMETHODCALLTYPE Release()
{
LONG lRef = InterlockedDecrement(&m_lRef);
if(lRef == 0)
delete this;
return lRef;
}
void event(EventType eventType, const std::vector& objList)
{
for (IWbemClassObject* obj : objList)
{
DWORD processId = 0;
std::wstring processName = L"";
std::wstring commandLine = L"";
VARIANT vtProp;
HRESULT hr = obj->Get(L"Name", 0, &vtProp, 0, 0);
if (SUCCEEDED(hr) && vtProp.vt == VT_BSTR)
processName = vtProp.bstrVal;
VariantClear(&vtProp);
hr = obj->Get(L"ProcessId", 0, &vtProp, 0, 0);
if (SUCCEEDED(hr) && vtProp.vt == VT_I4)
processId = vtProp.uintVal;
VariantClear(&vtProp);
if (eventType == QUERY || eventType == PROCESS_CREATION)
{
hr = obj->Get(L"CommandLine", 0, &vtProp, 0, 0);
if (SUCCEEDED(hr) && vtProp.vt == VT_BSTR)
commandLine = vtProp.bstrVal;
VariantClear(&vtProp);
//...
}
else if (eventType == PROCESS_DELETION)
{
//...
}
obj->Release();
}
}
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppv)
{
if (riid == IID_IUnknown || riid == IID_IWbemObjectSink)
{
*ppv = (IWbemObjectSink *) this;
AddRef();
return WBEM_S_NO_ERROR;
}
else return E_NOINTERFACE;
}
HRESULT STDMETHODCALLTYPE Indicate(LONG lObjectCount, IWbemClassObject __RPC_FAR *__RPC_FAR *apObjArray)
{
std::map eventMap;
for (int i = 0; i < lObjectCount; i++)
{
VARIANT vtClass;
HRESULT hr = apObjArray->Get(L"__CLASS", 0, &vtClass, 0, 0);
if (!SUCCEEDED(hr))
continue;
bool creationEvent = (wcscmp(vtClass.bstrVal, L"__InstanceCreationEvent") == 0);
VariantClear(&vtClass);
VARIANT vtTargetInstance;
hr = apObjArray->Get(L"TargetInstance", 0, &vtTargetInstance, 0, 0);
if (!SUCCEEDED(hr) || vtTargetInstance.vt != VT_UNKNOWN)
continue;
IWbemClassObject* pTargetInstance = NULL;
hr = vtTargetInstance.punkVal->QueryInterface(IID_IWbemClassObject, (void**)&pTargetInstance);
if (!SUCCEEDED(hr))
continue;
VariantClear(&vtTargetInstance);
eventMap[creationEvent ? PROCESS_CREATION : PROCESS_DELETION].emplace_back(pTargetInstance);
}
for (auto it = eventMap.begin(); it != eventMap.end(); ++it)
{
event(it->first, it->second);
}
return WBEM_S_NO_ERROR;
}
HRESULT STDMETHODCALLTYPE SetStatus(LONG lFlags, HRESULT hResult, BSTR strParam, IWbemClassObject __RPC_FAR *pObjParam)
{
return WBEM_S_NO_ERROR;
}
};
class ProcessMonitor
{
public:
ProcessMonitor()
{
HRESULT hres = CoInitializeEx(0, COINIT_MULTITHREADED);
IWbemLocator* pLoc = NULL;
hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc);
if (FAILED(hres))
{
std::cout
Подробнее здесь: https://stackoverflow.com/questions/783 ... -to-events
Высокая загрузка процессора WMI при прослушивании событий ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1713274556
Anonymous
Я написал код ниже, чтобы прослушивать события создания и удаления, когда создаются/удаляются определенные приложения, а также получать имя их процесса, идентификатор, командную строку, используя WMI, NotificationQuery, ExecQuery.
Я заметил, что WmiPrvSE.exe использует «слишком много» процессора, когда моя программа «простаивает», он использует около 1,5-2%.
Мой текущий код:
#include
#include
#include
#include
#include
#include
#include
#include
#pragma comment(lib, "wbemuuid.lib")
enum EventType { QUERY, PROCESS_CREATION, PROCESS_DELETION };
class EventSink : public IWbemObjectSink
{
LONG m_lRef = 0;
public:
EventSink(){}
virtual ULONG STDMETHODCALLTYPE AddRef()
{
return InterlockedIncrement(&m_lRef);
}
virtual ULONG STDMETHODCALLTYPE Release()
{
LONG lRef = InterlockedDecrement(&m_lRef);
if(lRef == 0)
delete this;
return lRef;
}
void event(EventType eventType, const std::vector& objList)
{
for (IWbemClassObject* obj : objList)
{
DWORD processId = 0;
std::wstring processName = L"";
std::wstring commandLine = L"";
VARIANT vtProp;
HRESULT hr = obj->Get(L"Name", 0, &vtProp, 0, 0);
if (SUCCEEDED(hr) && vtProp.vt == VT_BSTR)
processName = vtProp.bstrVal;
VariantClear(&vtProp);
hr = obj->Get(L"ProcessId", 0, &vtProp, 0, 0);
if (SUCCEEDED(hr) && vtProp.vt == VT_I4)
processId = vtProp.uintVal;
VariantClear(&vtProp);
if (eventType == QUERY || eventType == PROCESS_CREATION)
{
hr = obj->Get(L"CommandLine", 0, &vtProp, 0, 0);
if (SUCCEEDED(hr) && vtProp.vt == VT_BSTR)
commandLine = vtProp.bstrVal;
VariantClear(&vtProp);
//...
}
else if (eventType == PROCESS_DELETION)
{
//...
}
obj->Release();
}
}
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppv)
{
if (riid == IID_IUnknown || riid == IID_IWbemObjectSink)
{
*ppv = (IWbemObjectSink *) this;
AddRef();
return WBEM_S_NO_ERROR;
}
else return E_NOINTERFACE;
}
HRESULT STDMETHODCALLTYPE Indicate(LONG lObjectCount, IWbemClassObject __RPC_FAR *__RPC_FAR *apObjArray)
{
std::map eventMap;
for (int i = 0; i < lObjectCount; i++)
{
VARIANT vtClass;
HRESULT hr = apObjArray[i]->Get(L"__CLASS", 0, &vtClass, 0, 0);
if (!SUCCEEDED(hr))
continue;
bool creationEvent = (wcscmp(vtClass.bstrVal, L"__InstanceCreationEvent") == 0);
VariantClear(&vtClass);
VARIANT vtTargetInstance;
hr = apObjArray[i]->Get(L"TargetInstance", 0, &vtTargetInstance, 0, 0);
if (!SUCCEEDED(hr) || vtTargetInstance.vt != VT_UNKNOWN)
continue;
IWbemClassObject* pTargetInstance = NULL;
hr = vtTargetInstance.punkVal->QueryInterface(IID_IWbemClassObject, (void**)&pTargetInstance);
if (!SUCCEEDED(hr))
continue;
VariantClear(&vtTargetInstance);
eventMap[creationEvent ? PROCESS_CREATION : PROCESS_DELETION].emplace_back(pTargetInstance);
}
for (auto it = eventMap.begin(); it != eventMap.end(); ++it)
{
event(it->first, it->second);
}
return WBEM_S_NO_ERROR;
}
HRESULT STDMETHODCALLTYPE SetStatus(LONG lFlags, HRESULT hResult, BSTR strParam, IWbemClassObject __RPC_FAR *pObjParam)
{
return WBEM_S_NO_ERROR;
}
};
class ProcessMonitor
{
public:
ProcessMonitor()
{
HRESULT hres = CoInitializeEx(0, COINIT_MULTITHREADED);
IWbemLocator* pLoc = NULL;
hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc);
if (FAILED(hres))
{
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/78334917/high-wmi-cpu-usage-when-listening-to-events[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия