windows驱动开发14.驱动与应用程序异步通信
驱动与应用程序异步通信1.驱动与应用异步通信是什么?驱动与应用程序的异步通信是指应用程序向驱动程序发送请求后,驱动程序并不立即返回响应,而是继续执行其他操作,直到请求处理完成,驱动程序才通知应用程序或提供结果。异步通信通常用于需要处理长时间操作或等待外部事件的场景,这样可以避免应用程序在等待时被阻塞。
异步通信的工作原理:
请求发送:应用程序通过调用 DeviceIoControl、ReadFile 或 WriteFile 等函数向驱动程序发送请求。
请求排队:驱动程序收到请求后,不会立即返回,而是将请求添加到请求队列中,继续处理其他任务或者立即返回,表示操作正在进行。
事件通知:当驱动程序完成请求的处理后,它会通过某种机制(如信号量、事件、I/O 完成端口等)通知应用程序,通常是通过回调机制或事件对象。
获取结果:应用程序可以使用等待(如WaitForSingleObject)或轮询的方式等待通知,或者在通知到来时继续执行后续操作。
常见的异步机制:
**I/O 完成端口 (IOCP)**:用于处理大量的并发 I/O 请求,特别适用于高性能的网络或 ...
windows驱动开发13.驱动与应用程序通信
1. windows应用程序进程间怎么互相通信?方法一:共享内存
方法二:共享内存
方法三:网络通信
方法一:管道通信的完整代码管道通信需要一个服务端与一个客户端。在服务端创建管道,在客户端读取管道。
1.server.c
1234567891011121314151617181920212223// server.c : This file contains the 'main' function. Program execution begins and ends there.#include <stdio.h>#include <windows.h>int main(){ HANDLE hPipe = CreateNamedPipe(TEXT("\\\\.\\pipe\\MyPipe"), PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, 1, 1024, 1024, 0, ...
windows驱动开发12.EProcess结构体与修改进程信息
查看eprocess结构体Windows操作系统中的EPROCESS是一个关键的内核数据结构,它是Windows内核用来表示进程的执行体(Executive Process)。
EPROCESS是一个复杂的结构体,包含了与进程相关的所有信息,例如:
进程ID (PID)
父进程ID
进程创建时间
进程安全上下文
进程地址空间信息
进程拥有的对象句柄
线程列表
进程优先级
内存使用统计
各种标志和状态信息
1.windgb中查看eprocess在 WinDbg 中,你可以使用多种命令来查看和分析 EPROCESS 结构体。以下是几种常用方法:
使用 dt命令查看 EPROCESS 结构定义:
1dt nt!_EPROCESS
这会显示整个 EPROCESS 结构的布局和成员。
查看特定进程的 EPROCESS:
1!process [进程地址] 1
或者通过 PID 查看:
1!process [PID] 1
要获取当前进程的 EPROCESS 地址并查看:
12r $procdt nt!_EPROCESS @$proc
查看特定字段:
1dt nt!_EPROCESS ...
windows驱动开发11.驱动中读取内存数据
Windows中的内存地址分为几种?Windows11中内存数据分为物理内存与虚拟内存
在Windows 11(以及所有现代Windows版本)中,内存按照以下描述的方式组织:
物理内存 - 这是实际的硬件RAM,由内存条提供的实际存储空间。
虚拟内存
- 这是一个抽象层,被划分为两个主要区域:
低地址空间(用户空间):分配给应用程序使用的虚拟地址。在64位Windows系统中,用户空间通常是从0x0000000000000000到0x00007FFFFFFFFFFF,即低48位地址空间。每个进程都有自己独立的用户空间虚拟地址映射。
高地址空间(内核空间):保留给操作系统内核和驱动程序使用的虚拟地址。在64位Windows系统中,内核空间通常从0xFFFF800000000000开始,即高位地址空间。所有进程共享相同的内核空间映射。
读取物理内存地址数据1. 使用Windbg读取物理内存地址
windbg断点
输入!db命令查询地址
1!db 0x100000
带感叹号的命令读取物理内存地址,不带感叹号读取虚拟内存地址
在WinDbg中读取物理内存的常用命令:
! ...
windows驱动开发10.配置vs2022远程调试驱动环境
1.在被调试机器中安装远程工具并运行https://www.cnblogs.com/TechNomad/p/17444008.html
被调试机上也安装上 WDK 环境.
在 WDK 的安装目录下运行该工具 WDK Test Target Setup
默认路径:C:\Program Files (x86)\Windows Kits\10\Remote\x64\WDK Test Target Setup x64-x64_en-us.msi
2.在主机中添加远程机器的信息驱动项目中打开Driver install->Deployment。填入信息。
3. 编译后运行驱动项目选择远程内核调试器。
windows驱动开发9.关于打印函数的几种使用方式
1.驱动输出函数1. KdPrint函数1234567891011121314151617#include<ntifs.h>void DriverUnload(PDRIVER_OBJECT DriverObject){ KdPrint("qi:进入卸载例程DriverObject=%p");}NTSTATUS DriverEntry( _In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath){ DriverObject; RegistryPath; KdPrint("qi;进入 DriverEntry入口点DriverObject=%p\n"); return 0;}
2. DbgPrintEx函数123456789101112131415161718#include <ntifs.h>#pragma warning (disable : 4100)NTS ...
windows驱动开发8.HelloWorld驱动程序是如何一步步完整的
1.使用vs2022创建KMDF空项目
选择Kernel Mode Driver, Empty(KMDF)
源文件夹添加entry.c
entry.c添加驱动入口函数
1234int DriverEntry(){ return 0;}
编译成功,但是没什么用。
如果出现Inf2Cat错误,关闭Inf2Cat或者在Inf2Cat选项中使用本地时间。
如果出现spectre缓解错误,下载缓解库版本SKD或者在项目中关闭spectre缓解。
如果之后的驱动程序加载失败试着在项目属性->Driver Settings中设置Target Platform为Desktop。
2.使用标准入口函数
修改代码
12345678910#include <ntifs.h>NTSTATUSDriverEntry( _In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath){ return 0;}
解决报错
问题:
123Error C2 ...
windows驱动开发7.通过网络配置Windbg远程调试环境
1. 在被调试的机器中开启调试模式并在命令行设置远程端口
查看信息
1bcdedit
开启调试模式
12345bcdedit -debug onbcdedit /debug on#在设备管理器中查看busparams的值#Location PCI Slot 160 (PCI bus 3, device 0, function 0)bcdedit /set "{dbgsettings}" busparams 3.0.0
开启网络调试,ip设置为主机地址而非被调试的ip
1bcdedit /dbgsettings net hostip:192.168.1.16 port:50005 key:2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
显示信息确认
1bcdedit /dbgsettings
重启命令
1shutdown -r -t 0
如果需要windows10打开测试模式
12bcdedit /set nointegritychecks onbcdedit /set t ...
windows驱动开发6.Debuview查看Windows驱动的打印内容
Debuview查看Windows驱动的打印内容
下载DebugView.exe
DebugView下载链接
运行DriverMonitor.exe。
运行DebugView.exe。
DebugView中选中Cpature Kernel, Enable Verbose Kernel Output, Capture Events。
在DriverMonitor中点击open打开HelloWorld.sys驱动,点击go运行。
在DebugView中观察输出。
windows驱动开发5.怎么在Widows11中加载驱动程序
怎么在Widows11中加载驱动程序方法一:使用微软提供的DriverMonitor.exe加载
[DriverMonitor下载链接](http ://www.rsdown.cn/down/165643.html)
DriverMonitor中点击open加载驱动, 点击go运行驱动
方法二:使用命令行创建服务加载1234#1.创建服务#2.启动驱动#3.关闭驱动#4.卸载驱动
管理员打开cmd加载驱动
1sc create guidehacking type= kernel binpath="D:\Desktop\test\visual\studio\Hacking\Hacking\x64\Release\Hacking.sys"
使用debugView并勾选Caputure kernel
开始运行驱动
1sc start guidedhacking
cmd停止驱动
1sc stop guidedhacking
方法三:使用C语言程序调用系统命令加载✅ 使用 popen() 调用 sc 命令并获取输出的完整 C 程序
1234567 ...
