如何从 Windows 驱动程序(又名内核空间)确定 CPU 和内存消耗

Posted

技术标签:

【中文标题】如何从 Windows 驱动程序(又名内核空间)确定 CPU 和内存消耗【英文标题】:How to determine CPU and memory consumption from Windows driver (aka kernel space) 【发布时间】:2014-05-20 11:50:49 【问题描述】:

这个问题其实很简单的表述:我需要从Windows下的内核模式驱动中知道当前整个系统的CPU和内存消耗。 当然,我看过related question 并尝试过这段代码。结果不好:用于开发驱动程序的 Visual Studio 2013 环境不知道上述示例中的任何标头。例如:

#include "windows.h"

MEMORYSTATUSEX memInfo;
memInfo.dwLength = sizeof(MEMORYSTATUSEX);
GlobalMemoryStatusEx(&memInfo);
DWORDLONG totalVirtualMem = memInfo.ullTotalPageFile;

上面的代码没有编译。 我仔细检查了MSDN中几乎所有的“Kernel-Mode Driver Reference”搜索类似的功能,但没有成功。

那么,有谁知道如何从 Windows 下的内核模式驱动程序中获取相同的信息?

或者这是不可能的? (如果属实,这很奇怪。)

【问题讨论】:

您不能在内核模式下使用 Win32 API。您必须使用内核 API 函数。检查 WDK 文档。 记录的 WDK 函数专注于驱动程序应该做的事情。这不是在操作系统中创建操作系统。 NtQueryInformation() 也许,它没有记录,并且在不同的 Windows 版本中可能会有所不同。 最后看来,在用户空间实现服务进程是最简单的解决方案:它定期提供有关 CPU 和内存消耗的驱动程序数据。 【参考方案1】:

驱动程序无法使用这些 API,因此您的尝试没有构建也就不足为奇了。

内核模式驱动程序中的内存管理比用户模式应用程序中的要复杂得多。您应该调查pool tracking,看看是否有办法使用它为您提供所需的信息。

【讨论】:

以上是关于如何从 Windows 驱动程序(又名内核空间)确定 CPU 和内存消耗的主要内容,如果未能解决你的问题,请参考以下文章

POSIX 消息队列通过内核空间?

如何从内核模块向用户空间应用程序发送“信号”?

Windows内核学习笔记之浅析系统调用

如何从内核空间中缩小 Linux 页面缓存?

如何从 Windows 内核驱动程序获取设备实例路径?

如何从内核向用户空间发送信号