Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

593 lines
23 KiB

/**************************************************************************
*
* (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;