背景:我正在编写一个虚拟USB到RS232驱动程序。但由于我的硬件是一个USB芯片(PDIUSBD12),而不是一个纯UART芯片,驱动程序需要一些特殊的调整。使用类似于超级终端的PC应该理解它正在与普通的RS232芯片对话。无论如何,问题不在这个问题上,它更多的是一个理解WDF的问题,呵呵:)
问题:我想要完成的是创建一个“读取请求”(毫无意义),并将其传递给硬件。可悲的是,WdfRequestRetrieveOutputMemory导致了“访问无效”(Access)/crash。我如何创建新请求有什么根本问题吗?WdfRequestRetrieveOutputMemory的输入变量中没有一个为NULL,但我猜maskRequest变量在某种程度上是错误的?!
case IOCTL_SERIAL_WAIT_ON_MASK: // *** Wait on Mask ***
if (m_WaitMask == 0) { // Can only set if mask is not zero
status = STATUS_UNSUCCESSFUL;
DbgPrint("IOCTL_SERIAL_WAIT_ON_MASK failed, no wait mask\n");
bytesTransferred = 0;
break;
}
else {
// Registers completion routine for the mask-request
WdfRequestSetCompletionRoutine(Request, WaitOnMaskCompletionRoutine, pDevContext->BulkReadPipe); // pDevContext->BulkReadPipe??
// Forward the mask-request to the mask wait queue
status = WdfRequestForwardToIoQueue(Request, mask_queue);
if (!NT_SUCCESS(status)) {
DbgPrint("IOCTL_SERIAL_WAIT_ON_MASK, WdfRequestForwardToIoQueue failed\n");
bytesTransferred = 0;
break;
}
status = STATUS_PENDING;
// Create a brand new read request and pass it down to the hardware
mask_status = WdfRequestCreate(WDF_NO_OBJECT_ATTRIBUTES, NULL, &maskRequest);
if(!NT_SUCCESS(mask_status)) {
goto MaskExit;
}
mask_status = WdfRequestRetrieveOutputMemory(maskRequest, &maskMemory);
if(!NT_SUCCESS(mask_status)) {
goto MaskExit;
}
mask_status = WdfUsbTargetPipeFormatRequestForRead(pDevContext->BulkReadPipe, maskRequest, maskMemory, NULL);
if (!NT_SUCCESS(mask_status)) {
goto MaskExit;
}
WdfRequestSetCompletionRoutine(maskRequest, EvtRequestMaskReadCompletionRoutine, pDevContext->BulkReadPipe);
ret = WdfRequestSend(maskRequest, WdfUsbTargetPipeGetIoTarget(pDevContext->BulkReadPipe), WDF_NO_SEND_OPTIONS);
if (ret == FALSE) {
mask_status = WdfRequestGetStatus(maskRequest);
goto MaskExit;
}
else {
break;
}
MaskExit:
WdfRequestCompleteWithInformation(maskRequest, mask_status, 0);
}发布于 2012-04-04 09:56:52
您不能以这种方式访问请求的输出缓冲区。使用WdfRequestCreate,您只创建请求对象。因此,当您调用WdfRequestRetrieveOutputMemory时,此请求具有附加到它的任何缓冲区。之后,您需要使用WdfUsbTargetPipeFormatRequestForRead进行初始化。在此调用的第三个参数中,可以指定此请求的读缓冲区。
https://stackoverflow.com/questions/7740882
复制相似问题