[原创][成果3.6]驱动和应用层的异步通信
在调试驱动层代码的时候,我发现如下的结果好像有问题?
//当通知要获取数据时,获得异步的irp,然后传输数据
//-----驱动层代码
NTSTATUS COMM_BufferedIo(PIRP Irp, PIO_STACK_LOCATION pIoStackIrp)
{
NTSTATUS status = STATUS_UNSUCCESSFUL;
PVOID pInputBuffer, pOutputBuffer;
ULONG outputLength, inputLength;
DbgPrint("COMM_BufferedIo\r\n");
outputLength = pIoStackIrp->Parameters.DeviceIoControl.OutputBufferLength;
inputLength = pIoStackIrp->Parameters.DeviceIoControl.InputBufferLength;
pOutputBuffer = Irp->AssociatedIrp.SystemBuffer; //输出缓冲区
pInputBuffer = Irp->AssociatedIrp.SystemBuffer; //输入缓冲区
if(pInputBuffer && pOutputBuffer)
{
DbgPrint("COMM_BufferedIo UserModeMessage = '%s'", pInputBuffer);
RtlCopyMemory(pOutputBuffer, pInputBuffer, outputLength);
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = sizeof(pOutputBuffer);
IoCompleteRequest(Irp,IO_NO_INCREMENT); //设置该irp已经完成
status = STATUS_SUCCESS;
}
return status;
}
//---------------
在上面这段代码中outputLength 和inputLength的值都为0;而输入缓冲和输出缓冲为同一个缓冲区。
这样的话拷贝缓冲的代码
RtlCopyMemory(pOutputBuffer, pInputBuffer, outputLength);
不会执行,或者说执行完后结果不受影响。