2017-02-09 14 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が示唆するようにすべてを正しく行った。要約すると、ローカルI/Oスタックの要求を送信できません。ターゲットI/Oは適切な状態ではありません。そのI/Oをどのように動作させるかわかりません。

答えて

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); 

これを達成する方法です。

関連する問題