Высокая загрузка процессора WMI при прослушивании событийC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Высокая загрузка процессора WMI при прослушивании событий

Сообщение 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->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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как проверить, включена ли безопасная загрузка, с помощью Python 3.12 и WMI v 1.5.1
    Anonymous » » в форуме Python
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Высокая загрузка ЦП на Raspberry PI при чтении сетевого потока с помощью .NET
    Гость » » в форуме Linux
    0 Ответы
    27 Просмотры
    Последнее сообщение Гость
  • Высокая загрузка ЦП в FiddlerCore4 при большом количестве запросов.
    Anonymous » » в форуме C#
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Высокая загрузка 3D, вызов OpenCL с большим буфером на настольном графическом процессоре
    Anonymous » » в форуме C++
    0 Ответы
    40 Просмотры
    Последнее сообщение Anonymous
  • Высокая загрузка ЦП для вызовов API ChatGPT из программы Python [закрыто]
    Anonymous » » в форуме Python
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»