返回

用C++监视磁盘活动进程信息

闲谈

一、目的

为了实现监控磁盘活动的进程信息(微软自带资源监视器软件)

二、了解ETW

ETW是Event Tracing for Windows的简称,它是Windows提供的原生的事件跟踪日志系统。由微软开发,用于在Windows操作系统中记录和分析事件。ETW提供了一种机制,可以让开发人员将事件记录到一个中央存储库中,然后可以使用各种工具来分析这些事件。

三、使用ETW监视磁盘活动进程信息

为了使用ETW监视磁盘活动进程信息,我们需要完成以下几个步骤:

  1. 创建一个ETW事件提供程序。
  2. 使用C++代码来记录ETW事件。
  3. 使用微软自带的资源监视器软件来查看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事件,我们需要执行以下步骤:

  1. 打开资源监视器软件。
  2. 单击“性能”选项卡。
  3. 在“数据收集器集”下拉列表中,选择“ETW事件”。
  4. 在“事件提供程序”列表中,选择您要查看的ETW事件提供程序。
  5. 单击“启动”按钮。

现在,您就可以在资源监视器软件中查看ETW事件了。