aasa2
驱动中牛
驱动中牛
  • 注册日期2004-04-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分525分
  • 威望339点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
阅读:1156回复:6

我这段代码错了吗?特急

楼主#
更多 发布于:2004-12-10 14:30
我在filemon中编写如下代码,这是关于驱动和应用层共享内存的:
case IOCTL_FILEMON_VERSION:
SystemVirtualAddress = AllocatePool(NonPagedPool, 1024);
Mdl = IoAllocateMdl(SystemVirtualAddress, 1024, FALSE, FALSE, NULL);
if(Mdl)
{
    MmBuildMdlForNonPagedPool(Mdl);// 将分配的内存映射到用户进程地址空间,并返回地址。
    UserVirtualAddress= MmMapLockedPages(Mdl, UserMode);
   (PVOID) InputBuffer  = UserVirtualAddress;
//*(PVOID*) InputBuffer  = UserVirtualAddress;

...........
}

这段代码老是让计算机重启。
我调试了一下,好像是MmMapLockedPages()有错误,不知道为什么?

我调试了两天,都没有搞出来。
请各位帮我查一下。




[编辑 -  12/10/04 by  aasa2]

[编辑 -  12/10/04 by  aasa2]
技术交流:aasa2@21cn.com QQ群:10863699
aethercat
驱动牛犊
驱动牛犊
  • 注册日期2003-08-20
  • 最后登录2005-06-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-10 15:00

应该这样吧:
*(PULONG )InputBuffer = UserVirtualAddress ;
我感觉你这儿有问题
沙漠之鹰
驱动大牛
驱动大牛
  • 注册日期2001-12-30
  • 最后登录2007-08-02
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-10 15:09

应该这样吧:
*(PULONG )InputBuffer = UserVirtualAddress ;
我感觉你这儿有问题
 


有道理!!
------------------------------ [color=red]茶壶深爱着茶叶,表达爱意时却遭到拒绝,茶壶大吼:为什么?这一切都是为什么? 茶叶胆怯地说:俺妈说了,成天灌水的都不是好人。 ---别到处看,说你哪!!    [/color]
aasa2
驱动中牛
驱动中牛
  • 注册日期2004-04-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分525分
  • 威望339点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-12-10 15:39
应该这样吧!
*(PVOID*) InputBuffer = UserVirtualAddress;
但是,我这样写,就会重启。

PVOID InputBuffer = UserVirtualAddress;
好像应用层不能获得数据。

好奇怪!

大家清看看我的定义:
PVOID SystemVirtualAddress, UserVirtualAddress;

InputBuffer = Irp->AssociatedIrp.SystemBuffer;

到底是什么原因呢?
技术交流:aasa2@21cn.com QQ群:10863699
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-12-10 16:54
你是不是要在内核分配共享内存,然后把共享内存的地址返回用户空间?
如果是,那么就应该用OutputBuffer来存放返回的地址,而不是InputBuffer。
不知道我说得对不。^_^
在交流中学习。。。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2004-12-10 19:20
*(PVOID*) InputBuffer = UserVirtualAddress;

重启?在什么时候?
如果是2K的话,用MmMapLockedPagesSpecifyCache
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
6楼#
发布于:2004-12-10 22:09
*((PVOID *)(Irp->AssociatedIrp.SystemBuffer)) = UserVirtualAddress;
还有就是应该在DRIVERENTRY里分配内存,而不要在DEVICEIOCONTROL里分配.
DRIVERENTRY里
SystemVirtualAddress = ExAllocatePool(NonPagedPool, 1024);
Mdl = IoAllocateMdl(SystemVirtualAddress, 1024, FALSE, FALSE, NULL);
MmBuildMdlForNonPagedPool(Mdl);
在DISPTACH里
case IOCTL_FILEMON_VERSION:
try
{
//UserVirtualAddress = MmMapLockedPages(Mdl, UserMode);
                UserVirtualAddress = MmMapLockedPagesSpecifyCache(Mdl, UserMode,MmCached,NULL,FALSE,NormalPagePriority );
*((PVOID *)(Irp->AssociatedIrp.SystemBuffer)) = UserVirtualAddress;
}
except(EXCEPTION_EXECUTE_HANDLER){}
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
游客

返回顶部