Windows驱动和应用程序通信

    技术2022-05-18  32

    驱动层:

    PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);

    //得到输入缓冲区大小  ULONG cbin = stack->Parameters.DeviceIoControl.InputBufferLength;

    //得到输出缓冲区大小  ULONG cbout = stack->Parameters.DeviceIoControl.OutputBufferLength;//得到IOCTL码  ULONG code = stack->Parameters.DeviceIoControl.IoControlCode;

     

     

    CTL_CODE(DeviceType, Function, Method, Access)  //ntddk.hMethod:

        METHOD_BUFFERED //buffer mode

        METHOD_IN_DIRECT or METHOD_OUT_DIRECT   //直接映射地址

        METHOD_NEITHER

     

     

    如果为 METHOD_IN_DIRECT or METHOD_OUT_DIRECT,输入和BUFFER模式一样,但是输出就不再是输入那个地址,而是  

    采用MmGetSystemAddressForMdlSafe   IN PMDL  Mdl,  

                                                        /*irp->MdlAddress*/ IN MM_PAGE_PRIORITY  Priority  NormalPagePriority);映射

     

     

    如果为 METHOD_NEITHER:

    输入地址int * InputBuffer=(int*)stack->Parameters.DeviceIoControl.Type3InputBuffer;

    输出的地址:irq->UserBuffer

    操作前必须判断:ProbeForRead and ProbeForWrite这两个函数判断是否可读写

    最后

     //对相应的IPR进行处理 pIrp->IoStatus.Information=info;              //设置返回操作的字节数为0,这里无实际意义 pIrp->IoStatus.Status=STATUS_SUCCESS;//返回成功 IoCompleteRequest(pIrp,IO_NO_INCREMENT);//指示完成此IRP

     

     

     

     

     

    用户层

    1:CreateFile

    2:BOOL WINAPI DeviceIoControl(  __in          HANDLE hDevice,  __in          DWORD dwIoControlCode,  __in          LPVOID lpInBuffer,  __in          DWORD nInBufferSize,  __out         LPVOID lpOutBuffer,  __in          DWORD nOutBufferSize,  __out         LPDWORD lpBytesReturned,  __in          LPOVERLAPPED lpOverlapped);

     

     

     

    http://www.hztraining.com/bbs/showtopic-484.aspx

     


    最新回复(0)