clwfe
驱动牛犊
驱动牛犊
  • 注册日期2003-10-10
  • 最后登录2003-11-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2163回复:7

从sys里传内存地址到应用失败!请指点提示!

楼主#
更多 发布于:2003-10-29 16:33
我编写了一个简单的filter-hook驱动,我参照别人的程序进行编写,现在有一个问题解决不了,请高手指点!

我在sys里分配一块共享内存,然后把内存指针传给应用程序,但是,应用程序却始终得不到其指针!不知道为什么,还请知道的给点提示!谢谢!把部分代码贴出来!

//应用程序里的代码片段
.................................................
PVOID pShareMem=0;//我也用数组试过,也是一样的结果:TCHAR szOutBuf[20];
DWORD dwres=0;
//DeviceIoControl也执行成功,就是无法得到指针值
if(!DeviceIoControl(hdev,IO_GETADD,0,0,&pShareMem/*&szOutBuf*/,sizeof(pShareMem/*szOutBuf*/),&dwres,0))
{
............................
}
..................................................
//sys里相应的代码,内存分配等其他工作都成功,就是无法传地址出去
.........................................
case IO_GETADD:
try
{
pUserVirAdd=MmMapLockedPages(Mdl,UserMode);
DbgPrint(\"IO_GETADD:pUserVirAdd=%d\\n\",pUserVirAdd);//
//下面语句我也用别人的方法也不行,*((PVOID *)irp->AssociatedIrp.SystemBuffer)=pUserVirAdd;
memcpy(irp->AssociatedIrp.SystemBuffer,&pUserVirAdd,sizeof(pUserVirAdd));
               if(pUserVirAdd==0)
{
DbgPrint(\"pUserVirAdd==0\\n\");//
st=(!STATUS_SUCCESS);
break;
}
irp->IoStatus.Status=STATUS_SUCCESS;
irp->IoStatus.Information=sizeof(PVOID);
}
except(EXCEPTION_EXECUTE_HANDLER)
{
}
break;
........................................................

[编辑 -  10/29/03 by  clwfe]
kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-04-15 11:00
asmsys:
1、在驱动程序的哪做“分配与应用程序共享的内存”这块亚?
2、你在那kesetevent ,是在中断处理程序中么,我是在中断处理程序中,可是我的程序到这就死了?你在哪做的kesetevent ?
liumeng1970
驱动牛犊
驱动牛犊
  • 注册日期2003-10-10
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-04-05 13:40
还是不行!

就是在这一行出现异常:
*((PVOID *)(Irp->AssociatedIrp.SystemBuffer)) = UserVirtualAddr;

不知道是什么原因?
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-04-05 11:23
// 分配与应用程序共享的内存
Status = NdisAllocateMemoryWithTag(
&SystemVirtualAddr,
BUFFER_SIZE,
TAG
);
ASSERT(Status == NDIS_STATUS_SUCCESS);

DbgPrint("sys-NdisAllocateMemoryWithTag");

pMdl = IoAllocateMdl(
SystemVirtualAddr,
BUFFER_SIZE,
FALSE,
FALSE,
NULL
);
ASSERT(pMdl != NULL);

DbgPrint("sys-IoAllocateMdl");

MmBuildMdlForNonPagedPool(pMdl);
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-04-05 11:21
NDIS_STATUS DrvDispatchIoctl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
PIO_STACK_LOCATION IrpStack;
NDIS_STATUS Status;
ULONG ControlCode;
OBJECT_HANDLE_INFORMATION objHandleInfo;
HANDLE hEvent = NULL;

IrpStack = IoGetCurrentIrpStackLocation(Irp);

// 得到DeviceIoControl传来的控制码
ControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;

switch (ControlCode)
{
case IO_GET_SHAREMEMORY_ADDR:
// 将分配的内存映射到用户进程地址空间,并返回地址。
try
{
UserVirtualAddr = MmMapLockedPages(pMdl, UserMode);
*((PVOID *)(Irp->AssociatedIrp.SystemBuffer)) = UserVirtualAddr;
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = sizeof(PVOID);
}
except(EXCEPTION_EXECUTE_HANDLER){}
break;

case IO_REFERENCE_EVENT:
hEvent = (HANDLE)IrpStack->Parameters.DeviceIoControl.Type3InputBuffer;
Status = ObReferenceObjectByHandle(hEvent,
GENERIC_ALL,
NULL,
KernelMode,
&gpEventObject,
&objHandleInfo);
if(Status != NDIS_STATUS_SUCCESS)
break;
Monitor_flag = 1;
Irp->IoStatus.Status = NDIS_STATUS_SUCCESS;
Irp->IoStatus.Information = 0L;
break;

case IO_STOP_MONITOR_EVENT:
Monitor_flag = 0;
if(gpEventObject)
ObDereferenceObject(gpEventObject);
Irp->IoStatus.Status = NDIS_STATUS_SUCCESS;
Irp->IoStatus.Information = 0L;
break;

case IO_CLEAR_EVENT:
KeClearEvent(gpEventObject);
DbgPrint("KeClearEvent sussfully!\n");
Irp->IoStatus.Status = NDIS_STATUS_SUCCESS;
Irp->IoStatus.Information = 0L;
break;

default:
break;
}

IoCompleteRequest(Irp, IO_NO_INCREMENT);
return NDIS_STATUS_SUCCESS;
}



liumeng1970
驱动牛犊
驱动牛犊
  • 注册日期2003-10-10
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-04-05 10:54
多谢这么快就回答! 但好象还是不行 ! 我的代码

app

TCHAR szOutBuf[20];
DeviceIoControl(m_hCommDevice,IO_QUERY_EVENT_STATE,0,0,
szOutBuf,20,&dwReturn, 0);

sys

PVOID SystemVirtualAddress, UserVirtualAddress;
try {
SystemVirtualAddress = ExAllocatePool(NonPagedPool, 1024);
DbgPrint("OK1!\n");
Mdl = IoAllocateMdl(SystemVirtualAddress, 1024, FALSE, FALSE, NULL);
if (Mdl==NULL)
DbgPrint("OK2!\n");
else
DbgPrint("OK2.5!\n");

MmBuildMdlForNonPagedPool(Mdl);
DbgPrint("OK3!\n");

UserVirtualAddress = MmMapLockedPages(Mdl, UserMode);
DbgPrint("OK4!\n");
DbgPrint("Address=%x",UserVirtualAddress);
*((PVOID *)(Irp->AssociatedIrp.SystemBuffer))=UserVirtualAddress;

DbgPrint("OK5!\n");
Irp->IoStatus.Status = STATUS_SUCCESS;
DbgPrint("OK6!\n");
Irp->IoStatus.Information = sizeof(PVOID);
DbgPrint("OK7!\n");
}
except(EXCEPTION_EXECUTE_HANDLER)
{
DbgPrint("Exception2");
}
return STATUS_SUCCESS;

在这一行出现异常

*((PVOID *)(Irp->AssociatedIrp.SystemBuffer))=UserVirtualAddress;

asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-04-05 10:10
TCHAR szOutBuf[20];
DWORD dwres=0;
if(!DeviceIoControl(hdev,IO_GETADD,0,0,szOutBuf,20,&dwres,0))
{
............................
}
liumeng1970
驱动牛犊
驱动牛犊
  • 注册日期2003-10-10
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-04-05 09:33
我也遇到同样的问题.请问你解决了吗 ?
游客

返回顶部