添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

默认情况下,进程内存有一半为内核所有,一半为进程本身所有。但是因为 r3 的进程在不断的切换,所以不能在 r0 直接分配一个低位的内存(你不知道现在正在哪个进程的高位中)。

当然,使用 KeStackAttachProcess 附加到指定的进程上操作内存(读/写),最后再使用 KeUnstackDetachProcess 脱离进程,这样也可以实现 r0 和 r3 通信,但更推荐使用 MDL 的方式对将同一块物理内存同时映射到 r0 和 r3,这样我们只需要使用 DeviceIoControl 向驱动发送一个指针就可以 “一劳永逸” 的实现通信了(也不需要担心 IRP Hook 的风险)。

实现方式有两种: (代码来自网络)

  • 用户态进程分配空间,内核态去映射。
// assume uva is a virtual address in user space, uva_size is its size
MDL * mdl = IoAllocateMdl(uva, uva_size, FALSE, FALSE, NULL);
ASSERT(mdl);
__try {
	MmProbeAndLockPages(mdl, UserMode, IoReadAccess);
} __except(EXCEPTION_EXECUTE_HANDLER) {
	DbgPrint("error code = %d", GetExceptionCode);
PVOID kva = MmGetSystemAddressForMdlSafe(mdl, NormalPagePriority);
// use kva 
MmUnlockPages(mdl);
IoFreeMdl(mdl);
  • 内核态分配空间,用户态进程去映射。
PVOID kva = ExAllocatePoolWithTag(NonPagedPool, 1024, (ULONG)'PMET');
MDL * mdl = IoAllocateMdl(uva, uva_size, FALSE, FALSE, NULL);
ASSERT(mdl);
__try {
	MmBuildMdlForNonPagedPool(mdl);
} __except(EXCEPTION_EXECUTE_HANDLER) {
	DbgPrint("error code = %d", GetExceptionCode);
PVOID uva = MmMapLockedPagesSpecifyCache(mdl, UserMode, MmCached, NULL, FALSE, NormalPagePriority); 
                    背景默认情况下,进程内存有一半为内核所有,一半为进程本身所有。但是因为 r3 的进程在不断的切换,所以不能在 r0 直接分配一个低位的内存(你不知道现在正在哪个进程的高位中)。当然,使用 KeStackAttachProcess 附加到指定的进程上操作内存(读/写),最后再使用 KeUnstackDetachProcess 脱离进程,这样也可以实现 r0 和 r3 通信,但更推荐使用 MDL 的方式对将同一块物理内存同时映射到 r0 和 r3,这样我们只需要使用 DeviceIoControl 向驱动发
				
理解Windows环境下创建内核对象,动态链接库以及共享内存段的过程,并利用他们实现多个生产者多个消费者进程。其中生产者每次存放一个数据,消费者拿出一个数据并计数。 补充,1、生产消费模板在那个CRBuffer的头文件中;2、共享数据段中定义了 gBuffer环形缓冲。
前面分别通过读写驱动(IRP)和IO控制(ControlCOde)两种方法来实现ring3和ring0的通信,今天学习共享内存通信方法 共享内存实现有两种方式: 1.应用程序分配内存,提供给驱动程序,由驱动程序映射并锁定该内存。 2.驱动程序分配内存,然后映射到应用程序地址范围内。 这里主要学习按书上的第二种方法的实现。 1.驱动程序分配出一块内核空间。 2.使用MDL描述这
通常,我们在内核中修改内存的时候,都是通过修改 CR0 寄存器,关闭内存写保护属性,然后再写入内存的方式来修改内存。我个人不喜欢这种方式,因为总感觉我们使用没有线程接口函数的方法,总感觉不太稳定,而且,在 64 位程序下,CR0 方式不再适用了。 所以,我强烈推荐在内核下使用 MDL 方式来修改内存,在 32 位内核和 64 位内核下同样有效。 实现过程 内存描述符列表 (MDL) 是一个系统定义的结构,通过一系列物理地址描述缓冲区。MDL的全称是 Memory Descriptor List,即内存
本文主要介绍 windows NT 驱动之间利用 CTL_CODE 如何通信. 一般来讲, 用户态的应用程序通过调用 CreateFile 和 DeviceIOControl 就可以和内核态驱动之间进行通信, 如果是内核态的一个驱动程序想和另外一个驱动程序进行类似操作又如何实现呢, 接下来会做详细的说明. 主要的思路是首先得到另外一个驱动的 handle, 再构建一个 IRP, 赋予必要的参
回答: 在驱动开发中,如果需要构建一个新的内存描述符列表(MDL),来表示已有MDL描述的缓冲区的一部分,可以使用IoBuildPartialMdl函数。\[2\]这个函数可以帮助开发人员在驱动程序中实现直接读写操作。此外,如果你对Windows驱动开发有兴趣,可以参考《Windows驱动开发技术详解》这本书。这本书分为入门篇、进阶篇、实用篇和提高篇,可以帮助你系统地学习驱动开发的知识。\[3\]在驱动开发过程中,建议先快速阅读基础篇,然后认真阅读和实践进阶篇的内容,最后可以将提高篇作为复习和综合练习的材料。如果你需要相关的源码和DDK build版本的驱动代码,可以在资源中找到。 #### 引用[.reference_title] - *1* *2* *3* [《Windows驱动开发技术详解》学习笔记](https://blog.csdn.net/Sagittarius_Warrior/article/details/87193389)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]