Создание запроса на чтение WDF из ничего? - PullRequest
0 голосов
/ 12 октября 2011

Справочная информация: я пишу виртуальный драйвер USB для RS232.Но поскольку мое оборудование представляет собой USB-чип (PDIUSBD12), а не чистый UART-чип, драйвер нуждается в некоторых специальных настройках.ПК, использующий что-то вроде Hyperterminal, должен полагать, что он общается с обычным чипом RS232.В любом случае, проблема не в этом, это скорее проблема понимания WDF, хе-хе:)

Проблема: что я хочу сделать, это создать «запрос на чтение» (изничего) и передать его на аппаратное обеспечение.К сожалению, WdfRequestRetrieveOutputMemory вызывает «Access voilation» / сбой.Есть ли фундаментальная проблема с тем, как я создаю новый запрос?Ни одна из входных переменных для 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);
    }

1 Ответ

1 голос
/ 04 апреля 2012

Вы не можете получить доступ к выходному буферу запроса таким образом.С WdfRequestCreate вы только создаете объект запроса.Таким образом, этот запрос не имеет никакого буфера, прикрепленного к нему, когда вы вызываете WdfRequestRetrieveOutputMemory.После этого вам нужно выполнить инициализацию с помощью WdfUsbTargetPipeFormatRequestForRead.В третьем параметре этого вызова вы можете указать буфер чтения для этого запроса.

...