2017-02-09 5 views
1

Comme le titre le suggère, j'ai un problème avec le code suivant:Comment passer une autre requête dans la pile?

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

Je ne peux pas envoyer le NewRequest en bas de la pile ... la valeur RET est « FAUX » et le statut est STATUS_INVALID_DEVICE_STATE. Comment rendre l'appareil dans l'état correct?

Je l'ai fait tout droit comme le suggère link. Donc résumant je ne peux pas envoyer la demande vers le bas de la pile d'E/S locale, l'E/S cible n'est pas dans un état correct et je ne sais pas comment l'obtenir fonctionne?

Répondre

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

Voici comment le réaliser.