#include "pch.h" CComModule _Module; #include DEFINE_GUID(CLSID_VBScript, 0xb54f3741, 0x5b07, 0x11cf, 0xa4, 0xb0, 0x0, 0xaa, 0x0, 0x4a, 0x55, 0xe8); CIOBlock::CIOBlock() { memset(m_szFileName,0,sizeof(m_szFileName)); } CIOBlock::~CIOBlock() { StopScriptEngine(); } void CIOBlock::Initialize(PGSD_INFO pGSDInfo) { // SBB - RAID 370299 - orenr - 2001/04/18 - Security fix - // potential buffer overrun. Changed lstrcpy to use // _tcsncpy instead. // ZeroMemory(m_szFileName, sizeof(m_szFileName)); _tcsncpy(m_szFileName, pGSDInfo->szProductFileName, (sizeof(m_szFileName) / sizeof(TCHAR)) - 1); } HRESULT CIOBlock::StartScriptEngine() { HRESULT hr = S_OK; // // load scriptlets // hr = LoadScript(); if(FAILED(hr)){ return hr; } m_pDeviceScriptSite = new CDeviceScriptSite; if(m_pDeviceScriptSite){ m_pDeviceProperty = new CComObject; if(m_pDeviceProperty){ m_pDeviceAction = new CComObject; if(m_pDeviceAction){ m_pDeviceControl = new CComObject; if(m_pDeviceControl){ m_pLastError = new CComObject; if(!m_pLastError){ hr = E_OUTOFMEMORY; } } else { hr = E_OUTOFMEMORY; } } else { hr = E_OUTOFMEMORY; } } else { hr = E_OUTOFMEMORY; } } else { hr = E_OUTOFMEMORY; } if(FAILED(hr)){ // // Delete site & objects // if (m_pDeviceScriptSite) { delete m_pDeviceScriptSite; m_pDeviceScriptSite = NULL; } if (m_pDeviceProperty) { delete m_pDeviceProperty; m_pDeviceProperty = NULL; } if (m_pDeviceAction) { delete m_pDeviceAction; m_pDeviceAction = NULL; } if (m_pLastError) { m_pLastError = NULL; } } // // Initialize objects // m_pDeviceProperty->m_pScannerSettings = &m_ScannerSettings; m_pDeviceControl->m_pScannerSettings = &m_ScannerSettings; m_pDeviceAction->m_pScannerSettings = &m_ScannerSettings; // // get type library information // ITypeLib *ptLib = 0; // hr = LoadTypeLib(L"wiafb.tlb", &ptLib); // type library as a separate file hr = LoadTypeLib(OLESTR("wiafbdrv.dll\\2"), &ptLib); // type library as a resource if (SUCCEEDED(hr)) { Trace(TEXT("Type library loaded")); } else { Trace(TEXT("Type library failed to load")); } ptLib->GetTypeInfoOfGuid(CLSID_DeviceProperty, &m_pDeviceScriptSite->m_pTypeInfo); ptLib->GetTypeInfoOfGuid(CLSID_DeviceAction, &m_pDeviceScriptSite->m_pTypeInfoDeviceAction); ptLib->GetTypeInfoOfGuid(CLSID_DeviceControl, &m_pDeviceScriptSite->m_pTypeInfoDeviceControl); ptLib->GetTypeInfoOfGuid(CLSID_LastError, &m_pDeviceScriptSite->m_pTypeInfoLastError); ptLib->Release(); // // Intialize DeviceScriptSite with IUnknowns of scripting objects // hr = m_pDeviceProperty->QueryInterface(IID_IUnknown,(void **)&m_pDeviceScriptSite->m_pUnkScriptObject); if (SUCCEEDED(hr)) { Trace(TEXT("QI on DeviceProperty success")); } else { Trace(TEXT("QI on DeviceProperty FAILED")); } hr = m_pDeviceAction->QueryInterface(IID_IUnknown,(void **)&m_pDeviceScriptSite->m_pUnkScriptObjectDeviceAction); if (SUCCEEDED(hr)) { Trace(TEXT("QI on DeviceAction success")); } else { Trace(TEXT("QI on DeviceAction FAILED")); } hr = m_pDeviceControl->QueryInterface(IID_IUnknown,(void **)&m_pDeviceScriptSite->m_pUnkScriptObjectDeviceControl); if (SUCCEEDED(hr)) { Trace(TEXT("QI on DeviceControl success")); } else { Trace(TEXT("QI on DeviceControl FAILED")); } hr = m_pLastError->QueryInterface(IID_IUnknown,(void **)&m_pDeviceScriptSite->m_pUnkScriptObjectLastError); if (SUCCEEDED(hr)) { Trace(TEXT("QI on LastError success")); } else { Trace(TEXT("QI on LastError FAILED")); } // // Start inproc script engine, VBSCRIPT.DLL // hr = CoCreateInstance(CLSID_VBScript, NULL, CLSCTX_INPROC_SERVER, IID_IActiveScript, (void **)&m_pActiveScript); if (SUCCEEDED(hr)) { Trace(TEXT("CoCreateInstance, VBScript")); } else { Trace(TEXT("CoCreateInstance, VBScript FAILED")); Trace(TEXT("hr = %x"),hr); } // // Get engine's IActiveScriptParse interface. // hr = m_pActiveScript->QueryInterface(IID_IActiveScriptParse, (void **)&m_pActiveScriptParser); if (SUCCEEDED(hr)) { Trace(TEXT("QI pm ActiveParse success")); } else { Trace(TEXT("QI pm ActiveParse FAILED")); Trace(TEXT("hr = %x"),hr); } // // Give engine our DeviceScriptSite interface... // hr = m_pActiveScript->SetScriptSite((IActiveScriptSite *)m_pDeviceScriptSite); if (SUCCEEDED(hr)) { Trace(TEXT("SetScriptSite ")); } else { Trace(TEXT("SetScriptSite FAILED")); Trace(TEXT("hr = %x"),hr); } // // Intialize Engine // hr = m_pActiveScriptParser->InitNew(); if (SUCCEEDED(hr)) { Trace(TEXT("InitNew")); } else { Trace(TEXT("InitNew FAILED")); Trace(TEXT("hr = %x"),hr); } // // Add object names to ActiveScript's known named item list // hr = m_pActiveScript->AddNamedItem(L"DeviceProperty", SCRIPTITEM_ISVISIBLE); if (SUCCEEDED(hr)) { Trace(TEXT("added item")); } else { Trace(TEXT("added item FAILED")); Trace(TEXT("hr = %x"),hr); } hr = m_pActiveScript->AddNamedItem(L"DeviceAction", SCRIPTITEM_ISVISIBLE | SCRIPTITEM_ISSOURCE); if (SUCCEEDED(hr)) { Trace(TEXT("added item")); } else { Trace(TEXT("added item FAILED")); Trace(TEXT("hr = %x"),hr); } hr = m_pActiveScript->AddNamedItem(L"DeviceControl", SCRIPTITEM_ISVISIBLE); if (SUCCEEDED(hr)) { Trace(TEXT("added item")); } else { Trace(TEXT("added item FAILED")); Trace(TEXT("hr = %x"),hr); } hr = m_pActiveScript->AddNamedItem(L"LastError", SCRIPTITEM_ISVISIBLE); if (SUCCEEDED(hr)) { Trace(TEXT("added item")); } else { Trace(TEXT("added item FAILED")); Trace(TEXT("hr = %x"),hr); } return ProcessScript(); } HRESULT CIOBlock::StopScriptEngine() { HRESULT hr = S_OK; // // Release interfaces // if(m_pActiveScriptParser){ m_pActiveScriptParser->Release(); m_pActiveScriptParser = NULL; } if (m_pActiveScript) { m_pActiveScript->Release(); m_pActiveScript = NULL; } // // Delete site & objects // if (m_pDeviceScriptSite) { delete m_pDeviceScriptSite; m_pDeviceScriptSite = NULL; } if (m_pDeviceProperty) { delete m_pDeviceProperty; m_pDeviceProperty = NULL; } if (m_pDeviceAction) { delete m_pDeviceAction; m_pDeviceAction = NULL; } if (m_pLastError) { m_pLastError = NULL; } // // free scriptlets // if(m_wszScriptText){ LocalFree(m_wszScriptText); } return hr; } HRESULT CIOBlock::LoadScript() { HRESULT hr = S_OK; DWORD dwFileSize = 0; DWORD dwBytesRead = 0; CHAR *pBytes = NULL; HANDLE hGSDProductLineFile = NULL; BY_HANDLE_FILE_INFORMATION FileInfo; // // construct Window's system path // TCHAR szFullFilePath[255]; GetSystemDirectory(szFullFilePath,(sizeof(szFullFilePath)/sizeof(TCHAR))); lstrcat(szFullFilePath,TEXT("\\")); lstrcat(szFullFilePath,m_szFileName); // // open script file // Trace(TEXT("Opening this script file: %ws"),szFullFilePath); hGSDProductLineFile = CreateFile(szFullFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (NULL == hGSDProductLineFile || INVALID_HANDLE_VALUE == hGSDProductLineFile) { DWORD dwError = 0; dwError = GetLastError(); Trace(TEXT("CreateFile() LastError reports %d "),dwError); return E_FAIL; } // // calculate needed space, for script text buffer // GetFileInformationByHandle(hGSDProductLineFile,&FileInfo); dwFileSize = FileInfo.nFileSizeLow; // // alloc temp memory, for reading script file, read file, and close file // pBytes = (CHAR*)LocalAlloc(LPTR,(dwFileSize + 1024)); if (NULL != pBytes) { ReadFile(hGSDProductLineFile,pBytes,dwFileSize,&dwBytesRead,NULL); CloseHandle(hGSDProductLineFile); if ((dwBytesRead == dwFileSize)) { // // allocate text buffer // m_wszScriptText = (WCHAR*)LocalAlloc(LPTR,(dwFileSize * 2) + 1024); if(NULL != m_wszScriptText){ memset(m_wszScriptText,0,(dwFileSize * 2) + 1024); MultiByteToWideChar(CP_ACP, 0, pBytes, dwBytesRead, m_wszScriptText, (dwFileSize*2) + 1024); } } else { hr = E_FAIL; } // // free temp buffer // LocalFree(pBytes); } return hr; } HRESULT CIOBlock::ProcessScript() { HRESULT hr = S_OK; EXCEPINFO ei; // // parse scriptlet // note: we are alloc a copy here... should we keep the original // around for extra processing...manually?? // BSTR pParseText = ::SysAllocString(m_wszScriptText); hr = m_pActiveScriptParser->ParseScriptText(pParseText, NULL, NULL, NULL, 0, 0, 0L, NULL, &ei); if (SUCCEEDED(hr)) { Trace(TEXT("script parsed")); } else { Trace(TEXT("script parse FAILED")); Trace(TEXT("hr = %x"),hr); } ::SysFreeString(pParseText); // // Execute the scriptlet // hr = m_pActiveScript->SetScriptState(SCRIPTSTATE_CONNECTED); if (SUCCEEDED(hr)) { Trace(TEXT("Scripted connected")); } else { Trace(TEXT("Scripted connection FAILED")); Trace(TEXT("hr = %x"),hr); } return hr; } HRESULT CIOBlock::DebugDumpScannerSettings() { HRESULT hr = S_OK; // #define _USE_DUMMY_VALUES #ifdef _USE_DUMMY_VALUES lstrcpy(m_ScannerSettings.Version,TEXT("1.0")); lstrcpy(m_ScannerSettings.DeviceName,TEXT("HP 5P Driver")); lstrcpy(m_ScannerSettings.FirmwareVersion,TEXT("1.01")); m_ScannerSettings.BUSType = BUS_TYPE_SCSI; m_ScannerSettings.bNegative = TRUE; m_ScannerSettings.CurrentXResolution = 300; m_ScannerSettings.CurrentYResolution = 300; m_ScannerSettings.BedWidth = 8500; m_ScannerSettings.BedHeight = 11693; m_ScannerSettings.XOpticalResolution = 300; m_ScannerSettings.YOpticalResolution = 300; m_ScannerSettings.CurrentBrightness = 32; m_ScannerSettings.CurrentContrast = 12; m_ScannerSettings.ADFSupport = FALSE; m_ScannerSettings.TPASupport = FALSE; m_ScannerSettings.RawPixelPackingOrder = WIA_PACKED_PIXEL; m_ScannerSettings.RawPixelFormat = WIA_ORDER_BGR; m_ScannerSettings.RawDataAlignment = DWORD_ALIGN; m_ScannerSettings.FeederWidth = m_ScannerSettings.BedWidth; m_ScannerSettings.FeederHeight = m_ScannerSettings.BedHeight; m_ScannerSettings.VFeederJustification = LEFT_JUSTIFIED; m_ScannerSettings.HFeederJustification = TOP_JUSTIFIED; m_ScannerSettings.MaxADFPageCapacity = 30; m_ScannerSettings.CurrentDataType = WIA_DATA_GRAYSCALE; m_ScannerSettings.CurrentBitDepth = 8; m_ScannerSettings.XSupportedResolutionsRange.lMax = 1200; m_ScannerSettings.XSupportedResolutionsRange.lMin = 12; m_ScannerSettings.XSupportedResolutionsRange.lStep = 1; m_ScannerSettings.YSupportedResolutionsRange.lMax = 1200; m_ScannerSettings.YSupportedResolutionsRange.lMin = 12; m_ScannerSettings.YSupportedResolutionsRange.lStep = 1; m_ScannerSettings.XExtentsRange.lMax = 2550; m_ScannerSettings.XExtentsRange.lMin = 1; m_ScannerSettings.XExtentsRange.lStep = 1; m_ScannerSettings.YExtentsRange.lMax = 3507; m_ScannerSettings.YExtentsRange.lMin = 1; m_ScannerSettings.YExtentsRange.lStep = 1; m_ScannerSettings.XPosRange.lMax = 2549; m_ScannerSettings.XPosRange.lMin = 0; m_ScannerSettings.XPosRange.lStep = 1; m_ScannerSettings.YPosRange.lMax = 3506; m_ScannerSettings.YPosRange.lMin = 0; m_ScannerSettings.YPosRange.lStep = 1; m_ScannerSettings.CurrentXPos = 0; m_ScannerSettings.CurrentYPos = 0; m_ScannerSettings.CurrentXExtent = m_ScannerSettings.XExtentsRange.lMax; m_ScannerSettings.CurrentYExtent = m_ScannerSettings.YExtentsRange.lMax; m_ScannerSettings.BrightnessRange.lMax = 127; m_ScannerSettings.BrightnessRange.lMin = -127; m_ScannerSettings.BrightnessRange.lStep = 1; m_ScannerSettings.ContrastRange.lMax = 127; m_ScannerSettings.ContrastRange.lMin = -127; m_ScannerSettings.ContrastRange.lStep = 1; m_ScannerSettings.XSupportedResolutionsList = NULL; m_ScannerSettings.YSupportedResolutionsList = NULL; INT iNumValues = 4; // add 1 extra for header node m_ScannerSettings.SupportedDataTypesList = (PLONG)LocalAlloc(LPTR,(sizeof(LONG) * iNumValues)); if(m_ScannerSettings.SupportedDataTypesList){ m_ScannerSettings.SupportedDataTypesList[0] = (iNumValues - 1); m_ScannerSettings.SupportedDataTypesList[1] = WIA_DATA_THRESHOLD; m_ScannerSettings.SupportedDataTypesList[2] = WIA_DATA_GRAYSCALE; m_ScannerSettings.SupportedDataTypesList[3] = WIA_DATA_COLOR; } else { m_ScannerSettings.SupportedDataTypesList = NULL; } #endif Trace(TEXT(" -- m_ScannerSettings structure dump --")); Trace(TEXT("BUSType = %d"),m_ScannerSettings.BUSType); Trace(TEXT("bNegative = %d"),m_ScannerSettings.bNegative); Trace(TEXT("CurrentXResolution = %d"),m_ScannerSettings.CurrentXResolution); Trace(TEXT("CurrentYResolution = %d"),m_ScannerSettings.CurrentYResolution); Trace(TEXT("BedWidth = %d"),m_ScannerSettings.BedWidth); Trace(TEXT("BedHeight = %d"),m_ScannerSettings.BedHeight); Trace(TEXT("XOpticalResolution = %d"),m_ScannerSettings.XOpticalResolution); Trace(TEXT("YOpticalResolution = %d"),m_ScannerSettings.YOpticalResolution); Trace(TEXT("CurrentBrightness = %d"),m_ScannerSettings.CurrentBrightness); Trace(TEXT("CurrentContrast = %d"),m_ScannerSettings.CurrentContrast); Trace(TEXT("ADFSupport = %d"),m_ScannerSettings.ADFSupport); Trace(TEXT("TPASupport = %d"),m_ScannerSettings.TPASupport); Trace(TEXT("RawPixelPackingOrder = %d"),m_ScannerSettings.RawPixelPackingOrder); Trace(TEXT("RawPixelFormat = %d"),m_ScannerSettings.RawPixelFormat); Trace(TEXT("RawDataAlignment = %d"),m_ScannerSettings.RawDataAlignment); Trace(TEXT("FeederWidth = %d"),m_ScannerSettings.FeederWidth); Trace(TEXT("FeederHeight = %d"),m_ScannerSettings.FeederHeight); Trace(TEXT("VFeederJustification = %d"),m_ScannerSettings.VFeederJustification); Trace(TEXT("HFeederJustification = %d"),m_ScannerSettings.HFeederJustification); Trace(TEXT("MaxADFPageCapacity = %d"),m_ScannerSettings.MaxADFPageCapacity); Trace(TEXT("CurrentDataType = %d"),m_ScannerSettings.CurrentDataType ); Trace(TEXT("CurrentBitDepth = %d"),m_ScannerSettings.CurrentBitDepth); Trace(TEXT("XSupportedResolutionsRange.lMax = %d"),m_ScannerSettings.XSupportedResolutionsRange.lMax); Trace(TEXT("XSupportedResolutionsRange.lMin = %d"),m_ScannerSettings.XSupportedResolutionsRange.lMin); Trace(TEXT("XSupportedResolutionsRange.lNom = %d"),m_ScannerSettings.XSupportedResolutionsRange.lNom); Trace(TEXT("XSupportedResolutionsRange.lStep = %d"),m_ScannerSettings.XSupportedResolutionsRange.lStep); Trace(TEXT("YSupportedResolutionsRange.lMax = %d"),m_ScannerSettings.YSupportedResolutionsRange.lMax); Trace(TEXT("YSupportedResolutionsRange.lMin = %d"),m_ScannerSettings.YSupportedResolutionsRange.lMin); Trace(TEXT("YSupportedResolutionsRange.lNom = %d"),m_ScannerSettings.YSupportedResolutionsRange.lNom); Trace(TEXT("YSupportedResolutionsRange.lStep = %d"),m_ScannerSettings.YSupportedResolutionsRange.lStep); Trace(TEXT("XExtentsRange.lMax = %d"),m_ScannerSettings.XExtentsRange.lMax); Trace(TEXT("XExtentsRange.lMin = %d"),m_ScannerSettings.XExtentsRange.lMin); Trace(TEXT("XExtentsRange.lNom = %d"),m_ScannerSettings.XExtentsRange.lNom); Trace(TEXT("XExtentsRange.lStep = %d"),m_ScannerSettings.XExtentsRange.lStep); Trace(TEXT("YExtentsRange.lMax = %d"),m_ScannerSettings.YExtentsRange.lMax); Trace(TEXT("YExtentsRange.lMin = %d"),m_ScannerSettings.YExtentsRange.lMin); Trace(TEXT("YExtentsRange.lNom = %d"),m_ScannerSettings.YExtentsRange.lNom); Trace(TEXT("YExtentsRange.lStep = %d"),m_ScannerSettings.YExtentsRange.lStep); Trace(TEXT("XPosRange.lMax = %d"),m_ScannerSettings.XPosRange.lMax); Trace(TEXT("XPosRange.lMin = %d"),m_ScannerSettings.XPosRange.lMin); Trace(TEXT("XPosRange.lNom = %d"),m_ScannerSettings.XPosRange.lNom); Trace(TEXT("XPosRange.lStep = %d"),m_ScannerSettings.XPosRange.lStep); Trace(TEXT("YPosRange.lMax = %d"),m_ScannerSettings.YPosRange.lMax); Trace(TEXT("YPosRange.lMin = %d"),m_ScannerSettings.YPosRange.lMin); Trace(TEXT("YPosRange.lNom = %d"),m_ScannerSettings.YPosRange.lNom); Trace(TEXT("YPosRange.lStep = %d"),m_ScannerSettings.YPosRange.lStep); Trace(TEXT("CurrentXPos = %d"),m_ScannerSettings.CurrentXPos); Trace(TEXT("CurrentYPos = %d"),m_ScannerSettings.CurrentYPos); Trace(TEXT("CurrentXExtent = %d"),m_ScannerSettings.CurrentXExtent); Trace(TEXT("CurrentYExtent = %d"),m_ScannerSettings.CurrentYExtent); Trace(TEXT("BrightnessRange.lMax = %d"),m_ScannerSettings.BrightnessRange.lMax); Trace(TEXT("BrightnessRange.lMin = %d"),m_ScannerSettings.BrightnessRange.lMin); Trace(TEXT("BrightnessRange.lNom = %d"),m_ScannerSettings.BrightnessRange.lNom); Trace(TEXT("BrightnessRange.lStep = %d"),m_ScannerSettings.BrightnessRange.lStep); Trace(TEXT("ContrastRange.lMax = %d"),m_ScannerSettings.ContrastRange.lMax); Trace(TEXT("ContrastRange.lMin = %d"),m_ScannerSettings.ContrastRange.lMin); Trace(TEXT("ContrastRange.lNom = %d"),m_ScannerSettings.ContrastRange.lNom); Trace(TEXT("ContrastRange.lStep = %d"),m_ScannerSettings.ContrastRange.lStep); Trace(TEXT("XSupportedResolutionsList = %x"),m_ScannerSettings.XSupportedResolutionsList); Trace(TEXT("YSupportedResolutionsList = %x"),m_ScannerSettings.YSupportedResolutionsList); if(m_ScannerSettings.XSupportedResolutionsList) { LONG lNumResolutions = m_ScannerSettings.XSupportedResolutionsList[0]; Trace(TEXT("Number of Supported X Resolutions = %d"),lNumResolutions); for(LONG i = 1;i<=lNumResolutions;i++){ Trace(TEXT("Supported Resolution #%d = %d"),i,m_ScannerSettings.XSupportedResolutionsList[i]); } } if(m_ScannerSettings.YSupportedResolutionsList) { LONG lNumResolutions = m_ScannerSettings.YSupportedResolutionsList[0]; Trace(TEXT("Number of Supported Y Resolutions = %d"),lNumResolutions); for(LONG i = 1;i<=lNumResolutions;i++){ Trace(TEXT("Supported Resolution #%d = %d"),i,m_ScannerSettings.YSupportedResolutionsList[i]); } } return hr; } HRESULT CIOBlock::ReadValue(LONG ValueID, PLONG plValue) { HRESULT hr = S_OK; if(NULL == plValue){ return E_INVALIDARG; } // // set returned long value to 0 // *plValue = 0; // // initialize LastError Object to SUCCESS // m_pLastError->m_hr = S_OK; // // set action ID // m_pDeviceAction->m_DeviceActionID = 102; // make #define // // set value ID // m_pDeviceAction->m_DeviceValueID = ValueID; // // // ****************************************** // // // // // Give engine our DeviceScriptSite interface... // IActiveScript *pActiveScript = NULL; hr = m_pActiveScript->Clone(&pActiveScript); if (SUCCEEDED(hr)) { Trace(TEXT("cloning script success")); } else { Trace(TEXT("cloning script FAILED")); Trace(TEXT("hr = %x"),hr); } hr = pActiveScript->SetScriptSite((IActiveScriptSite *)m_pDeviceScriptSite); if (SUCCEEDED(hr)) { Trace(TEXT("SetScriptSite on cloned script")); } else { Trace(TEXT("SetScriptSite on cloned script FAILED")); Trace(TEXT("hr = %x"),hr); } // // Execute the scriptlet // hr = m_pActiveScript->SetScriptState(SCRIPTSTATE_CONNECTED); if (SUCCEEDED(hr)) { Trace(TEXT("Scripted connected")); } else { Trace(TEXT("Scripted connection FAILED")); Trace(TEXT("hr = %x"),hr); } // // // ****************************************** // // // // // signal script event (DeviceActionEvent) // hr = m_pDeviceAction->Fire_DeviceActionEvent(); if(SUCCEEDED(hr)){ // // check for any script-returned errors // hr = m_pLastError->m_hr; if(SUCCEEDED(hr)){ *plValue = m_pDeviceAction->m_lValue; } } return hr; } HRESULT CIOBlock::WriteValue(LONG ValueID, LONG lValue) { HRESULT hr = S_OK; // // initialize LastError Object to SUCCESS // m_pLastError->m_hr = S_OK; // // set action ID // m_pDeviceAction->m_DeviceActionID = 101; // make #define // // set value ID // m_pDeviceAction->m_DeviceValueID = ValueID; // // set value // m_pDeviceAction->m_lValue = lValue; // // // ****************************************** // // // // // Give engine our DeviceScriptSite interface... // IActiveScript *pActiveScript = NULL; hr = m_pActiveScript->Clone(&pActiveScript); if (SUCCEEDED(hr)) { Trace(TEXT("cloning script success")); } else { Trace(TEXT("cloning script FAILED")); Trace(TEXT("hr = %x"),hr); } hr = pActiveScript->SetScriptSite((IActiveScriptSite *)m_pDeviceScriptSite); if (SUCCEEDED(hr)) { Trace(TEXT("SetScriptSite on cloned script")); } else { Trace(TEXT("SetScriptSite on cloned script FAILED")); Trace(TEXT("hr = %x"),hr); } // // Execute the scriptlet // hr = m_pActiveScript->SetScriptState(SCRIPTSTATE_CONNECTED); if (SUCCEEDED(hr)) { Trace(TEXT("Scripted connected")); } else { Trace(TEXT("Scripted connection FAILED")); Trace(TEXT("hr = %x"),hr); } // // // ****************************************** // // // // // signal script event (DeviceActionEvent) // hr = m_pDeviceAction->Fire_DeviceActionEvent(); if(SUCCEEDED(hr)){ // // check for any script-returned errors // hr = m_pLastError->m_hr; } pActiveScript->Release(); return hr; } HRESULT CIOBlock::InitializeProperties() { HRESULT hr = S_OK; // // initialize LastError Object to SUCCESS // m_pLastError->m_hr = S_OK; // // set action ID // m_pDeviceAction->m_DeviceActionID = 100; // make #define // // // ****************************************** // // // // // Give engine our DeviceScriptSite interface... // IActiveScript *pActiveScript = NULL; hr = m_pActiveScript->Clone(&pActiveScript); if (SUCCEEDED(hr)) { Trace(TEXT("cloning script success")); } else { Trace(TEXT("cloning script FAILED")); Trace(TEXT("hr = %x"),hr); } hr = pActiveScript->SetScriptSite((IActiveScriptSite *)m_pDeviceScriptSite); if (SUCCEEDED(hr)) { Trace(TEXT("SetScriptSite on cloned script")); } else { Trace(TEXT("SetScriptSite on cloned script FAILED")); Trace(TEXT("hr = %x"),hr); } // // Execute the scriptlet // hr = m_pActiveScript->SetScriptState(SCRIPTSTATE_CONNECTED); if (SUCCEEDED(hr)) { Trace(TEXT("Scripted connected")); } else { Trace(TEXT("Scripted connection FAILED")); Trace(TEXT("hr = %x"),hr); } // // // ****************************************** // // // // // signal script event (DeviceActionEvent) // hr = m_pDeviceAction->Fire_DeviceActionEvent(); if(SUCCEEDED(hr)){ // // check for any script-returned errors // hr = m_pLastError->m_hr; } pActiveScript->Release(); return hr; } HRESULT CIOBlock::Scan(LONG lPhase, PBYTE pBuffer, LONG lLength, LONG *plReceived) { m_pDeviceControl->m_pBuffer = pBuffer; m_pDeviceControl->m_lBufferSize = lLength; m_pDeviceControl->m_dwBytesRead = 0; HRESULT hr = S_OK; // // initialize LastError Object to SUCCESS // m_pLastError->m_hr = S_OK; m_pDeviceAction->m_lValue = lLength; // set data amount requested // // set action ID // switch(lPhase){ case SCAN_FIRST: m_pDeviceAction->m_DeviceActionID = 104; // make #define break; case SCAN_NEXT: m_pDeviceAction->m_DeviceActionID = 105; // make #define break; case SCAN_FINISHED: m_pDeviceAction->m_DeviceActionID = 106; // make #define break; default: break; } // // // ****************************************** // // // // // Give engine our DeviceScriptSite interface... // IActiveScript *pActiveScript = NULL; hr = m_pActiveScript->Clone(&pActiveScript); if (SUCCEEDED(hr)) { Trace(TEXT("cloning script success")); } else { Trace(TEXT("cloning script FAILED")); Trace(TEXT("hr = %x"),hr); } hr = pActiveScript->SetScriptSite((IActiveScriptSite *)m_pDeviceScriptSite); if (SUCCEEDED(hr)) { Trace(TEXT("SetScriptSite on cloned script")); } else { Trace(TEXT("SetScriptSite on cloned script FAILED")); Trace(TEXT("hr = %x"),hr); } // // Execute the scriptlet // hr = m_pActiveScript->SetScriptState(SCRIPTSTATE_CONNECTED); if (SUCCEEDED(hr)) { Trace(TEXT("Scripted connected")); } else { Trace(TEXT("Scripted connection FAILED")); Trace(TEXT("hr = %x"),hr); } // // // ****************************************** // // // // // signal script event (DeviceActionEvent) // hr = m_pDeviceAction->Fire_DeviceActionEvent(); if(SUCCEEDED(hr)){ // // check for any script-returned errors // hr = m_pLastError->m_hr; } pActiveScript->Release(); if(NULL != plReceived){ *plReceived = m_pDeviceControl->m_dwBytesRead; } return hr; } BOOL CIOBlock::GetEventStatus(PGSD_EVENT_INFO pGSDEventInfo) { // // ask script about device reporting an event... // if there is an event, fill out pGSDEventInfo structure // and return TRUE, letting WIAFBDRV know that an event has // occured....or return FALSE, that nothing has happened. // // Dispatch a GETEVENT_STATUS event action to script here. // // check returned status flag... if no event happened, return FALSE; // else..somthing did happen..so check the returned mapping key. // // // script will return a mapping key that corresponds to // the device event. // // // use key to look up correct GUID from the driver's reported supported // event list, set GUID, and continue to return TRUE // return FALSE; } BOOL CIOBlock::DeviceOnLine() { // // ask script to check that the device is ON-LINE, and // funtional. Return TRUE, if it is, and FALSE if it is not. // // Dispatch a DEVICE_ONLINE event action to script here. return TRUE; } HRESULT CIOBlock::ResetDevice() { HRESULT hr = S_OK; // // ask script to reset the device to a power-on state. // Return TRUE, if it succeeded, and FALSE if it did not. // // Dispatch a DEVICE_RESET event action to script here. return hr; } HRESULT CIOBlock::EventInterrupt(PGSD_EVENT_INFO pGSDEventInfo) { BYTE InterruptData = 0; DWORD dwIndex = 0; DWORD dwError = 0; BOOL fLooping = TRUE; BOOL bRet = TRUE; DWORD dwBytesRet = 0; OVERLAPPED Overlapped; memset(&Overlapped,0,sizeof(OVERLAPPED)); // // create an event to wait on // Overlapped.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); HANDLE hEventArray[2] = {pGSDEventInfo->hShutDownEvent, Overlapped.hEvent}; HANDLE InterruptHandle = m_ScannerSettings.DeviceIOHandles[0]; // <- SET INTERRUPT PIPE INDEX // WITH REAL INDEX VALUE!! while (fLooping) { bRet = DeviceIoControl( InterruptHandle, IOCTL_WAIT_ON_DEVICE_EVENT, NULL, 0, &InterruptData, sizeof(InterruptData), &dwError, &Overlapped ); if ( bRet || ( !bRet && ( ::GetLastError() == ERROR_IO_PENDING ))) { dwIndex = WaitForMultipleObjects( 2, hEventArray, FALSE, INFINITE ); switch ( dwIndex ) { case WAIT_OBJECT_0+1: bRet = GetOverlappedResult( InterruptHandle, &Overlapped, &dwBytesRet, FALSE ); if (dwBytesRet) { // Change detected - signal if (*pGSDEventInfo->phSignalEvent != INVALID_HANDLE_VALUE) { // // InterruptData contains result from device // *pGSDEventInfo->pEventGUID needs to be set to // the correct EVENT. (map event to result here??) // // // ask script to report a mapping key that corresponds to // the InterruptData returned information from device event. // // Dispatch a MAP_EVENT_RESULT_TO_KEY event action to script here. // // // use key to look up correct GUID from the driver's reported supported // event list, set GUID, and continue to set // "SignalEvent" for service notification. // // // signal service about the event // SetEvent(*pGSDEventInfo->phSignalEvent); } break; } // // reset the overlapped event // ResetEvent( Overlapped.hEvent ); break; case WAIT_OBJECT_0: default: fLooping = FALSE; } } else { dwError = ::GetLastError(); break; } } return S_OK; } //////////////////////////////////////////////////////////// // helpers called internally, or wrapped by a script call // //////////////////////////////////////////////////////////// LONG CIOBlock::InsertINTIntoByteBuffer(PBYTE szDest, PBYTE szSrc, BYTE cPlaceHolder, INT iValueToInsert) { LONG lFinalStringSize = 0; INT iSrcIndex = 0; INT iValueIndex = 0; CHAR szValue[10]; // clean value string, and convert INT to characters memset(szValue,0,sizeof(szValue)); _itoa(iValueToInsert,szValue,10); while(szSrc[iSrcIndex] != '\0'){ // check for place holder if (szSrc[iSrcIndex] != cPlaceHolder) { szDest[lFinalStringSize] = szSrc[iSrcIndex]; iSrcIndex++; lFinalStringSize++; // increment size of buffer } else { // replace placeholder with integer value (in string format) iValueIndex = 0; while (szValue[iValueIndex] != '\0') { szDest[lFinalStringSize] = szValue[iValueIndex]; iValueIndex++; lFinalStringSize++; // increment size of command buffer } iSrcIndex++; } } // terminate buffer with NULL character szDest[lFinalStringSize] = '\0'; lFinalStringSize++; return lFinalStringSize; } LONG CIOBlock::ExtractINTFromByteBuffer(PINT iDest, PBYTE szSrc, BYTE cTerminatorByte, INT iOffset) { *iDest = 0; BYTE szTempBuffer[25]; INT iValueIndex = 0; memset(szTempBuffer,0,sizeof(szTempBuffer)); while (szSrc[iOffset] != cTerminatorByte) { szTempBuffer[iValueIndex] = szSrc[iOffset]; iValueIndex++; iOffset++; } iValueIndex++; szTempBuffer[iValueIndex] = '\0'; *iDest = atoi((char*)szTempBuffer); return (LONG)*iDest; } VOID Trace(LPCTSTR format,...) { #ifdef DEBUG TCHAR Buffer[1024]; va_list arglist; va_start(arglist, format); wvsprintf(Buffer, format, arglist); va_end(arglist); OutputDebugString(Buffer); OutputDebugString(TEXT("\n")); #endif }