0

背景:我正在编写一个虚拟 USB 到 RS232 驱动程序。但由于我的硬件是 USB 芯片 (PDIUSBD12) 而不是纯 UART 芯片,驱动程序需要一些特殊的调整。使用超级终端之类的 PC 应该相信它正在与常规的 RS232 芯片通信。反正问题不在这件事上,更多的是理解-WDF-issue,呵呵:)

问题:我想要完成的是创建一个“读取请求”(无中生有)并将其传递给硬件。可悲的是WdfRequestRetrieveOutputMemory导致“访问破坏”/崩溃。我如何创建新请求有什么基本问题吗?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);
    }
4

1 回答 1

1

您不能以这种方式访问​​请求的输出缓冲区。使用 WdfRequestCreate,您只需创建请求对象。因此,当您调用 WdfRequestRetrieveOutputMemory 时,此请求没有附加任何缓冲区。之后,您需要使用 WdfUsbTargetPipeFormatRequestForRead 进行初始化。在此调用的第三个参数中,您可以指定此请求的读取缓冲区。

于 2012-04-04T09:56:52.117 回答