/******************************************************************************* * * (C) COPYRIGHT MICROSOFT CORP., 1998 * * TITLE: Extras.Cpp * * DESCRIPTION: * Implementation of IWiaItemExtras methods * *******************************************************************************/ #include "precomp.h" #include "stiexe.h" HRESULT CWiaItem::GetExtendedErrorInfo(BSTR *bstrRet) { HRESULT hr = S_OK; WCHAR *pDevErrStr = NULL; LONG lDevErrVal = 0; if (bstrRet) { *bstrRet = NULL; // // Call the driver to give us an error string // hr = m_pActiveDevice->m_DrvWrapper.WIA_drvGetDeviceErrorStr( 0, m_lLastDevErrVal, &pDevErrStr, &lDevErrVal); // // Overwrite the device error value with the new one. // m_lLastDevErrVal = lDevErrVal; if (SUCCEEDED(hr)) { // // Make a BSTR out of the returned string // if (pDevErrStr) { *bstrRet = SysAllocString(pDevErrStr); if (!(*bstrRet)) { DBG_ERR(("CWiaItem::GetExtendedErrorInfo, out of memory!")); hr = E_OUTOFMEMORY; } // // Free the returned string // CoTaskMemFree(pDevErrStr); pDevErrStr = NULL; } else { DBG_ERR(("CWiaItem::GetExtendedErrorInfo, Driver's drvGetDeviceErrorStr return success, but failed to return a string!")); hr = WIA_ERROR_INVALID_DRIVER_RESPONSE; } } } else { DBG_WRN(("CWiaItem::GetExtendedErrorInfo, NULL argument passed")); hr = E_INVALIDARG; } return hr; } HRESULT CWiaItem::Escape( DWORD EscapeFunction, LPBYTE lpInData, DWORD cbInDataSize, LPBYTE pOutData, DWORD dwOutDataSize, LPDWORD pdwActualData) { DBG_FN(CWiaItem::Escape); HRESULT hr = E_UNEXPECTED; // // Do some parameter validation. This shouldn't be necessary since // COM should have done it for us, but this is a paranoid check in // case we call it internally somewhere (and so skip COM validation). // if (IsBadReadPtr(lpInData, cbInDataSize)) { DBG_WRN(("CWiaItem::Escape, Input buffer is a bad read pointer (could not read cbInDataSize bytes)")); return E_INVALIDARG; } if (IsBadWritePtr(pOutData, dwOutDataSize)) { DBG_WRN(("CWiaItem::Escape, Output buffer is a bad write pointer (cannot write dwOutDataSize bytes)")); return E_INVALIDARG; } // // Everything OK so far, so make the Escape call // if (m_pActiveDevice) { LOCK_WIA_DEVICE _LWD(this, &hr); if(SUCCEEDED(hr)) { hr = m_pActiveDevice->m_DrvWrapper.STI_Escape(EscapeFunction, lpInData, cbInDataSize, pOutData, dwOutDataSize, pdwActualData); } } return hr; } HRESULT CWiaItem::CancelPendingIO() { HRESULT hr = S_OK; // // Driver interface must be valid. // if (!m_pActiveDevice) { DBG_ERR(("CWiaItem::CancelPendingIO, bad mini driver interface")); return E_FAIL; } // // Corresponding driver item must be valid. // hr = ValidateWiaDrvItemAccess(m_pWiaDrvItem); if (FAILED(hr)) { DBG_ERR(("CWiaItem::CancelPendingIO, ValidateWiaDrvItemAccess failed (0x%X)", hr)); return hr; } // // no need to take any locks -- this method should be fully // asynchronous. // hr = m_pActiveDevice->m_DrvWrapper.WIA_drvNotifyPnpEvent(&WIA_EVENT_CANCEL_IO, NULL, 0); if (FAILED(hr)) { DBG_ERR(("CWiaItem::CancelPendingIO, drvNotifyPnpEvent failed (0x%X)", hr)); return hr; } return hr; }