用C++监视磁盘活动进程信息
2023-11-18 04:38:57
一、目的
为了实现监控磁盘活动的进程信息(微软自带资源监视器软件)
二、了解ETW
ETW是Event Tracing for Windows的简称,它是Windows提供的原生的事件跟踪日志系统。由微软开发,用于在Windows操作系统中记录和分析事件。ETW提供了一种机制,可以让开发人员将事件记录到一个中央存储库中,然后可以使用各种工具来分析这些事件。
三、使用ETW监视磁盘活动进程信息
为了使用ETW监视磁盘活动进程信息,我们需要完成以下几个步骤:
- 创建一个ETW事件提供程序。
- 使用C++代码来记录ETW事件。
- 使用微软自带的资源监视器软件来查看ETW事件。
四、创建ETW事件提供程序
要创建ETW事件提供程序,我们需要使用ETW API。ETW API是一个C++库,它提供了创建和管理ETW事件提供程序所需的函数。
首先,我们需要创建一个ETW事件提供程序对象。可以使用以下代码来创建ETW事件提供程序对象:
#include <windows.h>
#include <evntprov.h>
DEFINE_GUID(MyProviderGuid, 0x12345678, 0x9abc, 0xdef0, 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0);
int main()
{
// 创建ETW事件提供程序对象
EVENT_REGISTER_INFO eri = { 0 };
eri.Enabled = TRUE;
eri.FinalRegistrationCallback = NULL;
eri.Flags = EVENT_REGISTER_FLAG_PARAMETERIZED_TYPE;
eri.Guid = MyProviderGuid;
eri.Locale = USER_DEFAULT_LANGID;
eri.MatchAnyKeyword = 0;
eri.MaximumBuffersPerProvider = 16;
eri.MemoryBufferSize = 64 * 1024;
eri.MinimaConsumers = 1;
eri.MinimumBuffers = 2;
eri.ProviderContext = NULL;
eri.ProviderName = L"MyProvider";
eri.SecurityDescriptor = NULL;
LPCWSTR messageFile = L"MyProvider.dll";
LPCWSTR messageResourceId = L"MyProviderMessages";
// 注册ETW事件提供程序
HANDLE providerHandle;
DWORD status = EventRegister(&eri, &providerHandle);
if (status != ERROR_SUCCESS)
{
printf("Error registering ETW event provider: %d\n", status);
return 1;
}
// 释放ETW事件提供程序对象
EventUnregister(providerHandle);
return 0;
}
在上面的代码中,我们使用EventRegister函数来注册ETW事件提供程序。EventRegister函数的第一个参数是EVENT_REGISTER_INFO结构,它包含了ETW事件提供程序的信息。第二个参数是ETW事件提供程序的句柄。
五、使用C++代码来记录ETW事件
要使用C++代码来记录ETW事件,我们需要使用ETW API。ETW API提供了一系列函数,我们可以使用这些函数来记录ETW事件。
首先,我们需要创建一个ETW事件。可以使用以下代码来创建一个ETW事件:
EVENT_DATA_DESCRIPTOR edd[] = {
{ "DiskActivityType", 0, 0, 0, 0 },
{ "DiskDeviceName", 0, 0, 0, 0 },
{ "DiskBytesTransferred", 0, 0, 0, 0 },
{ "DiskRequestSize", 0, 0, 0, 0 },
{ "DiskRequestOffset", 0, 0, 0, 0 },
{ "DiskReadOrWrite", 0, 0, 0, 0 },
{ "DiskReadOrWriteLength", 0, 0, 0, 0 }
};
BYTE data[] = {
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0
};
EVENT_HEADER eh = {
sizeof(EVENT_HEADER),
EVENT_TYPE_INFORMATION,
0,
0,
MyProviderGuid
};
// 记录ETW事件
DWORD status = EventWrite(providerHandle, &eh, sizeof(edd) / sizeof(EVENT_DATA_DESCRIPTOR), edd, sizeof(data), data);
if (status != ERROR_SUCCESS)
{
printf("Error writing ETW event: %d\n", status);
return 1;
}
在上面的代码中,我们使用EventWrite函数来记录ETW事件。EventWrite函数的第一个参数是ETW事件提供程序的句柄。第二个参数是ETW事件的头部。第三个参数是ETW事件的数据符的数组。第四个参数是ETW事件的数据。第五个参数是ETW事件的数据的大小。第六个参数是ETW事件的句柄。
六、使用微软自带的资源监视器软件来查看ETW事件
要使用微软自带的资源监视器软件来查看ETW事件,我们需要执行以下步骤:
- 打开资源监视器软件。
- 单击“性能”选项卡。
- 在“数据收集器集”下拉列表中,选择“ETW事件”。
- 在“事件提供程序”列表中,选择您要查看的ETW事件提供程序。
- 单击“启动”按钮。
现在,您就可以在资源监视器软件中查看ETW事件了。