wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
20楼#
发布于:2005-01-24 09:30
你在应用层访问该地址前用SOFTICE看看该地址是否已经存在了?
还有建议你在DRIVERENTRY里分配内存,影射MDL等,而在DispatchIOControl里只需MmMapLockedPages即可.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
21楼#
发布于:2005-01-24 09:15
PVOID pBee;
PVOID userAddress;

在DispatchIOControl里的代码:
......
......
pBee = ExAllocatePoolWithTag(NonPagedPool,PAGE_SIZE,'xjuw');
mdl = IoAllocateMdl(pBee,PAGE_SIZE,FALSE,FALSE,NULL);
MmBuildMdlForNonPagedPool(mdl);
outBeeAddress= MmMapLockedPagesSpecifyCachemdl,UserMode,MmCached,
NULL,FALSE,NormalPagePriority);
RtlCopyMemory(pSmartcardExtension->IoRequest.ReplyBuffer,&outBeeAddress,sizeof(PVOID));
*pSmartcardExtension->IoRequest.Information = sizeof(PVOID);
return STATUS_SUCCESS;
我省去了一些检查分配的代码,outBeeAddress de的值是0x630000.

z在application端的代码:
PVOID    pBeeAddress;
unsigned char abc[10] = {0x01,0x02...0x0A};

通过DeviceIOControl得到kernel里传出的outBeeAddress的值,
然后我发现pBeeAddress的是确实也是0x630000.
但是当我做:
memcpy(pBeeAddress,abc,10);
的时候application程序就崩掉了,请问为深么啊?0x630000不是从kernel里映射到user地址空间的地址吗?


试一试在映射前加一句

MmProbeAndLockPages(Mdl, KernelMode, IoWriteAccess);
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
22楼#
发布于:2005-01-24 09:13
把outBeeAddress= MmMapLockedPagesSpecifyCachemdl,UserMode,MmCached,

改成MmBuildMdlForNonPagedPool(pMdl);

那个pBee应该就是返回的共享地址。
在交流中学习。。。
KMK
KMK
驱动大牛
驱动大牛
  • 注册日期2001-09-12
  • 最后登录2017-10-06
  • 粉丝2
  • 关注0
  • 积分42分
  • 威望404点
  • 贡献值2点
  • 好评度58点
  • 原创分1分
  • 专家分1分
  • 社区居民
23楼#
发布于:2005-01-23 23:56
 

    {        
        DWORD size = MmSizeOfMdl(pHeader,bufferSize); // map pHeader to user
        pMdl = (PMDL)ExAllocatePool( NonPagedPool, size );
        pMdl = MmCreateMdl( pMdl, pHeader, bufferSize);


        if ( (pMdl->MdlFlags & (MDL_PAGES_LOCKED |
                                MDL_SOURCE_IS_NONPAGED_POOL |
                                MDL_MAPPED_TO_SYSTEM_VA |
                                MDL_PARTIAL) ) == 0)
            MmBuildMdlForNonPagedPool(pMdl);


        PVOID ptr = MmMapLockedPages(pMdl, UserMode);

        if ( ptr == NULL )
            *(PDBGTRAP_HEADER*)outputBuffer = NULL;
        else
            *(PDBGTRAP_HEADER*)outputBuffer = (PDBGTRAP_HEADER) (ULONG(ptr) | MmGetMdlByteOffset(pMdl));
DbgPrint("Pointer %x + Offset %x \n", ptr, MmGetMdlByteOffset(pMdl));    
    }


我是这样造的.
上一页 下一页
游客

返回顶部