Я написал код ниже, чтобы прослушивать события создания и удаления, когда создаются/удаляются определенные приложения, а также получать имя их процесса, идентификатор, командную строку, используя 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++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как проверить, включена ли безопасная загрузка, с помощью Python 3.12 и WMI v 1.5.1
Anonymous » » в форуме Python - 0 Ответы
- 24 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Высокая загрузка 3D, вызов OpenCL с большим буфером на настольном графическом процессоре
Anonymous » » в форуме C++ - 0 Ответы
- 40 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Высокая загрузка ЦП для вызовов API ChatGPT из программы Python [закрыто]
Anonymous » » в форуме Python - 0 Ответы
- 17 Просмотры
-
Последнее сообщение Anonymous
-