2017-02-09 1 views
1

내가 다음 코드를 사용하여 문제가 제안 : 나는 스택 아래 newRequest을 보낼 수 없습니다스택 아래로 다른 요청을 전달하는 방법은 무엇입니까? 제목으로

EvtDeviceIoWrite(
    IN WDFQUEUE Queue, 
    IN WDFREQUEST Request, 
    IN size_t Length 
) { 
WDF_OBJECT_ATTRIBUTES_INIT(&attributes); 
attributes.ParentObject = WdfIoQueueGetDevice(Queue); 
status = WdfRequestCreate(&attributes, WdfDeviceGetIoTarget(WdfIoQueueGetDevice(Queue)), &newRequest); 
if (!NT_SUCCESS(status)) { 
    KdPrint(("Serial: failed 0x%x\n", status)); 
    WdfRequestComplete(Request, status); 
    return; 
} 
WDF_OBJECT_ATTRIBUTES_INIT(&attributes); 
attributes.ParentObject = newRequest; 
status = WdfMemoryCreate(&attributes, NonPagedPool, 'MyPl', 10, &newmem, &newbuf); 
if (!NT_SUCCESS(status)) { 
    KdPrint(("Serial: failed 0x%x\n", status)); 
    WdfRequestComplete(Request, status); 
    return; 
} 

WDF_REQUEST_SEND_OPTIONS_INIT(&options, 
    WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET); 
ret = WdfRequestSend(newRequest, WdfDeviceGetIoTarget(WdfIoQueueGetDevice(Queue)), &options); 
} 
if (ret == FALSE) { 
    status = WdfRequestGetStatus(newRequest); 
    KdPrint(("WdfRequestSend failed: 0x%x\n", status)); 
    WdfRequestComplete(Request, status); 
} 

을 ... RET 값은 "FALSE"이고 상태는 STATUS_INVALID_DEVICE_STATE입니다. 장치를 적절한 상태로 만드는 방법은 무엇입니까?

link가 제안한대로 모든 작업을 완료했습니다. 그래서 요약하면 로컬 IO 스택 아래로 요청을 보낼 수 없습니다. 대상 IO는 적절한 상태가 아니며 작동 방법을 모릅니다.

답변

0
WDF_OBJECT_ATTRIBUTES_INIT(&attributes); 
attributes.ParentObject = WdfIoQueueGetDevice(Queue); 
status = WdfRequestCreate(&attributes, WdfDeviceGetIoTarget(WdfIoQueueGetDevice(Queue)), &newRequest); 
if (!NT_SUCCESS(status)) { 
    KdPrint(("Serial: failed 0x%x\n", status)); 
    WdfRequestComplete(Request, status); 
    return; 
} 
WDF_OBJECT_ATTRIBUTES_INIT(&attributes); 
attributes.ParentObject = newRequest; 
status = WdfMemoryCreate(&attributes, NonPagedPool, 'MyPl', 10, &newMem, &newBuf); 
if (!NT_SUCCESS(status)) { 
    KdPrint(("Serial: failed 0x%x\n", status)); 
    WdfRequestComplete(Request, status); 
    return; 
} 
/*Proessing request */ 


/*End Processing request */ 
WdfRequestFormatRequestUsingCurrentType(newRequest); 
WdfIoTargetFormatRequestForWrite(WdfDeviceGetIoTarget(WdfIoQueueGetDevice(Queue)), newRequest, newMem, NULL , NULL); 
ret = WdfRequestSend(newRequest, WdfDeviceGetIoTarget(WdfIoQueueGetDevice(Queue)), NULL); 

if (ret == FALSE) { 
    status = WdfRequestGetStatus(newRequest); 
    KdPrint(("WdfRequestSend failed: 0x%x\n", status)); 

} 
WdfRequestComplete(Request, status); 

이것은 달성 방법입니다.

관련 문제