Map kernel address to user space for NT
 

作者:陆麟
转载请征得作者同意.
2003.4.9


How to map kernel address to user space?这应该算个FAQ问题了. 始终会有N个NEWBE会问...
市面上公开的方法是从NT4DDK中出来的. 本意是将ISA卡上的某段RAM开放操作权给USER MODE APPLICATION.
我们看一下NT4DDK的提供方法的大致操作顺序.
1. 打开\\Device\\PhysicalMemory
ntStatus = ZwOpenSection (&physicalMemoryHandle,
                          SECTION_ALL_ACCESS,
                          &objectAttributes);

2. MAP SECTION
viewBase = physicalAddressBase;
virtualAddress = NULL;
ntStatus = ZwMapViewOfSection (physicalMemoryHandle,
                               (HANDLE) -1,
                               &virtualAddress,
                               0L,
                               length,
                               &viewBase,
                               &length,
                               ViewShare,
                               0,
                               PAGE_READWRITE | PAGE_NOCACHE);
3. 由于ZwMapViewOfSection返回的virtualAddress是64K对齐的地址, 需要计算实际的映射后偏移, 返回给CALLER. 例如我们需要映射的是偏移50H. 那返回给CALLER的地址应当是virtualAddress+50H.
如果有看不懂的地方, 请自己看NT4DDK\src\general\mapmem\sys的代码. 如果源代码看不懂, 那就出钱找我培训吧.

上述方法有个比较麻烦的地方就是\\Device\\PhysicalMemory并不能够将任意的KERNEL MODE地址MAP给USER. 因此, 我们需要的是更加强力的手段. 在DRIVER中分配一段空间, 然后可以将分配到的这段空间MAP给用户.这就是Inside Programming所能提供的指导!
下面我们就来看一下.
大致流程如下:
1. DRVIER分配NONPAGED内存.
2. 为分配到的内存分配MDL
3. 使用MmBuildMdlForNonPagedPool
4. 获取USER SPACE的地址, 用MmMapLockedPages(Mdl,UserMode)来获取. 这是NT4的方法. 2000下也通用. 如果希望获得WHQL认证的话, 你需要使用MmMapLockedPagesSpcifiyCache函数来完成此功能.
嘿嘿, 这样,USER SPACE就有办法直接和DRIVER共享1个RAM段而无需COPY来COPY去的了.

如果这样讲都不懂的, 请考虑购买Inside Programming的DEVELOPMENT CONSULT SERVICE! :)

Read Inside Programming before you ask!
Go now! http://lu0.126.com