stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:14121回复:23

c从kernel里映射出来的地址在applicatinon里为什么不好使?(付有代码,50分)

楼主#
更多 发布于:2005-01-23 22:05
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地址空间的地址吗?

最新喜欢:

imlymimlym
stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-24 11:46
[quote]
    {        
        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));    
    }


我是这样造的. [/quote]

这样不行,我试过了,在app里说access violation,我想也是这样,一个kernel的地址怎么可以直接拿来app里用
stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-01-24 11:49
你在应用层访问该地址前用SOFTICE看看该地址是否已经存在了?
还有建议你在DRIVERENTRY里分配内存,影射MDL等,而在DispatchIOControl里只需MmMapLockedPages即可.



拿到的0x00630000确实在VC的debug里看到内容都是??????,
那么为什么映射出来的地址会没定义呢,我已经在driverEntry里声明内存和分配mdl了,在ioctrl里进行映射,可是还是没用啊
stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-01-24 11:56
[quote]
    {        
        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));    
    }


我是这样造的. [/quote]


请给一些你的变量说明好吗?
stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-24 12:10


试一试在映射前加一句

MmProbeAndLockPages(Mdl, KernelMode, IoWriteAccess);


试过了,也没用。
stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-01-24 12:11
救命啊,
有谁能看出问题在哪儿吗?
stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-01-26 17:02
[quote]救命啊,
有谁能看出问题在哪儿吗?

看了我上面的哪个代码吗?
仔细参考看看,应该可以 [/quote]

我看了,可是那个是每次交换数据都要通过DeviceIOControl的,我的要求是映射一次就一直可以用啊,看看我发的新帖子好吗,里面有我的driver的具体需求和实现设想,谢谢
stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-01-26 17:07
从0x630000这个地址上看,小于2G,肯定是应用层地址,我估计是应用层地址在这段上尚未映射,是空洞。


请问“用层地址在这段上尚未映射,是空洞”是什么意思?

我确实没有在应用层开出一个buffer,
只是声明了一个PVOID pFromKernel 指针,
并把0x630000附给这个指针,然后就直接写诸如:
pFromKernel[0] = 0x01;
这时app就出问题了。

请问我是不是在app里少做了什么啊?多谢各位了
stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-01-27 12:24
就是这个地址在应用程序页表中尚未映射,还未用到这块空间


怎么映射呀,在app里有api可以调吗?
stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-01-30 20:08
share memory 的问题终于解决了.
现在我直接用createfile打开设备在用deviceiocontrol来传出映射出来的地址就没有问题,拿到的地址可以用.
原先调用winscard提供的api--scardiocontrol进行传输就不行.
我问了是不是因为这样会改变当前app process context,可是好像大家说也不是.我就不知道为什么了.

不过不管怎么说,还是要谢谢大家给我的那么多建议,我把分数给大家
:)
游客

返回顶部