阅读:14121回复:23
c从kernel里映射出来的地址在applicatinon里为什么不好使?(付有代码,50分)
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地址空间的地址吗? |
|
最新喜欢:imlym |
沙发#
发布于:2005-01-24 11:46
[quote] 我是这样造的. [/quote] 这样不行,我试过了,在app里说access violation,我想也是这样,一个kernel的地址怎么可以直接拿来app里用 |
|
板凳#
发布于:2005-01-24 11:49
你在应用层访问该地址前用SOFTICE看看该地址是否已经存在了? 拿到的0x00630000确实在VC的debug里看到内容都是??????, 那么为什么映射出来的地址会没定义呢,我已经在driverEntry里声明内存和分配mdl了,在ioctrl里进行映射,可是还是没用啊 |
|
地板#
发布于:2005-01-24 11:56
[quote] 我是这样造的. [/quote] 请给一些你的变量说明好吗? |
|
地下室#
发布于:2005-01-24 12:10
试过了,也没用。 |
|
5楼#
发布于:2005-01-24 12:11
救命啊,
有谁能看出问题在哪儿吗? |
|
6楼#
发布于:2005-01-26 17:02
[quote]救命啊, 看了我上面的哪个代码吗? 仔细参考看看,应该可以 [/quote] 我看了,可是那个是每次交换数据都要通过DeviceIOControl的,我的要求是映射一次就一直可以用啊,看看我发的新帖子好吗,里面有我的driver的具体需求和实现设想,谢谢 |
|
7楼#
发布于:2005-01-26 17:07
从0x630000这个地址上看,小于2G,肯定是应用层地址,我估计是应用层地址在这段上尚未映射,是空洞。 请问“用层地址在这段上尚未映射,是空洞”是什么意思? 我确实没有在应用层开出一个buffer, 只是声明了一个PVOID pFromKernel 指针, 并把0x630000附给这个指针,然后就直接写诸如: pFromKernel[0] = 0x01; 这时app就出问题了。 请问我是不是在app里少做了什么啊?多谢各位了 |
|
8楼#
发布于:2005-01-27 12:24
就是这个地址在应用程序页表中尚未映射,还未用到这块空间 怎么映射呀,在app里有api可以调吗? |
|
9楼#
发布于:2005-01-30 20:08
share memory 的问题终于解决了.
现在我直接用createfile打开设备在用deviceiocontrol来传出映射出来的地址就没有问题,拿到的地址可以用. 原先调用winscard提供的api--scardiocontrol进行传输就不行. 我问了是不是因为这样会改变当前app process context,可是好像大家说也不是.我就不知道为什么了. 不过不管怎么说,还是要谢谢大家给我的那么多建议,我把分数给大家 :) |
|