private bool SelectConfiguration(EusbDeviceContext device, byte configIndex) { // 6. Sends TS_URB_CONTROL_DESCRIPTOR_REQUEST with the descriptor type of USB_DEVICE_DESCRIPTOR_TYPE. uint requestId = IdGenerator.NewId(); TS_URB_CONTROL_DESCRIPTOR_REQUEST des = new UrbBuilder( URB_FUNCTIONID.URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE, requestId, 0).BuildDeviceDescriptorRequest(); rdpeusbAdapter.TransferInRequest(device, des, USB_DEVICE_DESCRIPTOR.DefaultSize); // 7. Receives a completion message with the result for USB_DEVICE_DESCRIPTOR."); EusbUrbCompletionPdu pdu = (EusbUrbCompletionPdu)rdpeusbAdapter.ExpectCompletion(device.VirtualChannel); if (null == pdu || pdu.HResult != (uint)HRESULT_FROM_WIN32.ERROR_SUCCESS) { return(false); } USB_DEVICE_DESCRIPTOR desDevice = UsbStructParser.Parse <USB_DEVICE_DESCRIPTOR>(pdu); // 8. Sends TS_URB_CONTROL_DESCRIPTOR_REQUEST to retrieve the total length of the configuration. requestId = IdGenerator.NewId(); des = new UrbBuilder( URB_FUNCTIONID.URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE, requestId, 0).BuildConfigurationDescriptorRequest(configIndex); rdpeusbAdapter.TransferInRequest(device, des, USB_CONFIGURATION_DESCRIPTOR.DefaultSize); // 9. Receives a completion message with the result for USB_CONFIGURATION_DESCRIPTOR."); pdu = (EusbUrbCompletionPdu)rdpeusbAdapter.ExpectCompletion(device.VirtualChannel); if (null == pdu || pdu.HResult != (uint)HRESULT_FROM_WIN32.ERROR_SUCCESS) { return(false); } USB_CONFIGURATION_DESCRIPTOR desConfig = UsbStructParser.Parse <USB_CONFIGURATION_DESCRIPTOR>(pdu); // 10. Sends TS_URB_CONTROL_DESCRIPTOR_REQUEST with the actual length of USB_CONFIGURATION_DESCRIPTOR result. requestId = IdGenerator.NewId(); des = new UrbBuilder( URB_FUNCTIONID.URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE, requestId, 0).BuildConfigurationDescriptorRequest(configIndex); rdpeusbAdapter.TransferInRequest(device, des, desConfig.wTotalLength); // 11. Receives a completion message with the complete result for USB_CONFIGURATION_DESCRIPTOR."); pdu = (EusbUrbCompletionPdu)rdpeusbAdapter.ExpectCompletion(device.VirtualChannel); // 12. Sends TS_URB_SELECT_CONFIGURATION URB request. UsbConfigurationParser configParser = new UsbConfigurationParser(); configParser.ParseAll(pdu); requestId = IdGenerator.NewId(); TS_URB_SELECT_CONFIGURATION sel = new UrbBuilder( URB_FUNCTIONID.URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE, requestId, 0).BuildSelectConfigRequest(configParser.Interfaces, configParser.configDescriptor); rdpeusbAdapter.TransferInRequest(device, sel, 0); // 13. Receives a completion message with the result for configuration selection."); EusbUrbCompletionNoDataPdu pduRes = (EusbUrbCompletionNoDataPdu)rdpeusbAdapter.ExpectCompletion(device.VirtualChannel); if (null == pduRes || pduRes.HResult != (uint)HRESULT_FROM_WIN32.ERROR_SUCCESS) { return(false); } TS_URB_SELECT_CONFIGURATION_RESULT urb = new TS_URB_SELECT_CONFIGURATION_RESULT(); if (!PduMarshaler.Unmarshal(pduRes.TsUrbResult, urb)) { return(false); } context.SelectedConfig = urb; return(true); }
/// <summary> /// This method is used to verify the URB_COMPLETION_NO_DATA PDU. /// </summary> /// <param name="responsePdu">The PDU from the client.</param> /// <param name="tsUrb">The TS_URB in the request.</param> /// <param name="isTransferInRequest">This specify if the request is TRANSFER_IN_REQUEST or TRANSFER_OUT_REQUEST.</param> /// <param name="requestCompletion">A unique InterfaceID to be set in the Register Request Callback Message.</param> public static void VerifyUrbCompletionNoData(EusbUrbCompletionNoDataPdu responsePdu, TS_URB tsUrb, bool isTransferInRequest, uint requestCompletion) { Site.Assert.AreEqual <uint>( requestCompletion, responsePdu.InterfaceId, "Expect that the InterfaceId in the response PDU equals the RequestCompletion field of the REGISTER_REQUEST_CALLBACK PDU. The actual value is 0x{0:x8}.", responsePdu.InterfaceId); Site.Assert.AreEqual <Mask_Values>( Mask_Values.STREAM_ID_PROXY, responsePdu.Mask, "Expect that the Mask in the response PDU is STREAM_ID_PROXY."); Site.Assert.AreEqual <FunctionId_Values>( FunctionId_Values.URB_COMPLETION_NO_DATA, (FunctionId_Values)responsePdu.FunctionId, "Expect that the FunctionId in the response PDU is CHANNEL_CREATED. The actual value is 0x{0:x8}.", responsePdu.FunctionId); Site.Assert.AreEqual <uint>( tsUrb.Header.RequestId, responsePdu.RequestId, "Expect that the RequestId in the response PDU equals the RequestId in the request PDU. The actual value is 0x{0:x8}.", responsePdu.RequestId); if (isTransferInRequest) { #region Verify Response For TRANSFER_IN_REQUEST Site.Assert.AreEqual <uint>( 0, responsePdu.OutputBufferSize, "Expect that the OutputBufferSize in the response PDU is zero. The actual value is 0x{0:x8}.", responsePdu.OutputBufferSize); if (tsUrb is TS_URB_SELECT_CONFIGURATION) { #region Verify TS_URB_SELECT_CONFIGURATION_RESULT Site.Log.Add(LogEntryKind.Debug, "Expect the TsUrbResult is TS_URB_SELECT_CONFIGURATION_RESULT when the TsUrb in the request is TS_URB_SELECT_CONFIGURATION."); TS_URB_SELECT_CONFIGURATION_RESULT urb = new TS_URB_SELECT_CONFIGURATION_RESULT(); if (!PduMarshaler.Unmarshal(responsePdu.TsUrbResult, urb)) { // TsUrbResult can not be unmarshaled to TS_URB_SELECT_CONFIGURATION_RESULT TS_URB_UNKNOWN unknowUrb = new TS_URB_UNKNOWN(); Site.Assume.IsTrue(PduMarshaler.Unmarshal(responsePdu.TsUrbResult, unknowUrb), "Marshaling the data to an unknown PDU MUST succeed."); Site.Log.Add(LogEntryKind.CheckFailed, "The TsUrbResult is not valid TS_URB_SELECT_CONFIGURATION_RESULT. The data is:\r\n{0}", unknowUrb.ToString()); } else { Site.Log.Add(LogEntryKind.CheckSucceeded, "The TsUrbResult is expected TS_URB_SELECT_CONFIGURATION_RESULT."); } #endregion } else if (tsUrb is TS_URB_SELECT_INTERFACE) { #region Verify TS_URB_SELECT_INTERFACE_RESULT Site.Log.Add(LogEntryKind.Debug, "Expect the TsUrbResult is TS_URB_SELECT_INTERFACE_RESULT when the TsUrb in the request is TS_URB_SELECT_INTERFACE."); TS_URB_SELECT_INTERFACE_RESULT urb = new TS_URB_SELECT_INTERFACE_RESULT(); if (!PduMarshaler.Unmarshal(responsePdu.TsUrbResult, urb)) { // TsUrbResult can not be unmarshaled to TS_URB_SELECT_INTERFACE_RESULT TS_URB_UNKNOWN unknowUrb = new TS_URB_UNKNOWN(); Site.Assume.IsTrue(PduMarshaler.Unmarshal(responsePdu.TsUrbResult, unknowUrb), "Marshaling the data to an unknown PDU MUST succeed."); Site.Log.Add(LogEntryKind.CheckFailed, "The TsUrbResult is not valid TS_URB_SELECT_INTERFACE_RESULT. The data is:\r\n{0}", unknowUrb.ToString()); } else { Site.Log.Add(LogEntryKind.CheckSucceeded, "The TsUrbResult is expected TS_URB_SELECT_INTERFACE_RESULT."); } #endregion } else if (tsUrb is TS_URB_GET_CURRENT_FRAME_NUMBER) { #region Verify TS_URB_GET_CURRENT_FRAME_NUMBER_RESULT Site.Log.Add(LogEntryKind.Debug, "Expect the TsUrbResult is TS_URB_GET_CURRENT_FRAME_NUMBER_RESULT when the TsUrb in the request is TS_URB_GET_CURRENT_FRAME_NUMBER."); TS_URB_GET_CURRENT_FRAME_NUMBER_RESULT urb = new TS_URB_GET_CURRENT_FRAME_NUMBER_RESULT(); if (!PduMarshaler.Unmarshal(responsePdu.TsUrbResult, urb)) { // TsUrbResult can not be unmarshaled to TS_URB_GET_CURRENT_FRAME_NUMBER_RESULT TS_URB_UNKNOWN unknowUrb = new TS_URB_UNKNOWN(); Site.Assume.IsTrue(PduMarshaler.Unmarshal(responsePdu.TsUrbResult, unknowUrb), "Marshaling the data to an unknown PDU MUST succeed."); Site.Log.Add(LogEntryKind.CheckFailed, "The TsUrbResult is not valid TS_URB_GET_CURRENT_FRAME_NUMBER_RESULT. The data is:\r\n{0}", unknowUrb.ToString()); } else { Site.Log.Add(LogEntryKind.CheckSucceeded, "The TsUrbResult is expected TS_URB_GET_CURRENT_FRAME_NUMBER_RESULT."); } #endregion } #endregion } else { #region Verify Response For TRANSFER_OUT_REQUEST Site.Assert.AreNotEqual <uint>( 0, responsePdu.OutputBufferSize, "Expect that the OutputBufferSize in the response PDU is not zero. The actual value is 0x{0:x8}.", responsePdu.OutputBufferSize); #endregion } #region Verify TS_URB_ISOCH_TRANSFER_RESULT if (tsUrb is TS_URB_ISOCH_TRANSFER) { Site.Log.Add(LogEntryKind.Debug, "Expect the TsUrbResult is TS_URB_ISOCH_TRANSFER_RESULT when the TsUrb in the request is TS_URB_ISOCH_TRANSFER."); TS_URB_ISOCH_TRANSFER_RESULT urb = new TS_URB_ISOCH_TRANSFER_RESULT(); if (!PduMarshaler.Unmarshal(responsePdu.TsUrbResult, urb)) { // TsUrbResult can not be unmarshaled to TS_URB_ISOCH_TRANSFER_RESULT TS_URB_UNKNOWN unknowUrb = new TS_URB_UNKNOWN(); Site.Assume.IsTrue(PduMarshaler.Unmarshal(responsePdu.TsUrbResult, unknowUrb), "Marshaling the data to an unknown PDU MUST succeed."); Site.Log.Add(LogEntryKind.CheckFailed, "The TsUrbResult is not valid TS_URB_ISOCH_TRANSFER_RESULT. The data is:\r\n{0}", unknowUrb.ToString()); } else { Site.Log.Add(LogEntryKind.CheckSucceeded, "Expect that the TsUrbResult is TS_URB_ISOCH_TRANSFER_RESULT."); } } #endregion }