2017-02-09 115 views
1

正如標題所暗示我有下面的代碼麻煩:如何向堆棧傳遞另一個請求?

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

我不能發送newRequest下來堆...的RET值是「假」的狀態是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); 

這是如何實現的。