HRESULT CMyDevice::CreateUsbIoTargets( ) /*++ Routine Description: This routine creates Usb device, interface and pipe objects Arguments: None Return Value: HRESULT --*/ { HRESULT hr; IWDFUsbTargetFactory * pIUsbTargetFactory = NULL; IWDFUsbTargetDevice * pIUsbTargetDevice = NULL; hr = m_FxDevice->QueryInterface(IID_PPV_ARGS(&pIUsbTargetFactory)); if (FAILED(hr)) { TraceEvents(TRACE_LEVEL_ERROR, TEST_TRACE_DEVICE, "%!FUNC! Cannot get usb target factory %!HRESULT!", hr ); } if (SUCCEEDED(hr)) { hr = pIUsbTargetFactory->CreateUsbTargetDevice( &pIUsbTargetDevice); if (FAILED(hr)) { TraceEvents(TRACE_LEVEL_ERROR, TEST_TRACE_DEVICE, "%!FUNC! Unable to create USB Device I/O Target %!HRESULT!", hr ); } } if (SUCCEEDED(hr)) { m_pIUsbTargetDevice = pIUsbTargetDevice; // // Release the creation reference as object tree will maintain a reference // pIUsbTargetDevice->Release(); } SAFE_RELEASE(pIUsbTargetFactory); return hr; }
HRESULT CMyDevice::CreateUsbIoTargets( ) /*++ Routine Description: This routine creates Usb device, interface and pipe objects Arguments: None Return Value: HRESULT --*/ { HRESULT hr; UCHAR NumEndPoints = 0; IWDFUsbTargetFactory * pIUsbTargetFactory = NULL; IWDFUsbTargetDevice * pIUsbTargetDevice = NULL; IWDFUsbInterface * pIUsbInterface = NULL; IWDFUsbTargetPipe * pIUsbPipe = NULL; hr = m_FxDevice->QueryInterface(IID_PPV_ARGS(&pIUsbTargetFactory)); if (FAILED(hr)) { TraceEvents(TRACE_LEVEL_ERROR, TEST_TRACE_DEVICE, "%!FUNC! Cannot get usb target factory %!HRESULT!", hr ); } if (SUCCEEDED(hr)) { hr = pIUsbTargetFactory->CreateUsbTargetDevice( &pIUsbTargetDevice); if (FAILED(hr)) { TraceEvents(TRACE_LEVEL_ERROR, TEST_TRACE_DEVICE, "%!FUNC! Unable to create USB Device I/O Target %!HRESULT!", hr ); } else { m_pIUsbTargetDevice = pIUsbTargetDevice; // // Release the creation reference as object tree will maintain a reference // pIUsbTargetDevice->Release(); } } if (SUCCEEDED(hr)) { UCHAR NumInterfaces = pIUsbTargetDevice->GetNumInterfaces(); WUDF_TEST_DRIVER_ASSERT(1 == NumInterfaces); hr = pIUsbTargetDevice->RetrieveUsbInterface(0, &pIUsbInterface); if (FAILED(hr)) { TraceEvents(TRACE_LEVEL_ERROR, TEST_TRACE_DEVICE, "%!FUNC! Unable to retrieve USB interface from USB Device I/O Target %!HRESULT!", hr ); } else { m_pIUsbInterface = pIUsbInterface; pIUsbInterface->Release(); //release creation reference } } if (SUCCEEDED(hr)) { NumEndPoints = pIUsbInterface->GetNumEndPoints(); if (NumEndPoints != NUM_OSRUSB_ENDPOINTS) { hr = E_UNEXPECTED; TraceEvents(TRACE_LEVEL_ERROR, TEST_TRACE_DEVICE, "%!FUNC! Has %d endpoints, expected %d, returning %!HRESULT! ", NumEndPoints, NUM_OSRUSB_ENDPOINTS, hr ); } } if (SUCCEEDED(hr)) { for (UCHAR PipeIndex = 0; PipeIndex < NumEndPoints; PipeIndex++) { hr = pIUsbInterface->RetrieveUsbPipeObject(PipeIndex, &pIUsbPipe); if (FAILED(hr)) { TraceEvents(TRACE_LEVEL_ERROR, TEST_TRACE_DEVICE, "%!FUNC! Unable to retrieve USB Pipe for PipeIndex %d, %!HRESULT!", PipeIndex, hr ); } else { if ( pIUsbPipe->IsInEndPoint() ) { if ( UsbdPipeTypeInterrupt == pIUsbPipe->GetType() ) { m_pIUsbInterruptPipe = pIUsbPipe; WUDF_TEST_DRIVER_ASSERT(m_pIoTargetInterruptPipeStateMgmt == NULL); hr = m_pIUsbInterruptPipe->QueryInterface(__uuidof( IWDFIoTargetStateManagement), reinterpret_cast<void**>(&m_pIoTargetInterruptPipeStateMgmt) ); if (FAILED(hr)) { m_pIoTargetInterruptPipeStateMgmt = NULL; } } else if ( UsbdPipeTypeBulk == pIUsbPipe->GetType() ) { m_pIUsbInputPipe = pIUsbPipe; } else { pIUsbPipe->DeleteWdfObject(); } } else if ( pIUsbPipe->IsOutEndPoint() && (UsbdPipeTypeBulk == pIUsbPipe->GetType()) ) { m_pIUsbOutputPipe = pIUsbPipe; } else { pIUsbPipe->DeleteWdfObject(); } SAFE_RELEASE(pIUsbPipe); //release creation reference } } if (NULL == m_pIUsbInputPipe || NULL == m_pIUsbOutputPipe) { hr = E_UNEXPECTED; TraceEvents(TRACE_LEVEL_ERROR, TEST_TRACE_DEVICE, "%!FUNC! Input or output pipe not found, returning %!HRESULT!", hr ); } } SAFE_RELEASE(pIUsbTargetFactory); return hr; }