NTSTATUS kmdf1394_SubmitIrpAsync ( IN WDFIOTARGET IoTarget, IN WDFREQUEST Request, IN WDFMEMORY Memory) /*++ Routine Description: Asynchronous request submission routine Arguments: IoTarget - I/O Target object Request - current request object Irb - 1394 I/O Request Block to submit Return Value: NTSTATUS value --*/ { NTSTATUS ntStatus = STATUS_SUCCESS; ENTER("kmdf1394_SubmitIrpAsync"); ASSERT (KeGetCurrentIrql() < DISPATCH_LEVEL); ASSERT (Memory); if (!NT_SUCCESS (ntStatus)) { return ntStatus; } ntStatus = WdfIoTargetFormatRequestForInternalIoctlOthers ( IoTarget, Request, IOCTL_1394_CLASS, Memory, NULL, NULL, NULL, NULL, NULL); if (!NT_SUCCESS (ntStatus)) { TRACE( TL_ERROR, ("WdfIoTargetFormatRequestForInternalIoctlOthers failed " "with status %x\n", ntStatus)); return ntStatus; } if (FALSE == (WdfRequestSend (Request, IoTarget, NULL))) { ntStatus = WdfRequestGetStatus (Request); } EXIT("kmdf1394_SubmitIrpAsync", ntStatus); return ntStatus; } // kmdf1394_SubmitIrpAsync
NTSTATUS BthEchoSharedSendBrbAsync( _In_ WDFIOTARGET IoTarget, _In_ WDFREQUEST Request, _In_ PBRB Brb, _In_ size_t BrbSize, _In_ PFN_WDF_REQUEST_COMPLETION_ROUTINE ComplRoutine, _In_opt_ WDFCONTEXT Context ) /*++ Routine Description: This routine formats a request with brb and sends it asynchronously Arguments: IoTarget - Target to send the brb to Request - request object to be formatted with brb Brb - Brb to be sent BrbSize - size of the Brb data structure ComplRoutine - WDF completion routine for the request This must be specified because we are formatting the request and hence not using SEND_AND_FORGET flag Context - (optional) context to be passed in to the completion routine Return Value: Success implies that request was sent correctly and completion routine will be called for it, failure implies it was not sent and caller should complete the request Notes: This routine does not call WdfRequestReuse on the Request passed in. Caller must do so before passing in the request, if it is reusing the request. This routine does not complete the request in case of failure. Caller must complete the request in case of failure. --*/ { NTSTATUS status = BTH_ERROR_SUCCESS; WDF_OBJECT_ATTRIBUTES attributes; WDFMEMORY memoryArg1 = NULL; if (BrbSize <= 0) { TraceEvents(TRACE_LEVEL_ERROR, DBG_CONT_READER, "BrbSize has invalid value: %I64d\n", BrbSize ); status = STATUS_INVALID_PARAMETER; goto exit; } WDF_OBJECT_ATTRIBUTES_INIT(&attributes); attributes.ParentObject = Request; status = WdfMemoryCreatePreallocated( &attributes, Brb, BrbSize, &memoryArg1 ); if (!NT_SUCCESS(status)) { TraceEvents(TRACE_LEVEL_ERROR, DBG_UTIL, "Creating preallocted memory for Brb 0x%p failed, Request to be formatted 0x%p, " "Status code %!STATUS!\n", Brb, Request, status ); goto exit; } status = WdfIoTargetFormatRequestForInternalIoctlOthers( IoTarget, Request, IOCTL_INTERNAL_BTH_SUBMIT_BRB, memoryArg1, NULL, //OtherArg1Offset NULL, //OtherArg2 NULL, //OtherArg2Offset NULL, //OtherArg4 NULL //OtherArg4Offset ); if (!NT_SUCCESS(status)) { TraceEvents(TRACE_LEVEL_ERROR, DBG_UTIL, "Formatting request 0x%p with Brb 0x%p failed, Status code %!STATUS!\n", Request, Brb, status ); goto exit; } // // Set a CompletionRoutine callback function. // WdfRequestSetCompletionRoutine( Request, ComplRoutine, Context ); if (FALSE == WdfRequestSend( Request, IoTarget, NULL )) { status = WdfRequestGetStatus(Request); TraceEvents(TRACE_LEVEL_ERROR, DBG_UTIL, "Request send failed for request 0x%p, Brb 0x%p, Status code %!STATUS!\n", Request, Brb, status ); goto exit; } exit: return status; }
NTSTATUS PowerContextReuseRequest( _In_ PCDROM_DEVICE_EXTENSION DeviceExtension ) /*++ Routine Description: reset fields for the request. Arguments: DeviceExtension - device context Return Value: NTSTATUS --*/ { NTSTATUS status = STATUS_SUCCESS; WDF_REQUEST_REUSE_PARAMS reuseParams; PIRP irp = NULL; RtlZeroMemory(&(DeviceExtension->PowerContext.SenseData), sizeof(DeviceExtension->PowerContext.SenseData)); RtlZeroMemory(&(DeviceExtension->PowerContext.Srb), sizeof(DeviceExtension->PowerContext.Srb)); irp = WdfRequestWdmGetIrp(DeviceExtension->PowerContext.PowerRequest); // Re-use the previously created PowerRequest object and format it WDF_REQUEST_REUSE_PARAMS_INIT(&reuseParams, WDF_REQUEST_REUSE_NO_FLAGS, STATUS_NOT_SUPPORTED); status = WdfRequestReuse(DeviceExtension->PowerContext.PowerRequest, &reuseParams); if (NT_SUCCESS(status)) { // This request was preformated during initialization so this call should never fail. status = WdfIoTargetFormatRequestForInternalIoctlOthers(DeviceExtension->IoTarget, DeviceExtension->PowerContext.PowerRequest, IOCTL_SCSI_EXECUTE_IN, NULL, NULL, NULL, NULL, NULL, NULL); if (!NT_SUCCESS(status)) { TracePrint((TRACE_LEVEL_ERROR, TRACE_FLAG_GENERAL, "PowerContextReuseRequest: WdfIoTargetFormatRequestForInternalIoctlOthers failed, %!STATUS!\n", status)); } } // Do some basic initialization of the PowerRequest, the rest will be done by the caller // of this function if (NT_SUCCESS(status)) { PIO_STACK_LOCATION nextStack = NULL; nextStack = IoGetNextIrpStackLocation(irp); nextStack->MajorFunction = IRP_MJ_SCSI; nextStack->Parameters.Scsi.Srb = &(DeviceExtension->PowerContext.Srb); DeviceExtension->PowerContext.Srb.Length = sizeof(SCSI_REQUEST_BLOCK); DeviceExtension->PowerContext.Srb.OriginalRequest = irp; DeviceExtension->PowerContext.Srb.SenseInfoBuffer = &(DeviceExtension->PowerContext.SenseData); DeviceExtension->PowerContext.Srb.SenseInfoBufferLength = SENSE_BUFFER_SIZE; } return status; }
NTSTATUS FormatRequestWithBrb( _In_ WDFIOTARGET IoTarget, _In_ WDFREQUEST Request, _In_ PBRB Brb, _In_ size_t BrbSize ) /*++ Description: This routine formats are WDFREQUEST with the passed in BRB Arguments: IoTarget - Target to which request will be sent Request - Request to be formattted Brb - BRB to format the request with BrbSize - size of the BRB --*/ { NTSTATUS status = BTH_ERROR_SUCCESS; WDF_OBJECT_ATTRIBUTES attributes; WDFMEMORY memoryArg1 = NULL; if (BrbSize <= 0) { TraceEvents(TRACE_LEVEL_ERROR, DBG_UTIL, "BrbSize has an invalid value: %I64d\n", BrbSize ); status = STATUS_INVALID_PARAMETER; goto exit; } WDF_OBJECT_ATTRIBUTES_INIT(&attributes); attributes.ParentObject = Request; status = WdfMemoryCreatePreallocated( &attributes, Brb, BrbSize, &memoryArg1 ); if (!NT_SUCCESS(status)) { TraceEvents(TRACE_LEVEL_ERROR, DBG_UTIL, "Creating preallocted memory for Brb 0x%p failed, Request to be formatted 0x%p, " "Status code %!STATUS!\n", Brb, Request, status ); goto exit; } status = WdfIoTargetFormatRequestForInternalIoctlOthers( IoTarget, Request, IOCTL_INTERNAL_BTH_SUBMIT_BRB, memoryArg1, NULL, //OtherArg1Offset NULL, //OtherArg2 NULL, //OtherArg2Offset NULL, //OtherArg4 NULL //OtherArg4Offset ); if (!NT_SUCCESS(status)) { TraceEvents(TRACE_LEVEL_ERROR, DBG_UTIL, "Formatting request 0x%p with Brb 0x%p failed, Status code %!STATUS!\n", Request, Brb, status ); goto exit; } exit: return status; }