/************************************************************************** * * (C) COPYRIGHT MICROSOFT CORP., 2000 * * TITLE: wiafbdrv.h * * VERSION: 1.0 * * DATE: 18 July, 2000 * * DESCRIPTION: * * ***************************************************************************/ #include "pch.h" typedef GUID* PGUID; #if defined( _WIN32 ) && !defined( _NO_COM) ////////////////////////////////////////////////////////////////////////// // GUID / CLSID definition section (for your specific device) // // // // IMPORTANT!! - REMEMBER TO CHANGE YOUR .INF FILE TO MATCH YOUR WIA // // DRIVER'S CLSID!! // // // // // ////////////////////////////////////////////////////////////////////////// // BB6CF8E2-1511-40bd-91BA-80D43C53064E DEFINE_GUID(CLSID_FlatbedScannerUsd, 0xBB6CF8E2L, 0x1511, 0x40bd, 0x91, 0xBA, 0x80, 0xD4, 0x3C, 0x53, 0x06, 0x4E); // {48A89A69-C08C-482a-B3E5-CD50B50B5DFA} DEFINE_GUID(guidEventFirstLoaded, 0x48a89a69, 0xc08c, 0x482a, 0xb3, 0xe5, 0xcd, 0x50, 0xb5, 0xb, 0x5d, 0xfa); #endif ////////////////////////////////////////////////////////////////////////// // DLL #define Section // ////////////////////////////////////////////////////////////////////////// #define DATASEG_PERINSTANCE ".instance" #define DATASEG_SHARED ".shared" #define DATASEG_READONLY ".code" #define DATASEG_DEFAULT DATASEG_SHARED #define ENTERCRITICAL DllEnterCrit(void); #define LEAVECRITICAL DllLeaveCrit(void); #pragma data_seg(DATASEG_PERINSTANCE) #pragma data_seg(DATASEG_DEFAULT) extern UINT g_cRefThisDll; extern UINT g_cLocks; extern BOOL DllInitializeCOM(void); extern BOOL DllUnInitializeCOM(void); extern void DllAddRef(void); extern void DllRelease(void); // // Base structure for supporting non-delegating IUnknown for contained objects // struct INonDelegatingUnknown { // IUnknown-like methods STDMETHOD(NonDelegatingQueryInterface)(THIS_ REFIID riid, LPVOID *ppvObj) PURE; STDMETHOD_(ULONG,NonDelegatingAddRef)(THIS) PURE; STDMETHOD_(ULONG,NonDelegatingRelease)( THIS) PURE; }; // This sample WIA scanner supports a single scanning context. #define NUM_DEVICE_ITEM 1 // Device item specific context. typedef struct _MINIDRIVERITEMCONTEXT{ LONG lSize; LONG lTotalWritten; // Total image bytes written. // Scan parameters: LONG lDepth; // image bit depth LONG lBytesPerScanLine; // bytes per scan line (scanned data) LONG lBytesPerScanLineRaw; // bytes per scan line RAW (scanned data) LONG lTotalRequested; // Total image bytes requested. } MINIDRIVERITEMCONTEXT, *PMINIDRIVERITEMCONTEXT; // // Definitions controlling COLOR/BW support // #define NUM_DATA_TYPES_NONLEGACY 3 #define NUM_DATA_TYPES_LEGACY 2 // // Class definition for sample WIA scanner object // class CWIAScannerDevice : public IStiUSD, // STI USD interface public IWiaMiniDrv, // WIA Minidriver interface public INonDelegatingUnknown // NonDelegatingUnknown { public: ///////////////////////////////////////////////////////////////////////// // Construction/Destruction Section // ///////////////////////////////////////////////////////////////////////// CWIAScannerDevice(LPUNKNOWN punkOuter); HRESULT PrivateInitialize(); ~CWIAScannerDevice(); private: // COM object data ULONG m_cRef; // Device object reference count. // STI information BOOL m_fValid; // Is object initialized? LPUNKNOWN m_punkOuter; // Pointer to outer unknown. PSTIDEVICECONTROL m_pIStiDevControl; // Device control interface. BOOLEAN m_bUsdLoadEvent; // Controls load event. DWORD m_dwLastOperationError; // Last error. DWORD m_dwLockTimeout; // Lock timeout for LockDevice() calls BOOL m_bDeviceLocked; // device locked/unlocked CHAR *m_pszDeviceNameA; // CreateFileName for default RawRead/RawWrite handle HANDLE m_DeviceDefaultDataHandle;//default RawRead/RawWrite handle // Event information CRITICAL_SECTION m_csShutdown; // Syncronizes shutdown. HANDLE m_hSignalEvent; // Signal event handle. HANDLE m_hShutdownEvent; // Shutdown event handle. HANDLE m_hEventNotifyThread; // Does event notification. GUID m_guidLastEvent; // Last event ID. // WIA information, one time initialization. BSTR m_bstrDeviceID; // WIA unique device ID. BSTR m_bstrRootFullItemName; // Device name for prop streams. IWiaEventCallback *m_pIWiaEventCallback; // WIA event sink. IWiaDrvItem *m_pIDrvItemRoot; // The root item. IStiDevice *m_pStiDevice; // Sti object. HINSTANCE m_hInstance; // Module's HINSTANCE IWiaLog *m_pIWiaLog; // WIA logging object LONG m_NumSupportedCommands; // Number of supported commands LONG m_NumSupportedEvents; // Number of supported events LONG m_NumSupportedFormats; // Number of supported formats LONG m_NumCapabilities; // Number of capabilities LONG m_NumSupportedTYMED; // Number of supported TYMED LONG m_NumInitialFormats; // Number of Initial formats LONG m_NumSupportedDataTypes;// Number of supported data types LONG m_NumSupportedIntents; // Number of supported intents LONG m_NumSupportedCompressionTypes; // Number of supported compression types LONG m_NumSupportedResolutions; // Number of supported resolutions LONG m_NumSupportedPreviewModes;// Number of supported preview modes WIA_FORMAT_INFO *m_pSupportedFormats; // supported formats WIA_DEV_CAP_DRV *m_pCapabilities; // capabilities LONG *m_pSupportedTYMED; // supported TYMED GUID *m_pInitialFormats; // initial formats LONG *m_pSupportedDataTypes; // supported data types LONG *m_pSupportedIntents; // supported intents LONG *m_pSupportedCompressionTypes; // supported compression types LONG *m_pSupportedResolutions;// supported resolutions LONG *m_pSupportedPreviewModes;// supported preview modes LONG m_NumRootItemProperties;// Number of Root item properties LONG m_NumItemProperties; // Number of item properties LPOLESTR *m_pszRootItemDefaults; // root item property names PROPID *m_piRootItemDefaults; // root item property ids PROPVARIANT *m_pvRootItemDefaults; // root item property prop variants PROPSPEC *m_psRootItemDefaults; // root item property propspecs WIA_PROPERTY_INFO *m_wpiRootItemDefaults; // root item property attributes LPOLESTR *m_pszItemDefaults; // item property names PROPID *m_piItemDefaults; // item property ids PROPVARIANT *m_pvItemDefaults; // item property prop variants PROPSPEC *m_psItemDefaults; // item property propspecs WIA_PROPERTY_INFO *m_wpiItemDefaults; // item property attributes BOOL m_bADFAttached; // ADF attached BOOL m_bTPAEnabled; // TPA enabled BOOL m_bTPAAttached; // TPA attached LONG m_MaxBufferSize; // Maximum buffer for device LONG m_MinBufferSize; // Minimum buffer for device CScanAPI *m_pScanAPI; // Scanner device API class, (micro and script-based) BOOL m_bLegacyBWRestriction; // flag to restrict devices to BW and Grayscale scanning only // inline member functions BOOL inline IsValid(VOID) { return m_fValid; } public: ///////////////////////////////////////////////////////////////////////// // Standard COM Section // ///////////////////////////////////////////////////////////////////////// STDMETHODIMP QueryInterface( REFIID riid, LPVOID * ppvObj); STDMETHODIMP_(ULONG) AddRef( void); STDMETHODIMP_(ULONG) Release( void); ///////////////////////////////////////////////////////////////////////// // IStiUSD Interface Section (for all WIA drivers) // ///////////////////////////////////////////////////////////////////////// // // Methods for implementing the IStiUSD interface. // STDMETHOD(Initialize)(THIS_ PSTIDEVICECONTROL pHelDcb, DWORD dwStiVersion, HKEY hParametersKey); STDMETHOD(GetCapabilities)(THIS_ PSTI_USD_CAPS pDevCaps); STDMETHOD(GetStatus)(THIS_ PSTI_DEVICE_STATUS pDevStatus); STDMETHOD(DeviceReset)(THIS); STDMETHOD(Diagnostic)(THIS_ LPDIAG pBuffer); STDMETHOD(Escape)(THIS_ STI_RAW_CONTROL_CODE EscapeFunction, LPVOID lpInData, DWORD cbInDataSize, LPVOID pOutData, DWORD dwOutDataSize, LPDWORD pdwActualData); STDMETHOD(GetLastError)(THIS_ LPDWORD pdwLastDeviceError); STDMETHOD(LockDevice)(THIS); STDMETHOD(UnLockDevice)(THIS); STDMETHOD(RawReadData)(THIS_ LPVOID lpBuffer, LPDWORD lpdwNumberOfBytes, LPOVERLAPPED lpOverlapped); STDMETHOD(RawWriteData)(THIS_ LPVOID lpBuffer, DWORD nNumberOfBytes, LPOVERLAPPED lpOverlapped); STDMETHOD(RawReadCommand)(THIS_ LPVOID lpBuffer, LPDWORD lpdwNumberOfBytes, LPOVERLAPPED lpOverlapped); STDMETHOD(RawWriteCommand)(THIS_ LPVOID lpBuffer, DWORD nNumberOfBytes, LPOVERLAPPED lpOverlapped); STDMETHOD(SetNotificationHandle)(THIS_ HANDLE hEvent); STDMETHOD(GetNotificationData)(THIS_ LPSTINOTIFY lpNotify); STDMETHOD(GetLastErrorInfo)(THIS_ STI_ERROR_INFO *pLastErrorInfo); ///////////////////////////////////////////////////////////////////////// // IWiaMiniDrv Interface Section (for all WIA drivers) // ///////////////////////////////////////////////////////////////////////// // // Methods for implementing WIA's Mini driver interface // STDMETHOD(drvInitializeWia)(THIS_ BYTE *pWiasContext, LONG lFlags, BSTR bstrDeviceID, BSTR bstrRootFullItemName, IUnknown *pStiDevice, IUnknown *pIUnknownOuter, IWiaDrvItem **ppIDrvItemRoot, IUnknown **ppIUnknownInner, LONG *plDevErrVal); STDMETHOD(drvGetDeviceErrorStr)(THIS_ LONG lFlags, LONG lDevErrVal, LPOLESTR *ppszDevErrStr, LONG *plDevErr); STDMETHOD(drvDeviceCommand)(THIS_ BYTE *pWiasContext, LONG lFlags, const GUID *plCommand, IWiaDrvItem **ppWiaDrvItem, LONG *plDevErrVal); STDMETHOD(drvAcquireItemData)(THIS_ BYTE *pWiasContext, LONG lFlags, PMINIDRV_TRANSFER_CONTEXT pmdtc, LONG *plDevErrVal); STDMETHOD(drvInitItemProperties)(THIS_ BYTE *pWiasContext, LONG lFlags, LONG *plDevErrVal); STDMETHOD(drvValidateItemProperties)(THIS_ BYTE *pWiasContext, LONG lFlags, ULONG nPropSpec, const PROPSPEC *pPropSpec, LONG *plDevErrVal); STDMETHOD(drvWriteItemProperties)(THIS_ BYTE *pWiasContext, LONG lFlags, PMINIDRV_TRANSFER_CONTEXT pmdtc, LONG *plDevErrVal); STDMETHOD(drvReadItemProperties)(THIS_ BYTE *pWiasContext, LONG lFlags, ULONG nPropSpec, const PROPSPEC *pPropSpec, LONG *plDevErrVal); STDMETHOD(drvLockWiaDevice)(THIS_ BYTE *pWiasContext, LONG lFlags, LONG *plDevErrVal); STDMETHOD(drvUnLockWiaDevice)(THIS_ BYTE *pWiasContext, LONG lFlags, LONG *plDevErrVal); STDMETHOD(drvAnalyzeItem)(THIS_ BYTE *pWiasContext, LONG lFlags, LONG *plDevErrVal); STDMETHOD(drvDeleteItem)(THIS_ BYTE *pWiasContext, LONG lFlags, LONG *plDevErrVal); STDMETHOD(drvFreeDrvItemContext)(THIS_ LONG lFlags, BYTE *pSpecContext, LONG *plDevErrVal); STDMETHOD(drvGetCapabilities)(THIS_ BYTE *pWiasContext, LONG ulFlags, LONG *pcelt, WIA_DEV_CAP_DRV **ppCapabilities, LONG *plDevErrVal); STDMETHOD(drvGetWiaFormatInfo)(THIS_ BYTE *pWiasContext, LONG lFlags, LONG *pcelt, WIA_FORMAT_INFO **ppwfi, LONG *plDevErrVal); STDMETHOD(drvNotifyPnpEvent)(THIS_ const GUID *pEventGUID, BSTR bstrDeviceID, ULONG ulReserved); STDMETHOD(drvUnInitializeWia)(THIS_ BYTE *pWiasContext); ///////////////////////////////////////////////////////////////////////// // INonDelegating Interface Section (for all WIA drivers) // ///////////////////////////////////////////////////////////////////////// // // IUnknown-like methods. Needed in conjunction with normal IUnknown // methods to implement delegating components. // STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, LPVOID * ppvObj); STDMETHODIMP_(ULONG) NonDelegatingAddRef(); STDMETHODIMP_(ULONG) NonDelegatingRelease(); private: ///////////////////////////////////////////////////////////////////////// // Private helper functions section (for your specific driver) // ///////////////////////////////////////////////////////////////////////// // // // This section is for private helpers used for common WIA operations. // // These are custom to your driver. // // // // // // -- WIA Item Management Helpers // // BuildItemTree() // // DeleteItemTree() // // // // -- WIA Property Management Helpers // // BuildRootItemProperties() // // BuildTopItemProperties() // // // // -- WIA Capability Management Helpers // // BuildRootItemProperties() // // DeleteRootItemProperties() // // BuildTopItemProperties() // // DeleteTopItemProperties() // // BuildCapabilities() // // DeleteCapabilitiesArrayContents() // // BuildSupportedFormats() // // DeleteSupportedFormatsArrayContents() // // BuildSupportedDataTypes() // // DeleteSupportedDataTypesArrayContents() // // BuildSupportedIntents() // // DeleteSupportedIntentsArrayContents() // // BuildSupportedCompressions() // // DeleteSupportedCompressionsArrayContents() // // BuildSupportedTYMED() // // DeleteSupportedTYMEDArrayContents() // // BuildInitialFormats() // // DeleteInitialFormatsArrayContents() // // // // -- WIA Validation Helpers // // CheckDataType() // // CheckIntent() // // CheckPreferredFormat() // // SetItemSize() // // UpdateValidDepth() // // ValidateDataTransferContext() // // // // -- WIA Resource file Helpers // // GetBSTRResourceString() // // GetOLESTRResourceString() // // // // -- WIA Data acqusition Helpers // // ScanItem() // // ScanItemCB() // // SendBitmapHeader() // // // // // // // // // // // ///////////////////////////////////////////////////////////////////////// HRESULT _stdcall BuildItemTree(void); HRESULT _stdcall DeleteItemTree(void); HRESULT BuildRootItemProperties(); HRESULT DeleteRootItemProperties(); HRESULT BuildTopItemProperties(); HRESULT DeleteTopItemProperties(); HRESULT BuildCapabilities(); HRESULT DeleteCapabilitiesArrayContents(); HRESULT BuildSupportedFormats(); HRESULT DeleteSupportedFormatsArrayContents(); HRESULT BuildSupportedDataTypes(); HRESULT DeleteSupportedDataTypesArrayContents(); HRESULT BuildSupportedIntents(); HRESULT DeleteSupportedIntentsArrayContents(); HRESULT BuildSupportedCompressions(); HRESULT DeleteSupportedCompressionsArrayContents(); HRESULT BuildSupportedPreviewModes(); HRESULT DeleteSupportedPreviewModesArrayContents(); HRESULT BuildSupportedTYMED(); HRESULT DeleteSupportedTYMEDArrayContents(); HRESULT BuildSupportedResolutions(); HRESULT DeleteSupportedResolutionsArrayContents(); HRESULT BuildInitialFormats(); HRESULT DeleteInitialFormatsArrayContents(); HRESULT CheckDataType( BYTE *pWiasContext, WIA_PROPERTY_CONTEXT *pContext); HRESULT CheckIntent( BYTE *pWiasContext, WIA_PROPERTY_CONTEXT *pContext); HRESULT CheckPreferredFormat( BYTE *pWiasContext, WIA_PROPERTY_CONTEXT *pContext); HRESULT CheckADFStatus(BYTE *pWiasContext, WIA_PROPERTY_CONTEXT *pContext); HRESULT CheckPreview(BYTE *pWiasContext, WIA_PROPERTY_CONTEXT *pContext); HRESULT UpdateValidDepth( BYTE *pWiasContext, LONG lDataType, LONG *lDepth); HRESULT ValidateDataTransferContext( PMINIDRV_TRANSFER_CONTEXT pDataTransferContext); HRESULT SetItemSize( BYTE *pWiasContext); HRESULT _stdcall ScanItem( PMINIDRIVERITEMCONTEXT, PMINIDRV_TRANSFER_CONTEXT, LONG*); HRESULT _stdcall ScanItemCB( PMINIDRIVERITEMCONTEXT, PMINIDRV_TRANSFER_CONTEXT, LONG*); HRESULT SendBitmapHeader( PMINIDRV_TRANSFER_CONTEXT pmdtc); HRESULT SendFilePreviewBitmapHeader( PMINIDRV_TRANSFER_CONTEXT pmdtc); HRESULT GetBSTRResourceString( LONG lLocalResourceID, BSTR *pBSTR, BOOL bLocal); HRESULT GetOLESTRResourceString( LONG lLocalResourceID, LPOLESTR *ppsz, BOOL bLocal); UINT AlignInPlace( PBYTE pBuffer, LONG cbWritten, LONG lBytesPerScanLine, LONG lBytesPerScanLineRaw); VOID VerticalFlip( PMINIDRIVERITEMCONTEXT pDrvItemContext, PMINIDRV_TRANSFER_CONTEXT pDataTransferContext); VOID SwapBuffer24( PBYTE pBuffer, LONG lByteCount); LONG GetPageCount( BYTE *pWiasContext); BOOL IsPreviewScan( BYTE *pWiasContext); BOOL IsADFEnabled( BYTE *pWiasContext); public: HRESULT DoEventProcessing(); }; typedef CWIAScannerDevice *PWIASCANNERDEVICE;