Send the output of !analyze -v. god knows where it is blowing up without that. You are setting a completion routine, but always completing the request with failure. Did you mean to send the request down the stack instead?
d
-----Original Message-----
From: xxxxx@lists.osr.com [mailto:xxxxx@lists.osr.com] On Behalf Of xxxxx@razerzone.com
Sent: Tuesday, March 22, 2011 10:45 AM
To: Windows System Software Devs Interest List
Subject: RE:[ntdev] USB or HID lower level filter drivers
VOID
DispatchPassThrough(
IN WDFREQUEST arg_objRequest,
IN WDFIOTARGET arg_objTarget
)
/*++
Routine Description:
Passes a request on to the lower driver.
–*/
{
//
// Pass the IRP to the target
//
WDF_REQUEST_SEND_OPTIONS options;
BOOLEAN ret;
NTSTATUS status = STATUS_SUCCESS;
//
// We are not interested in post processing the IRP so
// fire and forget.
//
WDF_REQUEST_SEND_OPTIONS_INIT(&options,
WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET);
ret = WdfRequestSend(arg_objRequest, arg_objTarget, &options);
if (ret == FALSE) {
status = WdfRequestGetStatus (arg_objRequest);
KdPrint( (“WdfRequestSend failed: 0x%x\n”, status));
WdfRequestComplete(arg_objRequest, status);
}
return;
}
VOID
EvtIoInternalDeviceControl (
IN WDFQUEUE arg_objQueue,
IN WDFREQUEST arg_objRequest,
IN size_t arg_dOutputBufferLength,
IN size_t arg_dInputBufferLength,
IN ULONG arg_dIoControlCode
)
{
NTSTATUS status;
WDFDEVICE objDevice;
WDFIOTARGET objIoTarget;
WDFMEMORY objRequestMemory;
PDEVICE_CONTEXT pDeviceContext;
size_t dBytesTransferred = 0;
PURB pUrbBuffer = NULL;
WDF_REQUEST_PARAMETERS objRequestParameters;
UNREFERENCED_PARAMETER(arg_dInputBufferLength);
UNREFERENCED_PARAMETER(arg_dOutputBufferLength);
KdPrint((“TESTDRIVER: MESSAGE: —>EvtIoInternalDeviceControl\n”));
objDevice = WdfIoQueueGetDevice (arg_objQueue);
pDeviceContext = GetDeviceContext ( objDevice );
KdPrint((“TESTDRIVER: MESSAGE: Proceeding to handle I/O Control Request with code 0x%x”, arg_dIoControlCode));
switch (arg_dIoControlCode)
{
case IOCTL_INTERNAL_USB_SUBMIT_URB:
KdPrint((“TESTDRIVER: MESSAGE: IOCTL_INTERNAL_USB_SUBMIT_URB I/O Control Request.\n”));
KdPrint((“TESTDRIVER: MESSAGE: Input Buffer size = %d \n”, arg_dInputBufferLength));
KdPrint((“TESTDRIVER: MESSAGE: Output Buffer size = %d \n”, arg_dOutputBufferLength));
WDF_REQUEST_PARAMETERS_INIT(&objRequestParameters);
WdfRequestGetParameters ( arg_objRequest, &objRequestParameters );
pUrbBuffer = objRequestParameters.Parameters.Others.Arg1;
KdPrint((“TESTDRIVER: MESSAGE: Extracting URB data from the request. Request metadata as follows: \n”));
KdPrint((“TESTDRIVER: MESSAGE: Request Size = 0x%x \t Request Function = 0x%x \t Request Type = 0x%x \n”,
objRequestParameters.Size, objRequestParameters.MinorFunction, objRequestParameters.Type));
KdPrint((“TESTDRIVER: MESSAGE: URB data from the request. URB Header data as follows: \n”));
KdPrint((“TESTDRIVER: MESSAGE: URB Length = 0x%x \t URB Function = 0x%x \t URB Status = 0x%x \n”,
pUrbBuffer->UrbHeader.Length, pUrbBuffer->UrbHeader.Function, pUrbBuffer->UrbHeader.Status));
switch (pUrbBuffer->UrbHeader.Function)
{
case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:
KdPrint((“TESTDRIVER: MESSAGE: URB Function decoded to be BULK_OR_INTERRUPT_TRANSFER. \n”));
WdfRequestSetCompletionRoutine ( arg_objRequest, EvtInterruptTransferCompletionRoutine, NULL );
objIoTarget = WdfDeviceGetIoTarget ( objDevice );
if ( objIoTarget != NULL )
{
KdPrint((“TESTDRIVER: MESSAGE: Valid I/O Target. \n”));
DispatchPassThrough ( arg_objRequest, objIoTarget );
}
else
{
KdPrint((“TESTDRIVER: MESSAGE: Invalid Target. \n”));
WdfRequestComplete ( arg_objRequest, STATUS_NOT_IMPLEMENTED );
}
break;
case URB_FUNCTION_ABORT_PIPE:
break;
default:
break;
}
break;
default:
KdPrint ((“TESTDRIVER: MESSAGE: Unhandled I/O Control Request. Passing it to other stack drivers if any.\n”));
break;
}
objIoTarget = WdfDeviceGetIoTarget ( objDevice );
if ( objIoTarget != NULL )
{
KdPrint((“TESTDRIVER: MESSAGE: Valid I/O Target. \n”));
DispatchPassThrough ( arg_objRequest, objIoTarget );
}
else
{
KdPrint((“TESTDRIVER: MESSAGE: Invalid Target. \n”));
WdfRequestComplete ( arg_objRequest, STATUS_NOT_IMPLEMENTED );
}
KdPrint((“TESTDRIVER: MESSAGE: <—EvtIoInternalDeviceControl\n”));
}
VOID
EvtInterruptTransferCompletionRoutine (
IN WDFREQUEST arg_objRequest,
IN WDFIOTARGET arg_objTarget,
IN PWDF_REQUEST_COMPLETION_PARAMS arg_objReqComplnParams,
IN WDFCONTEXT arg_objContext
)
{
NTSTATUS status = STATUS_SUCCESS;
PURB pUrbBuffer = NULL;
size_t dBytesTranferred = 0;
WDF_REQUEST_PARAMETERS objRequestParameters;
UNREFERENCED_PARAMETER(arg_objContext);
KdPrint((“TESTDRIVER: MESSAGE: —>EvtInterruptTransferCompletionRoutine\n”));
WDF_REQUEST_PARAMETERS_INIT(&objRequestParameters);
WdfRequestGetParameters ( arg_objRequest, &objRequestParameters );
pUrbBuffer = objRequestParameters.Parameters.Others.Arg1;
if ( pUrbBuffer->UrbHeader.Function == URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER )
if ( pUrbBuffer->UrbBulkOrInterruptTransfer.TransferBufferLength > 0 && pUrbBuffer->UrbBulkOrInterruptTransfer.TransferBuffer != NULL )
{
//MyCode Here
}
WdfRequestComplete ( arg_objRequest, status );
KdPrint((“TESTDRIVER: MESSAGE: <—EvtInterruptTransferCompletionRoutine\n”));
}
Here is the code that I wrote to read the URBs, I am able to look at the URB, but as soon as I send the request out, things go bad and I get a Blue screen. What am I doing wrong here?
NTDEV is sponsored by OSR
For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars
To unsubscribe, visit the List Server section of OSR Online at http://www.osronline.com/page.cfm?name=ListServer