阅读:2163回复:7
从sys里传内存地址到应用失败!请指点提示!
我编写了一个简单的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] |
|
沙发#
发布于:2004-04-15 11:00
asmsys:
1、在驱动程序的哪做“分配与应用程序共享的内存”这块亚? 2、你在那kesetevent ,是在中断处理程序中么,我是在中断处理程序中,可是我的程序到这就死了?你在哪做的kesetevent ? |
|
板凳#
发布于:2004-04-05 13:40
还是不行!
就是在这一行出现异常: *((PVOID *)(Irp->AssociatedIrp.SystemBuffer)) = UserVirtualAddr; 不知道是什么原因? |
|
地板#
发布于: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); |
|
地下室#
发布于: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; } |
|
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; |
|
6楼#
发布于:2004-04-05 10:10
TCHAR szOutBuf[20];
DWORD dwres=0; if(!DeviceIoControl(hdev,IO_GETADD,0,0,szOutBuf,20,&dwres,0)) { ............................ } |
|
7楼#
发布于:2004-04-05 09:33
我也遇到同样的问题.请问你解决了吗 ?
|
|