Windows内核NT驱动框架基础分析
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows内核NT驱动框架基础分析相关的知识,希望对你有一定的参考价值。
参考技术A NT驱动框架 : 安全中用的最多的就是NT驱动模型,WDM框架 : 支持热插拔功能,大多用于网卡一类的硬件
NT驱动框架主要是由:驱动入口函数,若干分发函数.驱动卸载函数组成
驱动必须有设备名和符号链接
设备对象用于接收R3的IRP.而R3只有通过符号链接,才能找到R0中的驱动.从而下发IRP请求
DriverEntry()函数主要做3件事:创建设备对象、创建符号链接、初始化和注册分发函数
// --------------------------------------------------------------控制码----------------------------------------------------------
//---------------------------------------------------------------函数体----------------------------------------------------------
delphi 应用程序与 Windows NT 系统驱动程序之间的通信
【中文标题】delphi 应用程序与 Windows NT 系统驱动程序之间的通信【英文标题】:Communication between delphi application and Windows NT system driver 【发布时间】:2010-11-29 16:19:58 【问题描述】:我正在尝试构建一个非常简单的驱动程序。它的唯一目的是注册“PsSetCreateProcessNotifyRoutine”并在从内核收到的回调中通知我的 Win32 应用程序启动和停止了哪些进程。
我只知道如何用“DriverEntry”和“DriverUnload”构建这样一个简单的驱动程序并用DDK编译它。但我不知道如何实际实现通信。我知道它可以用 IOCTL 来完成。但除此之外,我还在黑暗中。我找不到如何在 Delphi 中执行此操作的简单示例。我只知道可以做到。
所以我正在寻找的是一些简单易懂的教程,关于如何做到这一点或更好地使用带有配套驱动程序代码的示例 delphi 程序。也许还有其他的交流方式。
如有任何帮助,将不胜感激。
【问题讨论】:
Runner check this question ***.com/questions/3489501/… WMI 有ExecNotificationQuery
事件与Win32_Process
类一起可以检测进程何时启动或停止。
感谢您的信息。我一般不喜欢 WMI,但在这种情况下值得一看。司机在这里真的是一个相当激烈的选择,即使非常有效。
@RRUZ,您的评论非常好,但我接受了他自己的回答,这也很好,是实际问题的答案。
【参考方案1】:
是否在 Delphi 中并不重要。您必须使用函数 DeviceIoControl。阅读有关它的article in MSDN。
简而言之,您必须从可用集合中选择一些IOCTL codes。然后,您使用这些代码之一调用 DeviceIoControl 并传递一些数据,然后在驱动程序中处理该请求并返回其他内容。
您还可以处理标准 IOCTLS,例如在用户模式下调用 ReadFile 或 WriteFile 生成的。
不要寻找“如何在 Delphi 中执行此操作的教程”,只需寻找任何教程即可。它们都是一样的,不管是什么语言,都是纯 Win32/Native api 的东西。例如Here's one,刚刚google了一下。
【讨论】:
谢谢,去看看。我说的是 delphi 示例,因为通常您必须定义常量、函数原型等或查找已经做出的定义。如果没有必要,我不想经历这些。我不寻找捷径,只寻找已经这样做的人的知识。 JEDI (delphi-jedi.org) 提供了几乎所有 API 标头的翻译。但我认为你不需要太多的用户模式,它只是 DeviceIoControl 和标准 Win32 函数(CreateFile 等),都在 Windows.pas 中定义。以上是关于Windows内核NT驱动框架基础分析的主要内容,如果未能解决你的问题,请参考以下文章
delphi 应用程序与 Windows NT 系统驱动程序之间的通信
Windows Driver开发_NT Driver框架:The driver is not in a state to accept this command
Windows Driver开发_NT Driver框架:The driver is not in a state to accept this command