UNICODE_STRING tem_uIpAddress={0};//IP地址
                   
 //tem_uIpAddress.Buffer=(PWSTR)ExAllocatePool(PagedPool,BUFFER_SIZE);第二句不注释掉的话,会有'UNICODE_STRING' : illegal use of this type 错误,搜不到解决办法

解决方案 »

  1.   

    顺便再问一个问题,我有两个驱动文件,单独加载测试没有文图,但是如果两个的监控都打开,使用VB的Winsock控件进行网络连接测试,不论是监听还是连接,都会有“运行时错误,没有可供使用的缓冲区空间”我两个驱动都是用的
    memmove(&output[0],&a,4);
    while (1)
    {
    KeDelayExecutionThread(KernelMode,0,&li);
    memmove(&a,&output[0],4);
    if (!a)
    {
    break;
    }
    }这种方式与应用层通信,应用层开了两个线程,缓冲区分别分配了两个数组,不会跟这个有关吧?
      

  2.   

    怎么看怎么像PRMonitor的代码……
    驱动中有一个RtlInitUnicodeString函数,LZ为什么要这样初始化呢?
    用这一系列的函数要注意内存的使用与泄露
    一般来说不用自己分配的(局部变量除外,是在栈里的)
    LZ多查一些资料,应该可以解决问题.
      

  3.   

    是的,应用层通信是从PRMonitor改过来的,出问题的是一个改自TDI的驱动,因为看的Windows驱动开发技术详解上RtlIntegerToUnicodeString使用之前要这样初始化
      

  4.   

    不要用DeviceIoControlFile(记不清了)来通讯,麻烦
    先用这个函数沟通一下,Ring3和Ring0共享一块内存
    然后用Event来传递信号
    最后,不推荐你看PRMonitor的代码,这个代码写的很随意
    没有一点编程规范,很难阅读
      

  5.   

    呵呵,不知道这样算不算共享内存的方法:
                case 1002:
    {
    buff = (UCHAR *)Irp->AssociatedIrp.SystemBuffer;
    memmove(&a,&buff[4],4);
    output=(char*)MmMapIoSpace(MmGetPhysicalAddress((void*)a),256,0);
    KdPrint(("加载驱动"));
    break;
    }
    刚学驱动,很多都不懂,编译的那个问题感觉好纠结,如果不加上面的两句,则:     i=to->sin_addr.S_un.S_un_b.s_b4;
         RtlIntegerToUnicodeString(i,10,&tem_uIpAddress);
         RtlAppendUnicodeStringToString(&uIpAddress,&tem_uIpAddress);
                       
         RtlUnicodeStringToAnsiString(&aIpAddress,&uIpAddress,TRUE);
         strcpy(aIpAddr,aIpAddress.Buffer);aIpAddr得到的是空的PS:怎么嵌入C代码?好看一点
      

  6.   

    一般来说通讯使用DeviceIoControl就可以,但是有的时候还不够,比如说Ring0捕获到数据,传递给Ring3,Ring3处理后再反馈给Ring0,Ring0再处理(比如说主动防御的进程监控),这样来说,一次DeviceIoControl的调用明显不够,也不可以,而且必须是一次数据交互要完成的事情,就要走别的路子了。如何共享内存数据:物理内存是不变的,物理内存地址也是不变的,在这里做手脚咯。Ring3申请内存,把内存地址传递给Ring0(DeviceIoControl操作),Ring0把此地址转换为内存物理地址再映射为Ring0可用的虚拟地址,即:MmMapIoSpace( MmGetPhysicalAddress( (PVOID)Addr ), SizeOfData, MmNonCached );Addr就是Ring3传递过来的虚拟地址了,SizeOfData是该地址的数据范围大小不再使用此地址时记得MmUnmapIoSpace取消映射可能的一个缺点就是内存的分页与非分页,解决的办法就是在Ring0下申请内存,再传递给Ring3了,没去实践,还没发现这个问题,嘿嘿。以上做好了之后就是交互问题了,信号怎么传递,用事件解决。之前找到的一个方法是在Ring0下创建事件,但是这样Ring3下就不能进行SetEvent等操作了(没权限?),只好在Ring3下创建事件传递给Ring0了,即:PKEVENT kEvent = NULL;
    ObReferenceObjectByHandle( hEvent, GENERIC_ALL,   NULL,KernelMode,(PVOID *)&kEvent,NULL);hEvent就是Ring3传递过来的Event句柄了,转换之后得到的kEvent即为Ring0所用了这样Ring3和Ring0就都可以操作同一个事件,都可以进行SetEvent(KeSetEvent)等操作了。