Создание запроса на чтение WDF из ничего?
Справочная информация: я пишу виртуальный драйвер 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 ответ
Вы не можете получить доступ к выходному буферу запроса таким образом. С WdfRequestCreate вы только создаете объект запроса. Таким образом, этот запрос не имеет никакого буфера, прикрепленного к нему, когда вы вызываете WdfRequestRetrieveOutputMemory. После этого вам нужно выполнить инициализацию с помощью WdfUsbTargetPipeFormatRequestForRead. В третьем параметре этого вызова вы можете указать буфер чтения для этого запроса.