内存映射法通信原理
在 Windows 操作系统中,用户态程序(如 DLL)和内核态驱动程序(如 SYS)运行在不同的地址空间,常规的内存访问方式无法实现两者间的数据共享。内存映射法通过在内核态申请一块物理内存,并将其映射到用户态的虚拟地址空间,使得用户态程序和内核态驱动能够同时访问同一块物理内存区域,以此达成高效的数据传递和通信。
代码解析
第一步:SYS 在内核态申请内存并完成映射
BOOL InitSys(PBOARD_INFO pB) {
// 在内核态申请非分页内存
dx->SysAddress = ExAllocatePoolWithTag(NonPagedPool, dwQueueBufferLen1 * 2 + dwQueueBufferLen2, 'MpaM');
// 为申请的内存创建内存描述符列表(MDL)
dx->Mdl = IoAllocateMdl(dx->SysAddress, dwQueueBufferLen1 * 2 + dwQueueBufferLen2, FALSE, FALSE, NULL);
// 将 MDL 描述的物理内存页面映射到用户空间的虚拟地址
dx->VirtualAddress = MmMapLockedPagesSpecifyCache(dx->Mdl,
UserMode<