0

背景: RS232 ドライバーへの仮想 USB を作成しています。しかし、私のハードウェアは USB チップ (PDIUSBD12) であり、純粋な UART チップではないため、ドライバーには特別な調整が必要です。ハイパーターミナルのようなものを使用している PC は、通常の RS232 チップと通信していると見なす必要があります。とにかく、問題はこの問題ではなく、WDFの問題を理解することです.hehe :)

問題: 私が達成したいのは、(何もないところから) 「読み取り要求」を作成し、それをハードウェアに渡すことです。悲しいことに、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 で初期化を行う必要があります。この呼び出しの 3 番目のパラメーターで、この要求の読み取りバッファーを指定できます。

于 2012-04-04T09:56:52.117 に答える