diff options
| author | Mike Fenelon <[email protected]> | 2017-08-24 10:10:48 -0700 |
|---|---|---|
| committer | Mike Fenelon <[email protected]> | 2017-08-24 10:10:48 -0700 |
| commit | 3965a237da143d06f0a24e042cef0970b799ea19 (patch) | |
| tree | 4250a3fdd13ecb5bde795cdc60465c4819af507f | |
| parent | 8a305a42a31c99ffa586c4118692a5bf5c9d22ef (diff) | |
Initial add of V3 Samples
328 files changed, 88503 insertions, 0 deletions
diff --git a/print/OEM Printer Customization Plug-in Samples/C++/CUSTOMDRV.HLP b/print/OEM Printer Customization Plug-in Samples/C++/CUSTOMDRV.HLP Binary files differnew file mode 100644 index 00000000..8ba599b2 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/CUSTOMDRV.HLP diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/Features.cpp b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/Features.cpp new file mode 100644 index 00000000..acee806b --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/Features.cpp @@ -0,0 +1,2858 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 2001 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Features.cpp +// +// PURPOSE: Implementation wrapper class for PScript Driver Features and Options. +// + +#include "precomp.h" +#include "resource.h" +#include "debug.h" +#include "globals.h" +#include "devmode.h" +#include "stringutils.h" +#include "helper.h" +#include "features.h" +#include "oemui.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +//////////////////////////////////////////////////////// +// Internal Defines and Macros +//////////////////////////////////////////////////////// + +#define INITIAL_ENUM_FEATURES_SIZE 1024 +#define INITIAL_ENUM_OPTIONS_SIZE 64 +#define INITIAL_FEATURE_DISPLAY_NAME_SIZE 64 +#define INITIAL_OPTION_DISPLAY_NAME_SIZE 32 +#define INITIAL_GET_OPTION_SIZE 64 +#define INITIAL_GET_REASON_SIZE 1024 + +#define DRIVER_FEATURE_PREFIX '%' +#define IS_DRIVER_FEATURE(f) (DRIVER_FEATURE_PREFIX == (f)[0]) + +// Flags that the uDisplayNameID should be returned as +// MAKEINTRESOURCE() instead of loading the string resource. +#define RETURN_INT_RESOURCE 1 + +// Macros to test for conditions of KEYWORDMAP entry. +#define IS_MAPPING_INT_RESOURCE(p) ((p)->dwFlags & RETURN_INT_RESOURCE) + +// TAG the identifies feature OPTITEM data stuct. +#define FEATURE_OPTITEM_TAG 'FETR' + + +//////////////////////////////////////////////////////// +// Type Definitions +//////////////////////////////////////////////////////// + +// Struct used to identify OPTITEM as +// feature OPTITEM and to map back from +// an OPTITEM to the feature. +typedef struct _tagFeatureOptitemData +{ + DWORD dwSize; + DWORD dwTag; + PCSTR pszFeatureKeyword; + COptions *pOptions; + +} FEATUREOPTITEMDATA, *PFEATUREOPTITEMDATA; + + + +//////////////////////////////////////////////////////// +// Internal Constants +//////////////////////////////////////////////////////// + +static KEYWORDMAP gkmFeatureMap[] = +{ + "%AddEuro", NULL, IDS_ADD_EURO, OEMCUIP_PRNPROP, 0, + "%CtrlDAfter", NULL, IDS_CTRLD_AFTER, OEMCUIP_PRNPROP, 0, + "%CtrlDBefore", NULL, IDS_CTRLD_BEFORE, OEMCUIP_PRNPROP, 0, + //"%CustomPageSize", NULL, IDS_PSCRIPT_CUSTOMSIZE, OEMCUIP_DOCPROP, 0, + "%GraphicsTrueGray", NULL, IDS_TRUE_GRAY_GRAPH, OEMCUIP_PRNPROP, 0, + "%JobTimeout", NULL, IDS_JOBTIMEOUT, OEMCUIP_PRNPROP, 0, + "%MaxFontSizeAsBitmap", NULL, IDS_PSMAXBITMAP, OEMCUIP_PRNPROP, 0, + "%MetafileSpooling", NULL, IDS_METAFILE_SPOOLING, OEMCUIP_DOCPROP, 0, + "%MinFontSizeAsOutline", NULL, IDS_PSMINOUTLINE, OEMCUIP_PRNPROP, 0, + "%Mirroring", NULL, IDS_MIRROR, OEMCUIP_DOCPROP, 0, + "%Negative", NULL, IDS_NEGATIVE_PRINT, OEMCUIP_DOCPROP, 0, + "%Orientation", TEXT("COMPSTUI.DLL"), IDS_CPSUI_ORIENTATION, OEMCUIP_DOCPROP, RETURN_INT_RESOURCE, + "%OutputFormat", NULL, IDS_PSOUTPUT_OPTION, OEMCUIP_DOCPROP, 0, + "%OutputProtocol", NULL, IDS_PSPROTOCOL, OEMCUIP_PRNPROP, 0, + "%OutputPSLevel", NULL, IDS_PSLEVEL, OEMCUIP_DOCPROP, 0, + "%PageOrder", TEXT("COMPSTUI.DLL"), IDS_CPSUI_PAGEORDER, OEMCUIP_DOCPROP, RETURN_INT_RESOURCE, + "%PagePerSheet", TEXT("COMPSTUI.DLL"), IDS_CPSUI_NUP, OEMCUIP_DOCPROP, RETURN_INT_RESOURCE, + "%PSErrorHandler", NULL, IDS_PSERROR_HANDLER, OEMCUIP_DOCPROP, 0, + "%PSMemory", NULL, IDS_POSTSCRIPT_VM, OEMCUIP_PRNPROP, 0, + "%TextTrueGray", NULL, IDS_TRUE_GRAY_TEXT, OEMCUIP_PRNPROP, 0, + "%TTDownloadFormat", NULL, IDS_PSTT_DLFORMAT, OEMCUIP_DOCPROP, 0, + "%WaitTimeout", NULL, IDS_WAITTIMEOUT, OEMCUIP_PRNPROP, 0, +}; +static const NUM_FEATURE_MAP = (sizeof(gkmFeatureMap)/sizeof(gkmFeatureMap[0])); + + +static KEYWORDMAP gkmOptionMap[] = +{ + "True", TEXT("COMPSTUI.DLL"), IDS_CPSUI_TRUE, 0, RETURN_INT_RESOURCE, + "False", TEXT("COMPSTUI.DLL"), IDS_CPSUI_FALSE, 0, RETURN_INT_RESOURCE, + "Portrait", TEXT("COMPSTUI.DLL"), IDS_CPSUI_PORTRAIT, 0, RETURN_INT_RESOURCE, + "Landscape", TEXT("COMPSTUI.DLL"), IDS_CPSUI_LANDSCAPE, 0, RETURN_INT_RESOURCE, + "RotatedLandscape", TEXT("COMPSTUI.DLL"), IDS_CPSUI_ROT_LAND, 0, RETURN_INT_RESOURCE, + "Speed", NULL, IDS_PSOPT_SPEED, 0, RETURN_INT_RESOURCE, + "Portability", NULL, IDS_PSOPT_PORTABILITY, 0, 0, + "EPS", NULL, IDS_PSOPT_EPS, 0, 0, + "Archive", NULL, IDS_PSOPT_ARCHIVE, 0, 0, + "ASCII", NULL, IDS_PSPROTOCOL_ASCII, 0, 0, + "BCP", NULL, IDS_PSPROTOCOL_BCP, 0, 0, + "TBCP", NULL, IDS_PSPROTOCOL_TBCP, 0, 0, + "Binary", NULL, IDS_PSPROTOCOL_BINARY, 0, 0, + "FrontToBack", TEXT("COMPSTUI.DLL"), IDS_CPSUI_FRONTTOBACK, 0, RETURN_INT_RESOURCE, + "BackToFront", TEXT("COMPSTUI.DLL"), IDS_CPSUI_BACKTOFRONT, 0, RETURN_INT_RESOURCE, + "1", TEXT("COMPSTUI.DLL"), IDS_CPSUI_NUP_NORMAL, 0, RETURN_INT_RESOURCE, + "2", TEXT("COMPSTUI.DLL"), IDS_CPSUI_NUP_TWOUP, 0, RETURN_INT_RESOURCE, + "4", TEXT("COMPSTUI.DLL"), IDS_CPSUI_NUP_FOURUP, 0, RETURN_INT_RESOURCE, + "6", TEXT("COMPSTUI.DLL"), IDS_CPSUI_NUP_SIXUP, 0, RETURN_INT_RESOURCE, + "9", TEXT("COMPSTUI.DLL"), IDS_CPSUI_NUP_NINEUP, 0, RETURN_INT_RESOURCE, + "16", TEXT("COMPSTUI.DLL"), IDS_CPSUI_NUP_SIXTEENUP, 0, RETURN_INT_RESOURCE, + "Booklet", TEXT("COMPSTUI.DLL"), IDS_CPSUI_BOOKLET, 0, RETURN_INT_RESOURCE, + "Automatic", NULL, IDS_TTDL_DEFAULT, 0, 0, + "Outline", NULL, IDS_TTDL_TYPE1, 0, 0, + "Bitmap", NULL, IDS_TTDL_TYPE3, 0, 0, + "NativeTrueType", NULL, IDS_TTDL_TYPE42, 0, 0, +}; +static const NUM_OPTION_MAP = (sizeof(gkmOptionMap)/sizeof(gkmOptionMap[0])); + + + + +//////////////////////////////////////////// +// +// COptions Methods +// + +// +// Private Methods +// + +// Initializes class data members. +void COptions::Init() +{ + m_wOptions = 0; + m_cType = TVOT_COMBOBOX; + m_pmszRaw = NULL; + m_pszFeature = NULL; + m_ppszOptions = NULL; + m_ptRange.x = 0; + m_ptRange.y = 0; + m_dwSize = 0; + m_pszUnits = NULL; + m_hHeap = NULL; + m_pInfo = NULL; +} + +void COptions::Clear() +{ + // Free memory associated with data members. + if(NULL != m_pmszRaw) HeapFree(m_hHeap, 0, m_pmszRaw); + if(NULL != m_ppszOptions) HeapFree(m_hHeap, 0, m_ppszOptions); + if( (NULL != m_pszUnits) && !IS_INTRESOURCE(m_pszUnits)) HeapFree(m_hHeap, 0, m_pszUnits); + + // Free option info. + FreeOptionInfo(); + + // Initialize data members. + Init(); +} + +// Frees memory associated with Option Info array. +void COptions::FreeOptionInfo() +{ + // Validate parameters. + if( (NULL == m_hHeap) + || + (NULL == m_pInfo) + ) + { + return; + } + + // Free strings in the array. + for(WORD wIndex = 0; wIndex < m_wOptions; ++wIndex) + { + PWSTR pszDisplay = m_pInfo[wIndex].pszDisplayName; + + if( (NULL != pszDisplay) + && + !(IS_INTRESOURCE(pszDisplay)) + ) + { + HeapFree(m_hHeap, 0, pszDisplay); + } + } + + // Free the array. + HeapFree(m_hHeap, 0, m_pInfo); + m_pInfo = NULL; +} + +// Will do init for features that need special handling. +HRESULT COptions::GetOptionsForSpecialFeatures(CUIHelper &Helper, POEMUIOBJ poemuiobj) +{ + HRESULT hrResult = E_NOTIMPL; + + + // See if this is a special feature. + // If it is, then call the special option init for the + // feature. + if(!lstrcmpA(m_pszFeature, "%CustomPageSize")) + { + // There is no option init for CustomPageSize. + // The item itself must be handled specially. + hrResult = S_OK; + } + else if( !lstrcmpA(m_pszFeature, "%JobTimeout") + || + !lstrcmpA(m_pszFeature, "%WaitTimeout") + ) + { + // JobTimeout and WaitTimeout feature options are string representations + // of an integer that represents number of seconds in the range 0 through + // 2,147,483,647 (i.e. LONG_MAX). However, COMPSTUI limits us to + // WORD size, which has range of 0 to 32,767 (i.e. SHRT_MAX). + m_cType = TVOT_UDARROW; + m_ptRange.x = 0; + m_ptRange.y = SHRT_MAX; + hrResult = GetOptionSelectionShort(Helper, poemuiobj); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("COptions::GetOptionsForSpecialFeatures() failed to get current selection for feature %hs. (hrResult = 0x%x)\r\n"), + m_pszFeature, + hrResult); + + goto Exit; + } + } + else if( !lstrcmpA(m_pszFeature, "%MaxFontSizeAsBitmap") + || + !lstrcmpA(m_pszFeature, "%MinFontSizeAsOutline") + ) + { + // MaxFontSizeAsBitmap, and MinFontSizeAsOutline feature options + // are string representations of an integer that represents number + // of pixels in the range 0 through 32,767 (i.e. SHRT_MAX). + m_cType = TVOT_UDARROW; + m_ptRange.x = 0; + m_ptRange.y = SHRT_MAX; + hrResult = GetOptionSelectionShort(Helper, poemuiobj); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("COptions::GetOptionsForSpecialFeatures() failed to get current selection for feature %hs. (hrResult = 0x%x)\r\n"), + m_pszFeature, + hrResult); + + goto Exit; + } + } + else if( !lstrcmpA(m_pszFeature, "%PSMemory") ) + { + DWORD dwType; + DWORD dwLevel; + DWORD dwNeeded; + + + // PSMemory option is string representation of an integer + // that represents number of seconds in the range 0 + // through 32,767 (i.e. SHRT_MAX). + // However, the minimum is 172 KB for Level 1 and 249 KB for level 2 + m_cType = TVOT_UDARROW; + m_ptRange.y = SHRT_MAX; + hrResult = GetOptionSelectionShort(Helper, poemuiobj); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("COptions::GetOptionsForSpecialFeatures() failed to get current selection for feature %hs. (hrResult = 0x%x)\r\n"), + m_pszFeature, + hrResult); + + goto Exit; + } + + // Get the global attribute for max language level. + hrResult = Helper.GetGlobalAttribute(poemuiobj, + 0, + "LanguageLevel", + &dwType, + (PBYTE) &dwLevel, + sizeof(dwLevel), + &dwNeeded); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("COptions::GetOptionsForSpecialFeatures() failed to get global attribute \"LanguageLevel\". (hrResult = 0x%x)\r\n"), + hrResult); + + goto Exit; + } + + // Set minimum range based on PS Max Language level. + switch(dwLevel) + { + case 1: + m_ptRange.x = 172; + break; + + default: + case 2: + case 3: + m_ptRange.x = 249; + break; + } + + // Get Units string. + //GetStringResource(m_pszUnits + } + else if(!lstrcmpA(m_pszFeature, "%OutputPSLevel")) + { + hrResult = GetOptionsForOutputPSLevel(Helper, poemuiobj); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("COptions::GetOptionsForSpecialFeatures() failed to get current selection for feature %hs. (hrResult = 0x%x)\r\n"), + m_pszFeature, + hrResult); + + goto Exit; + } + } + + +Exit: + + return hrResult; +} + +// Do init for PS Level options. +HRESULT COptions::GetOptionsForOutputPSLevel(CUIHelper &Helper, POEMUIOBJ poemuiobj) +{ + WORD wCount = 0; + DWORD dwLevel = 0; + DWORD dwType = 0; + DWORD dwNeeded = 0; + HRESULT hrResult = E_NOTIMPL; + + + // PS Level is integers from 1 to "LanguageLevel" + // global atribute. + m_cType = TVOT_COMBOBOX; + + // Get the global attribute for max language level. + hrResult = Helper.GetGlobalAttribute(poemuiobj, + 0, + "LanguageLevel", + &dwType, + (PBYTE) &dwLevel, + sizeof(dwLevel), + &dwNeeded); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("COptions::GetOptionsForOutputPSLevel() failed to get global attribute \"LanguageLevel\". (hrResult = 0x%x)\r\n"), + hrResult); + + goto Exit; + } + + // + // Create Options for PS Level + // + + // Set the number of options to the PS Level supported. + m_wOptions = (WORD) dwLevel; + + // Allocate keyword list. + // Allocate memory for pointer to keyword and the keyword itself, so that + // the memory for the keyword strings will get de-allocated with the keyword list + // on object destruction, just like regular features for which EnumOptions works. + // User the size of a pointer (4 bytes on x86, and 8 on IA64) so that + // it begining of the keyword strings will be DWORD or QUADWORD aligned + // for x86 and IA64 respectively. Keyword strings aren't required to + // be DWORD or QUADWORD aligned, but it is more optimal. Also, this gives + // some additional space for the case of %OutputPSLevel keywords, which are + // in the range of 1 through the max PostScript level supported, and only + // require 2 CHARs (1 for the digit and one for the NULL terminator). + m_ppszOptions = (PCSTR *) HeapAlloc(m_hHeap, HEAP_ZERO_MEMORY, m_wOptions * ( sizeof(PSTR) + sizeof(PCSTR *) ) ); + if(NULL == m_ppszOptions) + { + ERR(ERRORTEXT("COptions::GetOptionsForOutputPSLevel() failed to allocate option keyword array for PS Level.\r\n")); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + + // Allocate option info array. + m_pInfo = (POPTION_INFO) HeapAlloc(m_hHeap, HEAP_ZERO_MEMORY, m_wOptions * sizeof(OPTION_INFO)); + if(NULL == m_pInfo) + { + ERR(ERRORTEXT("COptions::GetOptionsForOutputPSLevel() failed to allocate info array for PS Level.\r\n")); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + // Init the option info. + for(wCount = 0; wCount < m_wOptions; ++wCount) + { + // Init keyword. + // The memory for both the keyword list and the keyword strings was allocated above. + m_ppszOptions[wCount] = (PSTR)(m_ppszOptions + m_wOptions) + (sizeof(PSTR) * wCount); + hrResult = StringCbPrintfA(const_cast<PSTR>(m_ppszOptions[wCount]), sizeof(PSTR), "%d", wCount + 1); + if(FAILED(hrResult)) + { + ERR(ERRORTEXT("COptions::GetOptionsForOutputPSLevel() failed to string representation of item %d.\r\n"), + wCount + 1); + + goto Exit; + } + + // Init option display name. + m_pInfo[wCount].pszDisplayName = (PWSTR) HeapAlloc(m_hHeap, HEAP_ZERO_MEMORY, 2 * sizeof(WCHAR)); + if(NULL == m_pInfo[wCount].pszDisplayName) + { + ERR(ERRORTEXT("COptions::GetOptionsForOutputPSLevel() failed to allocate display string for Level %d.\r\n"), + wCount); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + // Init option display name. + hrResult = StringCchPrintfW(m_pInfo[wCount].pszDisplayName, 2, TEXT("%d"), wCount + 1); + if(FAILED(hrResult)) + { + ERR(ERRORTEXT("COptions::GetOptionsForOutputPSLevel() failed to create display name for item %d.\r\n"), + wCount + 1); + + goto Exit; + } + } + + // + // Get Current Selection + // + + hrResult = GetOptionSelectionIndex(Helper, poemuiobj); + + +Exit: + + // Don't need to clean up memory allocation on error, since + // all memory allocated are assigned to data members, which + // will be cleaned up in the object destructor. + + return hrResult; +} + +HRESULT COptions::GetOptionSelectionString(CUIHelper &Helper, POEMUIOBJ poemuiobj, _Outptr_result_maybenull_ PSTR *ppszSel) +{ + PSTR pmszFeature = NULL; + PSTR pmszBuf = NULL; + WORD wCount = 0; + PCSTR *ppszList = NULL; + DWORD dwFeatureSize = 0; + DWORD dwNeeded = 0; + DWORD dwSize = INITIAL_GET_OPTION_SIZE; + HRESULT hrResult = S_OK; + + *ppszSel = NULL; + + + // + // Make single feature multi-sz. + // + + // Allocate single feature multi-sz buffer that's the size of the Feature name, plus two bytes for multi-sz termination + if (FAILED(hrResult = SizeTToDWord(strlen(m_pszFeature) + 2, &dwFeatureSize))) + { + goto Exit; + } + + pmszFeature = (PSTR) HeapAlloc(m_hHeap, HEAP_ZERO_MEMORY, dwFeatureSize); + if(NULL == pmszFeature) + { + ERR(ERRORTEXT("COptions::GetOptionSelectionString() failed to allocate buffer for single feature multi-sz for feature %hs.\r\n"), + m_pszFeature); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + // Just need to do a regular string copy, since the buffer is already zero filled. + hrResult = StringCbCopyA(pmszFeature, dwFeatureSize, m_pszFeature); + if(FAILED(hrResult)) + { + ERR(ERRORTEXT("COptions::GetOptionSelectionString() failed to copy feature string %hs.\r\n"), m_pszFeature); + } + + // Allocated initial buffer of reasonible size. + pmszBuf = (PSTR) HeapAlloc(m_hHeap, HEAP_ZERO_MEMORY, dwSize); + if(NULL == pmszBuf) + { + ERR(ERRORTEXT("COptions::GetOptionSelectionString() failed to allocate buffer to get current setting for feature %hs.\r\n"), + m_pszFeature); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + // Get current option selection. + hrResult = Helper.GetOptions(poemuiobj, + 0, + pmszFeature, + dwFeatureSize, + pmszBuf, + dwSize, + &dwNeeded); + if( (E_OUTOFMEMORY == hrResult) && (dwSize < dwNeeded) ) + { + PSTR pTemp = NULL; + + + // INVARIANT: initial buffer not large enough. + + // Re-alloc buffer and try again. + pTemp = (PSTR) HeapReAlloc(m_hHeap, HEAP_ZERO_MEMORY, pmszBuf, dwNeeded); + if(NULL == pTemp) + { + ERR(ERRORTEXT("COptions::GetOptionSelectionString() failed to re-allocate buffer to get current setting for feature %hs.\r\n"), + m_pszFeature); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + pmszBuf = pTemp; + + + // Try to get current option selection again. + hrResult = Helper.GetOptions(poemuiobj, + 0, + pmszFeature, + dwFeatureSize, + pmszBuf, + dwNeeded, + &dwNeeded); + } + + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("COptions::GetOptionSelectionString() failed to get current setting for feature %hs. (hrResult = 0x%x)\r\n"), + m_pszFeature, + hrResult); + + goto Exit; + } + + // NOTE: The return string from GetOptions() may return + // contain no strings and not return a HRESULT error + // when the feature isn't supported in the current document or + // printer sticky mode. + if('\0' == pmszBuf[0]) + { + // Feature not supported for this sticky mode. + goto Exit; + } + + // Parse the results buffer to see what the current setting is. + hrResult = MakeStrPtrList(m_hHeap, pmszBuf, &ppszList, &wCount); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("COptions::GetOptionSelectionString() failed to make string list for GetOptions() return for feature %hs. (hrResult = 0x%x)\r\n"), + m_pszFeature, + hrResult); + + goto Exit; + } + + // Check that we got 2 strings back. + if(2 != wCount) + { + WARNING(DLLTEXT("COptions::GetOptionSelectionString() the GetOption() return string list for \r\n\tfeature %hs is not of size 2.\r\n\tNumber of string is %d\r\n"), + m_pszFeature, + wCount); + + // Bail if we don't have at least 2 strings. + if(2 > wCount) + { + goto Exit; + } + } + + // Return copy of just the GetOption() result. + *ppszSel = MakeStringCopy(m_hHeap, ppszList[1]); + if(NULL == *ppszSel) + { + ERR(ERRORTEXT("COptions::GetOptionSelectionString() failed to duplicate string GetOptions() return for feature %hs. (hrResult = 0x%x)\r\n"), + m_pszFeature, + hrResult); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + +Exit: + + // Free local buffers. + if(NULL != pmszFeature) HeapFree(m_hHeap, 0, pmszFeature); + if(NULL != pmszBuf) HeapFree(m_hHeap, 0, pmszBuf); + if(NULL != ppszList) HeapFree(m_hHeap, 0, ppszList); + + return hrResult; +} + +// Gets current Options selection for LONG value. +HRESULT COptions::GetOptionSelectionLong(CUIHelper &Helper, POEMUIOBJ poemuiobj) +{ + PSTR pszSel = NULL; + HRESULT hrResult = S_OK; + + + // Get option selection string. + hrResult = GetOptionSelectionString(Helper, poemuiobj, &pszSel); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("COptions::GetOptionSelectionLong() failed to get string for GetOptions() return for feature %hs. (hrResult = 0x%x)\r\n"), + m_pszFeature, + hrResult); + + goto Exit; + } + + // Convert string option to LONG and uses that as the selection. + if(NULL != pszSel) m_Sel = atol(pszSel); + + +Exit: + + // Free local buffers. + if(NULL != pszSel) HeapFree(m_hHeap, 0, pszSel); + + return hrResult; +} + +// Gets current Options selection for SHORT value. +HRESULT COptions::GetOptionSelectionShort(CUIHelper &Helper, POEMUIOBJ poemuiobj) +{ + PSTR pszSel = NULL; + HRESULT hrResult = S_OK; + + + // Get option selection string. + hrResult = GetOptionSelectionString(Helper, poemuiobj, &pszSel); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("COptions::GetOptionSelectionLong() failed to get string for GetOptions() return for feature %hs. (hrResult = 0x%x)\r\n"), + m_pszFeature, + hrResult); + + goto Exit; + } + + // Convert string option to LONG and uses that as the selection. + if(NULL != pszSel) m_Sel = atoi(pszSel) & 0x00ffff; + + +Exit: + + // Free local buffers. + if(NULL != pszSel) HeapFree(m_hHeap, 0, pszSel); + + return hrResult; +} + +// Gets current option selection for feature. +HRESULT COptions::GetOptionSelectionIndex(CUIHelper &Helper, POEMUIOBJ poemuiobj) +{ + PSTR pszSel = NULL; + HRESULT hrResult = S_OK; + + + // Get option selection string. + hrResult = GetOptionSelectionString(Helper, poemuiobj, &pszSel); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("COptions::GetOptionSelectionIndex() failed to get string for GetOptions() return for feature %hs. (hrResult = 0x%x)\r\n"), + m_pszFeature, + hrResult); + + goto Exit; + } + + // Find the matching option for the string returned from GetOption. + m_Sel = FindOption(pszSel, m_wOptions - 1); + + +Exit: + + // Free local buffers. + if(NULL != pszSel) HeapFree(m_hHeap, 0, pszSel); + + return hrResult; +} + + + +// +// Public Methods +// + +// Default constructor +COptions::COptions() +{ + Init(); +} + +// Destructor +COptions::~COptions() +{ + Clear(); +} + +// Get the option list for a feature +HRESULT COptions::Acquire(_In_ HANDLE hHeap, + CUIHelper &Helper, + _In_ POEMUIOBJ poemuiobj, + _In_ PCSTR pszFeature) +{ + DWORD dwNeeded = 0; + HRESULT hrResult = S_OK; + + + VERBOSE(DLLTEXT("COptions::Acquire(0x%p, Helper, 0x%p, %hs) entered.\r\n"), + hHeap, + poemuiobj, + pszFeature ? pszFeature : "NULL"); + + // Don't retreive the Options again if we already got them. + if( (0 < m_wOptions) + && + (NULL != m_pszFeature) + && + !lstrcmpA(m_pszFeature, pszFeature) + ) + { + VERBOSE(DLLTEXT("COptions::Acquire() already have options for feature %hs.\r\n"), m_pszFeature); + VERBOSE(DLLTEXT("COptions::Acquire() returning with HRESULT of S_OK\r\n")); + + return S_OK; + } + + // Save the heap handle for use later, such as freeing memory at destruction. + m_hHeap = hHeap; + + // Store Keyword string. + m_pszFeature = pszFeature; + + + // + // Enumerate Options. + // + + + // Some features require special handling for initializing their options. + // EnumOpionts isn't implemented for these features. + // Return of E_NOTIMPL indicates it isn't the feature doesn't + // need special handling. + hrResult = GetOptionsForSpecialFeatures(Helper, poemuiobj); + if( SUCCEEDED(hrResult) + || + (!SUCCEEDED(hrResult) && (E_NOTIMPL != hrResult) ) + ) + { + // We either dealt with the special feature or incounter an error + // trying to deal with the special feature. + + goto Exit; + } + + // To try to cut down on having to call EnumOptions more than once, + // pre-allocate a buffer of reasonable size. + m_dwSize = INITIAL_ENUM_OPTIONS_SIZE; + m_pmszRaw = (PSTR) HeapAlloc(m_hHeap, HEAP_ZERO_MEMORY, m_dwSize); + if(NULL == m_pmszRaw) + { + ERR(ERRORTEXT("COptions::Acquire() alloc for options for feature %hs failed.\r\n"), m_pszFeature); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + + // Try to get options list with initial buffer. + hrResult = Helper.EnumOptions(poemuiobj, 0, m_pszFeature, m_pmszRaw, m_dwSize, &dwNeeded); + if( (E_OUTOFMEMORY == hrResult) && (m_dwSize < dwNeeded)) + { + PSTR pTemp; + + + // INVARIANT: options list multi-sz wasn't large enough. + + // Re-allocate the buffer and try again. + pTemp = (PSTR) HeapReAlloc(m_hHeap, HEAP_ZERO_MEMORY, m_pmszRaw, dwNeeded); + if(NULL == pTemp) + { + ERR(ERRORTEXT("COptions::Acquire() re-alloc for options list for feature %hs failed.\r\n"), m_pszFeature); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + m_pmszRaw = pTemp; + m_dwSize = dwNeeded; + + // Try again to get the options list. + hrResult = Helper.EnumOptions(poemuiobj, 0, m_pszFeature, m_pmszRaw, m_dwSize, &dwNeeded); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("COptions::Acquire() failed to EnumOptions() for feature %hs after re-allocating buffer.\r\n"), m_pszFeature); + + goto Exit; + } + } + + // Make sure we got the option list. + // Can't do anything more with out it. + if(!SUCCEEDED(hrResult)) + { + if(E_NOTIMPL != hrResult) ERR(ERRORTEXT("COptions::Acquire() failed to enumerate options for feature %hs. (hrResult = 0x%x)\r\n"), m_pszFeature, hrResult); + + goto Exit; + } + + // INVARIANT: successfully got option keyword list. + + // Create array of string pointers to the Option names + // in the multi-sz we got from EnumOptions(). + hrResult = MakeStrPtrList(m_hHeap, m_pmszRaw, &m_ppszOptions, &m_wOptions); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("COptions::Acquire() failed to create pointer list to options. (hrResult = 0x%x)\r\n"), hrResult); + + goto Exit; + } + + // + // Build Option Information + // + + // Allocate array to hold feature info + m_pInfo = (POPTION_INFO) HeapAlloc(m_hHeap, HEAP_ZERO_MEMORY, m_wOptions * sizeof(OPTION_INFO)); + if(NULL == m_pInfo) + { + ERR(ERRORTEXT("COptions::Acquire() failed to alloc feature info array.\r\n")); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + // For each option, build or get useful information, such as display name. + for(WORD wIndex = 0; wIndex < m_wOptions; ++wIndex) + { + POPTION_INFO pCurrent = m_pInfo + wIndex; + + + // Get or build a keyword mapping entry + // that maps from keyword to usefully where to get info, such as + // display name, icon, option type, for keywords that may not be + // able to get info for from Helper. + pCurrent->pMapping = FindKeywordMapping(gkmOptionMap, NUM_OPTION_MAP, m_ppszOptions[wIndex]); + + // Get display names for each of the Options. + // The function implements a heuristic for detemining the display name, + // since can't get the display name from the UI Helper for all Options. + hrResult = DetermineOptionDisplayName(m_hHeap, + Helper, + poemuiobj, + m_pszFeature, + m_ppszOptions[wIndex], + pCurrent->pMapping, + &pCurrent->pszDisplayName); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("COptions::Acquire() failed to get display name for %hs of feature %hs. (hrResult = 0x%x)\r\n"), + m_ppszOptions[wIndex], + m_pszFeature, + hrResult); + + goto Exit; + } + } + + // + // Get current option selection. + // + + hrResult = GetOptionSelectionIndex(Helper, poemuiobj); + + +Exit: + + // Clean up if weren't successful. + if(!SUCCEEDED(hrResult)) + { + Clear(); + } + + VERBOSE(DLLTEXT("COptions::Acquire() returning with HRESULT of 0x%x\r\n"), hrResult); + + return hrResult; +} + +// Return nth options keyword. +PCSTR COptions::GetKeyword(WORD wIndex) const +{ + // Validate parameters. + if( (wIndex >= m_wOptions) + || + (NULL == m_ppszOptions) + ) + { + return NULL; + } + + return m_ppszOptions[wIndex]; +} + +// Return nth options display name. +PCWSTR COptions::GetName(WORD wIndex) const +{ + // Validate parameters. + if( (wIndex >= m_wOptions) + || + (NULL == m_pInfo) + ) + { + ERR(ERRORTEXT("COptions::GetName() invalid parameters.\r\n")); + + return NULL; + } + + if(NULL == m_pInfo[wIndex].pszDisplayName) ERR(ERRORTEXT("COptions::GetName() returning NULL option display name.\r\n")); + + return m_pInfo[wIndex].pszDisplayName; +} + +// Find option with matching keyword string. +WORD COptions::FindOption(_In_opt_ PCSTR pszOption, WORD wDefault) const +{ + BOOL bFound = FALSE; + WORD wMatch = wDefault; + + + // Validate parameters. + if( (NULL == pszOption) + || + (NULL == m_ppszOptions) + ) + { + return wDefault; + } + + // Walk the option keyword looking for a match. + for(WORD wIndex = 0; !bFound && (wIndex < m_wOptions); ++wIndex) + { + bFound = !lstrcmpA(pszOption, m_ppszOptions[wIndex]); + if(bFound) + { + wMatch = wIndex; + } + } + + return wMatch; +} + +// Initializes OptItem with options for a feature. +HRESULT COptions::InitOptItem(_In_ HANDLE hHeap, POPTITEM pOptItem) +{ + WORD wParams = 0; + WORD wOptions = 0; + HRESULT hrResult = S_OK; + + + // Set option selection. + pOptItem->pSel = m_pSel; + + // Get count of number of options. + // NOTE: Some feature options have no counts. + wOptions = GetCount(); + + // Different OPTTYPE types require different number of OPTPARAMs. + switch(m_cType) + { + // For up down arrow control, the OPTPARAMs need is 2. + case TVOT_UDARROW: + wParams = 2; + break; + + // For combobox, the OPTPARAMs needed is on per options. + case TVOT_COMBOBOX: + wParams = wOptions; + break; + + // The default is the option count. + default: + WARNING(DLLTEXT("COptions::InitOptItem() OPTTYPE type %d num of OPTPARAMs not handled. Default to option count of %d.\r\n"), + m_cType, + wOptions); + wParams = wOptions; + break; + } + + // Only do OPTTYPEs if we have non-Zero number of OPTPARAMs. + // Every OPTTYPE has at leas one OPTPARAM. + if(0 < wParams) + { + // Allocate memory for feature options. + pOptItem->pOptType = CreateOptType(hHeap, wParams); + if(NULL == pOptItem->pOptType) + { + ERR(ERRORTEXT("COptions::InitOptItem() failed to allocate OPTTYPEs for OPTITEM %hs.\r\n"), + m_pszFeature); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + // Set OPTTYPE. + pOptItem->pOptType->Type = m_cType; + + // Different OPTTYPE types require different initialization. + switch(m_cType) + { + // For up down arrow control, OPTPARAM[0] is used by the contrl. + // pOptParam[0]->pData is the Units description string. + // pOptParam[1].IconID is the min limit. + // pOptParam[1].lParam is the max limit. + case TVOT_UDARROW: + assert(2 == wParams); + pOptItem->pOptType->pOptParam[0].pData = m_pszUnits; + pOptItem->pOptType->pOptParam[1].IconID = m_ptRange.x; + pOptItem->pOptType->pOptParam[1].lParam = m_ptRange.y; + break; + + // For combobox, the pOptParam[n].pData is the display name of the option. + case TVOT_COMBOBOX: + for(WORD wIndex = 0; wIndex < wParams; ++wIndex) + { + pOptItem->pOptType->pOptParam[wIndex].pData = const_cast<PWSTR>(GetName(wIndex)); + } + break; + + default: + ERR(ERRORTEXT("COptions::InitOptItem() OPTTYPE type %d OPTTYPE init not handled.\r\n"), + m_cType); + break; + } + } + + +Exit: + + return hrResult; +} + +// Refresh option selection. +HRESULT COptions::RefreshSelection(CUIHelper &Helper, POEMUIOBJ poemuiobj) +{ + HRESULT hrResult = S_OK; + + + // Method for getting option selection is based + // on OPTTYPE type. + switch(m_cType) + { + + case TVOT_UDARROW: + hrResult = GetOptionSelectionShort(Helper, poemuiobj); + break; + + case TVOT_COMBOBOX: + hrResult = GetOptionSelectionIndex(Helper, poemuiobj); + break; + + default: + ERR(ERRORTEXT("COptions::RefreshSelection() not handled for type %d OPTTYPE.\r\n"), + m_cType); + break; + } + + return hrResult; +} + + + +//////////////////////////////////////////// +// +// CFeatures Methods +// + +// +// Private Methods +// + +// Initializes class +void CFeatures::Init() +{ + // Initialize data members. + m_wFeatures = 0; + m_wDocFeatures = 0; + m_wPrintFeatures = 0; + m_pmszRaw = NULL; + m_ppszKeywords = NULL; + m_dwSize = 0; + m_hHeap = NULL; + m_pInfo = NULL; +} + +// Cleans up class and re-initialize it. +void CFeatures::Clear() +{ + // Free memory associated with data members. + if(NULL != m_pmszRaw) HeapFree(m_hHeap, 0, m_pmszRaw); + if(NULL != m_ppszKeywords) HeapFree(m_hHeap, 0, m_ppszKeywords); + + // Free feature info + FreeFeatureInfo(); + + // Re-initialize + Init(); +} + +// Free feature info +void CFeatures::FreeFeatureInfo() +{ + // Validate parameters. + if( (NULL == m_hHeap) + || + (NULL == m_pInfo) + ) + { + return; + } + + // Free memory associated with feature info. + for(WORD wIndex = 0; wIndex < m_wFeatures; ++wIndex) + { + PWSTR pszDisplay = m_pInfo[wIndex].pszDisplayName; + + + // Free display name. + if( (NULL != pszDisplay) + && + !IS_INTRESOURCE(pszDisplay) + ) + { + HeapFree(m_hHeap, 0, pszDisplay); + } + } + + // Free feature info array. + // Feature Info array allocated with new so + // that each of the constructors for COptions + // in fhte Feature Info array will be called. + delete[] m_pInfo; +} + +// Turns index for mode to modeless index, which +// is the real index to the feature. +WORD CFeatures::GetModelessIndex(WORD wIndex, DWORD dwMode) const +{ + WORD wCount = 0; + + + switch(dwMode) + { + // Number of features, all modes + case 0: + wCount = wIndex; + break; + + // Find the nth feature that matches the mode + case OEMCUIP_DOCPROP: + case OEMCUIP_PRNPROP: + // Walk the feature list looking for nth feature + // with matching mode. + for(wCount = 0; wCount < m_wFeatures; ++wCount) + { + // Count down to the feature we want. + // Only count down for matching modes. + if(dwMode == m_pInfo[wCount].dwMode) + { + if(0 == wIndex) + { + break; + } + else + { + --wIndex; + } + } + } + break; + } + + return wCount; +} + + +// +// Public Methods +// + +// Default constructor +CFeatures::CFeatures() +{ + Init(); +} + +// Destructor +CFeatures::~CFeatures() +{ + // Clean up class. + Clear(); +} + +// Gets Core Driver Features, if not already retrieved. +HRESULT CFeatures::Acquire(_In_ HANDLE hHeap, + CUIHelper &Helper, + _In_ POEMUIOBJ poemuiobj + ) +{ + WORD wIndex = 0; + DWORD dwNeeded = 0; + HRESULT hrResult = S_OK; + + + VERBOSE(DLLTEXT("CFeatures::Acquire(0x%p, Helper, 0x%p) entered.\r\n"), + hHeap, + poemuiobj); + + // Don't retreive the Features again if we already got them. + if(0 < m_wFeatures) + { + VERBOSE(DLLTEXT("CFeatures::Acquire() features already enumerated.\r\n")); + VERBOSE(DLLTEXT("CFeatures::Acquire() returning S_OK.\r\n")); + + return S_OK; + } + + // Save the heap handle for use later, such as freeing memory at destruction. + m_hHeap = hHeap; + + // + // Enumerate features. + // + + // To try to cut down on having to call EnumFeatures more than once, + // pre-allocate a buffer of reasonable size. + m_dwSize = INITIAL_ENUM_FEATURES_SIZE; + m_pmszRaw = (PSTR) HeapAlloc(m_hHeap, HEAP_ZERO_MEMORY, m_dwSize); + if(NULL == m_pmszRaw) + { + ERR(ERRORTEXT("CFeatures::Acquire() alloc for feature list failed.\r\n")); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + + // Try to get feature list with initial buffer. + hrResult = Helper.EnumFeatures(poemuiobj, 0, m_pmszRaw, m_dwSize, &dwNeeded); + if( (E_OUTOFMEMORY == hrResult) && (m_dwSize < dwNeeded)) + { + PSTR pTemp; + + + // INVARIANT: feature list multi-sz wasn't large enough. + + + // Re-allocate the buffer and try again. + pTemp = (PSTR) HeapReAlloc(m_hHeap, HEAP_ZERO_MEMORY, m_pmszRaw, dwNeeded); + if(NULL == pTemp) + { + ERR(ERRORTEXT("CFeatures::Acquire() re-alloc for feature list failed.\r\n")); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + m_pmszRaw = pTemp; + m_dwSize = dwNeeded; + + // Try again to get the feature list. + hrResult = Helper.EnumFeatures(poemuiobj, 0, m_pmszRaw, m_dwSize, &dwNeeded); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("CFeatures::Acquire() failed to EnumFeatures() after re-allocating buffer.\r\n")); + + goto Exit; + } + } + + // Make sure we got the feature list. + // Can't do anything more with out it. + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("CFeatures::Acquire() failed to enumerate features. (hrResult = 0x%x)\r\n"), hrResult); + + goto Exit; + } + + // INVARIANT: successfully got feature keyword list. + + // Create array of string pointers to the feature keywords + // in the multi-sz we got from EnumFreatures(). + hrResult = MakeStrPtrList(m_hHeap, m_pmszRaw, &m_ppszKeywords, &m_wFeatures); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("CFeatures::Acquire() failed to create pointer list to keywords. (hrResult = 0x%x)\r\n"), hrResult); + + goto Exit; + } + + + // + // Build Feature Information + // + + + // Allocate array to hold feature info + // Use new for allocation so class + // constructors/destructors get called. + m_pInfo = new FEATURE_INFO[m_wFeatures]; + if(NULL == m_pInfo) + { + ERR(ERRORTEXT("CFeatures::Acquire() failed to alloc feature info array.\r\n")); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + // For each feature, build/get feature info.... + for(wIndex = 0; wIndex < m_wFeatures; ++wIndex) + { + PFEATURE_INFO pCurrent = m_pInfo + wIndex; + + + // Get or build a keyword mapping entry + // that maps from keyword to usefully where to get info, such as + // display name, icon, option type, for keywords that may not be + // able to get info for from Helper. + pCurrent->pMapping = FindKeywordMapping(gkmFeatureMap, NUM_FEATURE_MAP, m_ppszKeywords[wIndex]); + + // Get display names for each of the featurs. + // The function implements a heuristic for detemining the display name, + // since can't get the display name from the UI Helper for all features. + hrResult = DetermineFeatureDisplayName(m_hHeap, + Helper, + poemuiobj, + m_ppszKeywords[wIndex], + pCurrent->pMapping, + &pCurrent->pszDisplayName); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("CFeatures::Acquire() failed to get display name for feature %hs. (hrResult = 0x%x)\r\n"), + m_ppszKeywords[wIndex], + hrResult); + + goto Exit; + } + + // Get options for each feature. + // NOTE: some features don't have options; the HRESULT will be E_NOTIMPL for these. + hrResult = pCurrent->Options.Acquire(hHeap, + Helper, + poemuiobj, + m_ppszKeywords[wIndex]); + if(!SUCCEEDED(hrResult) && (E_NOTIMPL != hrResult)) + { + ERR(ERRORTEXT("CFeatures::Acquire() failed to get options for feature %hs. (hrResult = 0x%x)\r\n"), + m_ppszKeywords[wIndex], + hrResult); + + goto Exit; + } + + // Determine if feature is Printer or Document sticky. + hrResult = DetermineStickiness(Helper, + poemuiobj, + m_ppszKeywords[wIndex], + pCurrent->pMapping, + &pCurrent->dwMode); + // Don't propagate error if failure from unhandled driver feature. + if( !SUCCEEDED(hrResult) + && + !IS_DRIVER_FEATURE(m_ppszKeywords[wIndex]) + ) + { + ERR(ERRORTEXT("CFeatures::Acquire() failed to determine stickiness for feature %hs. (hrResult = 0x%x)\r\n"), + m_ppszKeywords[wIndex], + hrResult); + + goto Exit; + } + + // Keep track of mode counts. + switch(pCurrent->dwMode) + { + case OEMCUIP_DOCPROP: + ++m_wDocFeatures; + break; + + case OEMCUIP_PRNPROP: + ++m_wPrintFeatures; + break; + + default: + ERR(ERRORTEXT("CFeatures::Acquire() unknown stickiness for feature %hs.\r\n"), + m_ppszKeywords[wIndex]); + break; + } + + } + + // INVARIANT: successfully build feature list. + + // Make sure that we always return success if we reach this point. + hrResult = S_OK; + + +Exit: + + // Clean up if weren't successful. + if(!SUCCEEDED(hrResult)) + { + Clear(); + } + + + VERBOSE(DLLTEXT("CFeatures::Acquire() returning HRESULT of 0x%x.\r\n"), hrResult); + + return hrResult; +} + +// Returns number of features contained in class instance. +WORD CFeatures::GetCount(DWORD dwMode) const +{ + WORD wCount = 0; + + + switch(dwMode) + { + // Number of features, all modes + case 0: + wCount = m_wFeatures; + break; + + case OEMCUIP_DOCPROP: + wCount = m_wDocFeatures; + break; + + case OEMCUIP_PRNPROP: + wCount = m_wPrintFeatures; + break; + + } + + VERBOSE(DLLTEXT("CFeatures::GetCount() returning %d\r\n"), wCount); + + return wCount; +} + +// Returns nth feature's keyword +PCSTR CFeatures::GetKeyword(WORD wIndex, DWORD dwMode) const +{ + // Validate parameters. + if( (wIndex >= GetCount(dwMode)) + || + (NULL == m_ppszKeywords) + ) + { + return NULL; + } + + // Get internal index. + wIndex = GetModelessIndex(wIndex, dwMode); + + // Return keyword + return m_ppszKeywords[wIndex]; +} + +// Return nth feature's Display Name. +PCWSTR CFeatures::GetName(WORD wIndex, DWORD dwMode) const +{ + // Validate parameters. + if( (wIndex >= GetCount(dwMode)) + || + (NULL == m_pInfo) + ) + { + return NULL; + } + + // Get internal index. + wIndex = GetModelessIndex(wIndex, dwMode); + + // Return display name. + return m_pInfo[wIndex].pszDisplayName; +} + +// Returns pointer to option class for nth feature. +COptions* CFeatures::GetOptions(WORD wIndex, DWORD dwMode) const +{ + // Validate parameters. + if( (wIndex >= GetCount(dwMode)) + || + (NULL == m_pInfo) + ) + { + return NULL; + } + + // Get internal index. + wIndex = GetModelessIndex(wIndex, dwMode); + + // Return options pointer. + return &m_pInfo[wIndex].Options; +} + +// Formats OPTITEM for specied feature. +HRESULT CFeatures::InitOptItem(_In_ HANDLE hHeap, POPTITEM pOptItem, WORD wIndex, DWORD dwMode) +{ + COptions *pOptions = NULL; + HRESULT hrResult = S_OK; + PFEATUREOPTITEMDATA pData = NULL; + + + // Validate parameters. + if( (wIndex >= GetCount(dwMode)) + || + (NULL == m_pInfo) + || + (NULL == pOptItem) + ) + { + return E_INVALIDARG; + } + + // Map mode index to internal index. + wIndex = GetModelessIndex(wIndex, dwMode); + + // Get name of feature. + pOptItem->pName = const_cast<PWSTR>(GetName(wIndex)); + + // Add feature OPTITEM data to OPTITEM to facilitate saving + // selection changes. + pData = (PFEATUREOPTITEMDATA) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(FEATUREOPTITEMDATA)); + if(NULL == pData) + { + ERR(ERRORTEXT("CFeatures::InitOptItem() failed to allocated memory for feature OPTITEM data.")); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + pData->dwSize = sizeof(FEATUREOPTITEMDATA); + pData->dwTag = FEATURE_OPTITEM_TAG; + pData->pszFeatureKeyword = GetKeyword(wIndex); + pData->pOptions = GetOptions(wIndex); + pOptItem->UserData = (ULONG_PTR) pData; + + + // Get pointer to options for this feature. + // NOTE: some features do not have option list for various reasons. + pOptions = GetOptions(wIndex); + if(NULL != pOptions) + { + // Initialize COption parts of the OPTITEM + hrResult = pOptions->InitOptItem(hHeap, pOptItem); + } + +Exit: + + Dump(pOptItem); + + return hrResult; +} + +////////////////////////////////////////////////// +// +// Regular functions not part of class +// +////////////////////////////////////////////////// + + +// Maps feature keywords to display names for the features. +HRESULT DetermineFeatureDisplayName(_In_ HANDLE hHeap, + CUIHelper &Helper, + POEMUIOBJ poemuiobj, + _In_ PCSTR pszKeyword, + const PKEYWORDMAP pMapping, + _Outptr_result_maybenull_ PWSTR *ppszDisplayName) +{ + DWORD dwDataType = 0; + DWORD dwSize = INITIAL_FEATURE_DISPLAY_NAME_SIZE; + DWORD dwNeeded = 0; + HRESULT hrResult = S_OK; + + + // Validate parameters. + if( (NULL == hHeap) + || + (NULL == pszKeyword) + || + (NULL == ppszDisplayName) + ) + { + ERR(ERRORTEXT("DetermineFeatureDisplayName() invalid arguement.\r\n")); + + hrResult = E_INVALIDARG; + goto Exit; + } + + // + // Call the Helper function. + // + + // Helper will return Display Names for PPD Features, but + // not for Driver Synthisized features (i.e. features prefixed with %). + // Do it for Driver Synthisized features, just in case the helper + // interface changes to support it. + + // Pre-allocate a buffer of reasonable size to try + // to one have to call GetFeatureAttribute() once. + *ppszDisplayName = (PWSTR) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwSize); + if(NULL == *ppszDisplayName) + { + ERR(ERRORTEXT("DetermineFeatureDisplayName() alloc for feature display name failed.\r\n")); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + // Try to get diplay name for feature from Helper. + hrResult = Helper.GetFeatureAttribute(poemuiobj, + 0, + pszKeyword, + "DisplayName", + &dwDataType, + (PBYTE) *ppszDisplayName, + dwSize, + &dwNeeded); + if( (E_OUTOFMEMORY == hrResult) && (dwSize < dwNeeded)) + { + PWSTR pTemp; + + + // INVARIANT: initial buffer wasn't large enough. + + // Re-alloc buffer and try again. + pTemp = (PWSTR) HeapReAlloc(hHeap, HEAP_ZERO_MEMORY, *ppszDisplayName, dwNeeded); + if(NULL == pTemp) + { + ERR(ERRORTEXT("DetermineFeatureDisplayName() re-alloc for feature display name failed.\r\n")); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + *ppszDisplayName = pTemp; + + // Try to get the display name from Helper, again. + hrResult = Helper.GetFeatureAttribute(poemuiobj, + 0, + pszKeyword, + "DisplayName", + &dwDataType, + (PBYTE) *ppszDisplayName, + dwNeeded, + &dwNeeded); + } + + if(SUCCEEDED(hrResult)) + { + // INVARIANT: Successfully got display name from Helper for feature. + // Don't need to do anything more. + + // Check the data type, it should be kADT_UNICODE. + if(kADT_UNICODE != dwDataType) WARNING(DLLTEXT("DetermineFeatureDisplayName() feature attribute type not kADT_UNICODE. (dwDataType = %d)\r\n"), dwDataType); + + goto Exit; + } + + // INVARIANT: Did not get the display name from the Helper. + + // Free memory allocated for call to Helper. + if(NULL != *ppszDisplayName) + { + HeapFree(hHeap, 0, *ppszDisplayName); + *ppszDisplayName = NULL; + } + + // Try alternative methods for getting the display name other + // than from the Helper function. + // If we have a mapping entry, then try to get resource string + // for the display name. + // Otherwise, covert the keyword to UNICODE and use that. + if(NULL != pMapping) + { + // + // Try mapping the keyword to resource string. + // + + hrResult = GetDisplayNameFromMapping(hHeap, pMapping, ppszDisplayName); + } + else + { + // + // Convert the keyword to UNICODE and use that. + // + + // Convert ANSI keyword to Unicode string for display name. + // Need to remove the % for Driver Synthisized features. + // For debug version, add marker that shows that the display name was faked. + PCSTR pConvert = IS_DRIVER_FEATURE(pszKeyword) ? pszKeyword + 1 : pszKeyword; + #if DBG + CHAR szTemp[256]; + if(FAILED(StringCbPrintfA(szTemp, sizeof(szTemp), "%s (Keyword)", pConvert))) + { + ERR(ERRORTEXT("DetermineFeatureDisplayName() StringCbPrintfA() called failed.\r\n")); + } + pConvert = szTemp; + #endif + *ppszDisplayName = MakeUnicodeString(hHeap, pConvert); + if(NULL == *ppszDisplayName) + { + ERR(ERRORTEXT("DetermineFeatureDisplayName() alloc for feature display name failed.\r\n")); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + // Return success even though we faked a display name. + hrResult = S_OK; + } + + +Exit: + + // If failed, then return no string. + if(!SUCCEEDED(hrResult)) + { + if(ppszDisplayName && NULL != *ppszDisplayName) + { + HeapFree(hHeap, 0, *ppszDisplayName); + *ppszDisplayName = NULL; + } + } + + return hrResult; +} + +// Maps option keywords to display names for the option. +HRESULT DetermineOptionDisplayName(_In_ HANDLE hHeap, + CUIHelper &Helper, + POEMUIOBJ poemuiobj, + _In_ PCSTR pszFeature, + _In_ PCSTR pszOption, + const PKEYWORDMAP pMapping, + _Outptr_result_maybenull_ PWSTR *ppszDisplayName) +{ + DWORD dwDataType = 0; + DWORD dwSize = INITIAL_OPTION_DISPLAY_NAME_SIZE; + DWORD dwNeeded = 0; + HRESULT hrResult = S_OK; + + + // Validate parameters. + if( (NULL == hHeap) + || + (NULL == pszFeature) + || + (NULL == pszOption) + || + (NULL == ppszDisplayName) + ) + { + ERR(ERRORTEXT("DetermineOptionDisplayName() invalid arguement.\r\n")); + + hrResult = E_INVALIDARG; + goto Exit; + } + + // + // Call the Helper function. + // + + // Helper will return Display Names for PPD Feature Options, but + // not for Driver Synthisized features options (i.e. features prefixed with %). + // Do it for all options, just in case the helper interface changes to support it. + + // Pre-allocate a buffer of reasonable size to try + // to one have to call GetOptionAttribute() once. + *ppszDisplayName = (PWSTR) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwSize); + if(NULL == *ppszDisplayName) + { + ERR(ERRORTEXT("DetermineOptionDisplayName() alloc for feature display name failed.\r\n")); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + // Try to get diplay name for feature from Helper. + hrResult = Helper.GetOptionAttribute(poemuiobj, + 0, + pszFeature, + pszOption, + "DisplayName", + &dwDataType, + (PBYTE) *ppszDisplayName, + dwSize, + &dwNeeded); + if( (E_OUTOFMEMORY == hrResult) && (dwSize < dwNeeded)) + { + PWSTR pTemp; + + + // INVARIANT: initial buffer wasn't large enough. + + // Re-alloc buffer and try again. + pTemp = (PWSTR) HeapReAlloc(hHeap, HEAP_ZERO_MEMORY, *ppszDisplayName, dwNeeded); + if(NULL == pTemp) + { + ERR(ERRORTEXT("GetOptionAttribute() re-alloc for feature display name failed.\r\n")); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + *ppszDisplayName = pTemp; + + // Try to get the display name from Helper, again. + hrResult = Helper.GetOptionAttribute(poemuiobj, + 0, + pszFeature, + pszOption, + "DisplayName", + &dwDataType, + (PBYTE) *ppszDisplayName, + dwNeeded, + &dwNeeded); + } + + if(SUCCEEDED(hrResult)) + { + // INVARIANT: Successfully got display name from Helper for feature. + // Don't need to do anything more. + + // Check the data type, it should be kADT_UNICODE. + if(kADT_UNICODE != dwDataType) WARNING(DLLTEXT("DetermineOptionDisplayName() feature attribute type not kADT_UNICODE. (dwDataType = %d)\r\n"), dwDataType); + + goto Exit; + } + + // INVARIANT: Did not get the display name from the Helper. + + // Free memory allocated for call to Helper. + if(NULL != *ppszDisplayName) + { + HeapFree(hHeap, 0, *ppszDisplayName); + *ppszDisplayName = NULL; + } + + // Try alternative methods for getting the display name other + // than from the Helper function. + // If we have a mapping entry, then try to get resource string + // for the display name. + // Otherwise, covert the keyword to UNICODE and use that. + if(NULL != pMapping) + { + // + // Try mapping the keyword to resource string. + // + + hrResult = GetDisplayNameFromMapping(hHeap, pMapping, ppszDisplayName); + } + else + { + // + // Convert the keyword to UNICODE and use that. + // + + // Convert ANSI keyword to Unicode string for display name. + // For debug version, add marker that shows that the display name was faked. + PCSTR pConvert = pszOption; + #if DBG + CHAR szTemp[256]; + if(FAILED(StringCbPrintfA(szTemp, sizeof(szTemp), "%s (Keyword)", pConvert))) + { + ERR(ERRORTEXT("DetermineOptionDisplayName() StringCbPrintfA() called failed.\r\n")); + } + pConvert = szTemp; + #endif + *ppszDisplayName = MakeUnicodeString(hHeap, pConvert); + if(NULL == *ppszDisplayName) + { + ERR(ERRORTEXT("DetermineOptionDisplayName() alloc for feature display name failed.\r\n")); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + // Return success even though we faked a display name. + hrResult = S_OK; + } + + +Exit: + + // If failed, then return no string. + if(!SUCCEEDED(hrResult)) + { + if(ppszDisplayName && NULL != *ppszDisplayName) + { + HeapFree(hHeap, 0, *ppszDisplayName); + *ppszDisplayName = NULL; + } + } + + return hrResult; +} + +// Determines sticky mode for the feature. +HRESULT DetermineStickiness(CUIHelper &Helper, + POEMUIOBJ poemuiobj, + PCSTR pszKeyword, + const PKEYWORDMAP pMapping, + PDWORD pdwMode) +{ + CHAR szGroupType[32] = {0}; + DWORD dwType = 0; + DWORD dwNeeded = 0; + HRESULT hrResult = S_OK; + + + // Use mapping to see what stickiness of the feature is. + if(NULL != pMapping) + { + *pdwMode = pMapping->dwMode; + goto Exit; + } + + // By default make feature Document sticky, if we don't have mapping. + *pdwMode = OEMCUIP_DOCPROP; + + // Try to use Helper to determine stickiness. + hrResult = Helper.GetFeatureAttribute(poemuiobj, + 0, + pszKeyword, + "OpenGroupType", + &dwType, + (PBYTE) szGroupType, + sizeof(szGroupType), + &dwNeeded); + if(SUCCEEDED(hrResult)) + { + // INVARIANT: found out if feature is an installable option. + // Installable options are the only PPD features + // that are Printer sticky. + + if(!lstrcmpA(szGroupType, "InstallableOptions")) + { + *pdwMode = OEMCUIP_PRNPROP; + } + goto Exit; + } + + +Exit: + + return hrResult; +} + +// Find the mapping entry from the keyword. +PKEYWORDMAP FindKeywordMapping(PKEYWORDMAP pKeywordMap, WORD wMapSize, PCSTR pszKeyword) +{ + BOOL bFound = FALSE; + PKEYWORDMAP pMapping = NULL; + + + // Walk mapping array for matching keyword. + for(WORD wIndex = 0; !bFound && (wIndex < wMapSize); ++wIndex) + { + bFound = !lstrcmpA(pszKeyword, pKeywordMap[wIndex].pszKeyword); + if(bFound) + { + pMapping = pKeywordMap + wIndex; + } + } + + return pMapping; +} + +// Get display name from mapping entry. +HRESULT GetDisplayNameFromMapping(_In_ HANDLE hHeap, PKEYWORDMAP pMapping, _Outptr_result_maybenull_ PWSTR *ppszDisplayName) +{ + HMODULE hModule = NULL; + HRESULT hrResult = S_OK; + + + // Validate parameters. + if( (NULL == hHeap) + || + (NULL == pMapping) + || + (NULL == ppszDisplayName) + ) + { + hrResult = E_INVALIDARG; + goto Exit; + } + + // Check for simple case of returning INT resource. + if( (NULL == pMapping->pwszModule) + || + IS_MAPPING_INT_RESOURCE(pMapping) + ) + { + // Just need to do MAKEINTRESOURCE on the resource ID and return. + *ppszDisplayName = MAKEINTRESOURCE(pMapping->uDisplayNameID); + goto Exit; + } + + // We only need to get the module if we aren't loading the resource from + // this module (i.e. if module name isn't NULL). + // Also, as an optimization, we assume that the module has already been loaded, + // since the only cases currently are this module, driver ui, and Compstui.dll. + hModule = GetModuleHandle(pMapping->pwszModule); + if(NULL == hModule) + { + DWORD dwError = GetLastError(); + + + ERR(ERRORTEXT("GetDisplayNameFromMapping() for failed to load module %s. (Error %d)\r\n"), + pMapping->pwszModule, + dwError); + + hrResult = HRESULT_FROM_WIN32(dwError); + goto Exit; + } + + // INVARIANT: have handle to module to load resource from or the + // resource is being loaded from this module. + + // Get the string resouce. + hrResult = GetStringResource(hHeap, hModule, pMapping->uDisplayNameID, ppszDisplayName); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("GetDisplayNameFromMapping() failed to load string. (hrResult = 0x%x)\r\n"), + hrResult); + goto Exit; + } + + +Exit: + + return hrResult; +} + +// Test if an OPTITEM is an OPTITEM for a feature. +// Macro for testing if OPTITEM is feature OPTITEM +BOOL IsFeatureOptitem(POPTITEM pOptItem) +{ + BOOL bRet = FALSE; + PFEATUREOPTITEMDATA pData = NULL; + + + // Make sure pointers are NULL. + if( (NULL == pOptItem) + || + (NULL == pOptItem->UserData) + ) + { + // INVARIANT: can't be feature OPTITEM, since one of + // the necessary pointer are NULL. + + return FALSE; + } + + // For convienience, assign to pointer to feature OPTITEM data. + pData = (PFEATUREOPTITEMDATA)(pOptItem->UserData); + + // Check size and tag. + bRet = (sizeof(FEATUREOPTITEMDATA) == pData->dwSize) + && + (FEATURE_OPTITEM_TAG == pData->dwTag); + + return bRet; +} + + + +// Walks array of OPTITEMs saving each feature OPTITEM +// that has changed. +HRESULT SaveFeatureOptItems(_In_ HANDLE hHeap, + CUIHelper *pHelper, + POEMUIOBJ poemuiobj, + HWND hWnd, + POPTITEM pOptItem, + WORD wItems) +{ + PSTR pmszPairs = NULL; + WORD wPairs = 0; + WORD wReasons = 0; + DWORD dwSize = 0; + DWORD dwResult = 0; + PCSTR *ppszReasons = NULL; + PWSTR pszConfilictFeature = NULL; + PWSTR pszConfilictOption = NULL; + PWSTR pszCaption = NULL; + PWSTR pszFormat = NULL; + PWSTR pszMessage = NULL; + HRESULT hrResult = S_OK; + + + // Validate parameters + if( (NULL == hHeap) + || + (NULL == pHelper) + || + (NULL == pOptItem) + ) + { + ERR(ERRORTEXT("SaveFeatureOptItems() called with invalid parameters.\r\n")); + + hrResult = E_INVALIDARG; + goto Exit; + } + + // Get feature option pairs to save. + hrResult = GetChangedFeatureOptions(hHeap, pOptItem, wItems, &pmszPairs, &wPairs, &dwSize); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("SaveFeatureOptItems() failed to get changed feature option pairs. (hrResult = 0x%x)\r\n"), + hrResult); + + goto Exit; + } + + // Don't need to do anything more if no feature options changed. + if(0 == wPairs || !pmszPairs) + { + VERBOSE(DLLTEXT("SaveFeatureOptItems() no feature options that need to be set.\r\n")); + + goto Exit; + } + + // Set the change feature options. + // For the first SetOptions() call, don't have the + // core driver UI resolve conflicts, so we can + // prompt user for automatic resolution or let + // them do the conflict resolving. + hrResult = pHelper->SetOptions(poemuiobj, + SETOPTIONS_FLAG_KEEP_CONFLICT, + pmszPairs, + dwSize, + &dwResult); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("SaveFeatureOptItems() call to SetOptions() failed. (hrResult = 0x%x, dwResult = %d\r\n"), + hrResult, + dwResult); + + goto Exit; + } + + // Check to see if we were able to save changed feature options, + // or if there is a conflict that needs resolution. + if(SETOPTIONS_RESULT_CONFLICT_REMAINED == dwResult) + { + int nRet; + DWORD dwRet; + CONFLICT Conflict; + PKEYWORDMAP pMapping = NULL; + + + // INVARIANT: constraint conflict, options weren't saved. + + // Get list of all features that have conflict. + hrResult = GetFirstConflictingFeature(hHeap, + pHelper, + poemuiobj, + pOptItem, + wItems, + &Conflict); + if(!SUCCEEDED(hrResult)) + { + goto Exit; + } + + // Create string pointer list in to multi-sz of first conflict. + hrResult = MakeStrPtrList(hHeap, Conflict.pmszReasons, &ppszReasons, &wReasons); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("SaveFeatureOptItems() failed to make string list for conflict reasons. (hrResult = 0x%x)\r\n"), + hrResult); + + goto Exit; + } + + // Ensure that we have at least 2 reasons. Later code assumes that we do. + if (wReasons < 2) + { + hrResult = E_UNEXPECTED; + + goto Exit; + } + + // + // Get display versions of feature/option conflict reason. + // + + // Get or build a keyword mapping entry + // that maps from keyword to usefully where to get info, such as + // display name, icon, option type, for keywords that may not be + // able to get info for from Helper. + pMapping = FindKeywordMapping(gkmFeatureMap, NUM_FEATURE_MAP, ppszReasons[0]); + + // Get display names for each of the featurs. + // The function implements a heuristic for detemining the display name, + // since can't get the display name from the UI Helper for all features. + hrResult = DetermineFeatureDisplayName(hHeap, + *pHelper, + poemuiobj, + ppszReasons[0], + pMapping, + &pszConfilictFeature); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("SaveFeatureOptItems failed to get display name for feature %hs. (hrResult = 0x%x)\r\n"), + ppszReasons[0], + hrResult); + + goto Exit; + } + + // Get or build a keyword mapping entry + // that maps from keyword to usefully where to get info, such as + // display name, icon, option type, for keywords that may not be + // able to get info for from Helper. + pMapping = FindKeywordMapping(gkmOptionMap, NUM_OPTION_MAP, ppszReasons[1]); + + // Get option display name. + hrResult = DetermineOptionDisplayName(hHeap, + *pHelper, + poemuiobj, + ppszReasons[0], + ppszReasons[1], + pMapping, + &pszConfilictOption); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("SaveFeatureOptItems() failed to get display name for %hs of feature %hs. (hrResult = 0x%x)\r\n"), + ppszReasons[1], + ppszReasons[0], + hrResult); + + goto Exit; + } + + // + // Prompt user about how to resolve conflict. + // + + // Get caption name. + hrResult = GetStringResource(hHeap, ghInstance, IDS_NAME, &pszCaption); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("SaveFeatureOptItems() failed to get caption name. (hrResult = 0x%x)\r\n"), + hrResult); + goto Exit; + } + + // Get message body format string. + hrResult = GetStringResource(hHeap, ghInstance, IDS_CONSTRAINT_CONFLICT, &pszFormat); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("SaveFeatureOptItems() failed to get constraint conflict format. (hrResult = 0x%x)\r\n"), + hrResult); + goto Exit; + } + + + // Get messsage body. + PVOID paArgs[4] = {pszConfilictFeature, + pszConfilictOption, + const_cast<PWSTR>(Conflict.pszFeature), + Conflict.pszOption + }; + dwRet = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, + pszFormat, + 0, + 0, + (PWSTR) &pszMessage, + 0, + (va_list *) paArgs); + if(0 == dwRet) + { + DWORD dwError = GetLastError(); + + ERR(ERRORTEXT("SaveFeatureOptItems() failed to FormatMessage() for constraint conflict of feature %hs option %hs. (Last Error %d)\r\n"), + Conflict.pszFeatureKeyword, + Conflict.pszOptionKeyword, + dwError); + + hrResult = HRESULT_FROM_WIN32(dwError); + goto Exit; + } + + // Display simple message box with prompt. + nRet = MessageBox(hWnd, pszMessage, pszCaption, MB_YESNO | MB_ICONWARNING); + + // Check to see how user wants to resolve conflict. + if(IDYES == nRet) + { + // Let core driver resolve conflict resolution. + hrResult = pHelper->SetOptions(poemuiobj, + SETOPTIONS_FLAG_RESOLVE_CONFLICT, + pmszPairs, + dwSize, + &dwResult); + + // Conflict resolution requires refreshing current option + // selection for each feature, since selection may have + // changed because of conflict resolution. + RefreshOptItemSelection(pHelper, poemuiobj, pOptItem, wItems); + } + + // Return failure if there are still conflictts. + if(SETOPTIONS_RESULT_CONFLICT_REMAINED == dwResult) + { + hrResult = E_FAIL; + } + } + + +Exit: + + // Clean up... + + // cleanup heap allocs. + if(NULL != pmszPairs) HeapFree(hHeap, 0, pmszPairs); + if(NULL != ppszReasons) HeapFree(hHeap, 0, ppszReasons); + if(NULL != pszConfilictFeature) HeapFree(hHeap, 0, pszConfilictFeature); + if(NULL != pszConfilictOption) HeapFree(hHeap, 0, pszConfilictOption); + if(NULL != pszCaption) HeapFree(hHeap, 0, pszCaption); + if(NULL != pszFormat) HeapFree(hHeap, 0, pszFormat); + if(NULL != pszMessage) LocalFree(pszMessage); + + return hrResult; +} + +// Allocates buffer, if needed, and calls IPrintCoreUI2::WhyConsrained +// to get reason for constraint. +HRESULT GetWhyConstrained(_In_ HANDLE hHeap, + CUIHelper *pHelper, + POEMUIOBJ poemuiobj, + _In_ PCSTR pszFeature, + _In_ PCSTR pszOption, + _Inout_ PSTR *ppmszReason, + _Inout_ PDWORD pdwSize) +{ + PSTR pmszReasonList = *ppmszReason; + DWORD dwNeeded = 0; + HRESULT hrResult = S_OK; + + + // If buffer wasn't passed in, then allocate one. + if( (NULL == pmszReasonList) || (0 == *pdwSize) ) + { + // If no size or size is smaller than default, then change to default + // size. We want to try to only allocate and call once. + if(*pdwSize < INITIAL_GET_REASON_SIZE) + { + *pdwSize = INITIAL_GET_REASON_SIZE; + } + + // Alloc initial buffer for reason constrained. + pmszReasonList = (PSTR) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, *pdwSize); + if(NULL == pmszReasonList) + { + ERR(ERRORTEXT("GetWhyConstrained() failed to alloc buffer for constraint reasons for feature %hs and option %hs.\r\n"), + pszFeature, + pszOption); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + } + + // Get reason for constraint. + hrResult = pHelper->WhyConstrained(poemuiobj, + 0, + pszFeature, + pszOption, + pmszReasonList, + *pdwSize, + &dwNeeded); + if( (E_OUTOFMEMORY == hrResult) + && + (*pdwSize < dwNeeded) + ) + { + PSTR pTemp; + + + // INVARIANT: initial buffer not large enough. + + // Re-alloc buffer to needed size. + pTemp = (PSTR) HeapReAlloc(hHeap, HEAP_ZERO_MEMORY, pmszReasonList, dwNeeded); + if(NULL == pTemp) + { + ERR(ERRORTEXT("GetWhyConstrained() failed to re-allocate buffer for constraint reason for feature %hs and option %hs.\r\n"), + pszFeature, + pszOption); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + pmszReasonList = pTemp; + *pdwSize = dwNeeded; + + // Retry getting constaint reason. + hrResult = pHelper->WhyConstrained(poemuiobj, + 0, + pszFeature, + pszOption, + pmszReasonList, + *pdwSize, + &dwNeeded); + } + + +Exit: + + // On error, do clean up. + if(!SUCCEEDED(hrResult)) + { + // Free reason buffer. + if(NULL != pmszReasonList) HeapFree(hHeap, 0, pmszReasonList); + + // Return NULL and zero size. + *ppmszReason = NULL; + *pdwSize = 0; + } + else + { + *ppmszReason = pmszReasonList; + } + + return hrResult; +} + +// Creates multi-sz list of feature option pairs that have changed. +HRESULT GetChangedFeatureOptions(_In_ HANDLE hHeap, + POPTITEM pOptItem, + WORD wItems, + _Outptr_result_maybenull_ PSTR *ppmszPairs, + _Out_ PWORD pwPairs, + _Out_ PDWORD pdwSize) +{ + WORD wCount = 0; + WORD wChanged = 0; + WORD wPairs = 0; + PSTR pmszPairs = NULL; + DWORD dwNeeded = 2; + DWORD dwOffset = 0; + HRESULT hrResult = S_OK; + PFEATUREOPTITEMDATA pData = NULL; + + + // Walk OPTITEM array looking or changed options, + // and calculating size needed for multi-sz buffer. + for(wCount = 0; wCount < wItems; ++wCount) + { + PSTR pszOption = NULL; + + + // Just go to next item if this OPTITEM hasn't + // changed or isn't a feature OPTITEM. + if( !(OPTIF_CHANGEONCE & pOptItem[wCount].Flags) + || + !IsFeatureOptitem(pOptItem + wCount) + ) + { + continue; + } + + // For convienience, assign to pointer to feature OPTITEM data. + pData = (PFEATUREOPTITEMDATA)(pOptItem[wCount].UserData); + + // Increment options changed and size needed. + pszOption = GetOptionKeywordFromOptItem(hHeap, pOptItem + wCount); + if(NULL != pszOption) + { + ++wChanged; + + DWORD dwTmp = 0; + + if (FAILED(hrResult = SizeTToDWord(strlen(pData->pszFeatureKeyword) + strlen(pszOption) + 2, &dwTmp))) + { + goto Exit; + } + + dwNeeded += dwTmp; + + // Need to free option keyword string copy + // allocated in GetOptionKeywordFromOptItem(). + HeapFree(hHeap, 0, pszOption); + pszOption = NULL; + } + } + + // Don't need to do anything more if no feature options changed. + if(0 == wChanged) + { + goto Exit; + } + + // Allocate multi-sz buffer. + pmszPairs = (PSTR) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwNeeded); + if(NULL == pmszPairs) + { + ERR(ERRORTEXT("GetChangedFeatureOptions() failed to allocate multi-sz.\r\n")); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + // Build mult-sz list of feature option pairs + // that changed. + for(wCount = 0, wPairs = 0; (wCount < wItems) && (wPairs < wChanged); ++wCount) + { + PSTR pszOption = NULL; + + + // Just go to next item if this OPTITEM hasn't + // changed or isn't a feature OPTITEM. + if( !(OPTIF_CHANGEONCE & pOptItem[wCount].Flags) + || + !IsFeatureOptitem(pOptItem + wCount) + ) + { + continue; + } + + // For convienience, assign to pointer to feature OPTITEM data. + pData = (PFEATUREOPTITEMDATA)(pOptItem[wCount].UserData); + + // Add feature option pair. + pszOption = GetOptionKeywordFromOptItem(hHeap, pOptItem + wCount); + if(NULL != pszOption) + { + if (FAILED(hrResult = StringCbCopyA(pmszPairs + dwOffset, dwNeeded - dwOffset, pData->pszFeatureKeyword))) + { + goto Exit; + } + + DWORD dwTmp = 0; + + if (FAILED(hrResult = SizeTToDWord(strlen(pData->pszFeatureKeyword) + 1, &dwTmp))) + { + goto Exit; + } + + dwOffset += dwTmp; + + if (FAILED(hrResult = StringCbCopyA(pmszPairs + dwOffset, dwNeeded - dwOffset, pszOption))) + { + goto Exit; + } + + if (FAILED(hrResult = SizeTToDWord(strlen(pszOption) + 1, &dwTmp))) + { + goto Exit; + } + + dwOffset += dwTmp; + + // Keep track of number of pairs added, so + // we are able to exit loop as soon as + // we added all changed feature options. + ++wPairs; + + // Need to free option keyword string copy + // allocated in GetOptionKeywordFromOptItem(). + HeapFree(hHeap, 0, pszOption); + pszOption = NULL; + } + } + + +Exit: + + if(SUCCEEDED(hrResult)) + { + // INVARIANT: either successfully build mutli-sz of changed + // feature option pairs, or there are no feature + // that options changed. + + // Return pairs and number of pairs. + *pwPairs = wPairs; + *pdwSize = dwNeeded; + *ppmszPairs = pmszPairs; + } + else + { + // INVARINAT: error. + + // Clean up. + if(NULL == pmszPairs) HeapFree(hHeap, 0, pmszPairs); + + // Return NULL and zero count. + *pwPairs = 0; + *pdwSize = 0; + *ppmszPairs = NULL; + } + + return hrResult; +} + +// Returns pointer to option keyword for a feature OPTITEM. +PSTR GetOptionKeywordFromOptItem(_In_ HANDLE hHeap, POPTITEM pOptItem) +{ + char szNumber[16] = {0}; + PSTR pszOption = NULL; + PFEATUREOPTITEMDATA pData = NULL; + + + // Validate parameter. + if(!IsFeatureOptitem(pOptItem)) + { + ERR(ERRORTEXT("GetOptionKeywordFromOptItem() invalid parameter.\r\n")); + + goto Exit; + } + + // For convienience, assign to pointer to feature OPTITEM data. + pData = (PFEATUREOPTITEMDATA)(pOptItem->UserData); + + // Option selection is based on type of OPTTYPE. + switch(pOptItem->pOptType->Type) + { + // For up down arrow control, selection is just pOptItem->Sel + // converted to string. + case TVOT_UDARROW: + if(FAILED(StringCbPrintfA(szNumber, sizeof(szNumber)/sizeof(szNumber[0]), "%u", pOptItem->Sel))) + { + ERR(ERRORTEXT("GetOptionKeywordFromOptItem() failed to convert number to string.\r\n")); + } + szNumber[sizeof(szNumber)/sizeof(szNumber[0]) - 1] = '\0'; + pszOption = MakeStringCopy(hHeap, szNumber); + break; + + // For combobox, pOptItem->Sel is the index in to the + // option array. + case TVOT_COMBOBOX: + pszOption = MakeStringCopy(hHeap, pData->pOptions->GetKeyword((WORD)pOptItem->Sel)); + break; + + // The default is the option count. + default: + ERR(ERRORTEXT("GetOptionKeywordFromOptItem() OPTTYPE type %d num of OPTPARAMs not handled.\r\n"), + pOptItem->pOptType->Type); + + goto Exit; + break; + } + + +Exit: + + return pszOption; +} + +// Returns pointer to option display name for a feature OPTITEM. +PWSTR GetOptionDisplayNameFromOptItem(_In_ HANDLE hHeap, POPTITEM pOptItem) +{ + WCHAR szNumber[16] = {0}; + PWSTR pszOption = NULL; + PFEATUREOPTITEMDATA pData = NULL; + + + // Validate parameter. + if(!IsFeatureOptitem(pOptItem)) + { + ERR(ERRORTEXT("GetOptionDisplayNameFromOptItem() invalid parameter.\r\n")); + + goto Exit; + } + + // For convienience, assign to pointer to feature OPTITEM data. + pData = (PFEATUREOPTITEMDATA)(pOptItem->UserData); + + // Option selection is based on type of OPTTYPE. + switch(pOptItem->pOptType->Type) + { + // For up down arrow control, selection is just pOptItem->Sel + // converted to string. + case TVOT_UDARROW: + if(FAILED(StringCbPrintfW(szNumber, sizeof(szNumber)/sizeof(szNumber[0]), L"%u", pOptItem->Sel))) + { + ERR(ERRORTEXT("GetOptionDisplayNameFromOptItem() failed to convert number to string.\r\n")); + } + szNumber[sizeof(szNumber)/sizeof(szNumber[0]) - 1] = L'\0'; + pszOption = MakeStringCopy(hHeap, szNumber); + break; + + // For combobox, pOptItem->Sel is the index in to the + // option array. + case TVOT_COMBOBOX: + pszOption = MakeStringCopy(hHeap, pOptItem->pOptType->pOptParam[pOptItem->Sel].pData); + break; + + // The default is the option count. + default: + ERR(ERRORTEXT("GetOptionDisplayNameFromOptItem() OPTTYPE type %d num of OPTPARAMs not handled.\r\n"), + pOptItem->pOptType->Type); + + goto Exit; + break; + } + + +Exit: + + return pszOption; +} + +// Refreshes option selection for each feature OPTITEM +HRESULT RefreshOptItemSelection(CUIHelper *pHelper, + POEMUIOBJ poemuiobj, + POPTITEM pOptItems, + WORD wItems) +{ + HRESULT hrResult = S_OK; + PFEATUREOPTITEMDATA pData = NULL; + + + // Walk OPTITEM array refreshing feature OPTITEMs. + for(WORD wCount = 0; wCount < wItems; ++wCount) + { + // Just go to next item if this OPTITEM isn't a feature OPTITEM. + if(!IsFeatureOptitem(pOptItems + wCount)) + { + continue; + } + + // For convienience, assign to pointer to feature OPTITEM data. + pData = (PFEATUREOPTITEMDATA)(pOptItems[wCount].UserData); + + // Refresh COption selection. + pData->pOptions->RefreshSelection(*pHelper, poemuiobj); + + // Assign COption selection to OPTITEM selection. + pOptItems[wCount].pSel = pData->pOptions->GetSelection(); + + } + + return hrResult; +} + +// Creates array of conflict features. +HRESULT GetFirstConflictingFeature(_In_ HANDLE hHeap, + CUIHelper *pHelper, + POEMUIOBJ poemuiobj, + POPTITEM pOptItem, + WORD wItems, + PCONFLICT pConflict) +{ + WORD wCount = 0; + HRESULT hrResult = S_OK; + PFEATUREOPTITEMDATA pData = NULL; + + + // Walk OPTITEM array looking or changed options that are in conflict. + for(wCount = 0; wCount < wItems; ++wCount) + { + // Just go to next item if this OPTITEM hasn't + // changed or isn't a feature OPTITEM. + if( !(OPTIF_CHANGEONCE & pOptItem[wCount].Flags) + || + !IsFeatureOptitem(pOptItem + wCount) + ) + { + continue; + } + + // For convienience, assign to pointer to feature OPTITEM data. + pData = (PFEATUREOPTITEMDATA)(pOptItem[wCount].UserData); + + // Init conflict record if this feature is in conflict. + pConflict->pszOptionKeyword = GetOptionKeywordFromOptItem(hHeap, pOptItem + wCount); + if(NULL != pConflict->pszOptionKeyword) + { + // Get reason for conflict + // If the feature isn't in conflict, + // then the pmszReasonList will start + // with NULL terminator. + hrResult = GetWhyConstrained(hHeap, + pHelper, + poemuiobj, + pData->pszFeatureKeyword, + pConflict->pszOptionKeyword, + &pConflict->pmszReasons, + &pConflict->dwReasonsSize); + if(!SUCCEEDED(hrResult)) + { + // NOTE: driver features aren't supported by WhyConstrained. + if((E_INVALIDARG == hrResult) && IS_DRIVER_FEATURE(pData->pszFeatureKeyword)) + { + // Need to reset the result in case it is the last + // feature OPTITEM. + hrResult = S_OK; + continue; + } + + ERR(ERRORTEXT("GetConflictingFeatures() failed to get reason for feature %hs option %hs constraint. (hrResult = 0x%x)\r\n"), + pData->pszFeatureKeyword, + pConflict->pszOptionKeyword, + hrResult); + + goto Exit; + } + + // Record conflict if feature is in conflict. + if( (NULL != pConflict->pmszReasons) + && + (pConflict->pmszReasons[0] != '\0') + ) + { + // Save pointer to feature keyword. + pConflict->pszFeatureKeyword = pData->pszFeatureKeyword; + pConflict->pszFeature = pOptItem[wCount].pName; + pConflict->pszOption = GetOptionDisplayNameFromOptItem(hHeap, pOptItem + wCount); + + // Found first conflict. + break; + } + } + } + + +Exit: + + return hrResult; +} + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/Features.h b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/Features.h new file mode 100644 index 00000000..84fee27e --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/Features.h @@ -0,0 +1,236 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 2001 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Features.h +// + +#pragma once + +//////////////////////////////////////////////////////// +// Defines and Macros +//////////////////////////////////////////////////////// + + + +//////////////////////////////////////////////////////// +// Type Definitions +//////////////////////////////////////////////////////// + +// Struct used to map keyword to information +// such as display name and stickiness. +typedef struct _tagKeywordMap +{ + PCSTR pszKeyword; + PCWSTR pwszModule; + UINT uDisplayNameID; + DWORD dwMode; + DWORD dwFlags; + +} KEYWORDMAP, *PKEYWORDMAP; + + +// Struct container for info about +// feature that is in conflict. +typedef struct _tagConflict +{ + PCSTR pszFeatureKeyword; + PCWSTR pszFeature; + PSTR pszOptionKeyword; + PWSTR pszOption; + PSTR pmszReasons; + DWORD dwReasonsSize; + +} CONFLICT, *PCONFLICT; + + + +//////////////////////////////////////////////////////// +// Class Definitions +//////////////////////////////////////////////////////// + +// Class wrapper and container for Core Driver Feature Options. +class COptions +{ + private: + + // Option Infomation + class OPTION_INFO + { + public: + PKEYWORDMAP pMapping; + PWSTR pszDisplayName; + + public: + OPTION_INFO() + { + pMapping = NULL; + pszDisplayName = NULL; + } + + virtual ~OPTION_INFO(){} + }; + typedef class OPTION_INFO *POPTION_INFO; + + // Data Members + WORD m_wOptions; // Count of the number of options contained for an instance of the class. + BYTE m_cType; // CPSUI Option Type (i.e. what to set pOptItem->pOptType->Type to). + PSTR m_pmszRaw; // The RAW multi NULL terminated string buffer used for IPrintCoreUI2::EnumOptions(). + PCSTR m_pszFeature; // Pointer to the feature for which the enumerate options belong. + PCSTR *m_ppszOptions; // String list pointer that points to begining of each of the strings in multi-SZ pointed to by m_pmszRaw. + POINT m_ptRange; // Option range for features, such as %JobTimeout, that have a range of possible vaules not a small selection list. + DWORD m_dwSize; // Size of m_pmszRaw buffer. + PWSTR m_pszUnits; // String that contains the unit specifier for options, such as %JobTimeout, which need Units (i.e. seconds). + HANDLE m_hHeap; // Heap to do allocations from. + POPTION_INFO m_pInfo; // Array of Info about each option for a feature. + + union { // Current selected option for a feature. + LONG m_Sel; // This is what pOptItem->m_pSel or pOptItem->m_Sel + LPTSTR m_pSel; // will be set to. + }; + + public: + COptions(); + virtual ~COptions(); + + // Populate Options list for specified keyword. + HRESULT COptions::Acquire(_In_ HANDLE hHeap, + CUIHelper &Helper, + _In_ POEMUIOBJ poemuiobj, + _In_ PCSTR pszFeature); + + // Returns number of feature options contained in class instance. + inline WORD GetCount() const {return m_wOptions;} + + // Returns selection. + inline LPTSTR GetSelection() const {return m_pSel;} + + // Return nth options keyword. + PCSTR GetKeyword(WORD wIndex) const; + + // Return nth option Display Name. + PCWSTR GetName(WORD wIndex) const; + + // Find option with matching keyword string. + WORD FindOption(_In_opt_ PCSTR pszOption, WORD wDefault) const; + + // Initializes options portion of OPTITEM. + HRESULT InitOptItem(_In_ HANDLE hHeap, POPTITEM pOptItem); + + // Refresh option selection. + HRESULT RefreshSelection(CUIHelper &Helper, POEMUIOBJ poemuiobj); + + private: + void Init(); + void Clear(); + void FreeOptionInfo(); + HRESULT GetOptionsForSpecialFeatures(CUIHelper &Helper, POEMUIOBJ poemuiobj); + HRESULT GetOptionsForOutputPSLevel(CUIHelper &Helper, POEMUIOBJ poemuiobj); + HRESULT GetOptionSelectionString(CUIHelper &Helper, POEMUIOBJ poemuiobj, _Outptr_result_maybenull_ PSTR *ppszSel); + HRESULT GetOptionSelectionLong(CUIHelper &Helper, POEMUIOBJ poemuiobj); + HRESULT GetOptionSelectionShort(CUIHelper &Helper, POEMUIOBJ poemuiobj); + HRESULT GetOptionSelectionIndex(CUIHelper &Helper, POEMUIOBJ poemuiobj); +}; + + +// Class wrapper and container for Cor Driver Features. +class CFeatures +{ + private: + + // Feature Infomation + class FEATURE_INFO + { + public: + PKEYWORDMAP pMapping; + PWSTR pszDisplayName; + COptions Options; + DWORD dwMode; + + public: + FEATURE_INFO() + { + pMapping = NULL; + pszDisplayName = NULL; + dwMode = 0; + } + + virtual ~FEATURE_INFO() {} + }; + typedef class FEATURE_INFO *PFEATURE_INFO; + + WORD m_wFeatures; // Count of the number of features. + WORD m_wDocFeatures; // Count of the number of Document sticky features. + WORD m_wPrintFeatures; // Count of the number of Printer sticky features. + PSTR m_pmszRaw; // Buffer for multi-SZ for call to IPrintCoreUI2::EnumFeatures. + PCSTR *m_ppszKeywords; // String list that points to each of the strings in m_pmszRaw. + DWORD m_dwSize; // Size of m_pmszRaw. + HANDLE m_hHeap; // Heap to do allocations from. + PFEATURE_INFO m_pInfo; // Array of feature information about each of the enumerate features. + + public: + CFeatures(); + virtual ~CFeatures(); + + // Populates the Feature list + HRESULT Acquire(_In_ HANDLE hHeap, CUIHelper &Helper, _In_ POEMUIOBJ poemuiobj); + + // Returns number of features contained in class instance. + WORD GetCount(DWORD dwMode = 0) const; + + // Returns feature keyword. + PCSTR GetKeyword(WORD wIndex, DWORD dwMode = 0) const; + + // Return feature Display Name. + PCWSTR GetName(WORD wIndex, DWORD dwMode = 0) const; + + // Returns pointer to option class for nth feature. + COptions* GetOptions(WORD wIndex, DWORD dwMode = 0) const; + + // Initializes OPTITEM for the feature. + HRESULT InitOptItem(_In_ HANDLE hHeap, POPTITEM pOptItem, WORD wIndex, DWORD dwMode); + + private: + void Init(); + void Clear(); + void FreeFeatureInfo(); + WORD GetModelessIndex(WORD wIndex, DWORD dwMode) const; +}; + + + +//////////////////////////////////////////////////////// +// Prototypes +//////////////////////////////////////////////////////// + +HRESULT DetermineFeatureDisplayName(_In_ HANDLE hHeap, CUIHelper &Helper, POEMUIOBJ poemuiobj, + _In_ PCSTR pszKeyword, const PKEYWORDMAP pMapping, + _Outptr_result_maybenull_ PWSTR *ppszDisplayName); +HRESULT DetermineOptionDisplayName(_In_ HANDLE hHeap, CUIHelper &Helper, POEMUIOBJ poemuiobj, + _In_ PCSTR pszFeature, _In_ PCSTR pszOption, + const PKEYWORDMAP pMapping, _Outptr_result_maybenull_ PWSTR *ppszDisplayName); +HRESULT DetermineStickiness(CUIHelper &Helper, POEMUIOBJ poemuiobj, PCSTR pszKeyword, + const PKEYWORDMAP pMapping,PDWORD pdwMode); + +PKEYWORDMAP FindKeywordMapping(PKEYWORDMAP pKeywordMap, WORD wMapSize, PCSTR pszKeyword); +HRESULT GetDisplayNameFromMapping(_In_ HANDLE hHeap, PKEYWORDMAP pMapping, _Outptr_result_maybenull_ PWSTR *ppszDisplayName); + +BOOL IsFeatureOptitem(POPTITEM pOptItem); +HRESULT SaveFeatureOptItems(_In_ HANDLE hHeap, CUIHelper *pHelper, POEMUIOBJ poemuiobj, + HWND hWnd, POPTITEM pOptItem, WORD wItems); +HRESULT GetWhyConstrained(_In_ HANDLE hHeap, CUIHelper *pHelper, POEMUIOBJ poemuiobj, + _In_ PCSTR pszFeature, _In_ PCSTR pszOption, _Inout_ PSTR *ppmszReason, + _Inout_ PDWORD pdwSize); +HRESULT GetChangedFeatureOptions(_In_ HANDLE hHeap, POPTITEM pOptItem, WORD wItems, + _Outptr_result_maybenull_ PSTR *ppmszPairs, _Out_ PWORD pdwPairs, _Out_ PDWORD pdwSize); +PSTR GetOptionKeywordFromOptItem(_In_ HANDLE hHeap, POPTITEM pOptItem); +PWSTR GetOptionDisplayNameFromOptItem(_In_ HANDLE hHeap, POPTITEM pOptItem); +HRESULT RefreshOptItemSelection(CUIHelper *pHelper, POEMUIOBJ poemuiobj, POPTITEM pOptItems, + WORD wItems); +HRESULT GetFirstConflictingFeature(_In_ HANDLE hHeap, CUIHelper *pHelper, POEMUIOBJ poemuiobj, + POPTITEM pOptItem, WORD wItems, PCONFLICT pConflict); + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/Helper.cpp b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/Helper.cpp new file mode 100644 index 00000000..3e1a2da5 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/Helper.cpp @@ -0,0 +1,457 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 2001 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Helper.cpp +// +// +// PURPOSE: Implementation of wrapper class for Driver UI Helper interface. +// + +#include "precomp.h" +#include "Helper.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +//////////////////////////////////////////////////////// +// Internal Macros +//////////////////////////////////////////////////////// + + +// Macros for simplifying calling the Driver UI Helper interfaces correctly. + +#define CALL_HELPER(MethodName, args) \ + if (IsEqualGUID(&m_iidUIHelper, &IID_IPrintOemDriverUI)) \ + { \ + return static_cast<IPrintOemDriverUI *>(m_pUIHelper)->MethodName args; \ + } \ + else if (IsEqualGUID(&m_iidUIHelper, &IID_IPrintCoreUI2)) \ + { \ + return static_cast<IPrintCoreUI2 *>(m_pUIHelper)->MethodName args; \ + } \ + return E_NOINTERFACE; + +#define CALL_HELPER2(MethodName, args) \ + if (IsEqualGUID(&m_iidUIHelper, &IID_IPrintCoreUI2)) \ + { \ + return static_cast<IPrintCoreUI2 *>(m_pUIHelper)->MethodName args; \ + } \ + return E_NOINTERFACE; + + +///////////////////////////////////////////////////////////// +// +// CUIHelper Class Methods +// + +// +// Private Methods +// + +// Clears or initializes data members. +void CUIHelper::Clear() +{ + // Clear stored interface + m_pUIHelper = NULL; + m_iidUIHelper = GUID_NULL; +} + + +// +// Public Methods +// + +// Default contructor. +CUIHelper::CUIHelper() +{ + // Initialize the data members. + Clear(); +} + +// Constructor with assignment. +CUIHelper::CUIHelper(const IID &HelperIID, PVOID pHelper) +{ + // Assign the interface. + Assign(HelperIID, pHelper); +} + +// Destructor +CUIHelper::~CUIHelper() +{ + // Release the interface reference. + Release(); +} + +// Stores helper interface in helper entry structure. +void CUIHelper::Assign(const IID &HelperIID, PVOID pHelper) +{ + // If we already have a helper interface, release it. + if(IsValid()) + { + Release(); + } + + // Store helper interface and IID for it. + m_pUIHelper = static_cast<IUnknown*>(pHelper); + m_iidUIHelper = HelperIID; +} + +// Releases the helper interface and +// our removes the references to it. +ULONG CUIHelper::Release() +{ + ULONG ulRef = 0; + + + if(IsValid()) + { + // Release the interface. + // Since IPrintCoreUI2 inherits from IPrintOemDriverUI, + // it is safe to cast both types of helper interfaces + // to IPrintOemDriverUI for purposes of calling a + // method implemented in IPrintOemDriverUI. + // NOTE: can't cast to IUnknown since it just has pure virtual + // calls for AddRef and Release. + ulRef = static_cast<IPrintOemDriverUI *>(m_pUIHelper)->Release(); + + // Clear the data members. + Clear(); + } + + return ulRef; +} + + +// +// IPrintOemDriverUI methods +// + +// +// Helper function to get driver settings. This function is only supported +// for UI plugins that do not fully replace core driver's standard UI. +// + +HRESULT __stdcall CUIHelper::DrvGetDriverSetting( + PVOID pci, + PCSTR Feature, + PVOID pOutput, + DWORD cbSize, + PDWORD pcbNeeded, + PDWORD pdwOptionsReturned + ) +{ + CALL_HELPER(DrvGetDriverSetting, + (pci, + Feature, + pOutput, + cbSize, + pcbNeeded, + pdwOptionsReturned + ) + ); +} + +// +// Helper function to allow OEM plugins upgrade private registry +// settings. This function is supported for any UI plugins and should be +// called only by OEM's UpgradePrinter. +// + +HRESULT __stdcall CUIHelper::DrvUpgradeRegistrySetting( + HANDLE hPrinter, + PCSTR pFeature, + PCSTR pOption + ) +{ + CALL_HELPER(DrvUpgradeRegistrySetting, + (hPrinter, + pFeature, + pOption + ) + ); +} + +// +// Helper function to allow OEM plugins to update the driver UI settings. +// This function is only supported for UI plugins that do not fully replace +// core driver's standard UI. It should be called only when the UI is present. +// + +HRESULT __stdcall CUIHelper::DrvUpdateUISetting( + PVOID pci, + PVOID pOptItem, + DWORD dwPreviousSelection, + DWORD dwMode + ) +{ + CALL_HELPER(DrvUpdateUISetting, + (pci, + pOptItem, + dwPreviousSelection, + dwMode + ) + ); +} + +// +// IPrintCoreUI2 new methods +// + +// +// Following four helper functions are only supported for UI plugins that fully +// replace core driver's standard UI. They should only be called by the UI plugin's +// DocumentPropertySheets, DevicePropertySheets and their property sheet callback +// functions. +// +// Helper function to retrieve driver's current setting as a list of +// feature/option keyword pairs. +// +_Use_decl_annotations_ +HRESULT __stdcall CUIHelper::GetOptions( + POEMUIOBJ poemuiobj, + DWORD dwFlags, + PCSTR pmszFeaturesRequested, + DWORD cbIn, + PSTR pmszFeatureOptionBuf, + DWORD cbSize, + PDWORD pcbNeeded) +{ + CALL_HELPER2(GetOptions, + (poemuiobj, + dwFlags, + pmszFeaturesRequested, + cbIn, + pmszFeatureOptionBuf, + cbSize, + pcbNeeded + ) + ); +} + +// +// Helper function to change driver's setting using a list of feature/option +// keyword pairs. +// +_Use_decl_annotations_ +HRESULT __stdcall CUIHelper::SetOptions( + POEMUIOBJ poemuiobj, + DWORD dwFlags, + PCSTR pmszFeatureOptionBuf, + DWORD cbIn, + PDWORD pdwResult) +{ + CALL_HELPER2(SetOptions, + (poemuiobj, + dwFlags, + pmszFeatureOptionBuf, + cbIn, + pdwResult + ) + ); +} + +// +// Helper function to retrieve the option(s) of a given feature that are +// constrained in driver's current setting. +// +_Use_decl_annotations_ +HRESULT __stdcall CUIHelper::EnumConstrainedOptions( + POEMUIOBJ poemuiobj, + DWORD dwFlags, + PCSTR pszFeatureKeyword, + PSTR pmszConstrainedOptionList, + DWORD cbSize, + PDWORD pcbNeeded) +{ + CALL_HELPER2(EnumConstrainedOptions, + (poemuiobj, + dwFlags, + pszFeatureKeyword, + pmszConstrainedOptionList, + cbSize, + pcbNeeded + ) + ); +} + +// +// Helper function to retrieve a list of feature/option keyword pairs from +// driver's current setting that conflict with the given feature/option pair. +// +_Use_decl_annotations_ +HRESULT __stdcall CUIHelper::WhyConstrained( + POEMUIOBJ poemuiobj, + DWORD dwFlags, + PCSTR pszFeatureKeyword, + PCSTR pszOptionKeyword, + PSTR pmszReasonList, + DWORD cbSize, + PDWORD pcbNeeded) +{ + CALL_HELPER2(WhyConstrained, + (poemuiobj, + dwFlags, + pszFeatureKeyword, + pszOptionKeyword, + pmszReasonList, + cbSize, + pcbNeeded + ) + ); +} + +// +// Following five helper functions are supported for any UI plugins. +// +// Helper function to retrieve global attribute. +// +_Use_decl_annotations_ +HRESULT __stdcall CUIHelper::GetGlobalAttribute( + POEMUIOBJ poemuiobj, + DWORD dwFlags, + PCSTR pszAttribute, + PDWORD pdwDataType, + PBYTE pbData, + DWORD cbSize, + PDWORD pcbNeeded) +{ + CALL_HELPER2(GetGlobalAttribute, + (poemuiobj, + dwFlags, + pszAttribute, + pdwDataType, + pbData, + cbSize, + pcbNeeded + ) + ); +} + + +// +// Helper function to retrieve attribute of a given feature. +// +_Use_decl_annotations_ +HRESULT __stdcall CUIHelper::GetFeatureAttribute( + POEMUIOBJ poemuiobj, + DWORD dwFlags, + PCSTR pszFeatureKeyword, + PCSTR pszAttribute, + PDWORD pdwDataType, + PBYTE pbData, + DWORD cbSize, + PDWORD pcbNeeded) +{ + CALL_HELPER2(GetFeatureAttribute, + (poemuiobj, + dwFlags, + pszFeatureKeyword, + pszAttribute, + pdwDataType, + pbData, + cbSize, + pcbNeeded + ) + ); +} + +// +// Helper function to retrieve attribute of a given feature/option selection. +// +_Use_decl_annotations_ +HRESULT __stdcall CUIHelper::GetOptionAttribute( + POEMUIOBJ poemuiobj, + DWORD dwFlags, + PCSTR pszFeatureKeyword, + PCSTR pszOptionKeyword, + PCSTR pszAttribute, + PDWORD pdwDataType, + PBYTE pbData, + DWORD cbSize, + PDWORD pcbNeeded) +{ + CALL_HELPER2(GetOptionAttribute, + (poemuiobj, + dwFlags, + pszFeatureKeyword, + pszOptionKeyword, + pszAttribute, + pdwDataType, + pbData, + cbSize, + pcbNeeded + ) + ); +} + +// +// Helper function to retrieve the list of feature keyword. +// +_Use_decl_annotations_ +HRESULT __stdcall CUIHelper::EnumFeatures( + POEMUIOBJ poemuiobj, + DWORD dwFlags, + PSTR pmszFeatureList, + DWORD cbSize, + PDWORD pcbNeeded) +{ + CALL_HELPER2(EnumFeatures, + (poemuiobj, + dwFlags, + pmszFeatureList, + cbSize, + pcbNeeded + ) + ); +} + +// +// Helper function to retrieve the list of options keyword of a given feature. +// +_Use_decl_annotations_ +HRESULT __stdcall CUIHelper::EnumOptions( + POEMUIOBJ poemuiobj, + DWORD dwFlags, + PCSTR pszFeatureKeyword, + PSTR pmszOptionList, + DWORD cbSize, + PDWORD pcbNeeded) +{ + CALL_HELPER2(EnumOptions, + (poemuiobj, + dwFlags, + pszFeatureKeyword, + pmszOptionList, + cbSize, + pcbNeeded + ) + ); +} + +// +// Helper function to query system simulation support +// +_Use_decl_annotations_ +HRESULT __stdcall CUIHelper::QuerySimulationSupport( + HANDLE hPrinter, + DWORD dwLevel, + PBYTE pCaps, + DWORD cbSize, + PDWORD pcbNeeded) +{ + CALL_HELPER2(QuerySimulationSupport, + (hPrinter, + dwLevel, + pCaps, + cbSize, + pcbNeeded + ) + ); +} + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/Helper.h b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/Helper.h new file mode 100644 index 00000000..31819dcc --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/Helper.h @@ -0,0 +1,214 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 2001 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Helper.h +// +#pragma once + +class CUIHelper +{ + private: + IUnknown *m_pUIHelper; // pointer to Driver UI's Helper interface + IID m_iidUIHelper; // Driver UI's Helper interface IID + + public: + CUIHelper(); + CUIHelper(const IID &HelperIID, PVOID pHelper); + virtual ~CUIHelper(); + + inline BOOL IsValid() {return NULL != m_pUIHelper;} + + void Assign(const IID &HelperIID, PVOID pHelper); + ULONG Release(); + + // + // IPrintOemDriverUI methods + // + + // + // Helper function to get driver settings. This function is only supported + // for UI plugins that do not fully replace core driver's standard UI. + // + + STDMETHOD(DrvGetDriverSetting) (THIS_ + PVOID pci, + PCSTR Feature, + PVOID pOutput, + DWORD cbSize, + PDWORD pcbNeeded, + PDWORD pdwOptionsReturned + ); + + // + // Helper function to allow OEM plugins upgrade private registry + // settings. This function is supported for any UI plugins and should be + // called only by OEM's UpgradePrinter. + // + + STDMETHOD(DrvUpgradeRegistrySetting) (THIS_ + HANDLE hPrinter, + PCSTR pFeature, + PCSTR pOption + ); + + // + // Helper function to allow OEM plugins to update the driver UI settings. + // This function is only supported for UI plugins that do not fully replace + // core driver's standard UI. It should be called only when the UI is present. + // + + STDMETHOD(DrvUpdateUISetting) (THIS_ + PVOID pci, + PVOID pOptItem, + DWORD dwPreviousSelection, + DWORD dwMode + ); + + // + // IPrintCoreUI2 new methods + // + + // + // Following four helper functions are only supported for UI plugins that fully + // replace core driver's standard UI. They should only be called by the UI plugin's + // DocumentPropertySheets, DevicePropertySheets and their property sheet callback + // functions. + // + // Helper function to retrieve driver's current setting as a list of + // feature/option keyword pairs. + // + + STDMETHOD(GetOptions) (THIS_ + POEMUIOBJ poemuiobj, + _Reserved_ DWORD dwFlags, + _In_reads_bytes_opt_(cbIn) PCSTR pmszFeaturesRequested, + DWORD cbIn, + _Out_writes_bytes_to_opt_(cbSize, *pcbNeeded) PSTR pmszFeatureOptionBuf, + DWORD cbSize, + _Out_ _On_failure_(_When_(return == E_OUTOFMEMORY, _Post_valid_)) PDWORD pcbNeeded); + + // + // Helper function to change driver's setting using a list of feature/option + // keyword pairs. + // + + STDMETHOD(SetOptions) (THIS_ + POEMUIOBJ poemuiobj, + DWORD dwFlags, + _In_reads_bytes_(cbIn) PCSTR pmszFeatureOptionBuf, + DWORD cbIn, + _Out_ PDWORD pdwResult); + + // + // Helper function to retrieve the option(s) of a given feature that are + // constrained in driver's current setting. + // + + STDMETHOD(EnumConstrainedOptions) (THIS_ + _In_ POEMUIOBJ poemuiobj, + _Reserved_ DWORD dwFlags, + _In_ PCSTR pszFeatureKeyword, + _Out_writes_bytes_to_opt_(cbSize, *pcbNeeded) PSTR pmszConstrainedOptionList, + DWORD cbSize, + _Out_ _On_failure_(_When_(return == E_OUTOFMEMORY, _Post_valid_)) PDWORD pcbNeeded); + + + // + // Helper function to retrieve a list of feature/option keyword pairs from + // driver's current setting that conflict with the given feature/option pair. + // + + STDMETHOD(WhyConstrained) (THIS_ + POEMUIOBJ poemuiobj, + _Reserved_ DWORD dwFlags, + _In_ PCSTR pszFeatureKeyword, + _In_ PCSTR pszOptionKeyword, + _Out_writes_bytes_to_opt_(cbSize, *pcbNeeded) PSTR pmszReasonList, + DWORD cbSize, + _Out_ _On_failure_(_When_(return == E_OUTOFMEMORY, _Post_valid_)) PDWORD pcbNeeded); + + // + // Following five helper functions are supported for any UI plugins. + // + // Helper function to retrieve global attribute. + // + + STDMETHOD(GetGlobalAttribute) (THIS_ + POEMUIOBJ poemuiobj, + _Reserved_ DWORD dwFlags, + _In_opt_ PCSTR pszAttribute, + _Out_ PDWORD pdwDataType, + _Out_writes_bytes_to_opt_(cbSize, *pcbNeeded) PBYTE pbData, + DWORD cbSize, + _Out_ _On_failure_(_When_(return == E_OUTOFMEMORY, _Post_valid_)) PDWORD pcbNeeded); + + // + // Helper function to retrieve attribute of a given feature. + // + + STDMETHOD(GetFeatureAttribute) (THIS_ + POEMUIOBJ poemuiobj, + _Reserved_ DWORD dwFlags, + _In_ PCSTR pszFeatureKeyword, + _In_opt_ PCSTR pszAttribute, + _Out_ PDWORD pdwDataType, + _Out_writes_bytes_to_opt_(cbSize, *pcbNeeded) PBYTE pbData, + DWORD cbSize, + _Out_ _On_failure_(_When_(return == E_OUTOFMEMORY, _Post_valid_)) PDWORD pcbNeeded); + + // + // Helper function to retrieve attribute of a given feature/option selection. + // + + STDMETHOD(GetOptionAttribute) (THIS_ + POEMUIOBJ poemuiobj, + _Reserved_ DWORD dwFlags, + _In_ PCSTR pszFeatureKeyword, + _In_ PCSTR pszOptionKeyword, + _In_opt_ PCSTR pszAttribute, + _Out_ PDWORD pdwDataType, + _Out_writes_bytes_to_opt_(cbSize, *pcbNeeded) PBYTE pbData, + DWORD cbSize, + _Out_ _On_failure_(_When_(return == E_OUTOFMEMORY, _Post_valid_)) PDWORD pcbNeeded); + + // + // Helper function to retrieve the list of feature keyword. + // + + STDMETHOD(EnumFeatures) (THIS_ + POEMUIOBJ poemuiobj, + _Reserved_ DWORD dwFlags, + _Out_writes_bytes_to_opt_(cbSize, *pcbNeeded) PSTR pmszFeatureList, + DWORD cbSize, + _Out_ _On_failure_(_When_(return == E_OUTOFMEMORY, _Post_valid_)) PDWORD pcbNeeded); + + // + // Helper function to retrieve the list of options keyword of a given feature. + // + + STDMETHOD(EnumOptions) (THIS_ + POEMUIOBJ poemuiobj, + _Reserved_ DWORD dwFlags, + _In_ PCSTR pszFeatureKeyword, + _Out_writes_bytes_to_opt_(cbSize, *pcbNeeded) PSTR pmszOptionList, + DWORD cbSize, + _Out_ _On_failure_(_When_(return == E_OUTOFMEMORY, _Post_valid_)) PDWORD pcbNeeded); + + // + // Helper function to query system simulation support + // + + STDMETHOD(QuerySimulationSupport) (THIS_ + HANDLE hPrinter, + DWORD dwLevel, + _Out_writes_bytes_to_opt_(cbSize, *pcbNeeded) PBYTE pCaps, + DWORD cbSize, + _Out_ _On_failure_(_When_(return == E_OUTOFMEMORY, _Post_valid_)) PDWORD pcbNeeded); + + private: + void Clear(); +}; diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/OEMUI.rc b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/OEMUI.rc new file mode 100644 index 00000000..d68603e1 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/OEMUI.rc @@ -0,0 +1,260 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "Written by Windows Printing & Imaging Team" + VALUE "CompanyName", "Microsoft Corp." + VALUE "FileDescription", "PS UI Replacement Sample" + VALUE "FileVersion", "1, 0, 0, 1" + VALUE "InternalName", "PSUIREP" + VALUE "LegalCopyright", "Copyright � 1998 - 2003 Microsoft Corp." + VALUE "LegalTrademarks", "Microsoft� is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation" + VALUE "OriginalFilename", "PSUIREP.dll" + VALUE "ProductName", "Microsoft PS UI Replacement Sample" + VALUE "ProductVersion", "1.1" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_DEVICE_PROPPAGE DIALOG 0, 0, 179, 113 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Device Property Page" +FONT 8, "MS Shell Dialog" +BEGIN + LTEXT "OEM UI Added Page",IDC_STATIC,55,14,68,11 + PUSHBUTTON "Calibrate",IDC_CALIBRATE,61,34,50,14 +END + +IDD_DOC_PROPPAGE DIALOG 0, 0, 210, 154 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Document Property Page" +FONT 8, "MS Shell Dialog" +BEGIN + LTEXT "OEM UI Document Property Page",IDC_STATIC,60,73,108,8 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_DEVICE_PROPPAGE, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 172 + TOPMARGIN, 8 + BOTTOMMARGIN, 106 + END + + IDD_DOC_PROPPAGE, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 203 + TOPMARGIN, 7 + BOTTOMMARGIN, 147 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDS_SECTION "OEM UI Added Item" + IDS_CALIBRATED "Printer has been calibrated." + IDS_NAME "OEM UI Customization DLL" + IDS_DEVICE_SETTINGS_NAME "Device Settings" + IDS_CONSTRAINT_CONFLICT "Ther are one or more conflicting settings.\r\nOne of the conflicting is:\r\n\t%1: %2\r\n\t%3: %4\r\n\r\nDo you want driver to automatically resolve conflict?" + IDS_DEV_SECTION "Device Settings OEM UI Added Item" + IDS_ADV_SECTION "Advanced OEM UI Added Item" +END + +STRINGTABLE +BEGIN + IDS_POSTSCRIPT_VM "Available PostScript Memory" + IDS_KBYTES "KB" + IDS_SECONDS "seconds" + IDS_PSTIMEOUTS "PostScript Timeout Values" + IDS_JOBTIMEOUT "Job Timeout" + IDS_WAITTIMEOUT "Wait Timeout" + IDS_PRINTER_DEFAULT "Use Current Setting in the Printer" + IDS_INSTALLABLE_OPTIONS "Installable Options" + IDS_DOWNLOAD_AS_SOFTFONT "<Don't Substitute>" + IDS_USE_DEVFONTS "Use Device Fonts?" + IDS_FONTSUB_OPTION "Font Substitution" + IDS_FONTSUB_DEFAULT "Normal" + IDS_FONTSUB_SLOW "Slow but more accurate" + IDS_FONTSUB_TABLE "Font Substitution Table" + IDS_DEFAULT_TRAY " / Default tray" + IDS_DRAW_ONLY_FROM_SELECTED "Draw selected form only from this tray" +END + +STRINGTABLE +BEGIN + IDS_RESTORE_DEFAULTS "&Restore Defaults" + IDS_PRINTER_FEATURES "Printer Features" + IDS_METAFILE_SPOOLING "Advanced Printing Features" + IDS_ENABLED "&Enabled" + IDS_DISABLED "&Disabled" + IDS_PSOPTIONS "PostScript Options" + IDS_MIRROR "Mirrored Output" + IDS_NEGATIVE_PRINT "Negative Output" + IDS_PAGEINDEP "Page Independence" + IDS_COMPRESSBMP "Compress bitmaps" + IDS_CTRLD_BEFORE "Send CTRL-D Before Each Job" + IDS_CTRLD_AFTER "Send CTRL-D After Each Job" + IDS_JOB_CONTROL "Generate Job Control Code" + IDS_TEXT_ASGRX "Print Optimizations" +END + +STRINGTABLE +BEGIN + IDS_TRUE_GRAY_TEXT "Convert Gray Text to PostScript Gray" + IDS_TRUE_GRAY_GRAPH "Convert Gray Graphics to PostScript Gray" + IDS_ADD_EURO "Add Euro Currency Symbol to PostScript Fonts" +END + +STRINGTABLE +BEGIN + IDS_PAGE_PROTECTION "Page Protection" + IDS_CANCEL_CONFLICT "Restore my previous settings" + IDS_IGNORE_CONFLICT "Keep this setting, and I will change it later" + IDS_RESOLVE_CONFLICT "Resolve this conflict for me automatically" + IDS_DRIVERUI_COLORMODE "Color Mode Option" + IDS_ENVELOPE "Envelope" + IDS_ENV_PREFIX "Env" + IDS_PSPROTOCOL "Output Protocol" + IDS_PSPROTOCOL_ASCII "ASCII" + IDS_PSPROTOCOL_BCP "BCP" + IDS_PSPROTOCOL_TBCP "TBCP" + IDS_PSPROTOCOL_BINARY "Binary" + IDS_TRAY_FORMSOURCE "Automatically Select" + IDS_OEMERR_DLGTITLE "OEM Customization Module Failed" + IDS_OEMERR_OPTITEM "Couldn't add custom items from OEM customization module '%s'.\n\nPlease contact its vendor for support." +END + +STRINGTABLE +BEGIN + IDS_OEMERR_PROPSHEET "Couldn't add custom property sheet pages from OEM customization module '%s'.\n\nPlease contact its vendor for support." + IDS_CANCEL_CONFLICT_FINAL "I will resolve the conflict for myself" + IDS_PSERROR_HANDLER "Send PostScript Error Handler" + IDS_PSMINOUTLINE "Minimum Font Size to Download as Outline" + IDS_PSMAXBITMAP "Maximum Font Size to Download as Bitmap" + IDS_PIXELS "pixel(s)" + IDS_PSOUTPUT_OPTION "PostScript Output Option" + IDS_PSOPT_SPEED "Optimize for Speed" + IDS_PSOPT_PORTABILITY "Optimize for Portability" + IDS_PSOPT_EPS "Encapsulated PostScript (EPS)" + IDS_PSOPT_ARCHIVE "Archive Format" + IDS_PSTT_DLFORMAT "TrueType Font Download Option" + IDS_TTDL_DEFAULT "Automatic" + IDS_TTDL_TYPE1 "Outline" + IDS_TTDL_TYPE3 "Bitmap" + IDS_TTDL_TYPE42 "Native TrueType" +END + +STRINGTABLE +BEGIN + IDS_PSLEVEL "PostScript Language Level" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/PSUIREP.vcxproj b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/PSUIREP.vcxproj new file mode 100644 index 00000000..a8816083 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/PSUIREP.vcxproj @@ -0,0 +1,1066 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Win10 Debug|ARM64"> + <Configuration>Win10 Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|Win32"> + <Configuration>Win10 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|x64"> + <Configuration>Win10 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|ARM64"> + <Configuration>Win10 Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|Win32"> + <Configuration>Win10 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|x64"> + <Configuration>Win10 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|Win32"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|Win32"> + <Configuration>Win8 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|Win32"> + <Configuration>Win7 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|Win32"> + <Configuration>Win8.1 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|Win32"> + <Configuration>Win8 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|Win32"> + <Configuration>Win7 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|x64"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|x64"> + <Configuration>Win8 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|x64"> + <Configuration>Win7 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|x64"> + <Configuration>Win8.1 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|x64"> + <Configuration>Win8 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|x64"> + <Configuration>Win7 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{5D63CD51-110C-41B7-B8B0-6AB27398690B}</ProjectGuid> + <RootNamespace>$(MSBuildProjectName)</RootNamespace> + <Configuration Condition="'$(Configuration)' == ''">Win10 Debug</Configuration> + <Platform Condition="'$(Platform)' == ''">Win32</Platform> + <SampleGuid>{50E3486C-DFB5-4447-A055-55B51DE6A08C}</SampleGuid> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <PropertyGroup> + <OutDir>$(IntDir)</OutDir> + </PropertyGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ItemGroup Label="WrappedTaskItems" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetName>PSUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetName>PSUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetName>PSUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <TargetName>PSUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <TargetName>PSUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetName>PSUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetName>PSUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetName>PSUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <TargetName>PSUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <TargetName>PSUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetName>PSUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetName>PSUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetName>PSUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <TargetName>PSUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetName>PSUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetName>PSUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetName>PSUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <TargetName>PSUIREP</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Link> + <ModuleDefinitionFile>PSUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Link> + <ModuleDefinitionFile>PSUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Link> + <ModuleDefinitionFile>PSUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <Link> + <ModuleDefinitionFile>PSUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <Link> + <ModuleDefinitionFile>PSUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Link> + <ModuleDefinitionFile>PSUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Link> + <ModuleDefinitionFile>PSUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Link> + <ModuleDefinitionFile>PSUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <Link> + <ModuleDefinitionFile>PSUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <Link> + <ModuleDefinitionFile>PSUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Link> + <ModuleDefinitionFile>PSUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Link> + <ModuleDefinitionFile>PSUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Link> + <ModuleDefinitionFile>PSUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <Link> + <ModuleDefinitionFile>PSUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>PSUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>PSUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>PSUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>PSUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="debug.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="devmode.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="dllentry.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="features.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="globals.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="helper.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="OEMUI.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Create</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="stringutils.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ResourceCompile Include="OEMUI.rc" /> + </ItemGroup> + <ItemGroup> + <Inf Exclude="@(Inf)" Include="*.inf" /> + <FilesToPackage Include="$(TargetPath)" Condition="'$(ConfigurationType)'=='Driver' or '$(ConfigurationType)'=='DynamicLibrary'" /> + </ItemGroup> + <ItemGroup> + <None Exclude="@(None)" Include="*.txt;*.htm;*.html" /> + <None Exclude="@(None)" Include="*.ico;*.cur;*.bmp;*.dlg;*.rct;*.gif;*.jpg;*.jpeg;*.wav;*.jpe;*.tiff;*.tif;*.png;*.rc2" /> + <None Exclude="@(None)" Include="*.def;*.bat;*.hpj;*.asmx" /> + </ItemGroup> + <ItemGroup> + <ClInclude Exclude="@(ClInclude)" Include="*.h;*.hpp;*.hxx;*.hm;*.inl;*.xsd" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/PSUIREP.vcxproj.Filters b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/PSUIREP.vcxproj.Filters new file mode 100644 index 00000000..a7adcd57 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/PSUIREP.vcxproj.Filters @@ -0,0 +1,397 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;*</Extensions> + <UniqueIdentifier>{34758E7D-B1F9-45D1-BF4C-84952A011FD8}</UniqueIdentifier> + </Filter> + <Filter Include="Header Files"> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + <UniqueIdentifier>{5FBB97F9-5E07-46FA-9D57-352EF01D247C}</UniqueIdentifier> + </Filter> + <Filter Include="Resource Files"> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms;man;xml</Extensions> + <UniqueIdentifier>{B3D9DA9C-3DC0-474A-8E98-121243DA58B3}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClCompile Include="debug.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="devmode.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="dllentry.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="features.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="globals.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="helper.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="OEMUI.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="stringutils.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="Helper.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="StringUtils.h" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="OEMUI.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> + <ItemGroup> + <None Include="psuirep.def"> + <Filter>Source Files</Filter> + </None> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/StringUtils.cpp b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/StringUtils.cpp new file mode 100644 index 00000000..01690f07 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/StringUtils.cpp @@ -0,0 +1,315 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 2001 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: StringUtils.cpp +// +// PURPOSE: Implementation wrapper class for WinXP PS Driver Features and Options. +// + + +#include "precomp.h" +#include "debug.h" +#include "devmode.h" +#include "globals.h" +#include "helper.h" +#include "features.h" +#include "oemui.h" +#include "stringutils.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +// Create a list of pointers to the strings +// in a multi-sz. +_Use_decl_annotations_ +HRESULT MakeStrPtrList(HANDLE hHeap, PCSTR pmszMultiSz, PCSTR **pppszList, PWORD pwCount) +{ + PCSTR *ppszList = NULL; + HRESULT hrResult = S_OK; + + + // Validate parameters + if( (NULL == hHeap) + || + (NULL == pmszMultiSz) + || + (NULL == pppszList) + || + (NULL == pwCount) + ) + { + return E_INVALIDARG; + } + + // Get the count of strings in the multi-sz. + *pwCount = mstrcount(pmszMultiSz); + if(0 == *pwCount) + { + WARNING(DLLTEXT("MakeStrPtrList() pmszMultiSz contains no strings.\r\n")); + + *pppszList = NULL; + + goto Exit; + } + + // Allocate pointer list. + *pppszList = (PCSTR *) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, (*pwCount) * sizeof(PCSTR)); + if(NULL == *pppszList) + { + ERR(ERRORTEXT("MakeStrPtrList() failed to allote array of PCSTR.\r\n")); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + ppszList = *pppszList; + + // Walk multi-sz mapping string pointers. + for(WORD wIndex = 0; wIndex < *pwCount; ++wIndex) + { + ppszList[wIndex] = pmszMultiSz; + pmszMultiSz += strlen(pmszMultiSz) + 1; + } + + +Exit: + + return hrResult; +} + + +// Determine how many strings are in the multi-sz. +WORD mstrcount(PCSTR pmszMultiSz) +{ + WORD wCount = 0; + + + // NULL string pointers have no strings. + if(NULL == pmszMultiSz) + { + return 0; + } + + // Walk list of strings counting them. + while(pmszMultiSz[0] != '\0') + { + ++wCount; + pmszMultiSz += strlen(pmszMultiSz) + 1; + } + + return wCount; +} + +// Allocates and converts ANSI string to Unicode. +PWSTR MakeUnicodeString(HANDLE hHeap, PCSTR pszAnsi) +{ + int nSize = 0; + PWSTR pszUnicode = NULL; + + + // Validate parameters + if( (NULL == hHeap) + || + (NULL == pszAnsi) + ) + { + return NULL; + } + + // Get the size needed for UNICODE string. + nSize = MultiByteToWideChar(CP_ACP, 0, pszAnsi, -1, NULL, 0); + if(0 != nSize) + { + // Allocate unicode string. + pszUnicode = (PWSTR) HeapAlloc(hHeap, 0, nSize * sizeof(WCHAR)); + if(NULL != pszUnicode) + { + // Convert ANSI to Unicode + nSize = MultiByteToWideChar(CP_ACP, 0, pszAnsi, -1, pszUnicode, nSize); + if(0 == nSize) + { + // INVARIANT: failed to convert. + + // free buffer and return NULL. + HeapFree(hHeap, 0, pszUnicode); + pszUnicode = NULL; + } + } + } + + return pszUnicode; +} + +// Allocates and copies source string. +PWSTR MakeStringCopy(HANDLE hHeap, PCWSTR pszSource) +{ + PWSTR pszCopy = NULL; + DWORD dwSize; + + + // Validate parameters + if( (NULL == hHeap) + || + (NULL == pszSource) + ) + { + return NULL; + } + + // Allocate memory for string duplication, and duplicate the string. + dwSize = (DWORD)(wcslen(pszSource) + 1) * sizeof(WCHAR); + pszCopy = (PWSTR) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwSize); + if(NULL != pszCopy) + { + HRESULT hResult; + + + hResult = StringCbCopyW(pszCopy, dwSize, pszSource); + if(FAILED(hResult)) + { + HeapFree(hHeap, 0, pszCopy); + pszCopy = NULL; + SetLastError(hResult); + } + } + + return pszCopy; +} + +// Allocates and copies source string. +PSTR MakeStringCopy(HANDLE hHeap, PCSTR pszSource) +{ + PSTR pszCopy = NULL; + size_t dwSize; + + + // Validate parameters + if( (NULL == hHeap) + || + (NULL == pszSource) + ) + { + return NULL; + } + + // Allocate memory for string duplication, and duplicate the string. + dwSize = (strlen(pszSource) + 1) * sizeof(CHAR); + pszCopy = (PSTR) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwSize); + if(NULL != pszCopy) + { + HRESULT hResult; + + hResult = StringCbCopyA(pszCopy, dwSize, pszSource); + if(FAILED(hResult)) + { + HeapFree(hHeap, 0, pszCopy); + pszCopy = NULL; + SetLastError(hResult); + } + } + + return pszCopy; +} + +// Frees list of strings. +// NOTE: don't use this for string list made with MakeStrPtrList(), since +// the strings pointed to be list made with MakeStrPtrList() will +// be freed when the multi-sz is freed. +void FreeStringList(HANDLE hHeap, _In_reads_(wCount) PWSTR *ppszList, WORD wCount) +{ + // Validate parameters. + if( (NULL == hHeap) + || + (NULL == ppszList) + ) + { + return; + } + + // Free each of the strings in the list. + for(WORD wIndex = 0; wIndex < wCount; ++wIndex) + { + if(NULL != ppszList[wIndex]) HeapFree(hHeap, 0, ppszList[wIndex]); + } + + // Free list. + HeapFree(hHeap, 0, ppszList); +} + + +// Retrieves pointer to a String resource. +HRESULT GetStringResource(HANDLE hHeap, HMODULE hModule, UINT uResource, _Outptr_result_maybenull_ PWSTR *ppszString) +{ + int nResult; + DWORD dwSize = MAX_PATH; + PWSTR pszString = NULL; + HRESULT hrResult = S_OK; + + + VERBOSE(DLLTEXT("GetStringResource(%#x, %#x, %d) entered.\r\n"), hHeap, hModule, uResource); + + // Validate parameters. + if( (NULL == hHeap) + || + (NULL == ppszString) + ) + { + return E_INVALIDARG; + } + + // Allocate buffer for string resource from heap; let the driver clean it up. + pszString = (PWSTR) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwSize * sizeof(WCHAR)); + if(NULL == pszString) + { + ERR(ERRORTEXT("GetStringResource() failed to allocate string buffer!\r\n")); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + // Load string resource; resize after loading so as not to waste memory. + nResult = LoadString(hModule, uResource, pszString, dwSize); + if(nResult > 0) + { + PWSTR pszTemp; + + + VERBOSE(DLLTEXT("LoadString() returned %d!\r\n"), nResult); + VERBOSE(DLLTEXT("String load was \"%s\".\r\n"), pszString); + + pszTemp = (PWSTR) HeapReAlloc(hHeap, HEAP_ZERO_MEMORY, pszString, (nResult + 1) * sizeof(WCHAR)); + if(NULL != pszTemp) + { + pszString = pszTemp; + } + else + { + WARNING(DLLTEXT("GetStringResource() HeapReAlloc() of string retrieved failed! (Last Error was %d)\r\n"), GetLastError()); + } + } + else + { + DWORD dwError = GetLastError(); + + + ERR(ERRORTEXT("LoadString() returned %d! (Last Error was %d)\r\n"), nResult, GetLastError()); + ERR(ERRORTEXT("GetStringResource() failed to load string resource %d!\r\n"), uResource); + + HeapFree(hHeap, 0, pszString); + pszString = NULL; + hrResult = HRESULT_FROM_WIN32(dwError); + } + + +Exit: + + // Save string pointer to caller. + // NOTE: string pointer will be NULL on failure. + *ppszString = pszString; + + return hrResult; +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/StringUtils.h b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/StringUtils.h new file mode 100644 index 00000000..35de69f2 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/StringUtils.h @@ -0,0 +1,23 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 2001 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: StringUtils.h +// +// PURPOSE: Header file for string utility routines. +// +#pragma once + +//////////////////////////////////////////////////////// +// Prototypes +//////////////////////////////////////////////////////// +_Success_(return >= 0 && *pwCount > 0) HRESULT MakeStrPtrList(HANDLE hHeap, PCSTR pmszMultiSz, _Outptr_result_buffer_(*pwCount) PCSTR **pppszList, _Out_ PWORD pwCount); +WORD mstrcount(PCSTR pmszMultiSz); +PWSTR MakeUnicodeString(HANDLE hHeap, PCSTR pszAnsi); +PWSTR MakeStringCopy(HANDLE hHeap, PCWSTR pszSource); +PSTR MakeStringCopy(HANDLE hHeap, PCSTR pszSource); +void FreeStringList(HANDLE hHeap, _In_reads_(wCount) PWSTR *ppszList, WORD wCount); +HRESULT GetStringResource(HANDLE hHeap, HMODULE hModule, UINT uResource, _Outptr_result_maybenull_ PWSTR *ppszString); diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/debug.cpp b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/debug.cpp new file mode 100644 index 00000000..f7a3d842 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/debug.cpp @@ -0,0 +1,405 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1996 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Debug.cpp +// +// PURPOSE: Debug functions. +// +// + +#include "precomp.h" +#include "debug.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +//////////////////////////////////////////////////////// +// INTERNAL DEFINES +//////////////////////////////////////////////////////// + +#define DEBUG_BUFFER_SIZE 1024 +#define PATH_SEPARATOR '\\' +#define MAX_LOOP 10 + +// Determine what level of debugging messages to eject. +#ifdef VERBOSE_MSG + #define DEBUG_LEVEL DBG_VERBOSE +#elif TERSE_MSG + #define DEBUG_LEVEL DBG_TERSE +#elif WARNING_MSG + #define DEBUG_LEVEL DBG_WARNING +#elif ERROR_MSG + #define DEBUG_LEVEL DBG_ERROR +#elif RIP_MSG + #define DEBUG_LEVEL DBG_RIP +#elif NO_DBG_MSG + #define DEBUG_LEVEL DBG_NONE +#else + #define DEBUG_LEVEL DBG_WARNING +#endif + + + +//////////////////////////////////////////////////////// +// EXTERNAL GLOBALS +//////////////////////////////////////////////////////// + +INT giDebugLevel = DEBUG_LEVEL; + + + + +//////////////////////////////////////////////////////// +// INTERNAL PROTOTYPES +//////////////////////////////////////////////////////// + +static BOOL DebugMessageV(LPCSTR lpszMessage, va_list arglist); +static BOOL DebugMessageV(DWORD dwSize, LPCWSTR lpszMessage, va_list arglist); + + + + +////////////////////////////////////////////////////////////////////////// +// Function: DebugMessageV +// +// Description: Outputs variable argument debug string. +// +// +// Parameters: +// +// dwSize Size of temp buffer to hold formated string. +// +// lpszMessage Format string. +// +// arglist Variable argument list.. +// +// +// Returns: +// +// +// Comments: +// +// +////////////////////////////////////////////////////////////////////////// + +static BOOL DebugMessageV(LPCSTR lpszMessage, va_list arglist) +{ + DWORD dwSize = DEBUG_BUFFER_SIZE; + DWORD dwLoop = 0; + LPSTR lpszMsgBuf = NULL; + HRESULT hr; + + + // Parameter checking. + if( (NULL == lpszMessage) + || + (0 == dwSize) + ) + { + return FALSE; + } + + do + { + // Allocate memory for message buffer. + if(NULL != lpszMsgBuf) + { + delete[] lpszMsgBuf; + dwSize *= 2; + } + lpszMsgBuf = new CHAR[dwSize + 1]; + if(NULL == lpszMsgBuf) + { + return FALSE; + } + + hr = StringCbVPrintfA(lpszMsgBuf, (dwSize + 1) * sizeof(CHAR), lpszMessage, arglist); + + // Pass the variable parameters to wvsprintf to be formated. + } while (FAILED(hr) && (STRSAFE_E_INSUFFICIENT_BUFFER == hr) && (++dwLoop < MAX_LOOP) ); + + // Dump string to Debug output. + OutputDebugStringA(lpszMsgBuf); + + // Cleanup. + delete[] lpszMsgBuf; + + return SUCCEEDED(hr); +} + + +////////////////////////////////////////////////////////////////////////// +// Function: DebugMessageV +// +// Description: Outputs variable argument debug string. +// +// +// Parameters: +// +// dwSize Size of temp buffer to hold formated string. +// +// lpszMessage Format string. +// +// arglist Variable argument list.. +// +// +// Returns: +// +// +// Comments: +// +// +////////////////////////////////////////////////////////////////////////// + +static BOOL DebugMessageV(DWORD dwSize, LPCWSTR lpszMessage, va_list arglist) +{ + LPWSTR lpszMsgBuf; + HRESULT hResult; + + + // Parameter checking. + if( (NULL == lpszMessage) + || + (0 == dwSize) + ) + { + return FALSE; + } + + // Allocate memory for message buffer. + lpszMsgBuf = new WCHAR[dwSize + 1]; + if(NULL == lpszMsgBuf) + return FALSE; + + // Pass the variable parameters to wvsprintf to be formated. + hResult = StringCbVPrintfW(lpszMsgBuf, (dwSize + 1) * sizeof(WCHAR), lpszMessage, arglist); + + // Dump string to debug output. + OutputDebugStringW(lpszMsgBuf); + + // Clean up. + delete[] lpszMsgBuf; + + return SUCCEEDED(hResult); +} + + +////////////////////////////////////////////////////////////////////////// +// Function: DebugMessage +// +// Description: Outputs variable argument debug string. +// +// +// Parameters: +// +// lpszMessage Format string. +// +// +// Returns: +// +// +// Comments: +// +// +////////////////////////////////////////////////////////////////////////// + +BOOL DebugMessage(LPCSTR lpszMessage, ...) +{ + BOOL bResult; + va_list VAList; + + + // Pass the variable parameters to DebugMessageV for processing. + va_start(VAList, lpszMessage); + bResult = DebugMessageV(lpszMessage, VAList); + va_end(VAList); + + return bResult; +} + + +////////////////////////////////////////////////////////////////////////// +// Function: DebugMessage +// +// Description: Outputs variable argument debug string. +// +// +// Parameters: +// +// lpszMessage Format string. +// +// +// Returns: +// +// +// Comments: +// +// +////////////////////////////////////////////////////////////////////////// + +BOOL DebugMessage(LPCWSTR lpszMessage, ...) +{ + BOOL bResult; + va_list VAList; + + + // Pass the variable parameters to DebugMessageV to be processed. + va_start(VAList, lpszMessage); + bResult = DebugMessageV(MAX_PATH, lpszMessage, VAList); + va_end(VAList); + + return bResult; +} + +void Dump(PPUBLISHERINFO pPublisherInfo) +{ + VERBOSE(TEXT("pPublisherInfo:\r\n")); + if(NULL == pPublisherInfo) + { + VERBOSE(TEXT("\tpPublisherInfo is NULL!\r\n")); + return; + } + VERBOSE(TEXT("\tdwMode = %#x\r\n"), pPublisherInfo->dwMode); + VERBOSE(TEXT("\twMinoutlinePPEM = %d\r\n"), pPublisherInfo->wMinoutlinePPEM); + VERBOSE(TEXT("\twMaxbitmapPPEM = %d\r\n"), pPublisherInfo->wMaxbitmapPPEM); +} + +void Dump(POEMDMPARAM pOemDMParam) +{ + VERBOSE(TEXT("pOemDMParam:\r\n")); + if(NULL == pOemDMParam) + { + VERBOSE(TEXT("\tpOemDMParam is NULL!\r\n")); + return; + } + VERBOSE(TEXT("\tcbSize = %d\r\n"), pOemDMParam->cbSize); + VERBOSE(TEXT("\tpdriverobj = %#x\r\n"), pOemDMParam->pdriverobj); + VERBOSE(TEXT("\thPrinter = %#x\r\n"), pOemDMParam->hPrinter); + VERBOSE(TEXT("\thModule = %#x\r\n"), pOemDMParam->hModule); + VERBOSE(TEXT("\tpPublicDMIn = %#x\r\n"), pOemDMParam->pPublicDMIn); + VERBOSE(TEXT("\tpPublicDMOut = %#x\r\n"), pOemDMParam->pPublicDMOut); + VERBOSE(TEXT("\tpOEMDMIn = %#x\r\n"), pOemDMParam->pOEMDMIn); + VERBOSE(TEXT("\tpOEMDMOut = %#x\r\n"), pOemDMParam->pOEMDMOut); + VERBOSE(TEXT("\tcbBufSize = %d\r\n"), pOemDMParam->cbBufSize); +} + +void Dump(PPROPSHEETUI_INFO pPSUIInfo) +{ + VERBOSE(TEXT("pPSUIInfo:\r\n")); + if(NULL == pPSUIInfo) + { + VERBOSE(TEXT("\tpPSUIInfo is NULL!\r\n")); + return; + } + VERBOSE(TEXT("\tcbSize = %d\r\n"), pPSUIInfo->cbSize); + VERBOSE(TEXT("\tVersion = %#x\r\n"), pPSUIInfo->Version); + VERBOSE(TEXT("\tFlags = %#x\r\n"), pPSUIInfo->Flags); + VERBOSE(TEXT("\tReason = %d\r\n"), pPSUIInfo->Reason); + VERBOSE(TEXT("\thComPropSheet = %#x\r\n"), pPSUIInfo->hComPropSheet); + VERBOSE(TEXT("\tpfnComPropSheet = %#x\r\n"), pPSUIInfo->pfnComPropSheet); + VERBOSE(TEXT("\tlParamInit = %#x\r\n"), pPSUIInfo->lParamInit); + VERBOSE(TEXT("\tUserData = %#x\r\n"), pPSUIInfo->UserData); + VERBOSE(TEXT("\tResult = %#x\r\n"), pPSUIInfo->Result); +} + +void Dump(POPTITEM pOptItem) +{ + VERBOSE(TEXT("pOptItem:\r\n")); + if(NULL == pOptItem) + { + VERBOSE(TEXT("\tpOptItem is NULL!\r\n")); + return; + } + VERBOSE(TEXT("\tcbSize = %d\r\n"), pOptItem->cbSize); + VERBOSE(TEXT("\tLevel = %d\r\n"), pOptItem->Level); + VERBOSE(TEXT("\tDlgPageIdx = %d\r\n"), pOptItem->DlgPageIdx); + VERBOSE(TEXT("\tFlags = 0x%x\r\n"), pOptItem->Flags); + VERBOSE(TEXT("\tUserData = 0x%p\r\n"), pOptItem->UserData); + VERBOSE(TEXT("\tpName = %s\r\n"), pOptItem->pName ? pOptItem->pName : TEXT("<NULL>")); + VERBOSE(TEXT("\tpSel = 0x%p\r\n"), pOptItem->pSel); + VERBOSE(TEXT("\tpExtChkBox = 0x%p\r\n"), pOptItem->pExtChkBox); + VERBOSE(TEXT("\tpExtChkBox = 0x%p\r\n"), pOptItem->pExtChkBox); + VERBOSE(TEXT("\tHelpIndex = 0x%x\r\n"), pOptItem->HelpIndex); + VERBOSE(TEXT("\tDMPubID = 0x%x\r\n"), pOptItem->DMPubID); + VERBOSE(TEXT("\tUserItemID = 0x%x\r\n"), pOptItem->UserItemID); + VERBOSE(TEXT("\twReserved = 0x%x\r\n"), pOptItem->wReserved); + VERBOSE(TEXT("\tpOIExt = 0x%p\r\n"), pOptItem->pOIExt); + + Dump(pOptItem->pOptType); +} + +void Dump(POPTTYPE pOptType) +{ + VERBOSE(TEXT("\tpOptType:\r\n")); + if(NULL == pOptType) + { + VERBOSE(TEXT("\t\tpOptType is NULL!\r\n")); + return; + } + VERBOSE(TEXT("\t\tcbSize = %d\r\n"), pOptType->cbSize); + VERBOSE(TEXT("\t\tType = 0x%x\r\n"), pOptType->Type); + VERBOSE(TEXT("\t\tFlags = 0x%x\r\n"), pOptType->Flags); + VERBOSE(TEXT("\t\tCount = %d\r\n"), pOptType->Count); + VERBOSE(TEXT("\t\tCount = 0x%x\r\n"), pOptType->BegCtrlID); + VERBOSE(TEXT("\t\tStyle = 0x%x\r\n"), pOptType->Style); + + Dump(pOptType->pOptParam, pOptType->Count); +} + +void Dump(POPTPARAM pOptParam, WORD wCount) +{ + if(NULL == pOptParam) + { + VERBOSE(TEXT("\t\tpOptParam is NULL!\r\n")); + return; + } + + for(WORD wIndex = 0; wIndex < wCount; ++wIndex) + { + VERBOSE(TEXT("\t\tpOptParam[wIndex]:\r\n")); + VERBOSE(TEXT("\t\t\tcbSize = %d\r\n"), pOptParam[wIndex].cbSize); + VERBOSE(TEXT("\t\t\tFlags = 0x%x\r\n"), pOptParam[wIndex].Flags); + VERBOSE(TEXT("\t\t\tStyle = 0x%x\r\n"), pOptParam[wIndex].Style); + VERBOSE(TEXT("\t\t\tpData = 0x%p\r\n"), pOptParam[wIndex].pData); + VERBOSE(TEXT("\t\t\tIconID = 0x%p\r\n"), pOptParam[wIndex].IconID); + VERBOSE(TEXT("\t\t\tlParam = 0x%p\r\n"), pOptParam[wIndex].lParam); + } +} + + +PCSTR +StripDirPrefixA( + IN PCSTR pstrFilename + ) + +/*++ + +Routine Description: + + Strip the directory prefix off a filename (ANSI version) + +Arguments: + + pstrFilename - Pointer to filename string + +Return Value: + + Pointer to the last component of a filename (without directory prefix) + +--*/ + +{ + PCSTR pstr; + + pstr = strrchr(pstrFilename, PATH_SEPARATOR); + if (pstr) + return pstr + 1; + + return pstrFilename; +} + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/debug.h b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/debug.h new file mode 100644 index 00000000..b4d57b0b --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/debug.h @@ -0,0 +1,166 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1996 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Debug.H +// +// +// PURPOSE: Define common data types, and external function prototypes +// for debugging functions. +// +// + +#pragma once + +// VC and Build use different debug defines. +// The following makes it so either will +// cause the inclusion of debugging code. +#if !defined(_DEBUG) && defined(DBG) + #define _DEBUG DBG +#elif defined(_DEBUG) && !defined(DBG) + #define DBG _DEBUG +#endif + + + +///////////////////////////////////////////////////////// +// Macros +///////////////////////////////////////////////////////// + +// +// These macros are used for debugging purposes. They expand +// to white spaces on a free build. Here is a brief description +// of what they do and how they are used: +// +// giDebugLevel +// Global variable which set the current debug level to control +// the amount of debug messages emitted. +// +// VERBOSE(msg) +// Display a message if the current debug level is <= DBG_VERBOSE. +// +// TERSE(msg) +// Display a message if the current debug level is <= DBG_TERSE. +// +// WARNING(msg) +// Display a message if the current debug level is <= DBG_WARNING. +// The message format is: WRN filename (linenumber): message +// +// ERR(msg) +// Similiar to WARNING macro above - displays a message +// if the current debug level is <= DBG_ERROR. +// +// ASSERT(cond) +// Verify a condition is true. If not, force a breakpoint. +// +// ASSERTMSG(cond, msg) +// Verify a condition is true. If not, display a message and +// force a breakpoint. +// +// RIP(msg) +// Display a message and force a breakpoint. +// +// Usage: +// These macros require extra parantheses for the msg argument +// example, ASSERTMSG(x > 0, ("x is less than 0\n")); +// WARNING(("App passed NULL pointer, ignoring...\n")); +// + +#define DBG_VERBOSE 1 +#define DBG_TERSE 2 +#define DBG_WARNING 3 +#define DBG_ERROR 4 +#define DBG_RIP 5 +#define DBG_NONE 6 + +#if DBG + + #define DebugMsg DebugMessage + + // + // Strip the directory prefix from a filename (ANSI version) + // + + PCSTR + StripDirPrefixA( + IN PCSTR pstrFilename + ); + + extern INT giDebugLevel; + + + #define DBGMSG(level, prefix, msg) { \ + if (giDebugLevel <= (level)) { \ + DebugMsg("%s %s (%d): ", prefix, StripDirPrefixA(__FILE__), __LINE__); \ + DebugMsg(msg); \ + } \ + } + + #define DBGPRINT(level, msg) { \ + if (giDebugLevel <= (level)) { \ + DebugMsg(msg); \ + } \ + } + + #define VERBOSE if(giDebugLevel <= DBG_VERBOSE) DebugMsg + #define TERSE if(giDebugLevel <= DBG_TERSE) DebugMsg + #define WARNING if(giDebugLevel <= DBG_WARNING) DebugMsg + #define ERR if(giDebugLevel <= DBG_ERROR) DebugMsg + + #define ASSERT(cond) { \ + if (! (cond)) { \ + RIP(("\n")); \ + } \ + } + + #define ASSERTMSG(cond, msg) { \ + if (! (cond)) { \ + RIP(msg); \ + } \ + } + + #define RIP(msg) { \ + DBGMSG(DBG_RIP, "RIP", msg); \ + DebugBreak(); \ + } + + +#else // !DBG + + #define DebugMsg NOP_FUNCTION + + #define VERBOSE NOP_FUNCTION + #define TERSE NOP_FUNCTION + #define WARNING NOP_FUNCTION + #define ERR NOP_FUNCTION + + #define ASSERT(cond) + + #define ASSERTMSG(cond, msg) + #define RIP(msg) + #define DBGMSG(level, prefix, msg) + #define DBGPRINT(level, msg) + +#endif + + + + +///////////////////////////////////////////////////////// +// ProtoTypes +///////////////////////////////////////////////////////// + +BOOL DebugMessage(LPCSTR, ...); +BOOL DebugMessage(LPCWSTR, ...); +void Dump(PPUBLISHERINFO pPublisherInfo); +void Dump(POEMDMPARAM pOemDMParam); +void Dump(PPROPSHEETUI_INFO pPSUIInfo); +void Dump(POPTITEM pOptItem); +void Dump(POPTTYPE pOptType); +void Dump(POPTPARAM pOptParam, WORD wCount); + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/devmode.cpp b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/devmode.cpp new file mode 100644 index 00000000..43da0361 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/devmode.cpp @@ -0,0 +1,193 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Devmode.cpp +// +// PURPOSE: Implementation of Devmode functions shared with OEM UI and OEM rendering modules. +// + +#include "precomp.h" + +#include "debug.h" +#include "globals.h" +#include "devmode.h" +#include "helper.h" +#include "features.h" +#include "oemui.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +HRESULT hrOEMDevMode(DWORD dwMode, POEMDMPARAM pOemDMParam) +{ + POEMDEV pOEMDevIn; + POEMDEV pOEMDevOut; + + + // Verify parameters. + if( (NULL == pOemDMParam) + || + ( (OEMDM_SIZE != dwMode) + && + (OEMDM_DEFAULT != dwMode) + && + (OEMDM_CONVERT != dwMode) + && + (OEMDM_MERGE != dwMode) + ) + ) + { + ERR(ERRORTEXT("DevMode() ERROR_INVALID_PARAMETER.\r\n")); + VERBOSE(DLLTEXT("\tdwMode = %d, pOemDMParam = %#lx.\r\n"), dwMode, pOemDMParam); + + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Cast generic (i.e. PVOID) to OEM private devomode pointer type. + pOEMDevIn = (POEMDEV) pOemDMParam->pOEMDMIn; + pOEMDevOut = (POEMDEV) pOemDMParam->pOEMDMOut; + + switch(dwMode) + { + case OEMDM_SIZE: + pOemDMParam->cbBufSize = sizeof(OEMDEV); + break; + + case OEMDM_DEFAULT: + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + pOEMDevOut->dwDriverData = 0; + pOEMDevOut->dwAdvancedData = 0; + VERBOSE(DLLTEXT("pOEMDevOut after setting default values:\r\n")); + Dump(pOEMDevOut); + break; + + case OEMDM_CONVERT: + ConvertOEMDevmode(pOEMDevIn, pOEMDevOut, pOemDMParam->cbBufSize); + break; + + case OEMDM_MERGE: + ConvertOEMDevmode(pOEMDevIn, pOEMDevOut, pOemDMParam->cbBufSize); + MakeOEMDevmodeValid(pOEMDevOut); + break; + } + Dump(pOemDMParam); + + return S_OK; +} + + +BOOL ConvertOEMDevmode(PCOEMDEV pOEMDevIn, POEMDEV pOEMDevOut, DWORD dwSize) +{ + if( (NULL == pOEMDevIn) + || + (NULL == pOEMDevOut) + || + (dwSize < sizeof(OEMDEV)) + ) + { + ERR(ERRORTEXT("ConvertOEMDevmode() invalid parameters.\r\n")); + return FALSE; + } + + // Check OEM Signature, if it doesn't match ours, + // then just assume DMIn is bad and use defaults. + if(pOEMDevIn->dmOEMExtra.dwSignature == pOEMDevOut->dmOEMExtra.dwSignature) + { + VERBOSE(DLLTEXT("Converting private OEM Devmode.\r\n")); + VERBOSE(DLLTEXT("pOEMDevIn:\r\n")); + Dump(pOEMDevIn); + + // Set the devmode defaults so that anything the isn't copied over will + // be set to the default value. + pOEMDevOut->dwDriverData = 0; + pOEMDevOut->dwAdvancedData = 0; + + // Copy the old structure in to the new using which ever size is the smaller. + // Devmode maybe from newer Devmode (not likely since there is only one), or + // Devmode maybe a newer Devmode, in which case it maybe larger, + // but the first part of the structure should be the same. + + // DESIGN ASSUMPTION: the private DEVMODE structure only gets added to; + // the fields that are in the DEVMODE never change only new fields get added to the end. + + memcpy(pOEMDevOut, pOEMDevIn, __min(dwSize, __min(pOEMDevOut->dmOEMExtra.dwSize, pOEMDevIn->dmOEMExtra.dwSize))); + + // Re-fill in the size and version fields to indicated + // that the DEVMODE is the current private DEVMODE version. + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + } + else + { + WARNING(DLLTEXT("Unknown DEVMODE signature, pOEMDMIn ignored.\r\n")); + + // Don't know what the input DEVMODE is, so just use defaults. + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + pOEMDevOut->dwDriverData = 0; + pOEMDevOut->dwAdvancedData = 0; + } + + return TRUE; +} + + +BOOL MakeOEMDevmodeValid(POEMDEV pOEMDevmode) +{ + if(NULL == pOEMDevmode) + { + return FALSE; + } + + // ASSUMPTION: pOEMDevmode is large enough to contain OEMDEV structure. + + // Make sure that dmOEMExtra indicates the current OEMDEV structure. + pOEMDevmode->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevmode->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevmode->dmOEMExtra.dwVersion = OEM_VERSION; + + // Set driver data, if not valid. + if(pOEMDevmode->dwDriverData > 100) + { + pOEMDevmode->dwDriverData = 0; + } + + // Set Advanced driver data, if not valid. + if(pOEMDevmode->dwAdvancedData > 100) + { + pOEMDevmode->dwAdvancedData = 0; + } + + return TRUE; +} + + +void Dump(PCOEMDEV pOEMDevmode) +{ + if( (NULL != pOEMDevmode) + && + (pOEMDevmode->dmOEMExtra.dwSize >= sizeof(OEMDEV)) + && + (OEM_SIGNATURE == pOEMDevmode->dmOEMExtra.dwSignature) + ) + { + VERBOSE(TEXT("\tdmOEMExtra.dwSize = %d\r\n"), pOEMDevmode->dmOEMExtra.dwSize); + VERBOSE(TEXT("\tdmOEMExtra.dwSignature = %#x\r\n"), pOEMDevmode->dmOEMExtra.dwSignature); + VERBOSE(TEXT("\tdmOEMExtra.dwVersion = %#x\r\n"), pOEMDevmode->dmOEMExtra.dwVersion); + VERBOSE(TEXT("\tdwDriverData = %#x\r\n"), pOEMDevmode->dwDriverData); + VERBOSE(TEXT("\tdwAdvancedData = %#x\r\n"), pOEMDevmode->dwAdvancedData); + } + else + { + ERR(ERRORTEXT("Dump(POEMDEV) unknown private OEM DEVMODE.\r\n")); + } +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/devmode.h b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/devmode.h new file mode 100644 index 00000000..83202d6a --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/devmode.h @@ -0,0 +1,56 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Devmode.h +// +// +// PURPOSE: Define common data types, and external function prototypes +// for devmode functions. +// +#pragma once + +//////////////////////////////////////////////////////// +// OEM Devmode Defines +//////////////////////////////////////////////////////// + + + + +//////////////////////////////////////////////////////// +// OEM Devmode Type Definitions +//////////////////////////////////////////////////////// + +// +//Can add info to the private devmode bellow here. +//Note : +// This structure must be prefixed by OEM_DMEXTRAHEADER +// Your plug-in must implement the IPrintOemUI::DevMode method +// +typedef struct tagOEMDEV +{ + OEM_DMEXTRAHEADER dmOEMExtra; + DWORD dwDriverData; + DWORD dwAdvancedData; + + // + //Private DevMode Members + // + +} OEMDEV, *POEMDEV; + +typedef const OEMDEV *PCOEMDEV; + + + +///////////////////////////////////////////////////////// +// ProtoTypes +///////////////////////////////////////////////////////// + +HRESULT hrOEMDevMode(DWORD dwMode, POEMDMPARAM pOemDMParam); +BOOL ConvertOEMDevmode(PCOEMDEV pOEMDevIn, POEMDEV pOEMDevOut, DWORD dwSize); +BOOL MakeOEMDevmodeValid(POEMDEV pOEMDevmode); +void Dump(PCOEMDEV pOEMDevIn); diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/dllentry.cpp b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/dllentry.cpp new file mode 100644 index 00000000..da0a1885 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/dllentry.cpp @@ -0,0 +1,49 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: dllentry.cpp +// +// PURPOSE: Source module for DLL entry function(s). +// + +#include "precomp.h" +#include "debug.h" +#include "globals.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +/////////////////////////////////////////////////////////// +// +// DLL entry point +// +BOOL WINAPI DllMain(HINSTANCE hInst, WORD wReason, LPVOID lpReserved) +{ + UNREFERENCED_PARAMETER(lpReserved); + + switch(wReason) + { + case DLL_PROCESS_ATTACH: + VERBOSE(DLLTEXT("Process attach.\r\n")); + ghInstance = hInst; + break; + + case DLL_THREAD_ATTACH: + VERBOSE(DLLTEXT("Thread attach.\r\n")); + break; + + case DLL_PROCESS_DETACH: + VERBOSE(DLLTEXT("Process detach.\r\n")); + break; + + case DLL_THREAD_DETACH: + VERBOSE(DLLTEXT("Thread detach.\r\n")); + break; + } + + return TRUE; +} diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/globals.cpp b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/globals.cpp new file mode 100644 index 00000000..785330cb --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/globals.cpp @@ -0,0 +1,24 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Globals.cpp +// +// PURPOSE: File that contains all the globals. +// + +#include "precomp.h" +#include "globals.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +/////////////////////////////////////// +// Globals +/////////////////////////////////////// + +// Module's Instance handle from DLLEntry of process. +HINSTANCE ghInstance = NULL; diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/globals.h b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/globals.h new file mode 100644 index 00000000..70d17f1c --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/globals.h @@ -0,0 +1,31 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Globals.h +// +// PURPOSE: Lists of globals declared in Globals.cpp. +// +#pragma once + +/////////////////////////////////////// +// Globals +/////////////////////////////////////// + + +#define OEM_SIGNATURE 'MSFT' +#define OEM_VERSION 0x00000001L + +// OEM Signature and version. +#define PROP_TITLE L"OEM PS UI Replacement Page" +#define DLLTEXT(s) TEXT("PSUIREP: ") TEXT(s) + +// OEM UI Misc defines. +#define ERRORTEXT(s) TEXT("ERROR ") DLLTEXT(s) + +// Module's Instance handle from DLLEntry of process. +extern HINSTANCE ghInstance; + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/intrface.cpp b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/intrface.cpp new file mode 100644 index 00000000..5ab1bffe --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/intrface.cpp @@ -0,0 +1,709 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Intrface.cpp +// +// PLATFORMS: Windows 2000, Windows XP, Windows Server 2003 +// + +#include "precomp.h" + + +#include "precomp.h" +#include "resource.h" +#include "debug.h" +#include "globals.h" +#include "devmode.h" +#include "stringutils.h" +#include "helper.h" +#include "features.h" +#include "oemui.h" +#include "intrface.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +//////////////////////////////////////////////////////// +// Internal Constants +//////////////////////////////////////////////////////// + +// +// List all of the supported Driver UI Helper interface IIDs from the +// latest to the oldest, that's the order we will query for the +// the Driver UI Helper interface to use. +// + +const IID *Helper_IIDs[] = +{ + &IID_IPrintCoreUI2, + &IID_IPrintOemDriverUI, +}; +const NUM_HELPER_IIDs = (sizeof(Helper_IIDs)/sizeof(Helper_IIDs[0])); + + +//////////////////////////////////////////////////////// +// Internal Globals +//////////////////////////////////////////////////////// + +static long g_cComponents = 0 ; // Count of active components +static long g_cServerLocks = 0 ; // Count of locks + + +//////////////////////////////////////////////////////////////////////////////// +// +// IOemUI2 body +// +IOemUI2::IOemUI2() +{ + VERBOSE(DLLTEXT("IOemUI2:IOemUI2() default constructor called.\r\n\r\n")); + + // Init ref count to 1 on creation, since AddRef() is implied. + m_cRef = 1; + + // The default for UI Hiding is FALSE, since HideStandardUI method + // will only be called by Driver UIs that support it. + // Older Driver UIs don't know about this method and won't call us. + m_bHidingStandardUI = FALSE; + + // Increment component count. + InterlockedIncrement(&g_cComponents); +} + +IOemUI2::~IOemUI2() +{ + VERBOSE(DLLTEXT("IOemUI2:~IOemUI2() destructor called.\r\n\r\n")); + + // If this instance of the object is being deleted, then the reference + // count should be zero. + assert(0 == m_cRef); + + // Decrement component count. + InterlockedDecrement(&g_cComponents); +} + +HRESULT __stdcall IOemUI2::QueryInterface(const IID& iid, void** ppv) +{ + VERBOSE(DLLTEXT("IOemUI2:QueryInterface entry.\r\n\r\n")); + +#if DBG + TCHAR szIID[80] = {0}; + StringFromGUID2(iid, szIID, _countof(szIID)); // can not fail! +#endif + + // Determine what object to return, if any. + if(iid == IID_IUnknown) + { + *ppv = static_cast<IUnknown*>(this); + } + else if(iid == IID_IPrintOemUI2) + { + *ppv = static_cast<IPrintOemUI2*>(this); + } + else if(iid == IID_IPrintOemUI) + { + *ppv = static_cast<IPrintOemUI*>(this); + } + else + { + // Interface not supported. +#if DBG + VERBOSE(DLLTEXT("IOemUI2::QueryInterface %s not supported.\r\n"), szIID); +#endif + + *ppv = NULL ; + return E_NOINTERFACE ; + } + +#if DBG + VERBOSE(DLLTEXT("IOemUI2::QueryInterface returning pointer to %s.\r\n"), szIID); +#endif + + reinterpret_cast<IUnknown*>(*ppv)->AddRef(); + return S_OK ; +} + +ULONG __stdcall IOemUI2::AddRef() +{ + VERBOSE(DLLTEXT("IOemUI2:AddRef entry.\r\n")); + return InterlockedIncrement(&m_cRef) ; +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall IOemUI2::Release() +{ + VERBOSE(DLLTEXT("IOemUI2:Release entry.\r\n")); + ASSERT( 0 != m_cRef); + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + + } + return cRef; +} + +HRESULT __stdcall IOemUI2::PublishDriverInterface( + IUnknown *pIUnknown) +{ + HRESULT hResult = S_OK; + + + VERBOSE(DLLTEXT("IOemUI2:PublishDriverInterface entry.\r\n")); + + // Core Driver UI shouldn't call us more than once if we were successful. + // Thus, if m_Helper is already valid, we shouldn't be getting called. + ASSERT(!m_Helper.IsValid()); + + // Need to store pointer to Driver Helper functions, if we already haven't. + if (!m_Helper.IsValid()) + { + PVOID pHelper = NULL; + + + // Try to get the newest version fo the Helper function + // that Driver UI supports. + hResult = E_FAIL; + for(DWORD dwIndex = 0; !SUCCEEDED(hResult) && (dwIndex < NUM_HELPER_IIDs); ++dwIndex) + { + // Query Driver UI for Helper interface. + hResult = pIUnknown->QueryInterface(*Helper_IIDs[dwIndex], &pHelper); + if(SUCCEEDED(hResult)) + { + // INVARIANT: we got a Helper interface. + + + // Store Helper interface. + m_Helper.Assign(*Helper_IIDs[dwIndex], pHelper); + } + } + } + + return hResult; +} + +HRESULT __stdcall IOemUI2::GetInfo( + DWORD dwMode, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded) +{ + VERBOSE(DLLTEXT("IOemUI2::GetInfo(%d) entry.\r\r\n"), dwMode); + + // Validate parameters. + if( (NULL == pcbNeeded) + || + ( (OEMGI_GETSIGNATURE != dwMode) + && + (OEMGI_GETVERSION != dwMode) + && + (OEMGI_GETPUBLISHERINFO != dwMode) + ) + ) + { + WARNING(DLLTEXT("IOemUI2::GetInfo() exit pcbNeeded is NULL! ERROR_INVALID_PARAMETER\r\r\n")); + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Set expected buffer size and number of bytes written. + *pcbNeeded = sizeof(DWORD); + + // Check buffer size is sufficient. + if((cbSize < *pcbNeeded) || (NULL == pBuffer)) + { + WARNING(DLLTEXT("IOemUI2::GetInfo() exit insufficient buffer!\r\r\n")); + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return E_FAIL; + } + + switch(dwMode) + { + // OEM DLL Signature + case OEMGI_GETSIGNATURE: + *(PDWORD)pBuffer = OEM_SIGNATURE; + break; + + // OEM DLL version + case OEMGI_GETVERSION: + *(PDWORD)pBuffer = OEM_VERSION; + break; + + // dwMode not supported. + default: + // Set written bytes to zero since nothing was written. + WARNING(DLLTEXT("IOemUI2::GetInfo() exit mode not supported.\r\r\n")); + *pcbNeeded = 0; + SetLastError(ERROR_NOT_SUPPORTED); + return E_FAIL; + } + + VERBOSE(DLLTEXT("IOemUI2::GetInfo() exit S_OK, (*pBuffer is %#x).\r\r\n"), *(PDWORD)pBuffer); + return S_OK; +} + +HRESULT __stdcall IOemUI2::DevMode( + DWORD dwMode, + POEMDMPARAM pOemDMParam) +{ + VERBOSE(DLLTEXT("IOemUI2:DevMode(%d, %#x) entry.\r\n"), dwMode, pOemDMParam); + + return hrOEMDevMode(dwMode, pOemDMParam); +} + +HRESULT __stdcall IOemUI2::CommonUIProp( + DWORD dwMode, + POEMCUIPPARAM pOemCUIPParam) +{ + VERBOSE(DLLTEXT("IOemUI2:CommonUIProp entry.\r\n")); + + return hrOEMPropertyPage(dwMode, pOemCUIPParam); +} + + +HRESULT __stdcall IOemUI2::DocumentPropertySheets( + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam) +{ + VERBOSE(DLLTEXT("IOemUI2:DocumentPropertySheets entry.\r\n")); + + return hrOEMDocumentPropertySheets(pPSUIInfo, + lParam, + m_Helper, + &m_Features, + m_bHidingStandardUI); +} + +HRESULT __stdcall IOemUI2::DevicePropertySheets( + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam) +{ + VERBOSE(DLLTEXT("IOemUI2:DevicePropertySheets entry.\r\n")); + + return hrOEMDevicePropertySheets(pPSUIInfo, + lParam, + m_Helper, + &m_Features, + m_bHidingStandardUI); +} + +HRESULT __stdcall IOemUI2::DeviceCapabilities( + POEMUIOBJ poemuiobj, + HANDLE hPrinter, + _In_ PWSTR pDeviceName, + WORD wCapability, + PVOID pOutput, + PDEVMODE pPublicDM, + PVOID pOEMDM, + DWORD dwOld, + DWORD *dwResult) +{ + VERBOSE(DLLTEXT("IOemUI2:DeviceCapabilities entry.\r\n")); + + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(pDeviceName); + UNREFERENCED_PARAMETER(wCapability); + UNREFERENCED_PARAMETER(pOutput); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + UNREFERENCED_PARAMETER(dwOld); + UNREFERENCED_PARAMETER(dwResult); + + return E_NOTIMPL; +} + +HRESULT __stdcall IOemUI2::DevQueryPrintEx( + POEMUIOBJ poemuiobj, + PDEVQUERYPRINT_INFO pDQPInfo, + PDEVMODE pPublicDM, + PVOID pOEMDM) +{ + VERBOSE(DLLTEXT("IOemUI2:DevQueryPrintEx entry.\r\n")); + + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(pDQPInfo); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + + return E_NOTIMPL; +} + +HRESULT __stdcall IOemUI2::UpgradePrinter( + DWORD dwLevel, + PBYTE pDriverUpgradeInfo) +{ + VERBOSE(DLLTEXT("IOemUI2:UpgradePrinter entry.\r\n")); + + UNREFERENCED_PARAMETER(dwLevel); + UNREFERENCED_PARAMETER(pDriverUpgradeInfo); + + return E_NOTIMPL; +} + +HRESULT __stdcall IOemUI2::PrinterEvent( + _In_ PWSTR pPrinterName, + INT iDriverEvent, + DWORD dwFlags, + LPARAM lParam) +{ + VERBOSE(DLLTEXT("IOemUI2:PrinterEvent entry.\r\n")); + + UNREFERENCED_PARAMETER(pPrinterName); + UNREFERENCED_PARAMETER(iDriverEvent); + UNREFERENCED_PARAMETER(dwFlags); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +} + +HRESULT __stdcall IOemUI2::DriverEvent( + DWORD dwDriverEvent, + DWORD dwLevel, + LPBYTE pDriverInfo, + LPARAM lParam) +{ + VERBOSE(DLLTEXT("IOemUI2:DriverEvent entry.\r\n")); + + UNREFERENCED_PARAMETER(dwDriverEvent); + UNREFERENCED_PARAMETER(dwLevel); + UNREFERENCED_PARAMETER(pDriverInfo); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +}; + + +HRESULT __stdcall IOemUI2::QueryColorProfile( + HANDLE hPrinter, + POEMUIOBJ poemuiobj, + PDEVMODE pPublicDM, + PVOID pOEMDM, + ULONG ulQueryMode, + VOID *pvProfileData, + ULONG *pcbProfileData, + FLONG *pflProfileData) +{ + VERBOSE(DLLTEXT("IOemUI2:QueryColorProfile entry.\r\n")); + + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + UNREFERENCED_PARAMETER(ulQueryMode); + UNREFERENCED_PARAMETER(pvProfileData); + UNREFERENCED_PARAMETER(pcbProfileData); + UNREFERENCED_PARAMETER(pflProfileData); + + return E_NOTIMPL; +}; + +HRESULT __stdcall IOemUI2::FontInstallerDlgProc( + HWND hWnd, + UINT usMsg, + WPARAM wParam, + LPARAM lParam) +{ + VERBOSE(DLLTEXT("IOemUI2:FontInstallerDlgProc entry.\r\n")); + + UNREFERENCED_PARAMETER(hWnd); + UNREFERENCED_PARAMETER(usMsg); + UNREFERENCED_PARAMETER(wParam); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +}; + +HRESULT __stdcall IOemUI2::UpdateExternalFonts( + HANDLE hPrinter, + HANDLE hHeap, + _In_ PWSTR pwstrCartridges) +{ + VERBOSE(DLLTEXT("IOemUI2:UpdateExternalFonts entry.\r\n")); + + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(hHeap); + UNREFERENCED_PARAMETER(pwstrCartridges); + + return E_NOTIMPL; +} + +// *********** IPrintOEMUI2 FUNCTIONS **************** + +// +// QueryJobAttribtues +// + +HRESULT __stdcall IOemUI2::QueryJobAttributes( + HANDLE hPrinter, + PDEVMODE pDevmode, + DWORD dwLevel, + LPBYTE lpAttributeInfo) +{ + TERSE(DLLTEXT("IOemUI2:QueryJobAttributes entry.\r\n")); + + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(pDevmode); + UNREFERENCED_PARAMETER(dwLevel); + UNREFERENCED_PARAMETER(lpAttributeInfo); + + return E_NOTIMPL; +} + +// +// Hide Standard UI +// + +HRESULT __stdcall IOemUI2::HideStandardUI( + DWORD dwMode) +{ + HRESULT hrReturn = E_NOTIMPL; + + + TERSE(DLLTEXT("IOemUI2:HideStandardUI entry.\r\n")); + + switch(dwMode) + { + // By returning S_OK for both OEMCUIP_DOCPROP and OEMCUIP_PRNPROP, + // we will hide the Standard UI for both Document Properties, + // and Device Properties. + // To not hide one or both, return E_NOTIMPL instead of S_OK, + case OEMCUIP_DOCPROP: + case OEMCUIP_PRNPROP: + // Flag that we are hiding the Standard UI. + // This is so we can tell easily between Driver UI + // that supports HideStandardUI (such as WinXP PS UI), + // or ones that don't (such as Win2K PS or Unidrv UI). + m_bHidingStandardUI = TRUE; + + hrReturn = S_OK; + break; + } + + return hrReturn; +} + +// +// DocumentEvent +// + +HRESULT __stdcall IOemUI2::DocumentEvent( + HANDLE hPrinter, + HDC hdc, + INT iEsc, + ULONG cbIn, + PVOID pbIn, + ULONG cbOut, + PVOID pbOut, + PINT piResult) +{ + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(hdc); + UNREFERENCED_PARAMETER(iEsc); + UNREFERENCED_PARAMETER(cbIn); + UNREFERENCED_PARAMETER(pbIn); + UNREFERENCED_PARAMETER(cbOut); + UNREFERENCED_PARAMETER(pbOut); + UNREFERENCED_PARAMETER(piResult); + + return E_NOTIMPL; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// oem class factory +// +class IOemCF : public IClassFactory +{ +public: + // *** IUnknown methods *** + + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release) (THIS); + + // *** IClassFactory methods *** + STDMETHOD(CreateInstance) (THIS_ + LPUNKNOWN pUnkOuter, + REFIID riid, + LPVOID FAR* ppvObject); + STDMETHOD(LockServer) (THIS_ BOOL bLock); + + + // Constructor + IOemCF(): m_cRef(1) { }; + ~IOemCF() { }; + +protected: + LONG m_cRef; + +}; + +/////////////////////////////////////////////////////////// +// +// Class factory body +// +HRESULT __stdcall IOemCF::QueryInterface(const IID& iid, void** ppv) +{ + if ((iid == IID_IUnknown) || (iid == IID_IClassFactory)) + { + *ppv = static_cast<IOemCF*>(this) ; + } + else + { +#if DBG + TCHAR szOutput[80] = {0}; + StringFromGUID2(iid, szOutput, _countof(szOutput)); // can not fail! + WARNING(DLLTEXT("IOemCF::QueryInterface %s not supported.\r\n"), szOutput); +#endif + + *ppv = NULL ; + return E_NOINTERFACE ; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef() ; + return S_OK ; +} + +ULONG __stdcall IOemCF::AddRef() +{ + return InterlockedIncrement(&m_cRef) ; +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall IOemCF::Release() +{ + ASSERT( 0 != m_cRef); + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + + } + return cRef; +} + +// IClassFactory implementation +HRESULT __stdcall IOemCF::CreateInstance(IUnknown* pUnknownOuter, + const IID& iid, + void** ppv) +{ + //DbgPrint(DLLTEXT("Class factory:\t\tCreate component.")) ; + + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Cannot aggregate. + if (pUnknownOuter != NULL) + { + return CLASS_E_NOAGGREGATION ; + } + + // Create component. + IOemUI2* pOemCB = new IOemUI2 ; + if (pOemCB == NULL) + { + return E_OUTOFMEMORY ; + } + // Get the requested interface. + HRESULT hr = pOemCB->QueryInterface(iid, ppv) ; + + // Release the IUnknown pointer. + // (If QueryInterface failed, component will delete itself.) + pOemCB->Release() ; + return hr ; +} + +// LockServer +HRESULT __stdcall IOemCF::LockServer(BOOL bLock) +{ + if (bLock) + { + InterlockedIncrement(&g_cServerLocks) ; + } + else + { + InterlockedDecrement(&g_cServerLocks) ; + } + return S_OK ; +} + +/////////////////////////////////////////////////////////// +// +// Exported functions +// + + +// Can DLL unload now? +// +STDAPI DllCanUnloadNow() +{ + // + // To avoid leaving OEM DLL still in memory when Unidrv or Pscript drivers + // are unloaded, Unidrv and Pscript driver ignore the return value of + // DllCanUnloadNow of the OEM DLL, and always call FreeLibrary on the OEMDLL. + // + // If OEM DLL spins off a working thread that also uses the OEM DLL, the + // thread needs to call LoadLibrary and FreeLibraryAndExitThread, otherwise + // it may crash after Unidrv or Pscript calls FreeLibrary. + // + + if ((g_cComponents == 0) && (g_cServerLocks == 0)) + { + return S_OK ; + } + else + { + return S_FALSE; + } +} + +// +// Get class factory +// +STDAPI DllGetClassObject( + _In_ REFCLSID clsid, + _In_ REFIID iid, + _Outptr_ LPVOID* ppv) +{ + VERBOSE(DLLTEXT("DllGetClassObject:Create class factory.\r\n")); + + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Can we create this component? + if (clsid != CLSID_OEMUI) + { + return CLASS_E_CLASSNOTAVAILABLE ; + } + + // Create class factory. + IOemCF* pFontCF = new IOemCF ; // Reference count set to 1 + // in constructor + if (pFontCF == NULL) + { + return E_OUTOFMEMORY ; + } + + // Get requested interface. + HRESULT hr = pFontCF->QueryInterface(iid, ppv) ; + pFontCF->Release() ; + + return hr ; +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/intrface.h b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/intrface.h new file mode 100644 index 00000000..d723cbb7 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/intrface.h @@ -0,0 +1,220 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Intrface.h +// +// PURPOSE: Header of interface for PScript5UI replacement plug-in. +// +#pragma once + +//////////////////////////////////////////////////////////////////////////////// +// +// IOemUI2 +// +class IOemUI2: public IPrintOemUI2 +{ +public: + // *** IUnknown methods *** + + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release) (THIS); + + // + // Get OEM dll related information + // + + STDMETHOD(GetInfo) (THIS_ DWORD dwMode, PVOID pBuffer, DWORD cbSize, + PDWORD pcbNeeded); + + // + // OEMDevMode + // + + STDMETHOD(DevMode) (THIS_ DWORD dwMode, POEMDMPARAM pOemDMParam) ; + + // + // Method for publishing Driver interface. + // + STDMETHOD(PublishDriverInterface)(THIS_ IUnknown *pIUnknown); + + // + // OEMCommonUIProp + // + + STDMETHOD(CommonUIProp) (THIS_ + DWORD dwMode, + POEMCUIPPARAM pOemCUIPParam + ); + + // + // OEMDocumentPropertySheets + // + + STDMETHOD(DocumentPropertySheets) (THIS_ + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam + ); + + // + // OEMDevicePropertySheets + // + + STDMETHOD(DevicePropertySheets) (THIS_ + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam + ); + + + // + // OEMDevQueryPrintEx + // + + STDMETHOD(DevQueryPrintEx) (THIS_ + POEMUIOBJ poemuiobj, + PDEVQUERYPRINT_INFO pDQPInfo, + PDEVMODE pPublicDM, + PVOID pOEMDM + ); + + // + // OEMDeviceCapabilities + // + + STDMETHOD(DeviceCapabilities) (THIS_ + POEMUIOBJ poemuiobj, + HANDLE hPrinter, + _In_ PWSTR pDeviceName, + WORD wCapability, + PVOID pOutput, + PDEVMODE pPublicDM, + PVOID pOEMDM, + DWORD dwOld, + DWORD *dwResult + ); + + // + // OEMUpgradePrinter + // + + STDMETHOD(UpgradePrinter) (THIS_ + DWORD dwLevel, + PBYTE pDriverUpgradeInfo + ); + + // + // OEMPrinterEvent + // + + STDMETHOD(PrinterEvent) (THIS_ + _In_ PWSTR pPrinterName, + INT iDriverEvent, + DWORD dwFlags, + LPARAM lParam + ); + + // + // OEMDriverEvent + // + + STDMETHOD(DriverEvent)(THIS_ + DWORD dwDriverEvent, + DWORD dwLevel, + LPBYTE pDriverInfo, + LPARAM lParam + ); + + // + // OEMQueryColorProfile + // + + STDMETHOD(QueryColorProfile) (THIS_ + HANDLE hPrinter, + POEMUIOBJ poemuiobj, + PDEVMODE pPublicDM, + PVOID pOEMDM, + ULONG ulReserved, + VOID *pvProfileData, + ULONG *pcbProfileData, + FLONG *pflProfileData); + + // + // OEMFontInstallerDlgProc + // + + STDMETHOD(FontInstallerDlgProc) (THIS_ + HWND hWnd, + UINT usMsg, + WPARAM wParam, + LPARAM lParam + ); + // + // UpdateExternalFonts + // + + STDMETHOD(UpdateExternalFonts) (THIS_ + HANDLE hPrinter, + HANDLE hHeap, + _In_ PWSTR pwstrCartridges + ); + + // + // IPrintOemUI2 methods + // + + // + // QueryJobAttributes + // + + STDMETHOD(QueryJobAttributes) (THIS_ + HANDLE hPrinter, + PDEVMODE pDevmode, + DWORD dwLevel, + LPBYTE lpAttributeInfo + ); + + // + // Hide Standard UI + // + + STDMETHOD(HideStandardUI) (THIS_ + DWORD dwMode + ); + + // + // DocumentEvent + // + + STDMETHOD(DocumentEvent) (THIS_ + HANDLE hPrinter, + HDC hdc, + INT iEsc, + ULONG cbIn, + PVOID pbIn, + ULONG cbOut, + PVOID pbOut, + PINT piResult + ); + + + IOemUI2(); + virtual ~IOemUI2(); + +protected: + LONG m_cRef; // Reference count + BOOL m_bHidingStandardUI; // Flag indicating if we are hiding the Standard UI. + // NOTE: Not all Driver UI versions support hinding + // the Standard Driver UI. + CUIHelper m_Helper; // Container for Driver UI Helper interface. + CFeatures m_Features; // Core Driver features and feature options. +}; + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/oemui.cpp b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/oemui.cpp new file mode 100644 index 00000000..331be437 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/oemui.cpp @@ -0,0 +1,1042 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: OEMUI.cpp +// +// +// PURPOSE: Main file for OEM UI test module. +// + +#include "precomp.h" +#include "resource.h" +#include "debug.h" +#include "globals.h" +#include "devmode.h" +#include "stringutils.h" +#include "helper.h" +#include "features.h" +#include "oemui.h" + + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +//////////////////////////////////////////////////////// +// INTERNAL MACROS and DEFINES +//////////////////////////////////////////////////////// + +typedef struct _tagCBUserData +{ + HANDLE hComPropSheet; + HANDLE hPropPage; + POEMUIPSPARAM pOEMUIParam; + PFNCOMPROPSHEET pfnComPropSheet; + CUIHelper *pHelper; + POEMUIOBJ poemuiobj; + BOOL bPermission; + BOOL bHidingStandardUI; + +} CBUSERDATA, *PCBUSERDATA; + + + +//////////////////////////////////////////////////////// +// INTERNAL PROTOTYPES +//////////////////////////////////////////////////////// + +static HRESULT hrDocumentPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam); +static HRESULT hrPrinterPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam); +LONG APIENTRY OEMPrinterUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam); +LONG APIENTRY OEMDocUIItemCallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam); +LONG APIENTRY OEMDocUICallBack(PCPSUICBPARAM pCallbackParam); +LONG APIENTRY OEMDevUICallBack(PCPSUICBPARAM pCallbackParam); +INT_PTR CALLBACK DevicePropPageProc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam); +static void InitOptItems(POPTITEM pOptItems, DWORD dwOptItems); + + + + +//////////////////////////////////////////////////////////////////////////////// +// +// Initializes OptItems to display OEM device or document property UI. +// +HRESULT hrOEMPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam) +{ + HRESULT hResult = S_OK; + + + VERBOSE(DLLTEXT("hrOEMPropertyPage(%d) entry.\r\n"), dwMode); + + // Validate parameters. + if( (OEMCUIP_DOCPROP != dwMode) + && + (OEMCUIP_PRNPROP != dwMode) + ) + { + ERR(ERRORTEXT("hrOEMPropertyPage() ERROR_INVALID_PARAMETER.\r\n")); + VERBOSE(DLLTEXT("\tdwMode = %d, pOEMUIParam = %#lx.\r\n"), dwMode, pOEMUIParam); + + // Return invalid parameter error. + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + switch(dwMode) + { + case OEMCUIP_DOCPROP: + hResult = hrDocumentPropertyPage(dwMode, pOEMUIParam); + break; + + case OEMCUIP_PRNPROP: + hResult = hrPrinterPropertyPage(dwMode, pOEMUIParam); + break; + + default: + // Should never reach this! + ERR(ERRORTEXT("hrOEMPropertyPage() Invalid dwMode, %d"), dwMode); + SetLastError(ERROR_INVALID_PARAMETER); + hResult = E_FAIL; + break; + } + + return hResult; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// Initializes OptItems to display OEM document property UI. +// +static HRESULT hrDocumentPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam) +{ + HRESULT hrResult = S_OK; + + UNREFERENCED_PARAMETER(dwMode); + + if(NULL == pOEMUIParam->pOEMOptItems) + { + // Fill in the number of OptItems to create for OEM document property UI. + pOEMUIParam->cOEMOptItems = 1; + + VERBOSE(DLLTEXT("hrDocumentPropertyPage() requesting %d number of items.\r\n"), pOEMUIParam->cOEMOptItems); + } + else + { + POEMDEV pOEMDev = (POEMDEV) pOEMUIParam->pOEMDM; + + + VERBOSE(DLLTEXT("hrDocumentPropertyPage() fill out %d items.\r\n"), pOEMUIParam->cOEMOptItems); + + // Init UI Callback reference. + pOEMUIParam->OEMCUIPCallback = OEMDocUIItemCallBack; + + // Init OEMOptItmes. + InitOptItems(pOEMUIParam->pOEMOptItems, pOEMUIParam->cOEMOptItems); + + // Fill out tree view items. + + // New section. + pOEMUIParam->pOEMOptItems[0].Level = 1; + pOEMUIParam->pOEMOptItems[0].Flags = OPTIF_COLLAPSE; + pOEMUIParam->pOEMOptItems[0].Sel = pOEMDev->dwAdvancedData; + + hrResult = GetStringResource(pOEMUIParam->hOEMHeap, + (HMODULE) pOEMUIParam->hModule, + IDS_ADV_SECTION, + &pOEMUIParam->pOEMOptItems[0].pName); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("hrDocumentPropertyPage() failed to get section name. (hrResult = 0x%x)\r\n"), + hrResult); + goto Exit; + } + + pOEMUIParam->pOEMOptItems[0].pOptType = CreateOptType(pOEMUIParam->hOEMHeap, 2); + + pOEMUIParam->pOEMOptItems[0].pOptType->Type = TVOT_UDARROW; + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].IconID = 0; + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].lParam = 100; + } + + +Exit: + + return hrResult; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// Initializes OptItems to display OEM printer property UI. +// +static HRESULT hrPrinterPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam) +{ + HRESULT hrResult = S_OK; + + UNREFERENCED_PARAMETER(dwMode); + + if(NULL == pOEMUIParam->pOEMOptItems) + { + // Fill in the number of OptItems to create for OEM printer property UI. + pOEMUIParam->cOEMOptItems = 1; + + VERBOSE(DLLTEXT("hrPrinterPropertyPage() requesting %d number of items.\r\n"), pOEMUIParam->cOEMOptItems); + } + else + { + DWORD dwError; + DWORD dwDeviceValue; + DWORD dwType; + DWORD dwNeeded; + + + VERBOSE(DLLTEXT("hrPrinterPropertyPage() fill out %d items.\r\n"), pOEMUIParam->cOEMOptItems); + + // Get device settings value from printer. + dwError = GetPrinterData(pOEMUIParam->hPrinter, OEMUI_VALUE, &dwType, (PBYTE) &dwDeviceValue, + sizeof(dwDeviceValue), &dwNeeded); + if( (ERROR_SUCCESS != dwError) + || + (dwDeviceValue > 100) + ) + { + // Failed to get the device value or value is invalid, just use the default. + dwDeviceValue = 0; + } + + // Init UI Callback reference. + pOEMUIParam->OEMCUIPCallback = OEMPrinterUICallBack; + + // Init OEMOptItmes. + InitOptItems(pOEMUIParam->pOEMOptItems, pOEMUIParam->cOEMOptItems); + + // Fill out tree view items. + + // New section. + pOEMUIParam->pOEMOptItems[0].Level = 1; + pOEMUIParam->pOEMOptItems[0].Flags = OPTIF_COLLAPSE; + hrResult = GetStringResource(pOEMUIParam->hOEMHeap, + (HMODULE) pOEMUIParam->hModule, + IDS_DEV_SECTION, + &pOEMUIParam->pOEMOptItems[0].pName); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("hrPrinterPropertyPage() failed to get section name. (hrResult = 0x%x)\r\n"), + hrResult); + goto Exit; + } + + pOEMUIParam->pOEMOptItems[0].Sel = dwDeviceValue; + + pOEMUIParam->pOEMOptItems[0].pOptType = CreateOptType(pOEMUIParam->hOEMHeap, 2); + + pOEMUIParam->pOEMOptItems[0].pOptType->Type = TVOT_UDARROW; + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].IconID = 0; + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].lParam = 100; + } + +Exit: + + return hrResult; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Adds property page to Document property sheet. +// +HRESULT hrOEMDocumentPropertySheets(PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam, + CUIHelper &Helper, + CFeatures *pFeatures, + BOOL bHidingStandardUI) +{ + LONG_PTR lResult = 0; + HRESULT hrResult = S_OK; + + VERBOSE(DLLTEXT("OEMDocumentPropertySheets() entry.\r\n")); + + // Validate parameters. + if( (NULL == pPSUIInfo) + || + (PROPSHEETUI_INFO_VERSION != pPSUIInfo->Version) + ) + { + ERR(ERRORTEXT("OEMDocumentPropertySheets() ERROR_INVALID_PARAMETER.\r\n")); + + // Return invalid parameter error. + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Do action. + switch(pPSUIInfo->Reason) + { + case PROPSHEETUI_REASON_INIT: + { + WORD wFeatures = 0; + WORD wIndex = 0; + DWORD dwSheets = 0; + PCBUSERDATA pUserData = NULL; + POEMUIPSPARAM pOEMUIParam = (POEMUIPSPARAM) pPSUIInfo->lParamInit; + BOOL bPermission = ((pOEMUIParam->dwFlags & DM_NOPERMISSION) == 0); + HANDLE hHeap = pOEMUIParam->hOEMHeap; + POEMDEV pOEMDev = (POEMDEV) pOEMUIParam->pOEMDM; + COMPROPSHEETUI Sheet; + + + // Make sure that we have the Core Driver Features. + // Only get features if we are hiding the standard + // document property sheets. + if(bHidingStandardUI) + { + pFeatures->Acquire(hHeap, Helper, pOEMUIParam->poemuiobj); + wFeatures = pFeatures->GetCount(OEMCUIP_DOCPROP); + } + + // Init property page. + memset(&Sheet, 0, sizeof(COMPROPSHEETUI)); + Sheet.cbSize = sizeof(COMPROPSHEETUI); + Sheet.Flags = bPermission ? CPSUIF_UPDATE_PERMISSION : 0; + Sheet.hInstCaller = ghInstance; + Sheet.pHelpFile = NULL; + Sheet.pfnCallBack = OEMDocUICallBack; + Sheet.pDlgPage = CPSUI_PDLGPAGE_TREEVIEWONLY; + Sheet.cOptItem = wFeatures + 1; + Sheet.IconID = IDI_CPSUI_PRINTER; + Sheet.CallerVersion = 0x100; + Sheet.OptItemVersion = 0x100; + + // Get Caller's name. + hrResult = GetStringResource(hHeap, ghInstance, IDS_NAME, &Sheet.pCallerName); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("hrOEMDocumentPropertySheets() failed to get caller name. (hrResult = 0x%x)\r\n"), + hrResult); + goto Exit; + } + + // Get section name. + hrResult = GetStringResource(hHeap, ghInstance, IDS_SECTION, &Sheet.pOptItemName); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("hrOEMDocumentPropertySheets() failed to get section name. (hrResult = 0x%x)\r\n"), + hrResult); + goto Exit; + } + + // Init user data. + pUserData = (PCBUSERDATA) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(CBUSERDATA)); + if(NULL == pUserData) + { + ERR(ERRORTEXT("hrOEMDocumentPropertySheets() failed to allocate user data.\r\n")); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + pUserData->hComPropSheet = pPSUIInfo->hComPropSheet; + pUserData->pfnComPropSheet = pPSUIInfo->pfnComPropSheet; + pUserData->pOEMUIParam = pOEMUIParam; + pUserData->pHelper = &Helper; + pUserData->poemuiobj = pOEMUIParam->poemuiobj; + pUserData->bPermission = bPermission; + pUserData->bHidingStandardUI = bHidingStandardUI; + Sheet.UserData = (ULONG_PTR) pUserData; + + // Create OptItems for page. + Sheet.pOptItem = CreateOptItems(hHeap, Sheet.cOptItem); + if(NULL == Sheet.pOptItem) + { + ERR(ERRORTEXT("hrOEMDocumentPropertySheets() failed to allocate OPTITEMs.\r\n")); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + // Add Core Driver features. + for(wIndex = 0; wIndex < wFeatures; ++wIndex) + { + // Initialize level and basic state for feature. + Sheet.pOptItem[wIndex].Level = 1; + Sheet.pOptItem[wIndex].Flags = OPTIF_COLLAPSE; + + // Get the OPTITEM for this feature. + hrResult = pFeatures->InitOptItem(hHeap, + Sheet.pOptItem + wIndex, + wIndex, + OEMCUIP_DOCPROP); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("hrOEMDocumentPropertySheets() failed to get OPTITEM for feature %hs.\r\n"), + pFeatures->GetKeyword(wIndex, OEMCUIP_DOCPROP)); + + goto Exit; + } + } + + // Initialize Plug-in OptItems + Sheet.pOptItem[wIndex].Level = 1; + Sheet.pOptItem[wIndex].Flags = OPTIF_COLLAPSE; + Sheet.pOptItem[wIndex].Sel = pOEMDev->dwDriverData; + + // get optitem name. + hrResult = GetStringResource(hHeap, ghInstance, IDS_SECTION, &Sheet.pOptItem[wIndex].pName); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("hrOEMDocumentPropertySheets() failed to get OptItem %d name. (hrResult = 0x%x)\r\n"), + wIndex, + hrResult); + goto Exit; + } + + Sheet.pOptItem[wIndex].pOptType = CreateOptType(hHeap, 2); + + Sheet.pOptItem[wIndex].pOptType->Type = TVOT_UDARROW; + Sheet.pOptItem[wIndex].pOptType->pOptParam[1].IconID = 0; + Sheet.pOptItem[wIndex].pOptType->pOptParam[1].lParam = 100; + + + // Add property sheets. + lResult = pPSUIInfo->pfnComPropSheet(pPSUIInfo->hComPropSheet, CPSFUNC_ADD_PCOMPROPSHEETUI, + (LPARAM)&Sheet, (LPARAM)&dwSheets); + } + break; + + case PROPSHEETUI_REASON_GET_INFO_HEADER: + { + PPROPSHEETUI_INFO_HEADER pHeader = (PPROPSHEETUI_INFO_HEADER) lParam; + + pHeader->pTitle = (LPTSTR)PROP_TITLE; + lResult = TRUE; + } + break; + + case PROPSHEETUI_REASON_GET_ICON: + // No icon + lResult = 0; + break; + + case PROPSHEETUI_REASON_SET_RESULT: + { + PSETRESULT_INFO pInfo = (PSETRESULT_INFO) lParam; + + lResult = pInfo->Result; + } + break; + + case PROPSHEETUI_REASON_DESTROY: + lResult = TRUE; + break; + } + + +Exit: + + pPSUIInfo->Result = lResult; + return hrResult; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Adds property page to printer property sheet. +// +HRESULT hrOEMDevicePropertySheets(PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam, + CUIHelper &Helper, + CFeatures *pFeatures, + BOOL bHidingStandardUI) +{ + LONG_PTR lResult = 0; + HRESULT hrResult = S_OK; + + + VERBOSE(DLLTEXT("hrOEMDevicePropertySheets(%#x, %#x) entry\r\n"), pPSUIInfo, lParam); + + // Validate parameters. + if( (NULL == pPSUIInfo) + || + (PROPSHEETUI_INFO_VERSION != pPSUIInfo->Version) + ) + { + ERR(ERRORTEXT("hrOEMDevicePropertySheets() ERROR_INVALID_PARAMETER.\r\n")); + + // Return invalid parameter error. + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + Dump(pPSUIInfo); + + // Do action. + switch(pPSUIInfo->Reason) + { + case PROPSHEETUI_REASON_INIT: + { + PROPSHEETPAGE Page; + + // If hiding standard UI, then + // need to add Device Settings page, too. + if(bHidingStandardUI) + { + POEMUIPSPARAM pOEMUIParam = (POEMUIPSPARAM) pPSUIInfo->lParamInit; + BOOL bPermission = ((pOEMUIParam->dwFlags & DPS_NOPERMISSION) == 0); + HANDLE hHeap = pOEMUIParam->hOEMHeap; + WORD wFeatures = 0; + WORD wIndex = 0; + DWORD dwSheets = 0; + DLGPAGE DlgPage; + PCBUSERDATA pUserData = NULL; + COMPROPSHEETUI Sheet; + + + // Make sure that we have the Core Driver Features. + pFeatures->Acquire(hHeap, Helper, pOEMUIParam->poemuiobj); + wFeatures = pFeatures->GetCount(OEMCUIP_PRNPROP); + + // Init DlgPage struct for Device Settings replacement page. + memset(&DlgPage, 0, sizeof(DLGPAGE)); + DlgPage.cbSize = sizeof(DLGPAGE); + DlgPage.DlgTemplateID = DP_STD_TREEVIEWPAGE; + + // Get Device Settings display name. + hrResult = GetStringResource(hHeap, ghInstance, IDS_DEVICE_SETTINGS_NAME, &DlgPage.pTabName); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("hrOEMDevicePropertySheets() failed to get Device Settings display name. (hrResult = 0x%x)\r\n"), + hrResult); + goto Exit; + } + + // Init Device Settings replacement page. + memset(&Sheet, 0, sizeof(COMPROPSHEETUI)); + Sheet.cbSize = sizeof(COMPROPSHEETUI); + Sheet.Flags = bPermission ? CPSUIF_UPDATE_PERMISSION : 0; + Sheet.hInstCaller = ghInstance; + Sheet.pHelpFile = NULL; + Sheet.pfnCallBack = OEMDevUICallBack; + Sheet.pDlgPage = &DlgPage; //CPSUI_PDLGPAGE_TREEVIEWONLY; + Sheet.cOptItem = wFeatures; + Sheet.cDlgPage = 1; + Sheet.IconID = IDI_CPSUI_PRINTER; + Sheet.CallerVersion = 0x100; + Sheet.OptItemVersion = 0x100; + + // Get Caller's name. + hrResult = GetStringResource(hHeap, ghInstance, IDS_NAME, &Sheet.pCallerName); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("hrOEMDevicePropertySheets() failed to get caller name. (hrResult = 0x%x)\r\n"), + hrResult); + goto Exit; + } + + // Get section name. + hrResult = GetStringResource(hHeap, ghInstance, IDS_SECTION, &Sheet.pOptItemName); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("hrOEMDevicePropertySheets() failed to get section name. (hrResult = 0x%x)\r\n"), + hrResult); + goto Exit; + } + + // Allocate and init User data used in our callback for this page. + pUserData = (PCBUSERDATA) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(CBUSERDATA)); + if(NULL == pUserData) + { + ERR(ERRORTEXT("hrOEMDevicePropertySheets() failed to allocate user data.\r\n")); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + pUserData->hComPropSheet = pPSUIInfo->hComPropSheet; + pUserData->pfnComPropSheet = pPSUIInfo->pfnComPropSheet; + pUserData->pOEMUIParam = pOEMUIParam; + pUserData->pHelper = &Helper; + pUserData->poemuiobj = pOEMUIParam->poemuiobj; + pUserData->bPermission = bPermission; + pUserData->bHidingStandardUI = bHidingStandardUI; + Sheet.UserData = (ULONG_PTR) pUserData; + + // Create OptItems for page. + Sheet.pOptItem = CreateOptItems(hHeap, Sheet.cOptItem); + if(NULL == Sheet.pOptItem) + { + ERR(ERRORTEXT("hrOEMDevicePropertySheets() failed to allocate OPTITEMs.\r\n")); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + // Add Core Driver features. + for(wIndex = 0; wIndex < wFeatures; ++wIndex) + { + // Initialize level and basic state for feature. + Sheet.pOptItem[wIndex].Level = 1; + Sheet.pOptItem[wIndex].Flags = OPTIF_COLLAPSE; + + // Get the OPTITEM for this feature. + hrResult = pFeatures->InitOptItem(hHeap, + Sheet.pOptItem + wIndex, + wIndex, + OEMCUIP_PRNPROP); + if(!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("hrOEMDevicePropertySheets() failed to get OPTITEM for feature %hs.\r\n"), + pFeatures->GetKeyword(wIndex, OEMCUIP_PRNPROP)); + + goto Exit; + } + } + + // Add property sheets. + lResult = pPSUIInfo->pfnComPropSheet(pPSUIInfo->hComPropSheet, CPSFUNC_ADD_PCOMPROPSHEETUI, + (LPARAM)&Sheet, (LPARAM)&dwSheets); + if(!SUCCEEDED(lResult)) + { + ERR(ERRORTEXT("hrOEMDevicePropertySheets() failed to add Device Settings replacement page. (lResult = 0x%x)\r\n"), + lResult); + goto Exit; + } + } + + // Init our property page. + memset(&Page, 0, sizeof(PROPSHEETPAGE)); + Page.dwSize = sizeof(PROPSHEETPAGE); + Page.dwFlags = PSP_DEFAULT; + Page.hInstance = ghInstance; + Page.pszTemplate = MAKEINTRESOURCE(IDD_DEVICE_PROPPAGE); + Page.pfnDlgProc = DevicePropPageProc; + + // Add property sheets. + lResult = pPSUIInfo->pfnComPropSheet(pPSUIInfo->hComPropSheet, CPSFUNC_ADD_PROPSHEETPAGE, (LPARAM)&Page, 0); + if(!SUCCEEDED(lResult)) + { + ERR(ERRORTEXT("hrOEMDevicePropertySheets() failed to add our Device Property page. (lResult = 0x%x)\r\n"), + lResult); + goto Exit; + } + + VERBOSE(DLLTEXT("hrOEMDevicePropertySheets() pfnComPropSheet returned %d.\r\n"), lResult); + } + break; + + case PROPSHEETUI_REASON_GET_INFO_HEADER: + { + PPROPSHEETUI_INFO_HEADER pHeader = (PPROPSHEETUI_INFO_HEADER) lParam; + + pHeader->pTitle = (LPTSTR)PROP_TITLE; + lResult = TRUE; + } + break; + + case PROPSHEETUI_REASON_GET_ICON: + // No icon + lResult = 0; + break; + + case PROPSHEETUI_REASON_SET_RESULT: + { + PSETRESULT_INFO pInfo = (PSETRESULT_INFO) lParam; + + lResult = pInfo->Result; + } + break; + + case PROPSHEETUI_REASON_DESTROY: + lResult = TRUE; + break; + } + + +Exit: + + pPSUIInfo->Result = lResult; + return hrResult; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// OptItems call back for OEM printer property UI. +// +LONG APIENTRY OEMPrinterUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam) +{ + LONG lReturn = CPSUICB_ACTION_NONE; + + VERBOSE(DLLTEXT("OEMPrinterUICallBack() entry, Reason is %d.\r\n"), pCallbackParam->Reason); + + switch(pCallbackParam->Reason) + { + case CPSUICB_REASON_APPLYNOW: + { + DWORD dwDriverValue = pOEMUIParam->pOEMOptItems[0].Sel; + + // Store OptItems state in printer data. + SetPrinterData(pOEMUIParam->hPrinter, OEMUI_VALUE, REG_DWORD, (PBYTE) &dwDriverValue, sizeof(DWORD)); + } + break; + + default: + break; + } + + return lReturn; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Call back for OEM device property UI. +// +#pragma warning(push) +// 2 MAX_PATH strings just slightly exceed the default threshold for the prefast stack usage warning +#pragma warning( disable : 6262 ) +INT_PTR CALLBACK DevicePropPageProc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uiMsg) + { + case WM_COMMAND: + switch(HIWORD(wParam)) + { + case BN_CLICKED: + switch(LOWORD(wParam)) + { + case IDC_CALIBRATE: + // Just display a message that the printer is calibrated, + // since we don't acutally calibrate anything. + { + TCHAR szName[MAX_PATH]; + TCHAR szCalibrated[MAX_PATH]; + + + LoadString(ghInstance, IDS_NAME, szName, sizeof(szName)/sizeof(szName[0])); + LoadString(ghInstance, IDS_CALIBRATED, szCalibrated, sizeof(szCalibrated)/sizeof(szCalibrated[0])); + MessageBox(hDlg, szCalibrated, szName, MB_OK); + } + break; + } + break; + + default: + return FALSE; + } + return TRUE; + + case WM_NOTIFY: + { + switch (((LPNMHDR)lParam)->code) // type of notification message + { + case PSN_SETACTIVE: + break; + + case PSN_KILLACTIVE: + break; + + case PSN_APPLY: + break; + + case PSN_RESET: + break; + } + } + break; + } + + return FALSE; +} +#pragma warning(pop) + +//////////////////////////////////////////////////////////////////////////////// +// +// OptItems call back for OEM document property UI. +// +LONG APIENTRY OEMDocUIItemCallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam) +{ + LONG lReturn = CPSUICB_ACTION_NONE; + POEMDEV pOEMDev = (POEMDEV) pOEMUIParam->pOEMDM; + + + VERBOSE(DLLTEXT("OEMDocUIItemCallBack() entry, Reason is %d.\r\n"), pCallbackParam->Reason); + + switch(pCallbackParam->Reason) + { + case CPSUICB_REASON_APPLYNOW: + // Store OptItems state in DEVMODE. + pOEMDev->dwAdvancedData = pOEMUIParam->pOEMOptItems[0].Sel; + break; + + case CPSUICB_REASON_KILLACTIVE: + pOEMDev->dwAdvancedData = pOEMUIParam->pOEMOptItems[0].Sel; + break; + + case CPSUICB_REASON_SETACTIVE: + if((DWORD)(pOEMUIParam->pOEMOptItems[0].Sel) != pOEMDev->dwAdvancedData) + { + pOEMUIParam->pOEMOptItems[0].Sel = pOEMDev->dwAdvancedData; + pOEMUIParam->pOEMOptItems[0].Flags |= OPTIF_CHANGED; + lReturn = CPSUICB_ACTION_OPTIF_CHANGED; + } + break; + + default: + break; + } + + return lReturn; +} + + +LONG APIENTRY OEMDocUICallBack(PCPSUICBPARAM pCallbackParam) +{ + WORD wItems = pCallbackParam->cOptItem; + LONG lReturn = CPSUICB_ACTION_NONE; + POPTITEM pOptItem = pCallbackParam->pOptItem; + PCBUSERDATA pUserData = (PCBUSERDATA) pCallbackParam->UserData; + HANDLE hHeap = pUserData->pOEMUIParam->hOEMHeap; + POEMDEV pOEMDev = (POEMDEV) pUserData->pOEMUIParam->pOEMDM; + + + VERBOSE(DLLTEXT("OEMDocUICallBack() entry, Reason is %d.\r\n"), pCallbackParam->Reason); + + // + // If user has no permission to change anything, then + // simply return without taking any action. + // + + if (!pUserData->bPermission && (pCallbackParam->Reason != CPSUICB_REASON_ABOUT)) + return CPSUICB_ACTION_NONE; + + switch(pCallbackParam->Reason) + { + case CPSUICB_REASON_APPLYNOW: + if(wItems > 0) + { + // Save feature options if hidig standard UI. + if(pUserData->bHidingStandardUI) + { + HRESULT hrResult; + + + // Save feature OPTITEMs. + hrResult = SaveFeatureOptItems(hHeap, + pUserData->pHelper, + pUserData->poemuiobj, + pCallbackParam->hDlg, + pOptItem, + wItems); + if(!SUCCEEDED(hrResult)) + { + // Return that we didn't save changes. + // NOTE: it is up to SaveFeatureOptItems() to display + // any UI for failure. + return CPSUICB_ACTION_NO_APPLY_EXIT; + } + } + + // Save OPTITEM that we explicitly added. + pOEMDev->dwDriverData = pOptItem[wItems - 1].Sel; + pUserData->pfnComPropSheet(pUserData->hComPropSheet, CPSFUNC_SET_RESULT, + (LPARAM)pUserData->hPropPage, + (LPARAM)CPSUI_OK); + + } + break; + + case CPSUICB_REASON_KILLACTIVE: + if(wItems > 0) + { + // Update OPTITEM that we explicitly added. + pOEMDev->dwDriverData = pOptItem[wItems - 1].Sel; + } + break; + + case CPSUICB_REASON_SETACTIVE: + if(wItems > 0) + { + if((DWORD)(pOptItem[wItems - 1].Sel) != pOEMDev->dwDriverData) + { + // Update OPTITEM that we explicitly added. + pOptItem[wItems - 1].Sel = pOEMDev->dwDriverData; + pOptItem[wItems - 1].Flags |= OPTIF_CHANGED; + } + } + lReturn = CPSUICB_ACTION_OPTIF_CHANGED; + break; + + default: + break; + } + + return lReturn; +} + +LONG APIENTRY OEMDevUICallBack(PCPSUICBPARAM pCallbackParam) +{ + WORD wItems = pCallbackParam->cOptItem; + LONG lReturn = CPSUICB_ACTION_NONE; + POPTITEM pOptItem = pCallbackParam->pOptItem; + PCBUSERDATA pUserData = (PCBUSERDATA) pCallbackParam->UserData; + HANDLE hHeap = pUserData->pOEMUIParam->hOEMHeap; + + + VERBOSE(DLLTEXT("OEMDevUICallBack() entry, Reason is %d.\r\n"), pCallbackParam->Reason); + + // + // If user has no permission to change anything, then + // simply return without taking any action. + // + + if (!pUserData->bPermission && (pCallbackParam->Reason != CPSUICB_REASON_ABOUT)) + return CPSUICB_ACTION_NONE; + + switch(pCallbackParam->Reason) + { + case CPSUICB_REASON_APPLYNOW: + if(wItems > 0) + { + // Save feature options if hidig standard UI. + if(pUserData->bHidingStandardUI) + { + HRESULT hrResult; + + + // Save feature OPTITEMs. + hrResult = SaveFeatureOptItems(hHeap, + pUserData->pHelper, + pUserData->poemuiobj, + pCallbackParam->hDlg, + pOptItem, + wItems); + if(!SUCCEEDED(hrResult)) + { + // Return that we didn't save changes. + // NOTE: it is up to SaveFeatureOptItems() to display + // any UI for failure. + return CPSUICB_ACTION_NO_APPLY_EXIT; + } + } + + + pUserData->pfnComPropSheet(pUserData->hComPropSheet, CPSFUNC_SET_RESULT, + (LPARAM)pUserData->hPropPage, + (LPARAM)CPSUI_OK); + } + break; + + case CPSUICB_REASON_KILLACTIVE: + break; + + case CPSUICB_REASON_SETACTIVE: + break; + + default: + break; + } + + return lReturn; +} + + + +//////////////////////////////////////////////////////////////////////////////// +// +// Creates and Initializes OptItems. +// +POPTITEM CreateOptItems(HANDLE hHeap, DWORD dwOptItems) +{ + POPTITEM pOptItems = NULL; + SIZE_T sizeOfOptItems = 0; + + // Compute the size of memory needed for the OptItems: + if (SUCCEEDED(SIZETMult(sizeof(OPTITEM), (SIZE_T)dwOptItems, &sizeOfOptItems))) + { + // Allocate memory for OptItems; + pOptItems = (POPTITEM) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeOfOptItems); + if(NULL != pOptItems) + { + InitOptItems(pOptItems, dwOptItems); + } + else + { + ERR(ERRORTEXT("CreateOptItems() failed to allocate memory for OPTITEMs!\r\n")); + } + } + else + { + ERR(ERRORTEXT("CreateOptItems() failed to compute necessary memory size for OPTITEMs!\r\n")); + } + + return pOptItems; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Initializes OptItems. +// +static void InitOptItems(POPTITEM pOptItems, DWORD dwOptItems) +{ + VERBOSE(DLLTEXT("InitOptItems() entry.\r\n")); + + // Zero out memory. + memset(pOptItems, 0, sizeof(OPTITEM) * dwOptItems); + + // Set each OptItem's size, and Public DM ID. + for(DWORD dwCount = 0; dwCount < dwOptItems; dwCount++) + { + pOptItems[dwCount].cbSize = sizeof(OPTITEM); + pOptItems[dwCount].DMPubID = DMPUB_NONE; + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Allocates and initializes OptType for OptItem. +// +POPTTYPE CreateOptType(HANDLE hHeap, WORD wOptParams) +{ + POPTTYPE pOptType = NULL; + + + VERBOSE(DLLTEXT("CreateOptType() entry.\r\n")); + + // Allocate memory from the heap for the OPTTYPE; the driver will take care of clean up. + pOptType = (POPTTYPE) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(OPTTYPE)); + if(NULL != pOptType) + { + // Initialize OPTTYPE. + pOptType->cbSize = sizeof(OPTTYPE); + pOptType->Count = wOptParams; + + // Allocate memory from the heap for the OPTPARAMs for the OPTTYPE. + pOptType->pOptParam = (POPTPARAM) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, wOptParams * sizeof(OPTPARAM)); + if(NULL != pOptType->pOptParam) + { + // Initialize the OPTPARAMs. + for(WORD wCount = 0; wCount < wOptParams; wCount++) + { + pOptType->pOptParam[wCount].cbSize = sizeof(OPTPARAM); + } + } + else + { + ERR(ERRORTEXT("CreateOptType() failed to allocated memory for OPTPARAMs!\r\n")); + + // Free allocated memory and return NULL. + HeapFree(hHeap, 0, pOptType); + pOptType = NULL; + } + } + else + { + ERR(ERRORTEXT("CreateOptType() failed to allocated memory for OPTTYPE!\r\n")); + } + + return pOptType; +} + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/oemui.h b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/oemui.h new file mode 100644 index 00000000..c00b87ef --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/oemui.h @@ -0,0 +1,33 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: OEMUI.H +// +#pragma once + + +//////////////////////////////////////////////////////// +// OEM UI Defines +//////////////////////////////////////////////////////// + +// Printer registry keys where OEM data is stored. +#define OEMUI_VALUE TEXT("OEMUI_VALUE") +#define OEMUI_DEVICE_VALUE TEXT("OEMUI_DEVICE_VALUE") + + +//////////////////////////////////////////////////////// +// Prototypes +//////////////////////////////////////////////////////// + +HRESULT hrOEMPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam); +HRESULT hrOEMDocumentPropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam, CUIHelper &Helper, CFeatures *pFeatures, + BOOL bHidingStandardUI); +HRESULT hrOEMDevicePropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam, CUIHelper &Helper, CFeatures *pFeatures, + BOOL bHidingStandardUI); + +POPTITEM CreateOptItems(HANDLE hHeap, DWORD dwOptItems); +POPTTYPE CreateOptType(HANDLE hHeap, WORD wOptParams); diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/precomp.h b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/precomp.h new file mode 100644 index 00000000..1374db76 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/precomp.h @@ -0,0 +1,55 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// PURPOSE: Header files that should be in the precompiled header. +// +#pragma once + +// Necessary for compiling under VC. +#if(!defined(WINVER) || (WINVER < 0x0500)) + #undef WINVER + #define WINVER 0x0500 +#endif +#if(!defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500)) + #undef _WIN32_WINNT + #define _WIN32_WINNT 0x0500 +#endif + + + +// Required header files that shouldn't change often. + + +#include <STDDEF.H> +#include <STDLIB.H> +#include <OBJBASE.H> +#include <STDARG.H> +#include <STDIO.H> +#include <LIMITS.H> +#include <WINDEF.H> +#include <WINERROR.H> +#include <WINBASE.H> +#include <WINGDI.H> +#include <WINDDI.H> +#include <WINSPOOL.H> +#include <TCHAR.H> +#include <EXCPT.H> +#include <ASSERT.H> +#include <PRSHT.H> +#include <COMPSTUI.H> +#include <WINDDIUI.H> +#include <PRINTOEM.H> +#include <INITGUID.H> +#include <PRCOMOEM.H> + +// Safe integer functions to detect integer overflow/underflow conditions: +#include <intsafe.h> + +// StrSafe.h needs to be included last +// to disallow unsafe string functions. +#include <STRSAFE.H> + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/precompsrc.cpp b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/precompsrc.cpp new file mode 100644 index 00000000..5944cf51 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/precompsrc.cpp @@ -0,0 +1 @@ +#include "precomp.h"
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/psuirep.def b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/psuirep.def new file mode 100644 index 00000000..eacb15a5 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/psuirep.def @@ -0,0 +1,3 @@ +LIBRARY PSUIREP +EXPORTS DllGetClassObject PRIVATE + DllCanUnloadNow PRIVATE
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/resource.h b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/resource.h new file mode 100644 index 00000000..958598da --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PSUIRep/resource.h @@ -0,0 +1,92 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by OEMUI.rc +// +#define IDS_SECTION 1 +#define IDS_CALIBRATED 2 +#define IDS_NAME 3 +#define IDS_DEVICE_SETTINGS_NAME 4 +#define IDS_CONSTRAINT_CONFLICT 5 +#define IDS_DEV_SECTION 6 +#define IDS_ADV_SECTION 10 +#define IDD_DEVICE_PROPPAGE 106 +#define IDD_DOC_PROPPAGE 107 +#define IDS_POSTSCRIPT_VM 400 +#define IDS_KBYTES 401 +#define IDS_SECONDS 402 +#define IDS_PSTIMEOUTS 403 +#define IDS_JOBTIMEOUT 404 +#define IDS_WAITTIMEOUT 405 +#define IDS_PRINTER_DEFAULT 406 +#define IDS_INSTALLABLE_OPTIONS 407 +#define IDS_DOWNLOAD_AS_SOFTFONT 408 +#define IDS_USE_DEVFONTS 409 +#define IDS_FONTSUB_OPTION 410 +#define IDS_FONTSUB_DEFAULT 411 +#define IDS_FONTSUB_SLOW 412 +#define IDS_FONTSUB_TABLE 413 +#define IDS_DEFAULT_TRAY 414 +#define IDS_DRAW_ONLY_FROM_SELECTED 415 +#define IDS_RESTORE_DEFAULTS 417 +#define IDS_PRINTER_FEATURES 418 +#define IDS_METAFILE_SPOOLING 419 +#define IDS_ENABLED 420 +#define IDS_DISABLED 421 +#define IDS_PSOPTIONS 422 +#define IDS_MIRROR 423 +#define IDS_NEGATIVE_PRINT 424 +#define IDS_PAGEINDEP 425 +#define IDS_COMPRESSBMP 426 +#define IDS_CTRLD_BEFORE 427 +#define IDS_CTRLD_AFTER 428 +#define IDS_JOB_CONTROL 429 +#define IDS_TEXT_ASGRX 431 +#define IDS_PAGE_PROTECTION 432 +#define IDS_CANCEL_CONFLICT 433 +#define IDS_IGNORE_CONFLICT 434 +#define IDS_RESOLVE_CONFLICT 435 +#define IDS_GETDATA_FAILED 436 +#define IDS_DRIVERUI_COLORMODE 437 +#define IDS_ENVELOPE 438 +#define IDS_ENV_PREFIX 439 +#define IDS_PSPROTOCOL 440 +#define IDS_PSPROTOCOL_ASCII 441 +#define IDS_PSPROTOCOL_BCP 442 +#define IDS_PSPROTOCOL_TBCP 443 +#define IDS_PSPROTOCOL_BINARY 444 +#define IDS_TRAY_FORMSOURCE 445 +#define IDS_OEMERR_DLGTITLE 446 +#define IDS_OEMERR_OPTITEM 447 +#define IDS_OEMERR_PROPSHEET 448 +#define IDS_CANCEL_CONFLICT_FINAL 449 +#define IDS_PSERROR_HANDLER 450 +#define IDS_PSMINOUTLINE 451 +#define IDS_PSMAXBITMAP 452 +#define IDS_PIXELS 453 +#define IDS_PSOUTPUT_OPTION 454 +#define IDS_PSOPT_SPEED 455 +#define IDS_PSOPT_PORTABILITY 456 +#define IDS_PSOPT_EPS 457 +#define IDS_PSOPT_ARCHIVE 458 +#define IDS_PSTT_DLFORMAT 459 +#define IDS_TTDL_DEFAULT 460 +#define IDS_TTDL_TYPE1 461 +#define IDS_TTDL_TYPE3 462 +#define IDS_TTDL_TYPE42 463 +#define IDS_PSLEVEL 471 +#define IDS_TRUE_GRAY_TEXT 507 +#define IDS_TRUE_GRAY_GRAPH 508 +#define IDS_ADD_EURO 509 +#define IDS_PSCRIPT_CUSTOMSIZE 600 +#define IDC_CALIBRATE 1001 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 103 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1002 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/install/ptpcplpr.gpd b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/install/ptpcplpr.gpd new file mode 100644 index 00000000..fa3e7864 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/install/ptpcplpr.gpd @@ -0,0 +1,763 @@ +*GPDFileName: "ptpcplpr.gpd" +*GPDFileVersion: "1.0" +*GPDSpecVersion: "1.0" +*Include: "StdNames.gpd" +*Include: "ttfsub.gpd" +*ModelName: "UniDrv PT/PC Plugin Provider" +*MasterUnits: PAIR(1200, 1200) +*ResourceDLL: "unires.dll" +*PrinterType: PAGE +*MaxCopies: 99 +*PrintRate: 16 +*PrintRateUnit: PPM +*PrintRatePPM: 16 + +*%****************************************************************************************** +*% Orientation +*%****************************************************************************************** +*Feature: Orientation +{ + *rcNameID: =ORIENTATION_DISPLAY + *DefaultOption: PORTRAIT + *Option: PORTRAIT + { + *rcNameID: =PORTRAIT_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.6 + *Cmd: "<1B>&l0O" + } + } + *Option: LANDSCAPE_CC90 + { + *rcNameID: =LANDSCAPE_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.8 + *Cmd: "<1B>&l1O" + } + } +} + +*%****************************************************************************************** +*% Input Bin +*%****************************************************************************************** +*Feature: InputBin +{ + *rcNameID: =PAPER_SOURCE_DISPLAY + *DefaultOption: AUTO + *Option: AUTO + { + *rcNameID: =AUTO_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.11 + *Cmd: "<1B>&l0H" + } + } + *Option: UPPER + { + *rcNameID: =UPPER_TRAY_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.11 + *Cmd: "<1B>&l1H" + } + } +} + +*%****************************************************************************************** +*% Resolution +*%****************************************************************************************** +*Feature: Resolution +{ + *rcNameID: =RESOLUTION_DISPLAY + *DefaultOption: Option2 + *Option: Option1 + { + *Name: "600 x 600" =DOTS_PER_INCH + *DPI: PAIR(600, 600) + *TextDPI: PAIR(600, 600) + *MinStripBlankPixels: 32 + EXTERN_GLOBAL: *StripBlanks: LIST(ENCLOSED,TRAILING) + *SpotDiameter: 100 + *Command: CmdBeginRaster { *Cmd : "<1B>*v7S<1B>*r1A" } + *Command: CmdEndRaster { *Cmd : "<1B>*rC" } + *Command: CmdSendBlockData { *Cmd : "<1B>*b" %d{NumOfDataBytes}"W" } + *Command: CmdSelect + { + *Order: DOC_SETUP.7 + *Cmd: "@PJL SET RESOLUTION=600<0A>@PJL ENTER LANGUAGE=PCL<0A0D1B>E<1B>*t600R" + } + } + *Option: Option2 + { + *Name: "300 x 300" =DOTS_PER_INCH + *DPI: PAIR(300, 300) + *TextDPI: PAIR(300, 300) + *MinStripBlankPixels: 32 + EXTERN_GLOBAL: *StripBlanks: LIST(ENCLOSED, TRAILING) + *SpotDiameter: 100 + *Command: CmdBeginRaster { *Cmd : "<1B>*v7S<1B>*r1A" } + *Command: CmdEndRaster { *Cmd : "<1B>*rC" } + *Command: CmdSendBlockData { *Cmd : "<1B>*b" %d{NumOfDataBytes}"W" } + *Command: CmdSelect + { + *Order: DOC_SETUP.7 + *Cmd: "@PJL SET RESOLUTION=300<0A>@PJL ENTER LANGUAGE=PCL<0A0D1B>E<1B>*t300R" + } + } + *Option: Option3 + { + *Name: "150 x 150" =DOTS_PER_INCH + *DPI: PAIR(150, 150) + *TextDPI: PAIR(150, 150) + *MinStripBlankPixels: 32 + EXTERN_GLOBAL: *StripBlanks: LIST(ENCLOSED, TRAILING) + *SpotDiameter: 100 + *Command: CmdBeginRaster { *Cmd : "<1B>*v7S<1B>*r1A" } + *Command: CmdEndRaster { *Cmd : "<1B>*rC" } + *Command: CmdSendBlockData { *Cmd : "<1B>*b" %d{NumOfDataBytes}"W" } + *Command: CmdSelect + { + *Order: DOC_SETUP.7 + *Cmd: "@PJL SET RESOLUTION=150<0A>@PJL ENTER LANGUAGE=PCL<0A0D1B>E<1B>*t150R" + } + } +} + +*%****************************************************************************************** +*% HP-GL/2 Graphics Support +*%****************************************************************************************** +*Ifdef: WINNT_51 +*Personality: =PERSONALITY_HPGL2 +*Feature: GraphicsMode +{ + *rcNameID: =GRAPHICSMODE_DISPLAY + *DefaultOption: RASTERMODE + *Option: HPGL2MODE + { + *rcNameID: =GRAPHICSMODE_HPGL2_DISPLAY + } + *Option: RASTERMODE + { + *rcNameID: =GRAPHICSMODE_RASTER_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.6 + *Cmd: "@PJL SET LIMAGEENHANCE=OFF<0A>" + } + } +} +*Endif: + +*%****************************************************************************************** +*% Paper Size +*%****************************************************************************************** +*Feature: PaperSize +{ + *rcNameID: =PAPER_SIZE_DISPLAY + *DefaultOption: LETTER + *Option: LETTER + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *PageProtectMem: 1028 + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(9500, 12500) + *PrintableOrigin: PAIR(400, 400) + *CursorOrigin: PAIR(300, 300) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l2a8c1E<1B>*p0x0Y<1B>*c0t5260x7704Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(9500, 12200) + *PrintableOrigin: PAIR(450, 300) + *CursorOrigin: PAIR(200, 12900) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l2a8c1E<1B>*p0x0Y<1B>*c0t7332x5880Y" + } + } + } + } + *Option: LEGAL + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *PageProtectMem: 1692 + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(9000, 15500) + *PrintableOrigin: PAIR(400, 600) + *CursorOrigin: PAIR(180, 300) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l3a8c1E<1B>*p0x0Y<1B>*c0t5880x8900Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(9000, 15500) + *PrintableOrigin: PAIR(400, 900) + *CursorOrigin: PAIR(180, 16500) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l3a8c1E<1B>*p0x0Y<1B>*c0t8900x5880Y" + } + } + } + } + *Option: EXECUTIVE + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *PageProtectMem: 4109 + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(8100, 11500) + *PrintableOrigin: PAIR(300, 300) + *CursorOrigin: PAIR(300, 200) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l1a8c1E<1B>*p0x0Y<1B>*c0t4860x7344Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(8300, 11500) + *PrintableOrigin: PAIR(200, 300) + *CursorOrigin: PAIR(200, 12300) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l1a8c1E<1B>*p0x0Y<1B>*c0t7272x4980Y" + } + } + } + } + *Option: A4 + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *PageProtectMem: 4249 + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(9100, 13200) + *PrintableOrigin: PAIR(400, 300) + *CursorOrigin: PAIR(288, 180) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l26a8c1E<1B>*p0x0Y<1B>*c0t5594x8201Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(9100, 13200) + *PrintableOrigin: PAIR(400, 300) + *CursorOrigin: PAIR(204, 13824) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l26a8c1E<1B>*p0x0Y<1B>*c0t8129x5714Y" + } + } + } + } + *Option: B5 + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *PageProtectMem: 3198 + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(7900, 11140) + *PrintableOrigin: PAIR(352, 300) + *CursorOrigin: PAIR(300, 100) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l12a8c1E<1B>*p0x0Y<1B>*c0t4970x7040Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(7760, 11140) + *PrintableOrigin: PAIR(300, 400) + *CursorOrigin: PAIR(100, 11940) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l12a8c1E<1B>*p0x0Y<1B>*c0t6780x4970Y" + } + } + } + } +} + +*%****************************************************************************************** +*% Media Type +*%****************************************************************************************** +*Feature: MediaType +{ + *rcNameID: =MEDIA_TYPE_DISPLAY + *DefaultOption: STANDARD + *Option: STANDARD + { + *rcNameID: =PLAIN_PAPER_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.15 + *Cmd: "<1B>&n6WdPlain" + } + } + *Option: CustomPhotographicPaper + { + *Name: "Photographic" + *PrintSchemaKeywordMap: "Photographic" + *Command: CmdSelect + { + *Order: DOC_SETUP.15 + *Cmd: "<1B>&n13WdPhotographic" + } + } +} + +*%****************************************************************************************** +*% Color Mode +*%****************************************************************************************** +*Feature: ColorMode +{ + *rcNameID: =COLOR_PRINTING_MODE_DISPLAY + *DefaultOption: 24bpp + *Option: Mono + { + *rcNameID: =MONO_DISPLAY + *DevNumOfPlanes: 1 + *DevBPP: 1 + *Color?: FALSE + } + *Option: Color + { + *rcNameID: =COLOR_DISPLAY + *DevNumOfPlanes: 3 + *DevBPP: 1 + *DrvBPP: 4 + EXTERN_GLOBAL: *RasterSendAllData?: TRUE + *ColorPlaneOrder: LIST(CYAN, MAGENTA, YELLOW) + *Command: CmdSendCyanData { *Cmd : "<1B>*b" %d{NumOfDataBytes}"V" } + *Command: CmdSendMagentaData { *Cmd : "<1B>*b" %d{NumOfDataBytes}"V" } + *Command: CmdSendYellowData { *Cmd : "<1B>*b" %d{NumOfDataBytes}"W" } + *Command: CmdSelectBlackColor { *Cmd : "<1B>*v7S" } + *Command: CmdSelectRedColor { *Cmd : "<1B>*v6S" } + *Command: CmdSelectGreenColor { *Cmd : "<1B>*v5S" } + *Command: CmdSelectYellowColor { *Cmd : "<1B>*v4S" } + *Command: CmdSelectBlueColor { *Cmd : "<1B>*v3S" } + *Command: CmdSelectMagentaColor { *Cmd : "<1B>*v2S" } + *Command: CmdSelectCyanColor { *Cmd : "<1B>*v1S" } + *Command: CmdSelectWhiteColor { *Cmd : "<1B>*v0S" } + *Command: CmdSelect + { + *Order: PAGE_SETUP.16 + *Cmd: "<1B>*r-3U" + } + } + *Option: 8bpp + { + *rcNameID: =8BPP_DISPLAY + *DevNumOfPlanes: 1 + *DevBPP: 8 + *DrvBPP: 8 + *PaletteSize: 256 + *PaletteProgrammable? : TRUE + *Command: CmdDefinePaletteEntry { *Cmd : "<1B>*v" %d{RedValue}"a" %d{GreenValue}"b" %d{BlueValue}"c" ++ %d{PaletteIndexToProgram} "I" } + *Command: CmdSelectPaletteEntry { *Cmd : "<1B>*v" %d{CurrentPaletteIndex}"S" } + *Command: CmdSelect + { + *Order: PAGE_SETUP.16 + *Cmd: "<1B>*v1N<1B>*v1O<1B>*t0I<1B>*l184O<1B>*v6W<000108080808>" + } + } + *Option: 24bpp + { + *rcNameID: =24BPP_DISPLAY + *DevNumOfPlanes: 1 + *DevBPP: 24 + *DrvBPP: 24 + *Command: CmdEnableDRC { *Cmd : "<1B>*b3M" } + *PaletteSize: 256 + *PaletteProgrammable? : TRUE + *Command: CmdDefinePaletteEntry { *Cmd : "<1B>*v" %d{RedValue}"a" %d{GreenValue}"b" %d{BlueValue}"c" ++ %d{PaletteIndexToProgram} "I" } + *Command: CmdSelectPaletteEntry { *Cmd : "<1B>*v" %d{CurrentPaletteIndex}"S" } + *Command: CmdSetSrcBmpWidth { *Cmd : "<1B>*r" %d{RasterDataWidthInBytes / 3}"S" } + *Command: CmdSelect + { + *Order: PAGE_SETUP.16 + *Cmd: "<1B>*v1N<1B>*v1O<1B>*l184O<1B>*v6W<0003080808081B>*v0a0b0c7i255a255b255c0I<1B>*" ++ "o3W<060400>" + } + } +} + +*%****************************************************************************************** +*% HalfTone +*%****************************************************************************************** +*Feature: Halftone +{ + *rcNameID: =HALFTONING_DISPLAY + *DefaultOption: HT_PATSIZE_AUTO + *Option: HT_PATSIZE_AUTO + { + *rcNameID: =HT_AUTO_SELECT_DISPLAY + } + *Option: HT_PATSIZE_SUPERCELL_M + { + *rcNameID: =HT_SUPERCELL_DISPLAY + } + *Option: HT_PATSIZE_6x6_M + { + *rcNameID: =HT_DITHER6X6_DISPLAY + } + *Option: HT_PATSIZE_8x8_M + { + *rcNameID: =HT_DITHER8X8_DISPLAY + } +} + +*%****************************************************************************************** +*% Memory +*% +*% Note: Unidrv uses the font memory information to estimate when it needs to stop +*% downloading fonts for a page, and thus driver writers should err on the conservative +*% side. Otherwise, printers will generate "out of memory" device errors for pages with +*% a large number of fonts / unique glyphs. +*%****************************************************************************************** +*Feature: Memory +{ + *rcNameID: =PRINTER_MEMORY_DISPLAY + *DefaultOption: 32768KB + *Option: 4096KB + { + *Name: "4MB" + *MemoryConfigKB: PAIR(4096, 6750) + } + *Option: 8192KB + { + *Name: "8MB" + *MemoryConfigKB: PAIR(8192, 10350) + } + *Option: 16384KB + { + *Name: "16MB" + *MemoryConfigKB: PAIR(16384, 13950) + } + *Option: 24576KB + { + *Name: "24MB" + *MemoryConfigKB: PAIR(24576, 21150) + } + *Option: 32768KB + { + *Name: "32MB" + *MemoryConfigKB: PAIR(32768, 28350) + } + *Option: 49152KB + { + *Name: "48MB" + *MemoryConfigKB: PAIR(49152, 43050) + } + *Option: 65536KB + { + *Name: "64MB" + *MemoryConfigKB: PAIR(65536, 57150) + } + *Option: 98304KB + { + *Name: "96MB" + *MemoryConfigKB: PAIR(98304, 85950) + } + *Option: 102400KB + { + *Name: "100MB" + *MemoryConfigKB: PAIR(102400, 89700) + } + *Option: 114688KB + { + *Name: "112MB" + *MemoryConfigKB: PAIR(114688, 100550) + } + *Option: 131072KB + { + *Name: "128MB" + *MemoryConfigKB: PAIR(131072, 116250) + } +} + +*%****************************************************************************************** +*% Duplex Unit +*%****************************************************************************************** +*Feature: DuplexUnit +{ + *rcNameID: 429 + *FeatureType: PRINTER_PROPERTY + *DefaultOption: FALSE + *Option: FALSE + { + *rcNameID: 444 + *DisabledFeatures: LIST(Duplex.VERTICAL, Duplex.HORIZONTAL) + } + *Option: TRUE + { + *rcNameID: 443 + } +} + +*%****************************************************************************************** +*% Duplex Type +*%****************************************************************************************** +*Feature: Duplex +{ + *rcNameID: =TWO_SIDED_PRINTING_DISPLAY + *DefaultOption: NONE + *Option: NONE + { + *rcNameID: =NONE_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.9 + *Cmd: "<1B>&l0S" + } + } + *Option: VERTICAL + { + *rcNameID: =FLIP_ON_LONG_EDGE_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.9 + *Cmd: "<1B>&l1S" + } + } + *Option: HORIZONTAL + { + *rcNameID: =FLIP_ON_SHORT_EDGE_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.9 + *Cmd: "<1B>&l2S" + } + } +} + +*%****************************************************************************************** +*% Page Photo Printing Intent +*%****************************************************************************************** +*Feature: PhotoPrintingIntent +{ + *Name: "Photo Printing Intent" + *PrintSchemaKeywordMap: "PagePhotoPrintingIntent" + *DefaultOption: None + *Option: None + { + *Name: "None" + *PrintSchemaKeywordMap: "None" + } + *Option: Draft + { + *Name: "Draft" + *PrintSchemaKeywordMap: "PhotoDraft" + } + *Option: Standard + { + *Name: "Standard" + *PrintSchemaKeywordMap: "PhotoStandard" + } + *Option: Best + { + *Name: "Best" + *PrintSchemaKeywordMap: "PhotoBest" + } +} + + +*Feature: OutputQuality +{ + *Name: "Page Output Quality" + *PrintSchemaKeywordMap: "PageOutputQuality" + *DefaultOption: None + *Option: None + { + *Name: "None" + *PrintSchemaKeywordMap: "None" + } + *Option: Draft + { + *Name: "Draft" + *PrintSchemaKeywordMap: "Draft" + } + *Option: High + { + *Name: "High" + *PrintSchemaKeywordMap: "High" + } + *Option: Photographic + { + *Name: "Photographic" + *PrintSchemaKeywordMap: "Photographic" + } +} + +*%****************************************************************************************** +*% Page Protect +*%****************************************************************************************** +*Feature: PageProtect +{ + *rcNameID: =PAGE_PROTECTION_DISPLAY + *DefaultOption: OFF + *Option: ON + { + *rcNameID: =ON_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.1 + *Cmd: "<1B>%%-12345X@PJL SET PAGEPROTECT=LETTER<0A>" + } + } + *Option: OFF + { + *rcNameID: =OFF_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.1 + *Cmd: "<1B>%%-12345X@PJL SET PAGEPROTECT=OFF<0A>" + } + } +} + +*%****************************************************************************************** +*% Doc setup commands +*%****************************************************************************************** +*Command: CmdStartDoc +{ + *Order: DOC_SETUP.7 + *Cmd: "<1B>&u1200D<1B>*r0F" +} +*Command: CmdStartPage +{ + *Order: PAGE_SETUP.1 + *Cmd: "<1B>*b0M<0D>" +} +*Command: CmdEndJob +{ + *Order: JOB_FINISH.1 + *Cmd: "<1B>E<1B>%%-12345X@PJL<20>LPORTROTATE<0A><1B>%%-12345X" +} +*Command: CmdCopies +{ + *Order: DOC_SETUP.13 + *Cmd: "<1B>&l" %d{NumOfCopies}"X" +} + +*%****************************************************************************************** +*% Cursor, Page and Color Commands +*%****************************************************************************************** +*RotateCoordinate?: TRUE +*RotateRaster?: TRUE +*RotateFont?: TRUE +*TextCaps: LIST(TC_CR_90,TC_UA_ABLE) +*MemoryUsage: LIST(FONT, RASTER, VECTOR) +*CursorXAfterCR: AT_PRINTABLE_X_ORIGIN +*BadCursorMoveInGrxMode: LIST(X_PORTRAIT,Y_LANDSCAPE) +*XMoveThreshold: 0 +*YMoveThreshold: 0 +*XMoveUnit: 300 +*YMoveUnit: 300 +*Command: CmdXMoveAbsolute { *Cmd : "<1B>*p" %d{(DestX) }"X" } +*Command: CmdXMoveRelRight { *Cmd : "<1B>*p+" %d[0,9600]{max_repeat((DestXRel) )}"X" } +*Command: CmdXMoveRelLeft { *Cmd : "<1B>*p-" %d[0,9600]{max_repeat((DestXRel) )}"X" } +*Command: CmdYMoveAbsolute { *Cmd : "<1B>*p" %d{(DestY) }"Y" } +*Command: CmdYMoveRelDown { *Cmd : "<1B>*p+" %d{(DestYRel) }"Y" } +*Command: CmdYMoveRelUp { *Cmd : "<1B>*p-" %d{(DestYRel) }"Y" } +*Command: CmdDefinePaletteEntry { *Cmd : "<1B>*v" %d{RedValue}"a" %d{GreenValue}"b" %d{BlueValue}"c" ++ %d{PaletteIndexToProgram} "I" } +*Command: CmdSelectPaletteEntry { *Cmd : "<1B>*v" %d{CurrentPaletteIndex}"S" } +*Command: CmdCR { *Cmd : "<0D>" } +*Command: CmdLF { *Cmd : "<0A>" } +*Command: CmdFF { *Cmd : "<0C>" } +*Command: CmdBackSpace { *Cmd : "<08>" } +*Command: CmdUniDirectionOn { *Cmd : "<00>" } +*Command: CmdUniDirectionOff { *Cmd : "<00>" } +*Command: CmdPushCursor { *Cmd : "<1B>&f0S" } +*Command: CmdPopCursor { *Cmd : "<1B>&f1S" } +*Command: CmdSetSimpleRotation { *Cmd : "<1B>&a" %d{PrintDirInCCDegrees}"P" } +*EjectPageWithFF?: TRUE +*Command: CmdEnableTIFF4 { *Cmd : "<1B>*b2M" } +*Command: CmdDisableCompression { *Cmd : "<1B>*b0M" } +*OutputDataFormat: H_BYTE +*OptimizeLeftBound?: TRUE +*CursorXAfterSendBlockData: AT_GRXDATA_ORIGIN +*CursorYAfterSendBlockData: AUTO_INCREMENT + +*%****************************************************************************************** +*% Font Descriptions and Commands +*%****************************************************************************************** +*TTFSEnabled?: TRUE +*DefaultFont: 136 +*DefaultCTT: 0 +*CharPosition: BASELINE +*DeviceFonts: LIST(136,138,146,147,148,149,150,151,152,153,154,155,156,157, ++ 163,164,165,166,196,197,198,199,200,201,202,203,209,210, ++ 211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226, ++ 227,228,229,230) +*MinFontID: 16534 +*MaxFontID: 32768 +*switch: Resolution +{ + *case: Option1 + { + *FontFormat: HPPCL_OUTLINE + } + *case: Option2 + { + *FontFormat: HPPCL_OUTLINE + } + *case: Option3 + { + *FontFormat: HPPCL_RES + } +} +*Command: CmdSetFontID { *Cmd : "<1B>*c" %d{NextFontID}"D" } +*Command: CmdSelectFontID { *Cmd : "<1B>(" %d{CurrentFontID}"X" } +*Command: CmdSetCharCode { *Cmd : "<1B>*c" %d{NextGlyph}"E" } +*Command: CmdUnderlineOn { *Cmd : "<1B>&dD" } +*Command: CmdUnderlineOff { *Cmd : "<1B>&d@" } +*Command: CmdWhiteTextOn { *Cmd : "<1B>*v1o1T" } +*Command: CmdWhiteTextOff { *Cmd : "<1B>*v0o0T" } + + +*%******************************************************************************************** +*%* Vector Commands. +*%******************************************************************************************** +*MinGrayFill: 1 +*MaxGrayFill: 100 +*Command: CmdSetRectWidth { *Cmd : "<1B>*c" %d{(RectXSize) }"A" } +*Command: CmdSetRectHeight { *Cmd : "<1B>*c" %d{(RectYSize) }"B" } +*Command: CmdRectGrayFill { *Cmd : "<1B>*c" %d{GrayPercentage }"g2P" } +*Command: CmdRectWhiteFill { *Cmd : "<1B>*c1P" } +*Command: CmdRectBlackFill { *Cmd : "<1B>*c0P" } diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/install/ptpcplpr.inf b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/install/ptpcplpr.inf new file mode 100644 index 00000000..c778b454 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/install/ptpcplpr.inf @@ -0,0 +1,107 @@ +; PTPCPlPr.INF +; +; INF file for OEM DLL PT/PC Plugin Provider sample +; +; Copyright 2001-2005 Microsoft Corporation + +[Version] +Signature="$Windows NT$" +Provider=%MS% +LayoutFile=ntprint.inf +ClassGUID={4D36E979-E325-11CE-BFC1-08002BE10318} +Class=Printer +DriverVer=09/09/2005,1.0.0.2 + +; +; Manufacturer section. +; +; This section lists all of the manufacturers +; that we will display in the Dialog box +; +[Manufacturer] +"Microsoft"=Microsoft, NTx86, NTamd64, NTia64 + +; +; Model sections. +; +; Each section here corresponds with an entry listed in the +; [Manufacturer] section, above. The models will be displayed in the order +; that they appear in the INF file. +; + +[Microsoft] +"UniDrv PT/PC Plugin Provider" = PTPCPLPR + +[Microsoft.NTx86] +"UniDrv PT/PC Plugin Provider" = PTPCPLPR + +[Microsoft.NTamd64] +"UniDrv PT/PC Plugin Provider" = PTPCPLPR + +[Microsoft.NTia64] +"UniDrv PT/PC Plugin Provider" = PTPCPLPR + +; +; Installer Sections +; +; These sections control file installation, and reference all files that +; need to be copied. The section name will be assumed to be the driver +; file, unless there is an explicit DriverFile section listed. +; + +[PTPCPLPR] +DataFile=PTPCPLPR.GPD +DataSection=UNIDRV_DATA +Include=NTPRINT.INF +Needs=UNIDRV.OEM,UNIDRV_DATA,TTFSUB.OEM + + +; Copy Sections +; +; Lists of files that are actually copied. These sections are referenced +; from the installer sections, above. Only create a section if it contains +; two or more files (if we only copy a single file, identify it in the +; installer section, using the @filename notation) or if it's a color +; profile (since the DestinationDirs can only handle sections, and not +; individual files). +; + +; Nothing needed here + +; +; Location of source files not in Layout.inf. +; + +[SourceDisksNames] +100 = %OEMIntentSample% + +[SourceDisksFiles.X86] +PTPCPLPR.DLL = 100,x86 + +[SourceDisksFiles.amd64] +PTPCPLPR.DLL = 100,amd64 + +[SourceDisksFiles.IA64] +PTPCPLPR.DLL = 100,ia64 + +[SourceDisksFiles] +PTPCPLPR.GPD = 100 +PTPCPLPR.INI = 100 + +; +; Call SetupSetDirectoryId with 66000 to set the target directory at runtime +; (depending on which environment drivers are getting installed) +; + +[DestinationDirs] +DefaultDestDir=66000 + +; +; Localizable Strings +; +[Strings] +MS="Microsoft DDK Sample" +OEMIntentSample="UniDrv PT/PC Plugin Provider" diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/install/ptpcplpr.ini b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/install/ptpcplpr.ini new file mode 100644 index 00000000..5535181a --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/install/ptpcplpr.ini @@ -0,0 +1,3 @@ +[OEMFiles] +OEMConfigFile1=PTPCPLPR.DLL + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/PTPCPLPR.vcxproj b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/PTPCPLPR.vcxproj new file mode 100644 index 00000000..33380c3f --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/PTPCPLPR.vcxproj @@ -0,0 +1,904 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Win10 Debug|ARM64"> + <Configuration>Win10 Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|Win32"> + <Configuration>Win10 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|x64"> + <Configuration>Win10 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|ARM64"> + <Configuration>Win10 Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|Win32"> + <Configuration>Win10 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|x64"> + <Configuration>Win10 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|Win32"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|Win32"> + <Configuration>Win8 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|Win32"> + <Configuration>Win7 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|Win32"> + <Configuration>Win8.1 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|Win32"> + <Configuration>Win8 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|Win32"> + <Configuration>Win7 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|x64"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|x64"> + <Configuration>Win8 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|x64"> + <Configuration>Win7 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|x64"> + <Configuration>Win8.1 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|x64"> + <Configuration>Win8 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|x64"> + <Configuration>Win7 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{CED613CF-6666-43FC-9414-02AFBDA83A34}</ProjectGuid> + <RootNamespace>$(MSBuildProjectName)</RootNamespace> + <Configuration Condition="'$(Configuration)' == ''">Win10 Debug</Configuration> + <Platform Condition="'$(Platform)' == ''">Win32</Platform> + <SampleGuid>{77D353B7-7DE8-4AB3-A89C-86F5EB1FC56C}</SampleGuid> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <PropertyGroup> + <OutDir>$(IntDir)</OutDir> + </PropertyGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ItemGroup Label="WrappedTaskItems" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetName>PTPCPLPR</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetName>PTPCPLPR</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetName>PTPCPLPR</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <TargetName>PTPCPLPR</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <TargetName>PTPCPLPR</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetName>PTPCPLPR</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetName>PTPCPLPR</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetName>PTPCPLPR</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <TargetName>PTPCPLPR</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <TargetName>PTPCPLPR</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetName>PTPCPLPR</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetName>PTPCPLPR</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetName>PTPCPLPR</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <TargetName>PTPCPLPR</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetName>PTPCPLPR</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetName>PTPCPLPR</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetName>PTPCPLPR</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <TargetName>PTPCPLPR</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;msxml6.lib;uuid.lib</AdditionalDependencies> + <ModuleDefinitionFile>PTPCPLPR.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;msxml6.lib;uuid.lib</AdditionalDependencies> + <ModuleDefinitionFile>PTPCPLPR.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;msxml6.lib;uuid.lib</AdditionalDependencies> + <ModuleDefinitionFile>PTPCPLPR.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;msxml6.lib;uuid.lib</AdditionalDependencies> + <ModuleDefinitionFile>PTPCPLPR.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;msxml6.lib;uuid.lib</AdditionalDependencies> + <ModuleDefinitionFile>PTPCPLPR.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;msxml6.lib;uuid.lib</AdditionalDependencies> + <ModuleDefinitionFile>PTPCPLPR.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;msxml6.lib;uuid.lib</AdditionalDependencies> + <ModuleDefinitionFile>PTPCPLPR.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;msxml6.lib;uuid.lib</AdditionalDependencies> + <ModuleDefinitionFile>PTPCPLPR.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;msxml6.lib;uuid.lib</AdditionalDependencies> + <ModuleDefinitionFile>PTPCPLPR.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;msxml6.lib;uuid.lib</AdditionalDependencies> + <ModuleDefinitionFile>PTPCPLPR.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;msxml6.lib;uuid.lib</AdditionalDependencies> + <ModuleDefinitionFile>PTPCPLPR.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;msxml6.lib;uuid.lib</AdditionalDependencies> + <ModuleDefinitionFile>PTPCPLPR.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;msxml6.lib;uuid.lib</AdditionalDependencies> + <ModuleDefinitionFile>PTPCPLPR.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;msxml6.lib;uuid.lib</AdditionalDependencies> + <ModuleDefinitionFile>PTPCPLPR.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;msxml6.lib;uuid.lib</AdditionalDependencies> + <ModuleDefinitionFile>PTPCPLPR.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;msxml6.lib;uuid.lib</AdditionalDependencies> + <ModuleDefinitionFile>PTPCPLPR.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;msxml6.lib;uuid.lib</AdditionalDependencies> + <ModuleDefinitionFile>PTPCPLPR.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;PLUGIN_PRINTTICKET</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;msxml6.lib;uuid.lib</AdditionalDependencies> + <ModuleDefinitionFile>PTPCPLPR.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="dllentry.cxx"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.hxx</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.hxx.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="globals.cxx"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.hxx</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.hxx.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="intrface.cxx"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.hxx</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.hxx.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="oemptprovider.cxx"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.hxx</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.hxx.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.hxx</PreCompiledHeaderFile> + <PreCompiledHeader>Create</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.hxx.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="printschema.cxx"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.hxx</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.hxx.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="xmlhandler.cxx"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.hxx</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.hxx.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ResourceCompile Include="PTPCPlPr.rc" /> + </ItemGroup> + <ItemGroup> + <Inf Exclude="@(Inf)" Include="*.inf" /> + <FilesToPackage Include="$(TargetPath)" Condition="'$(ConfigurationType)'=='Driver' or '$(ConfigurationType)'=='DynamicLibrary'" /> + </ItemGroup> + <ItemGroup> + <None Exclude="@(None)" Include="*.txt;*.htm;*.html" /> + <None Exclude="@(None)" Include="*.ico;*.cur;*.bmp;*.dlg;*.rct;*.gif;*.jpg;*.jpeg;*.wav;*.jpe;*.tiff;*.tif;*.png;*.rc2" /> + <None Exclude="@(None)" Include="*.def;*.bat;*.hpj;*.asmx" /> + </ItemGroup> + <ItemGroup> + <ClInclude Exclude="@(ClInclude)" Include="*.h;*.hpp;*.hxx;*.hm;*.inl;*.xsd" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/PTPCPLPR.vcxproj.Filters b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/PTPCPLPR.vcxproj.Filters new file mode 100644 index 00000000..abd9c1c0 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/PTPCPLPR.vcxproj.Filters @@ -0,0 +1,272 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;*</Extensions> + <UniqueIdentifier>{968C24E3-F5FE-4473-9D02-E46A409462B6}</UniqueIdentifier> + </Filter> + <Filter Include="Header Files"> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + <UniqueIdentifier>{D7302931-5FEA-4B5A-B5B1-7B1938023A9E}</UniqueIdentifier> + </Filter> + <Filter Include="Resource Files"> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms;man;xml</Extensions> + <UniqueIdentifier>{1475CB34-56B8-45D0-9740-D86566D868E6}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClCompile Include="dllentry.cxx"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="globals.cxx"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="intrface.cxx"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="oemptprovider.cxx"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="printschema.cxx"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="xmlhandler.cxx"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="debug.hxx"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="globals.hxx" /> + <ClInclude Include="intrface.hxx" /> + <ClInclude Include="oem.hxx" /> + <ClInclude Include="oemptprovider.hxx" /> + <ClInclude Include="precomp.hxx" /> + <ClInclude Include="printschema.hxx" /> + <ClInclude Include="xmlhandler.hxx" /> + <ClInclude Include="debug.hxx"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="globals.hxx" /> + <ClInclude Include="intrface.hxx" /> + <ClInclude Include="oem.hxx" /> + <ClInclude Include="oemptprovider.hxx" /> + <ClInclude Include="precomp.hxx" /> + <ClInclude Include="printschema.hxx" /> + <ClInclude Include="xmlhandler.hxx" /> + <ClInclude Include="debug.hxx"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="globals.hxx" /> + <ClInclude Include="intrface.hxx" /> + <ClInclude Include="oem.hxx" /> + <ClInclude Include="oemptprovider.hxx" /> + <ClInclude Include="precomp.hxx" /> + <ClInclude Include="printschema.hxx" /> + <ClInclude Include="xmlhandler.hxx" /> + <ClInclude Include="debug.hxx"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="globals.hxx" /> + <ClInclude Include="intrface.hxx" /> + <ClInclude Include="oem.hxx" /> + <ClInclude Include="oemptprovider.hxx" /> + <ClInclude Include="precomp.hxx" /> + <ClInclude Include="printschema.hxx" /> + <ClInclude Include="xmlhandler.hxx" /> + <ClInclude Include="debug.hxx"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="globals.hxx" /> + <ClInclude Include="intrface.hxx" /> + <ClInclude Include="oem.hxx" /> + <ClInclude Include="oemptprovider.hxx" /> + <ClInclude Include="precomp.hxx" /> + <ClInclude Include="printschema.hxx" /> + <ClInclude Include="xmlhandler.hxx" /> + <ClInclude Include="debug.hxx"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="globals.hxx" /> + <ClInclude Include="intrface.hxx" /> + <ClInclude Include="oem.hxx" /> + <ClInclude Include="oemptprovider.hxx" /> + <ClInclude Include="precomp.hxx" /> + <ClInclude Include="printschema.hxx" /> + <ClInclude Include="xmlhandler.hxx" /> + <ClInclude Include="debug.hxx"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="globals.hxx" /> + <ClInclude Include="intrface.hxx" /> + <ClInclude Include="oem.hxx" /> + <ClInclude Include="oemptprovider.hxx" /> + <ClInclude Include="precomp.hxx" /> + <ClInclude Include="printschema.hxx" /> + <ClInclude Include="xmlhandler.hxx" /> + <ClInclude Include="debug.hxx"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="globals.hxx" /> + <ClInclude Include="intrface.hxx" /> + <ClInclude Include="oem.hxx" /> + <ClInclude Include="oemptprovider.hxx" /> + <ClInclude Include="precomp.hxx" /> + <ClInclude Include="printschema.hxx" /> + <ClInclude Include="xmlhandler.hxx" /> + <ClInclude Include="debug.hxx"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="globals.hxx" /> + <ClInclude Include="intrface.hxx" /> + <ClInclude Include="oem.hxx" /> + <ClInclude Include="oemptprovider.hxx" /> + <ClInclude Include="precomp.hxx" /> + <ClInclude Include="printschema.hxx" /> + <ClInclude Include="xmlhandler.hxx" /> + <ClInclude Include="debug.hxx"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="globals.hxx" /> + <ClInclude Include="intrface.hxx" /> + <ClInclude Include="oem.hxx" /> + <ClInclude Include="oemptprovider.hxx" /> + <ClInclude Include="precomp.hxx" /> + <ClInclude Include="printschema.hxx" /> + <ClInclude Include="xmlhandler.hxx" /> + <ClInclude Include="debug.hxx"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="globals.hxx" /> + <ClInclude Include="intrface.hxx" /> + <ClInclude Include="oem.hxx" /> + <ClInclude Include="oemptprovider.hxx" /> + <ClInclude Include="precomp.hxx" /> + <ClInclude Include="printschema.hxx" /> + <ClInclude Include="xmlhandler.hxx" /> + <ClInclude Include="debug.hxx"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="globals.hxx" /> + <ClInclude Include="intrface.hxx" /> + <ClInclude Include="oem.hxx" /> + <ClInclude Include="oemptprovider.hxx" /> + <ClInclude Include="precomp.hxx" /> + <ClInclude Include="printschema.hxx" /> + <ClInclude Include="xmlhandler.hxx" /> + <ClInclude Include="debug.hxx"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="globals.hxx" /> + <ClInclude Include="intrface.hxx" /> + <ClInclude Include="oem.hxx" /> + <ClInclude Include="oemptprovider.hxx" /> + <ClInclude Include="precomp.hxx" /> + <ClInclude Include="printschema.hxx" /> + <ClInclude Include="xmlhandler.hxx" /> + <ClInclude Include="debug.hxx"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="globals.hxx" /> + <ClInclude Include="intrface.hxx" /> + <ClInclude Include="oem.hxx" /> + <ClInclude Include="oemptprovider.hxx" /> + <ClInclude Include="precomp.hxx" /> + <ClInclude Include="printschema.hxx" /> + <ClInclude Include="xmlhandler.hxx" /> + <ClInclude Include="debug.hxx"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="globals.hxx" /> + <ClInclude Include="intrface.hxx" /> + <ClInclude Include="oem.hxx" /> + <ClInclude Include="oemptprovider.hxx" /> + <ClInclude Include="precomp.hxx" /> + <ClInclude Include="printschema.hxx" /> + <ClInclude Include="xmlhandler.hxx" /> + <ClInclude Include="debug.hxx"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="globals.hxx" /> + <ClInclude Include="intrface.hxx" /> + <ClInclude Include="oem.hxx" /> + <ClInclude Include="oemptprovider.hxx" /> + <ClInclude Include="precomp.hxx" /> + <ClInclude Include="printschema.hxx" /> + <ClInclude Include="xmlhandler.hxx" /> + <ClInclude Include="debug.hxx"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="globals.hxx" /> + <ClInclude Include="intrface.hxx" /> + <ClInclude Include="oem.hxx" /> + <ClInclude Include="oemptprovider.hxx" /> + <ClInclude Include="precomp.hxx" /> + <ClInclude Include="printschema.hxx" /> + <ClInclude Include="xmlhandler.hxx" /> + <ClInclude Include="debug.hxx"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="globals.hxx" /> + <ClInclude Include="intrface.hxx" /> + <ClInclude Include="oem.hxx" /> + <ClInclude Include="oemptprovider.hxx" /> + <ClInclude Include="precomp.hxx" /> + <ClInclude Include="printschema.hxx" /> + <ClInclude Include="xmlhandler.hxx" /> + <ClInclude Include="debug.hxx"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="globals.hxx" /> + <ClInclude Include="intrface.hxx" /> + <ClInclude Include="oem.hxx" /> + <ClInclude Include="oemptprovider.hxx" /> + <ClInclude Include="precomp.hxx" /> + <ClInclude Include="printschema.hxx" /> + <ClInclude Include="xmlhandler.hxx" /> + <ClInclude Include="debug.hxx"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="globals.hxx" /> + <ClInclude Include="intrface.hxx" /> + <ClInclude Include="oem.hxx" /> + <ClInclude Include="oemptprovider.hxx" /> + <ClInclude Include="precomp.hxx" /> + <ClInclude Include="printschema.hxx" /> + <ClInclude Include="xmlhandler.hxx" /> + <ClInclude Include="debug.hxx"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="globals.hxx" /> + <ClInclude Include="intrface.hxx" /> + <ClInclude Include="oem.hxx" /> + <ClInclude Include="oemptprovider.hxx" /> + <ClInclude Include="precomp.hxx" /> + <ClInclude Include="printschema.hxx" /> + <ClInclude Include="xmlhandler.hxx" /> + <ClInclude Include="debug.hxx"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="globals.hxx" /> + <ClInclude Include="intrface.hxx" /> + <ClInclude Include="oem.hxx" /> + <ClInclude Include="oemptprovider.hxx" /> + <ClInclude Include="precomp.hxx" /> + <ClInclude Include="printschema.hxx" /> + <ClInclude Include="xmlhandler.hxx" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="PTPCPlPr.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> + <ItemGroup> + <None Include="ptpcplpr.def"> + <Filter>Source Files</Filter> + </None> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/debug.hxx b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/debug.hxx new file mode 100644 index 00000000..877fd6e3 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/debug.hxx @@ -0,0 +1,82 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1996 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Debug.hxx +// +// PURPOSE: Define common data types, and external function prototypes +// for debugging functions. Also defines the various debug macros. +// +// + +#pragma once + +///////////////////////////////////////////////////////// +// Macros +///////////////////////////////////////////////////////// +// +// These macros are used for debugging purposes. They expand +// to white spaces on a free build. Here is a brief description +// of what they do and how they are used: +// +// giDebugLevel +// Global variable which set the current debug level to control +// the amount of debug messages emitted. +// +// WARNING(msg) +// Display a message if the current debug level is <= DBG_WARNING. +// The message format is: WRN filename (linenumber): message +// +// ERR(msg) +// Similiar to WARNING macro above - displays a message +// if the current debug level is <= DBG_ERROR. +// +// ASSERT(cond) +// Verify a condition is true. If not, force a breakpoint. +// +// RIP(msg) +// Display a message and force a breakpoint. +// +// Usage: +// WARNING("App passed NULL pointer, ignoring...\n"); +// + +#define DBG_VERBOSE 0 +#define DBG_WARNING 1 +#define DBG_ERROR 2 +#define DBG_NONE 3 + +// VC and Build use different debug defines. +#if defined (DBG) || defined (_DEBUG) + + // __declspec(selectany) ensures that even if this is defined in multiple compilation + // modules, they will all resolve to the same symbol in the linked DLL + __declspec(selectany) INT giDebugLevel = 2; + + #define STRINGIZE(x) #x + #define QUOTE(x) STRINGIZE(x) + #define FILE_AND_LINE __FILE__ "@" QUOTE(__LINE__) + + #define VERBOSE(msg) { if(giDebugLevel <= DBG_VERBOSE) OutputDebugStringA( FILE_AND_LINE ": " msg); } + #define WARNING(msg) { if(giDebugLevel <= DBG_WARNING) OutputDebugStringA( FILE_AND_LINE ": Warning: " msg); } + #define ERR(msg) { if(giDebugLevel <= DBG_ERROR) OutputDebugStringA(FILE_AND_LINE ": Error:" msg); } + #define ASSERT(cond) { if (!(cond)) RIP("\n"); } + #define RIP(msg) { OutputDebugStringA(FILE_AND_LINE ": Error (not recoverable): " msg); DebugBreak(); } + +#else // !DBG + + #define VERBOSE(msg) + #define WARNING(msg) + #define ERR(msg) + #define ASSERT(cond) + #define RIP(msg) + +#endif + + + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/dllentry.cxx b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/dllentry.cxx new file mode 100644 index 00000000..4934dfc2 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/dllentry.cxx @@ -0,0 +1,48 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2005 Microsoft Corporation. All Rights Reserved. +// +// FILE: dllentry.cxx +// +// PURPOSE: Source module for DLL entry function(s). +// + +#include "precomp.hxx" +#include "oem.hxx" +#include "debug.hxx" +#include "globals.hxx" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +/////////////////////////////////////////////////////////// +// +// DLL entry point +// +BOOL WINAPI DllMain(HINSTANCE hInst, WORD wReason, LPVOID ) +{ + switch(wReason) + { + case DLL_PROCESS_ATTACH: + VERBOSE(DLLTEXT("Process attach.\r\n")); + ghInstance = hInst; + break; + + case DLL_THREAD_ATTACH: + VERBOSE(DLLTEXT("Thread attach.\r\n")); + break; + + case DLL_PROCESS_DETACH: + VERBOSE(DLLTEXT("Process detach.\r\n")); + break; + + case DLL_THREAD_DETACH: + VERBOSE(DLLTEXT("Thread detach.\r\n")); + break; + } + + return TRUE; +} diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/globals.cxx b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/globals.cxx new file mode 100644 index 00000000..75abea62 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/globals.cxx @@ -0,0 +1,21 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2005 Microsoft Corporation. All Rights Reserved. +// +// FILE: globals.cxx +// + +#include "precomp.hxx" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +/////////////////////////////////////// +// Globals +/////////////////////////////////////// + +// Module's Instance handle from DLLEntry of process. +HINSTANCE ghInstance = NULL; diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/globals.hxx b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/globals.hxx new file mode 100644 index 00000000..72f3aa11 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/globals.hxx @@ -0,0 +1,25 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2005 Microsoft Corporation. All Rights Reserved. +// +// FILE: globals.hxx +// + +#pragma once + +// +// Maximum string length limit for STRSAFE string length function StringCchLength +// Must be less than or equal to maximum upper bound on string length defined by STRSAFE +// library ie STRSAFE_MAX_CCH +// +#define STR_MAX_CCH 10000 + +/////////////////////////////////////// +// Globals +/////////////////////////////////////// + +// Module's Instance handle from DLLEntry of process. +extern HINSTANCE ghInstance; diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/intrface.cxx b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/intrface.cxx new file mode 100644 index 00000000..3d6f3b90 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/intrface.cxx @@ -0,0 +1,493 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2005 Microsoft Corporation. All Rights Reserved. +// +// FILE: intrface.cxx +// +// +// PURPOSE: Implementation of interface for PScript4, PScript5, Unidrv4, +// Unidrv5 UI plug-ins. +// +// + + +#include "precomp.hxx" +#include "debug.hxx" +#include "intrface.hxx" +#include "oem.hxx" +#include "oemptprovider.hxx" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +//////////////////////////////////////////////////////// +// Private Globals +//////////////////////////////////////////////////////// + +static long g_cComponents = 0 ; // Count of active components +static long g_cServerLocks = 0 ; // Count of locks + +//////////////////////////////////////////////////////////////////////////////// +// +// IOemUI body +// + +IOemUI::~IOemUI() +{ + // If this instance of the object is being deleted, then the reference + // count should be zero. + assert(0 == m_cRef); +} + +HRESULT __stdcall IOemUI::QueryInterface(const IID& iid, void** ppv) +{ + VERBOSE(DLLTEXT("IOemUI:QueryInterface entry.\r\n\r\n")); + if (IID_IUnknown == iid) + { + *ppv = static_cast<IUnknown*>(this); + VERBOSE(DLLTEXT("IOemUI:Return pointer to IUnknown.\r\n\r\n")); + } + else if (IID_IPrintOemUI == iid) + { + *ppv = static_cast<IPrintOemUI*>(this) ; + VERBOSE(DLLTEXT("IOemUI:Return pointer to IPrintOemUI.\r\n")); + } + else + { + VERBOSE(DLLTEXT("IOemUI::QueryInterface not supported.\r\n")); + *ppv = NULL ; + return E_NOINTERFACE ; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef() ; + return S_OK ; +} + +ULONG __stdcall IOemUI::AddRef() +{ + VERBOSE(DLLTEXT("IOemUI:AddRef entry.\r\n")); + return InterlockedIncrement(&m_cRef) ; +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall IOemUI::Release() +{ + VERBOSE(DLLTEXT("IOemUI:Release entry.\r\n")); + ASSERT (0 != m_cRef); + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + } + return cRef; +} + +HRESULT __stdcall IOemUI::PublishDriverInterface( + IUnknown *) +{ + VERBOSE(DLLTEXT("IOemUI:PublishDriverInterface entry.\r\n")); + + return S_OK; +} + +HRESULT __stdcall IOemUI::GetInfo( + DWORD dwMode, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded) +{ + VERBOSE(DLLTEXT("IOemUI::GetInfo entry.\r\r\n")); + + // Validate parameters. + if( (NULL == pcbNeeded) + || + ( (OEMGI_GETSIGNATURE != dwMode) + && + (OEMGI_GETVERSION != dwMode) + && + (OEMGI_GETPUBLISHERINFO != dwMode) + ) + ) + { + WARNING(DLLTEXT("IOemUI::GetInfo() exit pcbNeeded is NULL! ERROR_INVALID_PARAMETER\r\r\n")); + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Set expected buffer size and number of bytes written. + *pcbNeeded = sizeof(DWORD); + + // Check buffer size is sufficient. + if((cbSize < *pcbNeeded) || (NULL == pBuffer)) + { + WARNING(DLLTEXT("IOemUI::GetInfo() exit insufficient buffer!\r\r\n")); + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return E_FAIL; + } + + switch(dwMode) + { + // OEM DLL Signature + case OEMGI_GETSIGNATURE: + *(PDWORD)pBuffer = OEM_SIGNATURE; + break; + + // OEM DLL version + case OEMGI_GETVERSION: + *(PDWORD)pBuffer = OEM_VERSION; + break; + + // dwMode not supported. + default: + // Set written bytes to zero since nothing was written. + WARNING(DLLTEXT("IOemUI::GetInfo() exit mode not supported.\r\r\n")); + *pcbNeeded = 0; + SetLastError(ERROR_NOT_SUPPORTED); + return E_FAIL; + } + + VERBOSE(DLLTEXT("IOemUI::GetInfo() exit S_OK.\r\r\n")); + return S_OK; +} + +HRESULT __stdcall IOemUI::DevMode( + DWORD , + POEMDMPARAM ) +{ + VERBOSE(DLLTEXT("IOemUI:DevMode entry.\r\n")); + + return E_NOTIMPL; +} + +HRESULT __stdcall IOemUI::CommonUIProp( + DWORD , + POEMCUIPPARAM) +{ + VERBOSE(DLLTEXT("IOemUI:CommonUIProp entry.\r\n")); + + return E_NOTIMPL; +} + + +HRESULT __stdcall IOemUI::DocumentPropertySheets( + PPROPSHEETUI_INFO , + LPARAM ) +{ + VERBOSE(DLLTEXT("IOemUI:DocumentPropertySheets entry.\r\n")); + + return E_NOTIMPL; +} + +HRESULT __stdcall IOemUI::DevicePropertySheets( + PPROPSHEETUI_INFO , + LPARAM ) +{ + VERBOSE(DLLTEXT("IOemUI:DevicePropertySheets entry.\r\n")); + + return E_NOTIMPL; +} + +HRESULT __stdcall IOemUI::DeviceCapabilities( + POEMUIOBJ , + HANDLE , +_In_ PWSTR , + WORD , + PVOID , + PDEVMODE , + PVOID , + DWORD , + DWORD * ) +{ + VERBOSE(DLLTEXT("IOemUI:DeviceCapabilities entry.\r\n")); + + return E_NOTIMPL; +} + +HRESULT __stdcall IOemUI::DevQueryPrintEx( + POEMUIOBJ , + PDEVQUERYPRINT_INFO , + PDEVMODE , + PVOID ) +{ + VERBOSE(DLLTEXT("IOemUI:DevQueryPrintEx entry.\r\n")); + + return E_NOTIMPL; +} + +HRESULT __stdcall IOemUI::UpgradePrinter( + DWORD , + PBYTE ) +{ + VERBOSE(DLLTEXT("IOemUI:UpgradePrinter entry.\r\n")); + + return E_NOTIMPL; +} + +HRESULT __stdcall IOemUI::PrinterEvent( +_In_ PWSTR , + INT , + DWORD , + LPARAM ) +{ + VERBOSE(DLLTEXT("IOemUI:PrinterEvent entry.\r\n")); + + return E_NOTIMPL; +} + +HRESULT __stdcall IOemUI::DriverEvent( + DWORD , + DWORD , + LPBYTE , + LPARAM ) +{ + VERBOSE(DLLTEXT("IOemUI:DriverEvent entry.\r\n")); + + return E_NOTIMPL; +}; + + +#define PROFILE_NAME L"OEMPROFILE.icm\0" + +HRESULT __stdcall IOemUI::QueryColorProfile( + HANDLE , + POEMUIOBJ , + PDEVMODE , + PVOID , + ULONG , + VOID *, + ULONG *, + FLONG *) +{ + + VERBOSE(DLLTEXT("IOemUI:QueryColorProfile entry.\r\n")); + + return E_NOTIMPL; +}; + +HRESULT __stdcall IOemUI::FontInstallerDlgProc( + HWND , + UINT , + WPARAM , + LPARAM ) +{ + VERBOSE(DLLTEXT("IOemUI:FontInstallerDlgProc entry.\r\n")); + + return E_NOTIMPL; +}; + +HRESULT __stdcall IOemUI::UpdateExternalFonts( + HANDLE , + HANDLE , +_In_ PWSTR ) +{ + VERBOSE(DLLTEXT("IOemUI:UpdateExternalFonts entry.\r\n")); + + return E_NOTIMPL; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// oem class factory +// +class IOemCF : public IClassFactory +{ +public: + // *** IUnknown methods *** + + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release) (THIS); + + // *** IClassFactory methods *** + STDMETHOD(CreateInstance) (THIS_ + LPUNKNOWN pUnkOuter, + REFIID riid, + LPVOID FAR* ppvObject); + STDMETHOD(LockServer) (THIS_ BOOL bLock); + + + // Constructor + IOemCF(): m_cRef(1) {}; + ~IOemCF() {}; + +protected: + LONG m_cRef; + +}; + +/////////////////////////////////////////////////////////// +// +// Class factory body +// +HRESULT __stdcall IOemCF::QueryInterface(const IID& iid, void** ppv) +{ + if ((IID_IUnknown == iid) || (IID_IClassFactory == iid)) + { + *ppv = static_cast<IOemCF*>(this) ; + } + else + { + VERBOSE(DLLTEXT("IOemCF::QueryInterface not supported.\r\n")); + *ppv = NULL ; + return E_NOINTERFACE ; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef() ; + return S_OK ; +} + +ULONG __stdcall IOemCF::AddRef() +{ + return InterlockedIncrement(&m_cRef) ; +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall IOemCF::Release() +{ + ASSERT( 0 != m_cRef); + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + } + return cRef; +} + +// IClassFactory implementation +HRESULT __stdcall IOemCF::CreateInstance(IUnknown* pUnknownOuter, + const IID& iid, + void** ppv) +{ + HRESULT hr = S_OK; + + //DbgPrint(DLLTEXT("Class factory:\t\tCreate component.")) ; + + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Cannot aggregate. + if (NULL != pUnknownOuter) + { + return CLASS_E_NOAGGREGATION ; + } + + // Create component. + IOemUI* pOemCB = new IOemUI ; + if (NULL == pOemCB) + { + return E_OUTOFMEMORY ; + } + // Get the requested interface. + hr = pOemCB->QueryInterface(iid, ppv) ; + + // Release the IUnknown pointer. + // (If QueryInterface failed, component will delete itself.) + pOemCB->Release() ; + + if (FAILED(hr)) + { + IOEMPTProvider * pOemPT = new IOEMPTProvider(); + + if(NULL == pOemPT) + { + return E_OUTOFMEMORY; + } + + hr = pOemPT->QueryInterface(iid, ppv) ; + + pOemPT->Release(); + } + + return hr ; +} + +// LockServer +HRESULT __stdcall IOemCF::LockServer(BOOL bLock) +{ + if (bLock) + { + InterlockedIncrement(&g_cServerLocks) ; + } + else + { + InterlockedDecrement(&g_cServerLocks) ; + } + return S_OK ; +} + +/////////////////////////////////////////////////////////// +// +// Exported functions +// + + +// Can DLL unload now? +// +STDAPI DllCanUnloadNow() +{ + // + // To avoid leaving OEM DLL still in memory when Unidrv or Pscript drivers + // are unloaded, Unidrv and Pscript driver ignore the return value of + // DllCanUnloadNow of the OEM DLL, and always call FreeLibrary on the OEMDLL. + // + // If OEM DLL spins off a working thread that also uses the OEM DLL, the + // thread needs to call LoadLibrary and FreeLibraryAndExitThread, otherwise + // it may crash after Unidrv or Pscript calls FreeLibrary. + // + + if ((0 == g_cComponents) && (0 == g_cServerLocks)) + { + return S_OK ; + } + else + { + return S_FALSE; + } +} + +// +// Get class factory +// +STDAPI DllGetClassObject( + _In_ REFCLSID clsid, + _In_ REFIID iid, + _Outptr_ LPVOID* ppv) +{ + VERBOSE(DLLTEXT("DllGetClassObject:Create class factory.\r\n")); + + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Can we create this component? + if (CLSID_OEMUI != clsid && CLSID_OEMPTPROVIDER != clsid) + { + return CLASS_E_CLASSNOTAVAILABLE ; + } + + // Create class factory. + IOemCF* pFontCF = new IOemCF ; // Reference count set to 1 + // in constructor + if (NULL == pFontCF) + { + return E_OUTOFMEMORY ; + } + + // Get requested interface. + HRESULT hr = pFontCF->QueryInterface(iid, ppv) ; + pFontCF->Release() ; + + return hr ; +} diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/intrface.hxx b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/intrface.hxx new file mode 100644 index 00000000..99b950d3 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/intrface.hxx @@ -0,0 +1,178 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2005 Microsoft Corporation. All Rights Reserved. +// +// FILE: intrface.cxx +// +// PURPOSE: Header of interface for PScript4, PScript5, Unidrv4, +// Unidrv5 UI plug-ins. +// +// + +#pragma once + +//////////////////////////////////////////////////////////////////////////////// +// +// IOemUI +// +class IOemUI: public IPrintOemUI +{ +public: + // *** IUnknown methods *** + + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release) (THIS); + + // + // Method for publishing Driver interface. + // + STDMETHOD(PublishDriverInterface)(THIS_ IUnknown *pIUnknown); + + // + // Get OEM dll related information + // + + STDMETHOD(GetInfo) (THIS_ DWORD dwMode, PVOID pBuffer, DWORD cbSize, + PDWORD pcbNeeded); + + // + // OEMDevMode + // + + STDMETHOD(DevMode) (THIS_ DWORD dwMode, POEMDMPARAM pOemDMParam) ; + + // + // OEMCommonUIProp + // + + STDMETHOD(CommonUIProp) (THIS_ + DWORD dwMode, + POEMCUIPPARAM pOemCUIPParam + ); + + // + // OEMDocumentPropertySheets + // + + STDMETHOD(DocumentPropertySheets) (THIS_ + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam + ); + + // + // OEMDevicePropertySheets + // + + STDMETHOD(DevicePropertySheets) (THIS_ + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam + ); + + + // + // OEMDevQueryPrintEx + // + + STDMETHOD(DevQueryPrintEx) (THIS_ + POEMUIOBJ poemuiobj, + PDEVQUERYPRINT_INFO pDQPInfo, + PDEVMODE pPublicDM, + PVOID pOEMDM + ); + + // + // OEMDeviceCapabilities + // + + STDMETHOD(DeviceCapabilities) (THIS_ + POEMUIOBJ poemuiobj, + HANDLE hPrinter, + _In_ PWSTR pDeviceName, + WORD wCapability, + PVOID pOutput, + PDEVMODE pPublicDM, + PVOID pOEMDM, + DWORD dwOld, + DWORD *dwResult + ); + + // + // OEMUpgradePrinter + // + + STDMETHOD(UpgradePrinter) (THIS_ + DWORD dwLevel, + PBYTE pDriverUpgradeInfo + ); + + // + // OEMPrinterEvent + // + + STDMETHOD(PrinterEvent) (THIS_ + _In_ PWSTR pPrinterName, + INT iDriverEvent, + DWORD dwFlags, + LPARAM lParam + ); + + // + // OEMDriverEvent + // + + STDMETHOD(DriverEvent)(THIS_ + DWORD dwDriverEvent, + DWORD dwLevel, + LPBYTE pDriverInfo, + LPARAM lParam + ); + + // + // OEMQueryColorProfile + // + + STDMETHOD(QueryColorProfile) (THIS_ + HANDLE hPrinter, + POEMUIOBJ poemuiobj, + PDEVMODE pPublicDM, + PVOID pOEMDM, + ULONG ulReserved, + VOID *pvProfileData, + ULONG *pcbProfileData, + FLONG *pflProfileData); + + // + // OEMFontInstallerDlgProc + // + + STDMETHOD(FontInstallerDlgProc) (THIS_ + HWND hWnd, + UINT usMsg, + WPARAM wParam, + LPARAM lParam + ); + // + // UpdateExternalFonts + // + + STDMETHOD(UpdateExternalFonts) (THIS_ + HANDLE hPrinter, + HANDLE hHeap, + _In_ PWSTR pwstrCartridges + ); + + IOemUI() : m_cRef(1) {}; + ~IOemUI(); + +protected: + LONG m_cRef; +}; diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/oem.hxx b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/oem.hxx new file mode 100644 index 00000000..a8c7b03c --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/oem.hxx @@ -0,0 +1,26 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2005 Microsoft Corporation. All Rights Reserved. +// +// FILE: oem.hxx +// + +#pragma once + +//////////////////////////////////////////////////////// +// OEM Defines +//////////////////////////////////////////////////////// + +#define OEM_SIGNATURE 'MSFT' +#define OEM_VERSION 0x00000001L + +//////////////////////////////////////////////////////// +// OEM UI Defines +//////////////////////////////////////////////////////// + +// OEM UI Misc defines. +#define DLLTEXT(s) "PTPC Plugin: " s + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/oemptprovider.cxx b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/oemptprovider.cxx new file mode 100644 index 00000000..e0e94632 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/oemptprovider.cxx @@ -0,0 +1,1145 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED +// TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2005 Microsoft Corporation. All Rights Reserved. +// +// FILE: oemptprovider.cxx +// +// +// PURPOSE: Implementation of IOEMPTProvider Class. +// The Provider class implements the +// IPrintOemPrintTicketProvider interface functions that +// provide the plug-in access to Print Ticket and allow the +// plug-in to understand the Unidrv private setting in +// the Print Ticket and expose its private settings to +// Unidrv by putting them publicly in the Print Ticket. The +// various provider methods make use of the +// IPrintCoreHelper Interface methods to +// create instances of XML objects and to communicate +// information with Unidrv. +// +// Functions: +// IPrintOemPrintTicketProvider Interface Functions. +// Private Functions of class IOEMPTProvider. +// + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +#include "precomp.hxx" +#include "globals.hxx" +#include "debug.hxx" +#include "oem.hxx" +#include "xmlhandler.hxx" +#include "oemptprovider.hxx" +#include "printschema.hxx" + +/*++ + +Routine Name: + + IOEMPTProvider constructor + +Routine Description: + + Constructor + +Arguments: + + None + +Return Value: + + None + +--*/ +IOEMPTProvider::IOEMPTProvider() + : m_pCoreHelper(NULL), + m_cRef(1) +{ +} + +/*++ + +Routine Name: + + IOEMPTProvider destructor + +Routine Description: + + Destructor + +Arguments: + + None + +Return Value: + + None + +--*/ + +IOEMPTProvider::~IOEMPTProvider() +{ + + // + // Make sure that helper interface is released. + // + if (m_pCoreHelper) + { + m_pCoreHelper->Release(); + m_pCoreHelper = NULL; + } + + // + // If this instance of the object is being deleted, then the reference + // count should be zero. + // + ASSERT(0 == m_cRef); + +} + +/*++ + +Routine Name: + + IOEMPTProvider QueryInterface + +Routine Description: + + Returns a pointer to a specified interface on an object to which a client currently holds an + interface pointer. + This function must call IUnknown::AddRef on the pointer it returns. + +Arguments: + + riid - Identifier of requested Interface. + ppObj - Output variable that receives the pointer to requested Interface on success + +Return Value: + + HRESULT + S_OK - If the Interface requested is supported + E_NOINTERFACE otherwise + +--*/ + +STDMETHODIMP IOEMPTProvider::QueryInterface( + REFIID riid, + void **ppObj + ) +{ + if ((IID_IUnknown == riid) || (IID_IPrintOemPrintTicketProvider == riid)) + { + *ppObj = static_cast<IPrintOemPrintTicketProvider *>(this); + } + else + { + *ppObj = NULL ; + return E_NOINTERFACE ; + } + reinterpret_cast<IUnknown*>(*ppObj)->AddRef(); + return S_OK ; +} + +/*++ + +Routine Name: + + AddRef + +Routine Description: + + The AddRef method increments the reference count for an an interface + on an object. It should be called for every new copy of a pointer to + an interface on a given object. + +Arguments: + + None + +Return Value: + + Returns the value of the new reference count. + +--*/ + +STDMETHODIMP_(ULONG) IOEMPTProvider::AddRef( + VOID + ) +{ + return InterlockedIncrement(&m_cRef); +} + +/*++ + +Routine Name: + + Release + +Routine Description: + + The Release method decrements the reference count for the calling + interface on a object. If the reference count on the object falls + to 0, the object is freed from memory. + +Arguments: + + None + +Return Value: + + Returns the resulting value of the reference count. + +--*/ +_At_(this, __drv_freesMem(object)) +STDMETHODIMP_(ULONG) IOEMPTProvider::Release( + THIS + ) +{ + ULONG cRef = InterlockedDecrement(&m_cRef); + + if (0 == cRef) + { + delete this; + } + return cRef; +} + +/*++ + +Routine Name: + + GetSupportedVersions + +Routine Description: + + The routine returns major versions of Printschema schema supported by the plug-in Provider. + + +Arguments: + hPrinter - Printer Handle + ppVersions - OUT pointer to array of version numbers to be filled in by the plug-in + cVersions - OUT pointer to count of Number of versions supported by plug-in + +Return Value: + HRESULT + S_OK - On Success + E_* - On failure + +--*/ +STDMETHODIMP IOEMPTProvider::GetSupportedVersions +( + _In_ HANDLE , + _Outptr_result_buffer_maybenull_(*cVersions) INT *ppVersions[], + _Out_ INT *cVersions + ) +{ + VERBOSE(DLLTEXT("IOEMPTProvider::GetSupportedVersions: entry.\r\n")); + + HRESULT hr = S_OK; + + // + // check if input parameters are valid + // + if (!ppVersions || !cVersions) + { + return E_INVALIDARG; + } + + // + // The Plug-in Provider need to allocate memory for the input version array and + // then fill it with version information + // + *ppVersions = (INT *)CoTaskMemAlloc(sizeof(INT)); + + if (!*ppVersions) + { + *cVersions = 0; + return E_OUTOFMEMORY; + } + else + { + // + // version number 1 is the only version supported currently + // + + *cVersions = 1; + (*ppVersions)[0] = PRINTSCHEMA_VERSION_NUMBER; + } + + return hr; +} + +/*++ + +Routine Name: + + BindPrinter + +Routine Description: + + Bind Printer is the part of the Unidrv's activity to bind to a device. It allows the plug-in to cache + certain information that can be used later on. + +Arguments: + + hPrinter - Printer Handle supplied by Unidrv + version - version of Printschema + pOptions - Flags passed out to set configurable options supported by caller + cNamespaces - Count of private namespaces of plug-in + ppNamespaces - OUT pointer to the array of Namespace URIs filled in by plug-in + +Return Value: + + HRESULT + S_OK - On Success + E_VERSION_NOT_SUPPORTED - if printer version specified is not supported by plug-in + E_* - On any other failure + +--*/ + +STDMETHODIMP IOEMPTProvider::BindPrinter +( + _In_ HANDLE hPrinter, + INT version, + _Out_ POEMPTOPTS pOptions, + _Out_ INT *cNamespaces, + _Outptr_result_buffer_maybenull_(*cNamespaces) BSTR **ppNamespaces + ) +{ + VERBOSE(DLLTEXT("IOEMPTProvider::BindPrinter: entry.\r\n")); + + HRESULT hr = S_OK; + + // + // check if input parameters are NULL + // Printer Handle should be provided by Unidrv in this call, which is cached by plug-in provider and + // is later on used while making calls to Plug-in Helper Interface methods. + // + if (!pOptions || !cNamespaces || !ppNamespaces || !hPrinter) + { + return E_INVALIDARG; + } + + + *ppNamespaces = NULL; + + *cNamespaces = 0; + + // + // Agree on the Printschema version with Unidrv + // Version 1 is the only version currently supported + // + if (PRINTSCHEMA_VERSION_NUMBER != version) + { + return E_VERSION_NOT_SUPPORTED; + } + + // + // Bind to the Physical Printer device + // cache the printer handle for further use + // + m_hPrinterCached = hPrinter; + + // + // Flags to set configurable options, + // OEMPT_DEFAULT defined in prcomoem.h + // + *pOptions = OEMPT_DEFAULT; + + return hr; + +} + +/*++ + +Routine Name: + + PublishPrintTicketHelperInterface + +Routine Description: + + For a number of operations, the plug-in needs to use the Helper Interface utilities provided by + Unidrv. Unidrv uses this method to publish the Print Ticket Helper Interface, IPrintCoreHelper. + Plug-in should return SUCCESS after successfully incrementing the reference count of the interface. + +Arguments: + + pHelper - IPrintCoreHelper interface pointer + +Return Value: + + HRESULT + S_OK - On Success + E_* - On failure + +--*/ +STDMETHODIMP IOEMPTProvider::PublishPrintTicketHelperInterface +( + _In_ IUnknown *pHelper + ) +{ + VERBOSE(DLLTEXT("IOEMPTProvider::PublishPrintTicketHelperInterface: entry.\r\n")); + + if (!pHelper) + { + return E_INVALIDARG; + } + + HRESULT hr = S_OK; + + // + // Need to store pointer to Driver Helper functions, if we already haven't. + // + if (NULL == m_pCoreHelper) + { + hr = pHelper->QueryInterface(IID_IPrintCoreHelperUni, (VOID**)&m_pCoreHelper); + } + + // + // It's possible that this routine will publish other interfaces in the + // future. If the object published did not support the desired interface, + // this routine should still succeed. + // + // If the helper interface is needed, but for some reason was not + // published (this would be an error on the OS's part), you should + // detect this and fail during the call-back where you intended to + // use the helper interface. + // + + if (E_NOINTERFACE == hr) + { + hr = S_OK; + } + + return hr; +} + +/*++ + +Routine Name: + + QueryDeviceDefaultNamespace + +Routine Description: + + Plug-in should specify the name of Private namespace URI that Unidrv + should be using to handle any features defined in the GPD that Unidrv + does not recognize plug-in may specify a set of namespaces as a result + of the call to BindPrinter method, and Unidrv needs to know which of + them is to be used as default namespace so that, for all the features + that Unidrv does not recognize, it will put them under this namespace + in Print Ticket. + + This method is optional. A plug-in can return E_NOTIMPL from this + method if there are multiple plug-ins and another plug-in is providing + the default, or if the plug-in does not want to change the default + namespace that unidrv provides. + + Note: It is Unidrv's responsibility to add the private namespace URI + that plug-in has specified through this call in the root node of the + DOM document, and also define a prefix for it so that plug-in should + use the prefix defined by Unidrv when it wishes to add any new node to + the Print Ticket under its private namespace. Plug-in should not define + its own prefix for this default private namespace URI. + +Arguments: + + pbstrNamespaceUri - OUT Pointer to namespace URI to be filled in and returned by plug-in + +Return Value: + + HRESULT + S_OK - On success + E_* - On failure + +--*/ + +STDMETHODIMP IOEMPTProvider::QueryDeviceDefaultNamespace +( + _Out_ BSTR * + ) +{ + VERBOSE(DLLTEXT("IOEMPTProvider::QueryDeviceDefaultNamespace: entry.\r\n")); + + return E_NOTIMPL; +} + +/*++ + +Routine Name: + + ConvertPrintTicketToDevMode + +Routine Description: + + Unidrv will call this routine before it performs its part of PT->DM + conversion. The plug-in is passed with an input Print Ticket that is + fully populated, and Devmode which has default settings in it. For + this conversion, the plug-in needs to undo whatever changes it made to + the Print Ticket during Devmode->PT conversion. + +Arguments: + + pPrintTicket - pointer to input Print Ticket + cbDevmode - size in bytes of input full devmode + pDevmode - pointer to input full devmode buffer + cbDrvPrivateSize - buffer size in bytes of plug-in private devmode + pPrivateDevmode - pointer to plug-in private devmode buffer + + +Return Value: + + HRESULT + S_OK - On Success + E_* - On failure + +--*/ + +STDMETHODIMP IOEMPTProvider::ConvertPrintTicketToDevMode +( + _In_ IXMLDOMDocument2 *pPrintTicket, + ULONG cbDevmode, + _Inout_updates_bytes_(cbDevmode) + PDEVMODE pDevmode, + ULONG , // cbDrvPrivateSize + _Inout_ PVOID // pPrivateDevmode + ) +{ + VERBOSE(DLLTEXT("IOEMPTProvider::ConvertPrintTicketToDevMode: entry.\r\n")); + + // + // cbDrvPrivateSize will be 0 because this plug-in doesn't + // support a private DEVMODE. + // + if (!cbDevmode || !pDevmode || !pPrintTicket) + { + return E_INVALIDARG; + } + + return S_OK; +} + +/*++ + +Routine Name: + + ConvertDevModeToPrintTicket + +Routine Description: + + Unidrv will call the routine with an Input Print + Ticket that is populated with public and Unidrv private features. For + those features in the GPD that Unidrv does not understand, it puts + them in the PT under the private namespace (either specified by the + plug-in through QueryDeviceDefaultNamespace or created by itself). It + is the plug-in's responsibility to read the corresponding features + from the input PT and put them in public printschema namespace, so + that any higher level application making use of a print ticket can + read and interpret these settings. + + +Arguments: + + cbDevmode - size in bytes of input full devmode + pDevmode - pointer to input full devmode buffer + cbDrvPrivateSize - buffer size in bytes of plug-in private devmode + pPrivateDevmode - pointer to plug-in private devmode buffer + pPrintTicket - pointer to input Print Ticket + +Return Value: + + HRESULT + S_OK - On Success + E_* - On failure + +--*/ +STDMETHODIMP IOEMPTProvider::ConvertDevModeToPrintTicket +( + ULONG cbDevmode, + _Inout_updates_bytes_(cbDevmode) + PDEVMODE pDevmode, + ULONG , // cbDrvPrivateSize + _Inout_ PVOID , // pPrivateDevmode, + _Inout_ IXMLDOMDocument2 *pPrintTicket + ) +{ + VERBOSE(DLLTEXT("IOEMPTProvider::ConvertDevModeToPrintTicket: entry.\r\n")); + + // + // cbDrvPrivateSize will be 0 because this plug-in doesn't + // support a private DEVMODE. + // + if (!cbDevmode || !pDevmode || !pPrintTicket) + { + return E_INVALIDARG; + } + + HRESULT hr = S_OK; + + OEMPTXMLHandler opxh; + EIntentValue eIntentValue = printschema::photoprintingintent::None; + + // + // Initialize PrintTicketHandler + // + + hr = opxh.SetRoot(pPrintTicket, m_pCoreHelper); + + if (SUCCEEDED(hr)) + { + hr = ReadAndDeletePhotoPrintingIntent(opxh, eIntentValue); + } + + if (S_FALSE == hr) + { + hr = S_OK; + } + + return hr; +} + + +/*++ + +Routine Name: + + CompletePrintCapabilities + +Routine Description: + + Unidrv calls this routine with an input Device Capabilities Document + that is partially populated with Device capabilities information + filled in by Unidrv for features that it understands. The plug-in + needs to read any private features in the input Print Ticket, delete + them and add them back under Printschema namespace so that higher + level applications can understand them and make use of them. + +Arguments: + + pPrintTicket - pointer to input Print Ticket + pCapabilities - pointer to Device Capabilities Document. + +Return Value: + + HRESULT + S_OK - On Success + E_* - On failure + +--*/ +STDMETHODIMP IOEMPTProvider::CompletePrintCapabilities +( + _In_opt_ IXMLDOMDocument2 *, + _Inout_ IXMLDOMDocument2 *pCapabilities + ) +{ + VERBOSE(DLLTEXT("IOEMPTProvider::CompletePrintCapabilities: entry.\r\n")); + + if (!pCapabilities) + { + return E_INVALIDARG; + } + + return S_OK; +} + +/*++ + +Routine Name: + + ExpandIntentOptions + +Routine Description: + + As part of its Merge and Validate Procedure, the + Unidrv/Postscript driver will call this routine to give the plug-in a + chance to expand options which represent intent into their individual + settings in other features in the print ticket. This has two + important effects: the client sees the results of the intent + expansion, and unidrv resolves constraints against the individual + features which are affected by the intent. + + If the plug-in does not support any intent features, then the plug-in + should simply return S_OK. + +Arguments: + + pPrintTicket - Pointer to input Print Ticket. + +Return Value: + + HRESULT + S_OK - On Success + E_* - On failure + +--*/ + +STDMETHODIMP IOEMPTProvider::ExpandIntentOptions( + _Inout_ IXMLDOMDocument2 *pPrintTicket + ) +{ + VERBOSE(DLLTEXT("IOEMPTProvider::ExpandIntentOptions: entry.\r\n")); + + if (!pPrintTicket) + { + return E_INVALIDARG; + } + + HRESULT hr = S_OK; + OEMPTXMLHandler opxh; + + // + // Initialize PrintTicketHandler + // + + hr = opxh.SetRoot(pPrintTicket, m_pCoreHelper); + + // + // Read in the photo printing intent value, if it exists. If it + // doesn't, the default value of None is assumed instead. + // + + EIntentValue eIntentValue = printschema::photoprintingintent::None; + + if (SUCCEEDED(hr)) + { + hr = ReadAndDeletePhotoPrintingIntent(opxh, eIntentValue); + } + + if (S_FALSE == hr) + { + hr = S_OK; + } + + if (printschema::photoprintingintent::None != eIntentValue) + { + IOEMPTProvider::IntentConversionEntry entry = IOEMPTProvider::intentConversionTable[eIntentValue]; + + // + // Set appropriate values for PageMediaType and + // PageOutputQuality. Override any existing values of the + // options (by deleting before adding). + // + + if (SUCCEEDED(hr)) + { + hr = AddOrOverridePageMediaType(opxh, entry.pageMediaType); + } + + if (SUCCEEDED(hr)) + { + hr = AddOrOverridePageOutputQuality(opxh, entry.pageOutputQuality); + } + } + + return hr; +} + +/*++ + +Routine Name: + + ValidatePrintTicket + +Routine Description: + + The plug-in might need to delete any feature under private namespace + from input PT that are also in the public namespace because of Merge + and Validate. + + The Validate method should also perform any conflict resolution if + necessary looking at the settings made in public and unidrv private + part of Print Ticket, to make sure that the resultant Print Ticket is a + valid one, and has all constraints resolved. + +Arguments: + + pBaseTicket - Pointer to input Print Ticket. + +Return Value: + + HRESULT + S_NO_CONFLICT/S_CONFLICT_RESOLVED - On Success + E_* - On failure + +--*/ + +STDMETHODIMP IOEMPTProvider::ValidatePrintTicket( + _Inout_ IXMLDOMDocument2 *pPrintTicket + ) +{ + VERBOSE(DLLTEXT("IOEMPTProvider::ValidatePrintTicket: entry.\r\n")); + + if (!pPrintTicket) + { + return E_INVALIDARG; + } + + // + // If the plug-in performs validation successfully, it needs to + // send either S_NO_CONFLICT or S_CONFLICT_RESOLVED as the result + // code, sending hr = S_OK will not work since Unidrv expects one + // of the above two success codes to interpret successful + // completion of plug-in validate method. + // + + return S_NO_CONFLICT; +} + +// +// Private stuff +// + +IOEMPTProvider::IntentConversionEntry IOEMPTProvider::intentConversionTable[] = +{ + { NULL, NULL, }, + { printschema::pagemediatype::PLAIN, printschema::pageoutputquality::DRAFT, }, + { printschema::pagemediatype::PHOTOGRAPHIC, printschema::pageoutputquality::HIGH, }, + { printschema::pagemediatype::PHOTOGRAPHIC, printschema::pageoutputquality::PHOTOGRAPHIC, }, +}; + +/*++ + +Routine Name: + + ReadAndDeletePhotoPrintingIntent + +Routine Description: + + This function gets the value of the Photo Printing Intent from a Print + Ticket and returns it in eIntentValue. It also deletes the entire + feature from the Ticket. + +Arguments: + + opxh - reference to input XMLHandler + eIntentValue - reference to output intent value + +Return Value: + + HRESULT + S_OK - On success, if intent was found + S_FALSE - On Success, if intent was not found + E_* - On failure + +--*/ + +HRESULT IOEMPTProvider::ReadAndDeletePhotoPrintingIntent( + OEMPTXMLHandler &opxh, + EIntentValue &eIntentValue + ) +{ + VERBOSE(DLLTEXT("IOEMPTProvider::ReadAndDeletePhotoPrintingIntent: entry.\r\n")); + + HRESULT hr = S_OK; + + IXMLDOMElement *pPhotoPrintingIntentFeature = NULL; + IXMLDOMElement *pPhotoPrintingIntentOption = NULL; + + hr = opxh.GetFeatureNode(NULL, // meaning root is parent + printschema::KEYWORDS_URI, + printschema::photoprintingintent::FEATURE, + &pPhotoPrintingIntentFeature); + + // + // Check for S_OK == hr and not SUCCEEDED(hr) because + // GetFeatureNode returns S_FALSE if feature is not found + // + + if (S_OK == hr && pPhotoPrintingIntentFeature) + { + hr = opxh.GetOptionNode(pPhotoPrintingIntentFeature, + &pPhotoPrintingIntentOption); + } + + BSTR bstrIntentNamespace = NULL; + BSTR bstrIntentValue = NULL; + + if (S_OK == hr && pPhotoPrintingIntentOption) + { + hr = opxh.GetXMLAttribute(pPhotoPrintingIntentOption, &bstrIntentNamespace, &bstrIntentValue); + } + + if (S_OK == hr && NULL != bstrIntentNamespace) + { + if (0 != wcscmp(bstrIntentNamespace, printschema::KEYWORDS_URI)) + { + // + // We do not delete the node if it specifies a different + // namespace + // + hr = S_FALSE; + } + } + + // + // Search for intent, looping across all possible (valid) values, and store it in eIntentValue + // + + if (S_OK == hr && NULL != bstrIntentValue) + { + EIntentValue e = EIntentValue(0); + + for (; e < printschema::photoprintingintent::EIntentValueMax; ++e) + { + if (0 == wcscmp(bstrIntentValue, printschema::photoprintingintent::OPTIONS[e])) + { + eIntentValue = e; + break; + } + } + + if (printschema::photoprintingintent::EIntentValueMax == e) + { + // + // We do not delete the node if the attribute name + // in the Print Ticket is not one of the valid ones + // + hr = S_FALSE; + } + } + + // + // If found, delete intent + // + + if (S_OK == hr) + { + hr = opxh.DeleteFeatureNode(NULL, pPhotoPrintingIntentFeature); + } + + // + // Make sure all BSTRs are freed, ... + // + + if (bstrIntentNamespace) + { + SysFreeString(bstrIntentNamespace); + bstrIntentNamespace = NULL; + } + + if (bstrIntentValue) + { + SysFreeString(bstrIntentValue); + bstrIntentValue = NULL; + } + + // + // ... and interface pointers released + // + + if (pPhotoPrintingIntentFeature) + { + pPhotoPrintingIntentFeature->Release(); + } + + if (pPhotoPrintingIntentOption) + { + pPhotoPrintingIntentOption->Release(); + } + + return hr; +} + +/*++ + +Routine Name: + + AddOrOverridePageMediaType + +Routine Description: + + This routine takes in the value of the PageMediaType to be set, + depending on the intent that was present. It then deletes any existing + PageMediaType value in the ticket, and then adds the new PageMediaType + value. + +Arguments: + + opxh - reference to input XMLHandler + lpcwstrPageMediaType - input PageMediaType string + +Return Value: + + HRESULT + S_OK - On success + E_* - On failure + +--*/ + +HRESULT IOEMPTProvider::AddOrOverridePageMediaType( + OEMPTXMLHandler &opxh, + LPCWSTR lpcwstrPageMediaType + ) +{ + VERBOSE(DLLTEXT("IOEMPTProvider::AddOrOverridePageMediaType: entry.\r\n")); + + HRESULT hr = S_OK; + + if (NULL == lpcwstrPageMediaType) + { + return S_OK; + } + + IXMLDOMElement *pPageMediaTypeOld = NULL; + IXMLDOMElement *pPageMediaTypeNew = NULL; + + // + // Search for, and delete any old PageMediaType option, since we're + // going to override it + // + + hr = opxh.GetFeatureNode(NULL, + printschema::KEYWORDS_URI, + printschema::pagemediatype::FEATURE, + &pPageMediaTypeOld); + + if (S_OK == hr) + { + hr = opxh.DeleteFeatureNode(NULL, pPageMediaTypeOld); + } + + // + // GetFeatureNode might have returned S_FALSE if it couldn't find + // such a node, so from now on, we check for SUCCEEDED + // + + // + // Create PageMediaType feature node + // + + if (SUCCEEDED(hr)) + { + hr = opxh.CreateFeatureNode(NULL, + printschema::KEYWORDS_URI, + printschema::pagemediatype::FEATURE, + &pPageMediaTypeNew); + } + + // + // Create option node under the feature node above + // + + if (SUCCEEDED(hr)) + { + hr = opxh.CreateOptionNode(pPageMediaTypeNew, + printschema::KEYWORDS_URI, + lpcwstrPageMediaType, + NULL); + } + + if (pPageMediaTypeOld) + { + pPageMediaTypeOld->Release(); + } + + if (pPageMediaTypeNew) + { + pPageMediaTypeNew->Release(); + } + + return hr; +} + +/*++ + +Routine Name: + + AddOrOverridePageOutputQuality + +Routine Description: + + This routine, similar to AddOrOverridePageMediaType, takes in the + value of the PageOutputQuality to be set, depending on the intent that + was present. It then deletes any existing PageOutputQuality value in + the ticket, and then adds the new PageOutputQuality value. + +Arguments: + + opxh - reference to input XMLHandler + lpcwstrPageOutputQuality - input PageOutputQuality string + +Return Value: + + HRESULT + S_OK - On success + E_* - On failure + +--*/ + +HRESULT IOEMPTProvider::AddOrOverridePageOutputQuality( + OEMPTXMLHandler &opxh, + LPCWSTR lpcwstrPageOutputQuality + ) +{ + VERBOSE(DLLTEXT("IOEMPTProvider::AddOrOverridePageOutputQuality: entry.\r\n")); + + HRESULT hr = S_OK; + + if (NULL == lpcwstrPageOutputQuality) + { + return S_OK; + } + + IXMLDOMElement *pPageOutputQualityOld = NULL; + IXMLDOMElement *pPageOutputQualityNew = NULL; + + // + // Search for, and delete any old PageOutputQuality option, since we're + // going to override it + // + + hr = opxh.GetFeatureNode(NULL, + printschema::KEYWORDS_URI, + printschema::pageoutputquality::FEATURE, + &pPageOutputQualityOld); + + if (S_OK == hr) + { + hr = opxh.DeleteFeatureNode(NULL, pPageOutputQualityOld); + } + + // + // GetFeatureNode might have returned S_FALSE if it couldn't find + // such a node, so from now on, we check for SUCCEEDED + // + + // + // Create PageOutputQuality feature node + // + + if (SUCCEEDED(hr)) + { + hr = opxh.CreateFeatureNode(NULL, + printschema::KEYWORDS_URI, + printschema::pageoutputquality::FEATURE, + &pPageOutputQualityNew); + } + + // + // Create option node under the feature node above + // + + if (SUCCEEDED(hr)) + { + hr = opxh.CreateOptionNode(pPageOutputQualityNew, + printschema::KEYWORDS_URI, + lpcwstrPageOutputQuality, + NULL); + } + + if (pPageOutputQualityOld) + { + pPageOutputQualityOld->Release(); + } + + if (pPageOutputQualityNew) + { + pPageOutputQualityNew->Release(); + } + + return hr; +} diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/oemptprovider.hxx b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/oemptprovider.hxx new file mode 100644 index 00000000..77b54be1 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/oemptprovider.hxx @@ -0,0 +1,143 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2005 Microsoft Corporation. All Rights Reserved. +// +// FILE: oemptprovider.hxx +// +// +// PURPOSE: Definition of IOEMPTProvider Class. +// +// + +#pragma once + +#include "xmlhandler.hxx" +#include "printschema.hxx" + +using printschema::photoprintingintent::EIntentValue; + +// +// The Provider class to Implement IPrintOemPrintTicketProvider Interface +// + +class IOEMPTProvider : public IPrintOemPrintTicketProvider +{ +public: + + // + // Public Methods go here + // + IOEMPTProvider(); + virtual ~IOEMPTProvider(); + + // + // Basic COM Methods + // + STDMETHODIMP QueryInterface(THIS_ REFIID riid, void **ppvObj); + + STDMETHODIMP_(ULONG) AddRef(THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHODIMP_(ULONG) Release(THIS); + + + // + // IPrintOemPrintTicketProvider methods + // + + STDMETHOD(GetSupportedVersions)(THIS_ + _In_ HANDLE hPrinter, + _Outptr_result_buffer_maybenull_(*cVersions) INT *ppVersions[], + _Out_ INT *cVersions + ); + + STDMETHOD(BindPrinter)(THIS_ + _In_ HANDLE hPrinter, + INT version, + _Out_ POEMPTOPTS pOptions, + _Out_ INT *cNamespaces, + _Outptr_result_buffer_maybenull_(*cNamespaces) BSTR **ppNamespaces + ); + + STDMETHOD(PublishPrintTicketHelperInterface)(THIS_ + _In_ IUnknown *pHelper + ); + + STDMETHOD(QueryDeviceDefaultNamespace)(THIS_ + _Out_ BSTR *pbstrNamespaceUri + ); + + STDMETHOD(ConvertPrintTicketToDevMode)(THIS_ + _In_ IXMLDOMDocument2 *pPrintTicket, + ULONG cbDevmode, + _Inout_updates_bytes_(cbDevmode) + PDEVMODE pDevmode, + ULONG cbDrvPrivateSize, + _Inout_ PVOID pPrivateDevmode + ); + + STDMETHOD(ConvertDevModeToPrintTicket)(THIS_ + ULONG cbDevmode, + _Inout_updates_bytes_(cbDevmode) + PDEVMODE pDevmode, + ULONG cbDrvPrivateSize, + _Inout_ PVOID pPrivateDevmode, + _Inout_ IXMLDOMDocument2 *pPrintTicket + ); + + STDMETHOD(CompletePrintCapabilities)(THIS_ + _In_opt_ IXMLDOMDocument2 *pPrintTicket, + _Inout_ IXMLDOMDocument2 *pCapabilities + ); + + STDMETHOD(ExpandIntentOptions)(THIS_ + _Inout_ IXMLDOMDocument2 *pPrintTicket + ); + + STDMETHOD(ValidatePrintTicket)(THIS_ + _Inout_ IXMLDOMDocument2 *pPrintTicket + ); + +private: + + // + // Data members go here + // + LONG m_cRef; // COM reference count + HANDLE m_hPrinterCached; // cached printer handle + IPrintCoreHelperUni *m_pCoreHelper; // cached pointer to plug-in helper interface + + struct IntentConversionEntry + { + LPCWSTR pageMediaType; + LPCWSTR pageOutputQuality; + }; + + static IntentConversionEntry intentConversionTable[printschema::photoprintingintent::EIntentValueMax]; + + // + // Private Methods + // + + HRESULT ReadAndDeletePhotoPrintingIntent( + OEMPTXMLHandler &opxh, + EIntentValue &eIntentValue + ); + + HRESULT AddOrOverridePageMediaType( + OEMPTXMLHandler &opxh, + LPCWSTR lpcwstrPageMediaType + ); + + HRESULT AddOrOverridePageOutputQuality( + OEMPTXMLHandler &opxh, + LPCWSTR lpcwstrPageOutputQuality + ); + +}; + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/precomp.hxx b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/precomp.hxx new file mode 100644 index 00000000..fc8cb4be --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/precomp.hxx @@ -0,0 +1,49 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2005 Microsoft Corporation. All Rights Reserved. +// +// FILE: precomp.hxx +// +// PURPOSE: Header files that should be in the precompiled header. +// + +#pragma once + +// Required header files that shouldn't change often. + +#include <STDDEF.H> +#include <STDLIB.H> +#include <OBJBASE.H> +#include <STDARG.H> +#include <STDIO.H> +#include <WINDEF.H> +#include <WINERROR.H> +#include <WINBASE.H> +#include <WINGDI.H> +#include <windows.h> +#include <WINSPOOL.H> +#include <TCHAR.H> +#include <INITGUID.H> +#include <msxml6.h> +#include <string.h> +#include <EXCPT.H> +#include <ASSERT.H> +#include <PRSHT.H> +#include <COMPSTUI.H> +#include <WINDDI.H> +#include <WINDDIUI.H> + +#include <PRINTOEM.H> +#include <prdrvcom.h> +#include <prcomoem.h> + +// StrSafe.h needs to be included last +// to disallow unsafe string functions. +#include <intsafe.h> +#include <strsafe.h> + +#include "common.ver" + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/precompsrc.cpp b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/precompsrc.cpp new file mode 100644 index 00000000..5d84a122 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/precompsrc.cpp @@ -0,0 +1 @@ +#include "precomp.hxx"
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/printschema.cxx b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/printschema.cxx new file mode 100644 index 00000000..d22ffc10 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/printschema.cxx @@ -0,0 +1,64 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2005 Microsoft Corporation. All Rights Reserved. +// +// FILE: printschema.cxx +// +// PURPOSE: Constant definitions for print schema names. +// +// + +#include "precomp.hxx" +#include "printschema.hxx" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +LPCWSTR printschema::FRAMEWORK_URI = + L"http://schemas.microsoft.com/windows/2003/08/printing/printschemaframework"; + +LPCWSTR printschema::KEYWORDS_URI = + L"http://schemas.microsoft.com/windows/2003/08/printing/printschemakeywords"; + +// +// Element types defined in Printschema framework +// + +LPCWSTR printschema::FEATURE_ELEMENT_NAME = L"Feature"; +LPCWSTR printschema::OPTION_ELEMENT_NAME = L"Option"; +LPCWSTR printschema::NAME_ATTRIBUTE_NAME = L"name"; + +// +// Elements described as Printschema keywords +// + +LPCWSTR printschema::photoprintingintent::FEATURE = L"PagePhotoPrintingIntent"; +LPCWSTR printschema::photoprintingintent::OPTIONS[] = { L"None", L"PhotoDraft", L"PhotoStandard", L"PhotoBest", }; + +namespace printschema +{ + namespace photoprintingintent + { + // + // operator prefix increment + // + const EIntentValue & operator++(EIntentValue &e) + + { + e = (EIntentValue)(e + 1); + return e; + } + } +} + +LPCWSTR printschema::pagemediatype::FEATURE = L"PageMediaType"; +LPCWSTR printschema::pagemediatype::PLAIN = L"Plain"; +LPCWSTR printschema::pagemediatype::PHOTOGRAPHIC = L"Photographic"; + +LPCWSTR printschema::pageoutputquality::FEATURE = L"PageOutputQuality"; +LPCWSTR printschema::pageoutputquality::DRAFT = L"Draft"; +LPCWSTR printschema::pageoutputquality::HIGH = L"High"; +LPCWSTR printschema::pageoutputquality::PHOTOGRAPHIC = L"Photographic"; diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/printschema.hxx b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/printschema.hxx new file mode 100644 index 00000000..e6bd73b4 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/printschema.hxx @@ -0,0 +1,74 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2005 Microsoft Corporation. All Rights Reserved. +// +// FILE: printschema.hxx +// +// PURPOSE: Constant declarations for print schema names. +// + +#pragma once + +typedef +enum tagPrintschemaVersion +{ + PRINTSCHEMA_VERSION_NUMBER = 1 +} EPrintschemaVersion; + + +namespace printschema +{ + + extern LPCWSTR FRAMEWORK_URI; + + extern LPCWSTR KEYWORDS_URI; + + // + // Element types defined in Printschema framework + // + + extern LPCWSTR FEATURE_ELEMENT_NAME; + extern LPCWSTR OPTION_ELEMENT_NAME; + extern LPCWSTR NAME_ATTRIBUTE_NAME; + + // + // Elements described as Printschema keywords + // + + namespace photoprintingintent + { + extern LPCWSTR FEATURE; + + enum EIntentValue + { + None = 0, + Draft, + Standard, + Best, + EIntentValueMax, // size of enum list + }; + + extern LPCWSTR OPTIONS[EIntentValueMax]; + + const EIntentValue & operator++(EIntentValue &e); + } + + namespace pagemediatype + { + extern LPCWSTR FEATURE; + extern LPCWSTR PLAIN; + extern LPCWSTR PHOTOGRAPHIC; + } + + namespace pageoutputquality + { + extern LPCWSTR FEATURE; + extern LPCWSTR DRAFT; + extern LPCWSTR HIGH; + extern LPCWSTR PHOTOGRAPHIC; + } + +} diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/ptpcplpr.def b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/ptpcplpr.def new file mode 100644 index 00000000..20165c2d --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/ptpcplpr.def @@ -0,0 +1,3 @@ +LIBRARY PTPCPLPR +EXPORTS DllGetClassObject PRIVATE + DllCanUnloadNow PRIVATE diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/ptpcplpr.rc b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/ptpcplpr.rc new file mode 100644 index 00000000..c40881de --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/ptpcplpr.rc @@ -0,0 +1,24 @@ +#include "winres.h" +#include <ntverp.h> + +#define VER_FILETYPE VFT_DLL +#define VER_FILESUBTYPE VFT2_UNKNOWN +#define VER_FILEDESCRIPTION_STR "PT/PC Plugin Provider Module" +#define VER_INTERNALNAME_STR "PTPCPlPr" +#define VER_ORIGINALFILENAME_STR "PTPCPlPr.dll" + +///////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + +#include "common.ver" diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/xmlhandler.cxx b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/xmlhandler.cxx new file mode 100644 index 00000000..4bbee2e8 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/xmlhandler.cxx @@ -0,0 +1,1612 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2005 Microsoft Corporation. All Rights Reserved. +// +// FILE: xmlhandler.cxx +// +// +// PURPOSE: Helper Class that handles all functionality related to +// processing of input PrintTicket/PrintCapabilities XML documents. +// +// +// Functions: Public and Private functions of class OEMPTXMLHandler. +// + +#include "precomp.hxx" + +#include "globals.hxx" +#include "printschema.hxx" +#include "xmlhandler.hxx" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +//Disable the warnings generated by PFEFAST for conversion between wchar_t * and BSTR +//because MSXML defines all its interfaces parameters as BSTR but officially declares itself +//to be wchar_t safe. + +#pragma prefast(disable:__WARNING_WCHAR_TO_BSTR) + +// +// MSXML makes the guarantee that we can call it's methods with LPTSTRs instead +// of BSTRs, so we need to do a const cast whenever we pass our strings to MSXML. +// +#define MSXMLSTR(lptstr_value) (const_cast<BSTR>(lptstr_value)) + +/*++ +Routine Name: + OEMPTXMLHandler +Routine Description: + Print Ticket Handler Constructor + + +Arguments: + None + +Return Value: + None + +--*/ + +OEMPTXMLHandler::OEMPTXMLHandler() : + m_pRootDocument(NULL), + m_pRootElement(NULL), + m_pNSManager(NULL), + m_dwNextIndex(0) +{ +} + +/*++ +Routine Name: + ~OEMPTXMLHandler( +Routine Description: + Print Ticket Handler Destructor + +Arguments: + None + +Return Value: + None + +--*/ + +OEMPTXMLHandler::~OEMPTXMLHandler() +{ + if (m_pRootDocument) + { + m_pRootDocument->Release(); + m_pRootDocument = NULL; + } + if (m_pRootElement) + { + m_pRootElement->Release(); + m_pRootElement = NULL; + } + if (m_pNSManager) + { + m_pNSManager->Release(); + m_pNSManager = NULL; + } +} + +/*++ +Routine Name: + SetRoot + +Routine Description: + + Initialization routine. Sets root of the DOM tree. Alos creates an instance of xml namespace manager + using plug-in helper interface method. + + Note: This routine MUST BE called before any other xml handling routines are called. + Note also that it is not necessary to call CoInitializeEx because Unidrv has already + made that call while creating the DOM tree with appropriate arguments passed on to it + and when Unidrv makes a call to one of plug-in interface routines, since plug-in is + running in the same thread, it does not need to make that call again + In fact the plug-in SHOULD NOT make that call to CoInitializeEx , because Unidrv must have made + that call with some particular concurrency model settings which plug-in cannot find out, + so the plug-in might end up changing the concurrency setting made by Unidrv. + +Arguments: + pRoot - Root of the input DOM tree. + + +Return Value: + HRESULT Completion status code + +--*/ +HRESULT +OEMPTXMLHandler::SetRoot( + _In_ IXMLDOMDocument2 *pRoot, + _In_ IPrintCoreHelper *pHelper + ) +{ + HRESULT hr = S_OK; + + // + // check if input paramters are not NULL + // + if (!pRoot || !pHelper) + { + return E_INVALIDARG; + } + + m_pRootDocument = pRoot; + + m_pRootDocument->AddRef(); + + + // + // Make use of Plug-in Helper Interface method provided by Unidrv to create an Instance of MSXML Namespace Manager. + // The plug-in must make use of Helper Interface provided by Unidrv while creating instance of namespacemanager + // of MSXML DOM document, the plug-in should not load MSXML6.DLL by itself but should rely on Unidrv for + // doing that + // + if (SUCCEEDED(hr)) + { + // + // Note: Current versions of Unidrv support MSXML6 hence plug-in should also support that and write its + // code in compliance with MSXML6 + // + hr = pHelper->CreateInstanceOfMSXMLObject(CLSID_MXNamespaceManager60, NULL, NULL, IID_IMXNamespaceManager, (void**)&m_pNSManager); + } + + // + // Get the Root Element of the document and store it in pRootElement. + // + if (SUCCEEDED(hr)) + { + hr = m_pRootDocument->get_documentElement(&m_pRootElement); + } + + if (FAILED(hr)) + { + if (m_pRootDocument) + { + m_pRootDocument->Release(); + m_pRootDocument = NULL; + } + + if (m_pRootElement) + { + m_pRootElement->Release(); + m_pRootElement = NULL; + } + + if (m_pNSManager) + { + m_pNSManager->Release(); + m_pNSManager = NULL; + } + } + + return hr; +} + +/*++ +Routine Name: + CreateFeatureNode + +Routine Description: + + Creates a new Feature Node + +Arguments: + pParent - parent node of the new feature node, if NULL, root is considered as parent + pszNamespaceURI - namesapce URI to which new node belongs + pszFeatureName - local name of the new feature node + ppFeatureNode - out pointer to newly created node + +Return Value: + HRESULT Completion status code + S_OK on success + E_* on failure + +--*/ + +HRESULT OEMPTXMLHandler::CreateFeatureNode( + _In_opt_ IXMLDOMElement *pParent, + _In_ PCWSTR pszNamespaceURI, + _In_ PCWSTR pszFeatureName, + _Out_opt_ IXMLDOMElement **ppFeatureNode + ) +{ + HRESULT hr = S_OK; + IXMLDOMElement *pNewElement = NULL; + BSTR qName = NULL; + + if (!pszFeatureName) + { + return E_INVALIDARG; + } + + if (!pParent) + { + pParent = m_pRootElement; + } + + + hr = CreateXMLElement(pParent, printschema::FEATURE_ELEMENT_NAME, printschema::FRAMEWORK_URI, &pNewElement); + + if (SUCCEEDED(hr)) + { + hr = CreateQName(pNewElement, pszNamespaceURI, pszFeatureName, &qName); + } + + if (SUCCEEDED(hr)) + { + + // The 'name' attibute node is not namespace qualified; it + // belongs to the namespace of its parent (feature/option) + // node. + + hr = CreateXMLAttribute(pNewElement, printschema::NAME_ATTRIBUTE_NAME, L"", qName); + } + + if (qName) + { + SysFreeString(qName); + qName = NULL; + } + + if (SUCCEEDED(hr) && ppFeatureNode) + { + *ppFeatureNode = pNewElement; + } + else if (pNewElement) + { + pNewElement->Release(); + } + + return hr; + +} + +/*++ +Routine Name: + CreateOptionNode + +Routine Description: + + Creates a new Option Node + +Arguments: + pParent - parent node of the new Option node + pszNamespaceURI - namesapce URI to which new node belongs + pszFeatureName - local name of the new Option node + ppOptionElement - out pointer to newly created node + +Return Value: + HRESULT Completion status code + S_OK on success + E_* on failure + +--*/ + +HRESULT OEMPTXMLHandler::CreateOptionNode( + _In_ IXMLDOMElement *pParent, + _In_ PCWSTR pszNamespaceURI, //print schema URI that corresponds to prefix "prn:" + _In_ PCWSTR pszOptionName, //"TopLeft" etc + _Out_opt_ IXMLDOMElement **ppOptionElement + ) +{ + HRESULT hr = S_OK; + IXMLDOMElement *pNewElement = NULL; + BSTR qName = NULL; + + if (!pParent) + { + return E_INVALIDARG; + } + + hr = CreateXMLElement(pParent, printschema::OPTION_ELEMENT_NAME, printschema::FRAMEWORK_URI, &pNewElement); + + if (SUCCEEDED(hr)) + { + hr = CreateQName(pNewElement, pszNamespaceURI, pszOptionName, &qName); + } + + if (SUCCEEDED(hr)) + { + // The 'name' attibute node is not namespace qualified; it + // belongs to the namespace of its parent (feature/option) + // node. + + hr = CreateXMLAttribute(pNewElement, printschema::NAME_ATTRIBUTE_NAME, L"", qName); + } + + if (qName) + { + SysFreeString(qName); + qName = NULL; + } + + if (SUCCEEDED(hr) && ppOptionElement) + { + *ppOptionElement = pNewElement; + } + else if (pNewElement) + { + pNewElement->Release(); + } + + return hr; +} + +/*++ +Routine Name: + CreateXMLElement + +Routine Description: + Generic method to create new XML element node + +Arguments: + + pParent - pointer to the parent node of the new nod eto be created, if NULL root of DOM tree is considered as parent + pszElementName - local name of the newly created element + pszNamespaceURI - namespace URI that the new element belongs to, the caller can only specify the namespace URI + and not the prefix + ppCreatedElement - double pointer to the newly created element returned by the procedure + +Return Value: + HRESULT Completion status code + S_OK - If the new element node is created successfully + E_* - on failure + +--*/ + +HRESULT OEMPTXMLHandler::CreateXMLElement( + _In_ IXMLDOMElement *pParent, + _In_ PCWSTR pszElementName, + _In_ PCWSTR pszNamespaceURI, + _Out_ IXMLDOMElement **ppCreatedElement + ) +{ + HRESULT hr = S_OK; + IXMLDOMNode *pNewNode = NULL; + BSTR bstrQName = NULL; + + if (!pParent || !pszElementName || !pszNamespaceURI || !ppCreatedElement) + { + return E_INVALIDARG; + } + + // + // create XML Qname + // + hr = CreateQName(pParent, pszNamespaceURI, pszElementName, &bstrQName); + + if (SUCCEEDED(hr)) + { + VARIANT nodeType; + VariantInit(&nodeType); + V_VT(&nodeType) = VT_I4; + V_I4(&nodeType) = NODE_ELEMENT; + hr = m_pRootDocument->createNode(nodeType, bstrQName, MSXMLSTR(pszNamespaceURI), &pNewNode); + if (SUCCEEDED(hr)) + VariantClear(&nodeType); + } + + if (SUCCEEDED(hr)) + hr = pParent->appendChild(pNewNode, NULL); + + + if (SUCCEEDED(hr)) + { + // + // we need to return Interface ptr to IXMLDOMElement. + // + hr = pNewNode->QueryInterface(IID_IXMLDOMElement, (void **)ppCreatedElement); + + // + // if interface is not supported, E_* will be returned in hr, + // we simply return that to the caller. + // + } + + if (pNewNode) + { + // + // release reference to local node Created since it is no longer being used + // + pNewNode->Release(); + } + + if (bstrQName) + { + SysFreeString(bstrQName); + bstrQName = NULL; + } + + return hr; + +} + +/*++ +Routine Name: + CreateQName + +Routine Description: + + Creates XML qname for given local name and namespace URI + Note: It is assumed that a prefix for given URI is already defined in root of DOM document + either by Unidrv or by plug-in itself. + Routine fails if it doesnot find a predefined prefix for given URI. + +Arguments: + pElement - context node + pszUri - Uri + pszLocalName - local name + pQName - a pointer to resultant qname string defined by the routine + +Return Value: + HRESULT Completion status code + + S_OK - On success + E_FAIL - on failure to create Qname + +--*/ +HRESULT OEMPTXMLHandler::CreateQName( + _In_ IXMLDOMElement *pElement, + _In_ PCWSTR pszUri, + _In_ PCWSTR pszLocalName, + _Out_ BSTR *pQName + ) +{ + HRESULT hr = S_OK; + BSTR bstrPrefixString = NULL; + size_t prefixLen = 0; + // Is it the default namespace? If so, don't stick a semicolon in the string + size_t localNameLen = 0; + + if (!pszUri || !pszLocalName || !pQName) + { + return E_INVALIDARG; + } + + *pQName = NULL; + + // + // See if a prefix is already defined for the given URI + // + + hr = getPrefix(pElement, pszUri, &bstrPrefixString); + + // + // It is possible that during validation the prefix might not + // already be defined if we're converting public features to GPD + // features. In that case, we need to add a definition for the + // feature namespace. + // + + if (S_FALSE == hr) + { + hr = declarePrefix(pElement, pszUri, NULL, &bstrPrefixString); + } + + if (SUCCEEDED(hr)) + { + // + // StrSafe function StringCchLength checks if the length of string is less than + // maximum length specified, and returns S_OK if the input string is non NULL and + // length is less that maximum length specified. + // It returns length of string EXCLUDING null terminator + // + hr = StringCchLength(pszLocalName, STR_MAX_CCH, &localNameLen); + } + + if (SUCCEEDED(hr)) + { + if (bstrPrefixString) + { + hr = StringCchLength(bstrPrefixString, STR_MAX_CCH, &prefixLen); + } + } + + if (SUCCEEDED(hr)) + { + if (prefixLen > 0) + { + // non-default namespace + + UINT cchLength = 0; + + if (SUCCEEDED(hr = SizeTAdd(prefixLen, localNameLen, &localNameLen)) && + SUCCEEDED(hr = SizeTAdd(localNameLen, 2, &localNameLen)) && + SUCCEEDED(hr = SizeTToUInt(localNameLen, &cchLength))) + { + + *pQName = SysAllocStringLen(NULL, cchLength); + + if (*pQName) + { + // we got a terminator character as part of SysAllocString. + hr = StringCchPrintf(*pQName, cchLength, L"%s:%s", bstrPrefixString, pszLocalName); + } + else + { + hr = E_OUTOFMEMORY; + } + } + } + else + { + // Default namespace ... + + UINT cchLength = 0; + + if (SUCCEEDED(hr = SizeTAdd(localNameLen, 1, &localNameLen)) && + SUCCEEDED(hr = SizeTToUInt(localNameLen, &cchLength))) + { + *pQName = SysAllocStringLen(NULL, cchLength); + + if (*pQName) + { + // we got a terminator character as part of SysAllocString. + hr = StringCchPrintf(*pQName, cchLength, L"%s", pszLocalName); + } + else + { + hr = E_OUTOFMEMORY; + } + } + } + } + + if (bstrPrefixString) + { + SysFreeString(bstrPrefixString); + bstrPrefixString = NULL; + } + + if (FAILED(hr)) + { + if (*pQName) + { + SysFreeString(*pQName); + *pQName = NULL; + } + } + + return hr; +} + +/*++ +Routine Name: + CreateXMLAttribute + +Routine Description: + Creates an attribute for the given XML element. + +Arguments: + + pElement - pointer to the element node to which an attribute is to be added + pszAttributeName - local name of the attribute + pszNamespaceURI - namespace URI to which the attribute belongs + pszAttributeValue - value of the attribute + +Return Value: + HRESULT Completion status code + S_OK - on success + E_* - on failure + +--*/ + +HRESULT OEMPTXMLHandler::CreateXMLAttribute( + _In_ IXMLDOMElement *pElement, + _In_ PCWSTR pszAttributeName, //"name=" + _In_ PCWSTR pszNamespaceURI, //"pt:" + _In_ PCWSTR pszAttributeValue //"prn:" + ) +{ + HRESULT hr = S_OK; + IXMLDOMAttribute *pNewAttribute = NULL ; + IXMLDOMNode *pNewNode = NULL ; + + if (!pElement || !pszAttributeName || ! pszNamespaceURI || !pszAttributeValue) + { + return E_INVALIDARG; + } + + VARIANT nodeType; + VariantInit(&nodeType); + V_VT(&nodeType) = VT_I4; + V_I4(&nodeType) = NODE_ATTRIBUTE; + hr = m_pRootDocument->createNode(nodeType, MSXMLSTR(pszAttributeName), MSXMLSTR(pszNamespaceURI), &pNewNode); + if (SUCCEEDED(hr)) + VariantClear(&nodeType); + + if (SUCCEEDED(hr)) + { + hr = pNewNode->QueryInterface(IID_IXMLDOMAttribute, (void **)&pNewAttribute); + } + + if (SUCCEEDED(hr)) + { + VARIANT attrType; + VariantInit(&attrType); + V_VT(&attrType) = VT_BSTR; + V_BSTR(&attrType) = SysAllocString(pszAttributeValue); + hr = pNewAttribute->put_value(attrType); + if (SUCCEEDED(hr)) + VariantClear(&attrType); + } + + if (SUCCEEDED(hr)) + { + hr = pElement->setAttributeNode(pNewAttribute, NULL); + } + + if (SUCCEEDED(hr)) + { + if (pNewAttribute) + { + pNewAttribute->Release(); + } + + } + else if (pNewAttribute) + pNewAttribute->Release(); + + if (pNewNode) + pNewNode->Release(); + + return hr; +} + +/*++ +Routine Name: + GetXMLElement +Routine Description: + Returns an XML element with given namespace URI and given attribute + +Arguments: + + pParent - Parent of node to be found + pszElementNamespaceURI - Namespace URI to which the element belongs + pszElementName - Local Name of the element + pszAttrNamespaceURI - Namespace URI to which the attribute of the element belongs + pszAttrName - local name of the element attribute + ppElement - out pointer to xml element so retrieved + +Return Value: + HRESULT Completion status code + S_OK - On Successfully locating XML node specified + S_FALSE - If the specified XML node is not found + E_* - On Failure + + Note: Since the module returns S_FALSE if the specified node is not found, the caller must be + careful to check hr status to be S_OK before proceeding, just checking for SUCCEEDED(hr) might + give wrong results + +--*/ +HRESULT OEMPTXMLHandler::GetXMLElement( + _In_ IXMLDOMElement *pParent, + _In_ PCWSTR pszElementNamespaceURI, + _In_ PCWSTR pszElementName, + _In_ PCWSTR pszAttrNamespaceURI, + _In_ PCWSTR pszAttrName, + _Outptr_result_maybenull_ IXMLDOMElement **ppElement + ) const +{ + HRESULT hr = S_OK; + LONG cChildren = 0; + IXMLDOMNodeList *pChildren = NULL; + + + if (!pParent || !pszElementNamespaceURI || !pszElementName || !pszAttrNamespaceURI || !pszAttrName) + { + return E_INVALIDARG; + } + + *ppElement = NULL; + + // + // Get a list of child nodes for the current DOM node + // + hr = pParent->get_childNodes(&pChildren); + + // + // Get number of child nodes + // + if (SUCCEEDED(hr)) + { + hr = pChildren->get_length(&cChildren); + } + + if (SUCCEEDED(hr)) + { + LONG i = 0; + BOOL bFound = FALSE; + + for(i = 0;i < cChildren && !bFound;i++) + { + IXMLDOMNode *pCurNode; + IXMLDOMElement *pCurElement = NULL; + + hr = pChildren->get_item(i, &pCurNode); + + if (SUCCEEDED(hr)) + { + hr = pCurNode->QueryInterface(IID_IXMLDOMElement, (void **)&pCurElement); + } + if (S_OK == hr) + { + BSTR bstrElementName = NULL; + BSTR bstrElementNamespaceURI = NULL; + + // + // retrieve element name and namespace URI + // + hr = pCurElement->get_baseName(&bstrElementName); + + if (SUCCEEDED(hr)) + { + hr = pCurElement->get_namespaceURI(&bstrElementNamespaceURI); + } + + if (SUCCEEDED(hr) && bstrElementNamespaceURI && bstrElementName) + { + + if (0 == wcscmp(bstrElementName, pszElementName) && 0 == wcscmp(bstrElementNamespaceURI, pszElementNamespaceURI)) + { + // + //check if element name matches + // + BSTR bstrAttrName = NULL; + BSTR bstrAttrNamespaceURI = NULL; + hr = GetXMLAttribute(pCurElement,&bstrAttrNamespaceURI,&bstrAttrName); + if (SUCCEEDED(hr) && bstrAttrName && bstrAttrNamespaceURI) + { + if (0 == wcscmp(bstrAttrName, pszAttrName) && 0 == wcscmp(pszAttrNamespaceURI, bstrAttrNamespaceURI)) + { + bFound = TRUE; + *ppElement = pCurElement; + (*ppElement)->AddRef(); + } + else + { + hr = S_FALSE; + } + } + + SysFreeString(bstrAttrName); + bstrAttrName = NULL; + + SysFreeString(bstrAttrNamespaceURI); + bstrAttrNamespaceURI = NULL; + } + } + + SysFreeString(bstrElementName); + bstrElementName = NULL; + + SysFreeString(bstrElementNamespaceURI); + bstrElementNamespaceURI = NULL; + + if (pCurElement) + { + pCurElement->Release(); + } + } + + if (pCurNode) + { + pCurNode->Release(); + } + } + } + + if (pChildren) + pChildren->Release(); + + if (SUCCEEDED(hr) && (*ppElement)) + { + hr = S_OK; + } + else + { + hr = S_FALSE; + } + + return hr; + +} + +/*++ +Routine Name: + GetXMLElementWithoutAttribute + +Routine Description: + Returns an XML element with given namespace URI. + +Arguments: + + pParent - Parent of node to be found + pszElementNamespaceURI - Namespace URI to which the element belongs + pszElementName - Local Name of the element + ppChildElement - out pointer to xml element so retrieved + +Return Value: + HRESULT Completion status code + S_OK - On Successfully locating XML node specified + S_FALSE - If the specified XML node is not found + E_* - On Failure + + Note: Since the module returns S_FALSE if the specified node is not found, the caller must be + careful to check hr status before proceeding, just checking for SUCCEEDED(hr) might + give wrong results + +--*/ +HRESULT OEMPTXMLHandler::GetXMLElementWithoutAttribute( + _In_ IXMLDOMElement *pContext, + _In_ PCWSTR pszElementNamespace, + _In_ PCWSTR pszElementName, + _Outptr_result_maybenull_ IXMLDOMElement **ppChildElement + ) const +{ + if (!pContext || !pszElementName || !pszElementNamespace || !ppChildElement) + { + return E_INVALIDARG; + } + + HRESULT hr = S_OK; + LONG cChildren = 0; + IXMLDOMNodeList *pContextChildren; + *ppChildElement = NULL; + + // + // Get the list of child nodes + // + hr = pContext->get_childNodes(&pContextChildren); + + if (SUCCEEDED(hr)) + hr = pContextChildren->get_length(&cChildren); + + if (SUCCEEDED(hr)) + { + for(LONG i = 0;i < cChildren && !(*ppChildElement);i++) + { + + IXMLDOMNode *pCurrentNode; + IXMLDOMElement *pCurrentElement; + hr = pContextChildren->get_item(i, &pCurrentNode); + + // + // See if its a DOM Element. Don't set hr here because we + // fully expect that not everything in the context is an element. + // + if (SUCCEEDED(hr) && S_OK == pCurrentNode->QueryInterface(IID_IXMLDOMElement, (void**)&pCurrentElement)) + { + BSTR pbstrBaseName = NULL; + BSTR pbstrNamespaceURI = NULL; + + hr = pCurrentElement->get_baseName(&pbstrBaseName); + + if (SUCCEEDED(hr)) + { + hr = pCurrentElement->get_namespaceURI(&pbstrNamespaceURI); + } + if (SUCCEEDED(hr) && + pbstrNamespaceURI && + pbstrBaseName && + 0 == wcscmp(pbstrNamespaceURI, pszElementNamespace) && + 0 == wcscmp(pbstrBaseName, pszElementName)) + { + *ppChildElement = pCurrentElement; + (*ppChildElement)->AddRef(); + } + + pCurrentElement->Release(); + + SysFreeString(pbstrBaseName); + pbstrBaseName = NULL; + + SysFreeString(pbstrNamespaceURI); + pbstrNamespaceURI = NULL; + } + + if (pCurrentNode) + { + pCurrentNode->Release(); + } + } + } + + if (pContextChildren) + { + pContextChildren->Release(); + } + + if (SUCCEEDED(hr)) + { + if (*ppChildElement) + { + hr = S_OK; + } + else + { + hr = S_FALSE; + } + } + + return hr; +} + +/*++ +Routine Name: + GetXMLAttribute + +Routine Description: + Returns an XML Attribute node with given namespace URI. + +Arguments: + + pParent - Parent of node to be found + pszAttrNamespaceURI - Namespace URI to which the attribute belongs + pszAttrName - Local Name of the attribute + ppChildElement - out pointer to xml node so retrieved + +Return Value: + HRESULT Completion status code + S_OK - On Success + E_* - On Failure + +--*/ +HRESULT OEMPTXMLHandler::GetXMLAttribute( + _In_ IXMLDOMElement *pElement, + _Outptr_result_maybenull_ BSTR *ppAttrNamespaceURI, + _Outptr_result_maybenull_ BSTR *ppAttrName + ) const +{ + HRESULT hr = S_OK; + IXMLDOMNamedNodeMap *pAttrMap = NULL; + IXMLDOMNode *pAttrNode = NULL; + + if (!pElement || !ppAttrNamespaceURI || !ppAttrName) + { + return E_INVALIDARG; + } + + *ppAttrNamespaceURI = NULL; + *ppAttrName = NULL; + + hr = pElement->get_attributes(&pAttrMap); + + if (SUCCEEDED(hr)) + { + hr = pAttrMap->getNamedItem(MSXMLSTR(printschema::NAME_ATTRIBUTE_NAME),&pAttrNode); + } + + if (S_OK == hr) + { + BSTR bstrAttrQName = NULL; + IXMLDOMAttribute *pAttribute = NULL; + + hr = pAttrNode->QueryInterface(IID_IXMLDOMAttribute, (void **)&pAttribute); + + if (SUCCEEDED(hr)) + hr = pAttribute->get_text(&bstrAttrQName); + + if (S_OK == hr && bstrAttrQName) + hr = getUri(pElement, bstrAttrQName, ppAttrNamespaceURI); + + if (S_OK == hr && bstrAttrQName) + hr = getLocalName(bstrAttrQName, ppAttrName); + + if (pAttribute) + pAttribute->Release(); + + if (bstrAttrQName) + { + SysFreeString(bstrAttrQName); + bstrAttrQName = NULL; + } + } + + if (pAttrMap) + pAttrMap->Release(); + if (pAttrNode) + pAttrNode->Release(); + + if (FAILED(hr)) + { + if (*ppAttrNamespaceURI) + { + SysFreeString(*ppAttrNamespaceURI); + *ppAttrNamespaceURI = NULL; + } + if (*ppAttrName) + { + SysFreeString(*ppAttrName); + *ppAttrName = NULL; + } + } + return hr; +} + +/*++ +Routine Name: + GetFeatureNode + +Routine Description: + + Returns the feature node with specified attribute under printschema namespace + +Arguments: + pParent - parent node of the feature node to be located + pszAttrNamespaceURI - namespace URI for the attribute node of given feature node + pszAttrName - attribute name for given feature node + ppElement - OUT pointer to feature node to be returned + +Return Value: + HRESULT Completion status code + S_OK - On Successfully locating Feature node + S_FALSE - If Feature node is not found + E_* - On Failure + + +--*/ +HRESULT OEMPTXMLHandler::GetFeatureNode( + _In_opt_ IXMLDOMElement *pParent, + _In_ PCWSTR pszAttrNamespaceURI, + _In_ PCWSTR pszAttrName, + _Out_ _When_(return == S_FALSE, _At_(*ppElement, _Post_maybenull_)) + _When_(return != S_FALSE, _At_(*ppElement, _Post_valid_)) + IXMLDOMElement **ppElement + ) const +{ + HRESULT hr = S_OK; + + // + // If no parent is specified, set root of DOM tree as parent + // + if (!pParent) + { + pParent = m_pRootElement; + } + + hr = GetXMLElement(pParent, printschema::FRAMEWORK_URI, printschema::FEATURE_ELEMENT_NAME, pszAttrNamespaceURI, pszAttrName, ppElement); + + return hr; +} + +/*++ +Routine Name: + GetOptionNode + +Routine Description: + + Returns the option node under printschema namespace + +Arguments: + pParent - parent node of the option node to be located + ppElement - OUT pointer to option node to be returned + +Return Value: + HRESULT Completion status code + S_OK - On Successfully locating Option node + S_FALSE - If Option node is not found + E_* - On Failure + +--*/ +HRESULT +OEMPTXMLHandler::GetOptionNode( + _In_ IXMLDOMElement *pParent, + _Outptr_result_maybenull_ IXMLDOMElement **ppElement + ) const +{ + return GetXMLElementWithoutAttribute(pParent, printschema::FRAMEWORK_URI, printschema::OPTION_ELEMENT_NAME, ppElement); +} + +/*++ + +Routine Name: + getLocalName +Routine Description: + Returns Local name for input XML Qname. + +Arguments: + pszQName - Qname for which local name is to be found out + ppbstrLocalName - OUT pointer to local name + +Return Value: + HRESULT Completion status code + S_OK - On Success + E_* - On Failure + +--*/ +HRESULT +OEMPTXMLHandler::getLocalName( + _In_ PCWSTR pszQName, + _Out_ BSTR *ppbstrLocalName + ) const +{ + HRESULT hr = S_OK; + + if (!pszQName || !ppbstrLocalName) + { + return E_INVALIDARG; + } + + *ppbstrLocalName = NULL; + + PCWSTR pszStartPos = wcschr(pszQName,L':'); + + if (pszStartPos) + { + pszStartPos++; + } + else + { + pszStartPos = pszQName; + } + + *ppbstrLocalName = SysAllocString(pszStartPos); + + if (!(*ppbstrLocalName)) + { + hr = E_OUTOFMEMORY; + } + + return hr; +} + + +/*++ +Routine Name: + getUri +Routine Description: + Returns namespace URI for given input Qname and in context of given XML DOM node. +Arguments: + pContext - Input XML DOM node for current context + pszQName - input qname + pbstrURI - OUT pointer to URI to be returned +Return Value: + + S_OK if found + S_FALSE if not found + E_OUTOFMEMORY if the string could not be allocated + E_INVALIDARG if a non-optional param is null. + +Notes: + + This routine assumes that the string has already been + validated, which should have happened in the managed code base. + The string should either be of the form "prefix:localname", + or "localname" + +--*/ +HRESULT +OEMPTXMLHandler::getUri( + IXMLDOMElement *pContext, + _In_ PCWSTR pszQName, + _Out_ BSTR *pbstrURI + ) const + +{ + HRESULT hr = S_OK; + BOOL bNodePushed = FALSE; + + if (!(pContext && pbstrURI && pszQName)) + { + return E_INVALIDARG; + } + + PWSTR pszSplitPos = (_TCHAR*) wcschr(pszQName, L':'); + INT cchUri = 0; + *pbstrURI = NULL; + + // + // if splitpos is null, then there is no namespace + // prefix, which means return the default namespace. + // + wchar_t wchSwapChar = L'\0'; + if (pszSplitPos) + { + wchSwapChar = *pszSplitPos; + *pszSplitPos = (wchar_t)0; + } + else + { + pszQName = L""; + } + + hr = m_pNSManager->pushNodeContext(pContext, TRUE); + + if (SUCCEEDED(hr)) + { + bNodePushed = TRUE; + // get the length first, then alloc the string +#pragma prefast(suppress:__WARNING_INVALID_PARAM_VALUE_1, "According to MSDN, it is acceptable to pass a NULL buffer to getURI.") + hr = m_pNSManager->getURI(pszQName, NULL, NULL, &cchUri); + } + + if (S_OK == hr) + { + if (SUCCEEDED(hr)) + { + // account for null terminator + cchUri += 1; + + *pbstrURI = SysAllocStringLen(NULL, cchUri); + if (!(*pbstrURI)) + { + hr = E_OUTOFMEMORY; + } + } + + if (SUCCEEDED(hr)) + { + hr = m_pNSManager->getURI(pszQName, NULL, *pbstrURI, &cchUri); + } + + if (pszSplitPos) + { + *pszSplitPos = wchSwapChar; + } + + if (FAILED(hr) && (*pbstrURI)) + { + SysFreeString(*pbstrURI); + *pbstrURI = NULL; + } + } + + if (bNodePushed) + { + hr = m_pNSManager->popContext(); + } + + return hr; +} + +/*++ + +Routine Name: + getPrefix +Routine Description: + + Returns predefined Prefix for the input namespace URI if one already exists + +Arguments: + pContext - Current context node + pszUri - namespace URI for which prefix is to be obtained + pbstrPrefix - prefix string to be returned, if NULL routine just checks for + existence of prefix + +Return Value: + HRESULT Completion status code + S_OK - on success + S_FALSE - on failure + +--*/ +HRESULT +OEMPTXMLHandler::getPrefix( + _In_ IXMLDOMElement *pContext, + _In_ PCWSTR pszUri, + _Outptr_opt_result_maybenull_ BSTR *pbstrPrefix + ) const +{ + HRESULT hr = S_OK; + BOOL bNodePushed = FALSE; + INT cchPrefix = 0; + + if (!pContext || !pszUri) + return E_INVALIDARG; + + if (pbstrPrefix) + { + *pbstrPrefix = NULL; + } + + //Push context "Deep" to get info abt all URI prefix mappings defined so far in the current DOM document + hr = m_pNSManager->pushNodeContext(pContext, TRUE); + + if (SUCCEEDED(hr)) + { + bNodePushed = TRUE; + + // get the length first, then alloc the string + + hr = m_pNSManager->getPrefix(pszUri, 0, NULL, &cchPrefix); + } + + + if (S_OK == hr && pbstrPrefix) + { + + *pbstrPrefix = NULL; + cchPrefix++; + + if (SUCCEEDED(hr)) + { + *pbstrPrefix = SysAllocStringLen(NULL, cchPrefix); + + if (!(*pbstrPrefix)) + hr = E_OUTOFMEMORY; + } + + if (SUCCEEDED(hr)) + { + hr = m_pNSManager->getPrefix(pszUri, 0, *pbstrPrefix, &cchPrefix); + + } + + if (FAILED(hr) && (*pbstrPrefix)) + { + SysFreeString(*pbstrPrefix); + *pbstrPrefix = NULL; + } + } + + // Note: MSXML NSManager returns S_FALSE for an undeclared URI, and E_FAIL for an undeclared + // prefix, hence it is safe to check for both here. + + if (E_FAIL == hr || S_FALSE == hr) + { + // NS manager didn't find the prefix. Tweak the result to S_FALSE + hr = S_FALSE; + } + + if (bNodePushed) + { + m_pNSManager->popContext(); + } + + return hr; +} + +/*++ + +Routine Name: + declarePrefix + +Routine Description: + + This declares a new prefix for a given URI. This routine will always generate a new + prefix definition, regardless of whether the URI is already defined. Use getPrefix + to prevent duplicate definitions of namespace URI prefixes. If the preferred prefix is + already in use or no preferred prefix is supplied the namespace will be declared using + a generated namespace name. + +Arguments: + pContext - The context in which you want to ensure that the prefix is properly declared + in. This is where we check to see if the prefix is already in use. However, if not + in use, the prefix will always be declared in the root of the document. This gaurantees + 2 things: The prefix is declared in the entire document (though it may be overridden + locally in other places), and the prefix has the expected meaning at the passed in pContext. + pszUri - The URI to associate with the prefix. + pszPreferredPrefix - prefix to use if not already defined, can be a BSTR or PCWSTR, either + is acceptable + pbstrNewPrefix - The actual prefix that was declared, which may be different from the + preferred prefix + +Return Value: + HRESULT Completion status code + S_OK - on success + S_FALSE - on failure + +--*/ +HRESULT +OEMPTXMLHandler::declarePrefix( + _In_ IXMLDOMElement *pContext, + _In_ PCWSTR pszUri, + _In_opt_ PCWSTR pszPreferredPrefix, + _Out_ BSTR *pbstrNewPrefix + ) +{ + HRESULT hr = S_OK; + + // These two strings are tied ... the second string is used to print the number over top of a + // copy of the first string, so chances are, if you change one, you need to change the other. + PCWSTR szPrefixChars = L"ns0000"; + PCWSTR szPrefixPrintfPattern = L"ns%.4X"; + + if (!(pContext && pszUri && pbstrNewPrefix)) + { + return E_INVALIDARG; + } + + *pbstrNewPrefix = NULL; + + // Check if the preferred prefix exists... + // + // If we got S_OK, the prefix exists, if we got E_*, bail out + // anyway. Only declare the prefix if we successfully decided + // it doesn't exist. + + if (pszPreferredPrefix) + { + INT unused = 0; + + if (SUCCEEDED(hr)) + { + hr = m_pNSManager->pushNodeContext(pContext, TRUE); + } + + if (SUCCEEDED(hr)) + { +#pragma prefast(suppress:__WARNING_INVALID_PARAM_VALUE_1, "According to MSDN, it is acceptable to pass a NULL buffer to getURI.") + hr = m_pNSManager->getURI(pszPreferredPrefix, NULL, NULL, &unused); + + // If the prefix is already defined, MSXML will return S_FALSE. In that + // case, we don't want to declare another namespace with the same prefix + if (S_FALSE != hr) + { + pszPreferredPrefix = NULL; + } + + hr = m_pNSManager->popContext(); + } + + if (SUCCEEDED(hr) && pszPreferredPrefix) + { + *pbstrNewPrefix = SysAllocStringLen(pszPreferredPrefix, (UINT) wcslen(pszPreferredPrefix)); + } + } + + // If we don't have a workable prefix, try to generate a namespace + // Namespaces are in the form of NSxxxx where the x's are hex digits, + // and there are sizeof(m_nextPrefix)*2 of them + if (SUCCEEDED(hr) && !(*pbstrNewPrefix)) + { + BOOL bFound = TRUE; + UINT cchLength = (UINT) wcslen(szPrefixChars); + *pbstrNewPrefix = SysAllocStringLen(NULL, cchLength); + if (!(*pbstrNewPrefix)) + { + hr = E_OUTOFMEMORY; + } + if (SUCCEEDED(hr)) + { + do + { + INT unused = 0; + + // We're really unlikely to hit this. If we do we probably + // have bigger problems. but put a reasonable cap on the + // generated namespaces anyway. + if (((UINT)m_dwNextIndex) >= (UINT)0xFFFF) + { + // We could reset the counter here, but it's very unlikely to + // help matters, and could end up costing tons of CPU time if + // caller ignored the error or retried. + hr = E_FAIL; + } + + if (SUCCEEDED(hr)) + { + // now fill in the real value. + hr = StringCchPrintf(*pbstrNewPrefix, cchLength+1, szPrefixPrintfPattern, (INT)m_dwNextIndex); + } + + if (SUCCEEDED(hr)) + { + // look up the URI associated with the prefix. +#pragma prefast(suppress:__WARNING_INVALID_PARAM_VALUE_1, "According to MSDN, it is acceptable to pass a NULL buffer to getURI.") + bFound = (S_OK == m_pNSManager->getURI(*pbstrNewPrefix, pContext, NULL, &unused)); + } + + m_dwNextIndex++; + + } while(SUCCEEDED(hr) && bFound); + + if (bFound) + { + SysFreeString(*pbstrNewPrefix); + *pbstrNewPrefix = NULL; + } + } + } + + if (SUCCEEDED(hr) && *pbstrNewPrefix) + { + // We'll always put declarations at the root + if (SUCCEEDED(hr)) + { + // Create the namespace declaration string + UINT cchDeclLength = (UINT)(wcslen(L"xmlns:") + wcslen(*pbstrNewPrefix)); + + BSTR bstrDecl = SysAllocStringLen(NULL, cchDeclLength); + if (!bstrDecl) + { + hr = E_OUTOFMEMORY; + } + + // Add the new declaration to the root of the document. This is important because + // we really don't want to re-declare the namespace at every element. Just starts + // to look really messy, and adds a lot of bloat. + if (SUCCEEDED(hr)) + { + hr = StringCchPrintf(bstrDecl, cchDeclLength+1, L"xmlns:%s", *pbstrNewPrefix); + } + + if (SUCCEEDED(hr)) + { + hr = CreateXMLAttribute(m_pRootElement, bstrDecl, L"", pszUri); + } + + SysFreeString(bstrDecl); + bstrDecl = NULL; + + // Explicitly let the namespace manager know about our prefix + + if (SUCCEEDED(hr)) + { + hr = m_pNSManager->declarePrefix(*pbstrNewPrefix, pszUri); + } + } + } + + if (FAILED(hr)) + { + SysFreeString(*pbstrNewPrefix); + *pbstrNewPrefix = NULL; + } + + return hr; +} + +/*++ +Routine Name: + DeleteFeatureNode +Routine Description: + + Deletes given input Feature node and all its children from DOM tree + +Arguments: + + pParent - Parent node of the XML DOM node to be deleted + pElement - XML DOM node to be deleted + +Return Value: + HRESULT Completion status code + S_OK - On Success + E_* - On failure +--*/ +HRESULT +OEMPTXMLHandler::DeleteFeatureNode( + _In_opt_ IXMLDOMNode *pParent, + _In_ IXMLDOMNode *pElement + ) +{ + HRESULT hr = S_OK; + + IXMLDOMNode *pRemovedElement = NULL; + + if (!pElement) + { + return E_INVALIDARG; + } + + // + // if no parent node specified assume root of DOM tree as parent + // + + if (!pParent) + { + pParent = m_pRootElement; + } + + // + // MSXML function removeChild removes the given child of the XML + // element and all its children, even the Attribute nodes defined + // for given element node if any are removed. Hence we do not need + // to worry about recursively removing all the children of the + // given node before removing it + // + + hr = pParent->removeChild(pElement, &pRemovedElement); + + if (pRemovedElement) + { + pRemovedElement->Release(); + } + + return hr ; +} diff --git a/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/xmlhandler.hxx b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/xmlhandler.hxx new file mode 100644 index 00000000..2767c282 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/PTPCPlPr/src/xmlhandler.hxx @@ -0,0 +1,162 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2005 Microsoft Corporation. All Rights Reserved. +// +// FILE: xmlhandler.hxx +// +// +// PURPOSE: Helper Class that handles all functionality related to +// processing of input PrintTicket/PrintCapabilities XML document +// +// + +#pragma once + +// +// Print ticket handler class that performs all XML handling for the +// sample code +// + +class OEMPTXMLHandler +{ + +public: + + OEMPTXMLHandler(); + virtual ~OEMPTXMLHandler(); + + HRESULT SetRoot( + _In_ IXMLDOMDocument2 *pRoot, + _In_ IPrintCoreHelper *pHelper + ); + + // + // Node creation methods + // + + HRESULT CreateFeatureNode( + _In_opt_ IXMLDOMElement *pParent, + _In_ PCWSTR pszNamespaceURI, + _In_ PCWSTR pszFeatureName, + _Out_opt_ IXMLDOMElement **ppFeatureNode + ); + + HRESULT CreateOptionNode( + _In_ IXMLDOMElement *pParent, + _In_ PCWSTR pszNamespaceURI, + _In_ PCWSTR pszOptionName, + _Out_opt_ IXMLDOMElement **ppOptionElement + ); + + // + // Get methods + // + + HRESULT GetXMLAttribute( + _In_ IXMLDOMElement *pElement, + _Outptr_result_maybenull_ BSTR *pszAttrNamespaceURI, + _Outptr_result_maybenull_ BSTR *pszAttrName + ) const; + + HRESULT GetFeatureNode( + _In_opt_ IXMLDOMElement *pParent, + _In_ PCWSTR pszAttrNamespaceURI, + _In_ PCWSTR pszAttrName, + _Out_ _When_(return == S_FALSE, _At_(*ppElement, _Post_maybenull_)) + _When_(return != S_FALSE, _At_(*ppElement, _Post_valid_)) + IXMLDOMElement **ppElement + ) const; + + HRESULT GetOptionNode( + _In_ IXMLDOMElement *pParent, + _Outptr_result_maybenull_ IXMLDOMElement **ppElement + ) const; + + HRESULT DeleteFeatureNode( + _In_opt_ IXMLDOMNode *pParent, + _In_ IXMLDOMNode *pElement + ); + +private: + + IXMLDOMDocument2 *m_pRootDocument; + IXMLDOMElement *m_pRootElement; + IMXNamespaceManager *m_pNSManager; + DWORD m_dwNextIndex; + + HRESULT GetXMLElement( + _In_ IXMLDOMElement *pParent, + _In_ PCWSTR pszElementNamespaceURI, + _In_ PCWSTR pszElementName, + _In_ PCWSTR pszAttrNamespaceURI, + _In_ PCWSTR pszAttrName, + _Outptr_result_maybenull_ IXMLDOMElement **ppElement + ) const; + + HRESULT GetXMLElementWithoutAttribute( + _In_ IXMLDOMElement *pContext, + _In_ PCWSTR pszElementNamespaceURI, + _In_ PCWSTR pszElementName, + _Outptr_result_maybenull_ IXMLDOMElement **ppChildElement + ) const; + + HRESULT getPrefix( + _In_ IXMLDOMElement *pContext, + _In_ PCWSTR pszUri, + _Outptr_opt_result_maybenull_ BSTR *pbstrPrefix + ) const; + + HRESULT declarePrefix( + _In_ IXMLDOMElement *pContext, + _In_ LPCWSTR pszUri, + _In_opt_ LPCWSTR pszPreferredPrefix, + _Out_ BSTR *newPrefix + ); + + HRESULT CreateQName( + _In_ IXMLDOMElement *pElement, + _In_ PCWSTR pszUri, + _In_ PCWSTR pszLocalName, + _Out_ BSTR *pQName + ); + + // + // Adds attributes to existing XML element + // + + HRESULT CreateXMLAttribute( + _In_ IXMLDOMElement *pElement, + _In_ PCWSTR pszAttributeName, + _In_ PCWSTR pszNamespaceURI, + _In_ PCWSTR pszAttributeValue + ); + + // + // Creates new XML element node + // + HRESULT CreateXMLElement( + _In_ IXMLDOMElement *pParent, + _In_ PCWSTR pszElementName, + _In_ PCWSTR pszNamespaceURI, + _Out_ IXMLDOMElement **ppCreatedElement + ); + + // + // Helpers + // + HRESULT getLocalName( + _In_ PCWSTR pszQName, + _Out_ BSTR *ppbstrLocalName + ) const; + + HRESULT getUri( + IXMLDOMElement *pContext, + _In_ PCWSTR pszQName, + _Out_ BSTR *pbstrURI + ) const; + +}; + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/SYNCSET.vcxproj b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/SYNCSET.vcxproj new file mode 100644 index 00000000..cf56c5f6 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/SYNCSET.vcxproj @@ -0,0 +1,1066 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Win10 Debug|ARM64"> + <Configuration>Win10 Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|Win32"> + <Configuration>Win10 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|x64"> + <Configuration>Win10 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|ARM64"> + <Configuration>Win10 Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|Win32"> + <Configuration>Win10 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|x64"> + <Configuration>Win10 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|Win32"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|Win32"> + <Configuration>Win8 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|Win32"> + <Configuration>Win7 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|Win32"> + <Configuration>Win8.1 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|Win32"> + <Configuration>Win8 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|Win32"> + <Configuration>Win7 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|x64"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|x64"> + <Configuration>Win8 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|x64"> + <Configuration>Win7 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|x64"> + <Configuration>Win8.1 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|x64"> + <Configuration>Win8 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|x64"> + <Configuration>Win7 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}</ProjectGuid> + <RootNamespace>$(MSBuildProjectName)</RootNamespace> + <Configuration Condition="'$(Configuration)' == ''">Win10 Debug</Configuration> + <Platform Condition="'$(Platform)' == ''">Win32</Platform> + <SampleGuid>{A7A17685-16BD-4A90-9E09-A46B09CF3A1F}</SampleGuid> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <PropertyGroup> + <OutDir>$(IntDir)</OutDir> + </PropertyGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ItemGroup Label="WrappedTaskItems" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetName>SYNCSET</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetName>SYNCSET</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetName>SYNCSET</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <TargetName>SYNCSET</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <TargetName>SYNCSET</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetName>SYNCSET</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetName>SYNCSET</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetName>SYNCSET</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <TargetName>SYNCSET</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <TargetName>SYNCSET</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetName>SYNCSET</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetName>SYNCSET</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetName>SYNCSET</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <TargetName>SYNCSET</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetName>SYNCSET</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetName>SYNCSET</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetName>SYNCSET</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <TargetName>SYNCSET</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;_DEBUG</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>SYNCSET.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>SYNCSET.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>SYNCSET.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>SYNCSET.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>SYNCSET.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>SYNCSET.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>SYNCSET.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>SYNCSET.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>SYNCSET.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>SYNCSET.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>SYNCSET.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>SYNCSET.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>SYNCSET.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>SYNCSET.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>SYNCSET.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>SYNCSET.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>SYNCSET.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>SYNCSET.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="debug.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="devmode.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="dllentry.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="globals.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="oemui.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Create</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ResourceCompile Include="oemui.rc" /> + </ItemGroup> + <ItemGroup> + <Inf Exclude="@(Inf)" Include="*.inf" /> + <FilesToPackage Include="$(TargetPath)" Condition="'$(ConfigurationType)'=='Driver' or '$(ConfigurationType)'=='DynamicLibrary'" /> + </ItemGroup> + <ItemGroup> + <None Exclude="@(None)" Include="*.txt;*.htm;*.html" /> + <None Exclude="@(None)" Include="*.ico;*.cur;*.bmp;*.dlg;*.rct;*.gif;*.jpg;*.jpeg;*.wav;*.jpe;*.tiff;*.tif;*.png;*.rc2" /> + <None Exclude="@(None)" Include="*.def;*.bat;*.hpj;*.asmx" /> + </ItemGroup> + <ItemGroup> + <ClInclude Exclude="@(ClInclude)" Include="*.h;*.hpp;*.hxx;*.hm;*.inl;*.xsd" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/SYNCSET.vcxproj.Filters b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/SYNCSET.vcxproj.Filters new file mode 100644 index 00000000..9737750a --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/SYNCSET.vcxproj.Filters @@ -0,0 +1,272 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;*</Extensions> + <UniqueIdentifier>{72226DBB-2FE2-4E91-99A5-A18952A112EB}</UniqueIdentifier> + </Filter> + <Filter Include="Header Files"> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + <UniqueIdentifier>{C3708A9B-9215-44CC-96A2-0C0B656486BF}</UniqueIdentifier> + </Filter> + <Filter Include="Resource Files"> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms;man;xml</Extensions> + <UniqueIdentifier>{D44A3AF2-69E5-4F32-BC8A-7636FB947722}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClCompile Include="debug.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="devmode.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="dllentry.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="globals.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="oemui.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="oemui.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> + <ItemGroup> + <None Include="SyncSet.def"> + <Filter>Source Files</Filter> + </None> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/SyncSet.def b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/SyncSet.def new file mode 100644 index 00000000..68bdffc0 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/SyncSet.def @@ -0,0 +1,3 @@ +LIBRARY OEMUI +EXPORTS DllGetClassObject PRIVATE + DllCanUnloadNow PRIVATE
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/debug.cpp b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/debug.cpp new file mode 100644 index 00000000..f7a3d842 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/debug.cpp @@ -0,0 +1,405 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1996 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Debug.cpp +// +// PURPOSE: Debug functions. +// +// + +#include "precomp.h" +#include "debug.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +//////////////////////////////////////////////////////// +// INTERNAL DEFINES +//////////////////////////////////////////////////////// + +#define DEBUG_BUFFER_SIZE 1024 +#define PATH_SEPARATOR '\\' +#define MAX_LOOP 10 + +// Determine what level of debugging messages to eject. +#ifdef VERBOSE_MSG + #define DEBUG_LEVEL DBG_VERBOSE +#elif TERSE_MSG + #define DEBUG_LEVEL DBG_TERSE +#elif WARNING_MSG + #define DEBUG_LEVEL DBG_WARNING +#elif ERROR_MSG + #define DEBUG_LEVEL DBG_ERROR +#elif RIP_MSG + #define DEBUG_LEVEL DBG_RIP +#elif NO_DBG_MSG + #define DEBUG_LEVEL DBG_NONE +#else + #define DEBUG_LEVEL DBG_WARNING +#endif + + + +//////////////////////////////////////////////////////// +// EXTERNAL GLOBALS +//////////////////////////////////////////////////////// + +INT giDebugLevel = DEBUG_LEVEL; + + + + +//////////////////////////////////////////////////////// +// INTERNAL PROTOTYPES +//////////////////////////////////////////////////////// + +static BOOL DebugMessageV(LPCSTR lpszMessage, va_list arglist); +static BOOL DebugMessageV(DWORD dwSize, LPCWSTR lpszMessage, va_list arglist); + + + + +////////////////////////////////////////////////////////////////////////// +// Function: DebugMessageV +// +// Description: Outputs variable argument debug string. +// +// +// Parameters: +// +// dwSize Size of temp buffer to hold formated string. +// +// lpszMessage Format string. +// +// arglist Variable argument list.. +// +// +// Returns: +// +// +// Comments: +// +// +////////////////////////////////////////////////////////////////////////// + +static BOOL DebugMessageV(LPCSTR lpszMessage, va_list arglist) +{ + DWORD dwSize = DEBUG_BUFFER_SIZE; + DWORD dwLoop = 0; + LPSTR lpszMsgBuf = NULL; + HRESULT hr; + + + // Parameter checking. + if( (NULL == lpszMessage) + || + (0 == dwSize) + ) + { + return FALSE; + } + + do + { + // Allocate memory for message buffer. + if(NULL != lpszMsgBuf) + { + delete[] lpszMsgBuf; + dwSize *= 2; + } + lpszMsgBuf = new CHAR[dwSize + 1]; + if(NULL == lpszMsgBuf) + { + return FALSE; + } + + hr = StringCbVPrintfA(lpszMsgBuf, (dwSize + 1) * sizeof(CHAR), lpszMessage, arglist); + + // Pass the variable parameters to wvsprintf to be formated. + } while (FAILED(hr) && (STRSAFE_E_INSUFFICIENT_BUFFER == hr) && (++dwLoop < MAX_LOOP) ); + + // Dump string to Debug output. + OutputDebugStringA(lpszMsgBuf); + + // Cleanup. + delete[] lpszMsgBuf; + + return SUCCEEDED(hr); +} + + +////////////////////////////////////////////////////////////////////////// +// Function: DebugMessageV +// +// Description: Outputs variable argument debug string. +// +// +// Parameters: +// +// dwSize Size of temp buffer to hold formated string. +// +// lpszMessage Format string. +// +// arglist Variable argument list.. +// +// +// Returns: +// +// +// Comments: +// +// +////////////////////////////////////////////////////////////////////////// + +static BOOL DebugMessageV(DWORD dwSize, LPCWSTR lpszMessage, va_list arglist) +{ + LPWSTR lpszMsgBuf; + HRESULT hResult; + + + // Parameter checking. + if( (NULL == lpszMessage) + || + (0 == dwSize) + ) + { + return FALSE; + } + + // Allocate memory for message buffer. + lpszMsgBuf = new WCHAR[dwSize + 1]; + if(NULL == lpszMsgBuf) + return FALSE; + + // Pass the variable parameters to wvsprintf to be formated. + hResult = StringCbVPrintfW(lpszMsgBuf, (dwSize + 1) * sizeof(WCHAR), lpszMessage, arglist); + + // Dump string to debug output. + OutputDebugStringW(lpszMsgBuf); + + // Clean up. + delete[] lpszMsgBuf; + + return SUCCEEDED(hResult); +} + + +////////////////////////////////////////////////////////////////////////// +// Function: DebugMessage +// +// Description: Outputs variable argument debug string. +// +// +// Parameters: +// +// lpszMessage Format string. +// +// +// Returns: +// +// +// Comments: +// +// +////////////////////////////////////////////////////////////////////////// + +BOOL DebugMessage(LPCSTR lpszMessage, ...) +{ + BOOL bResult; + va_list VAList; + + + // Pass the variable parameters to DebugMessageV for processing. + va_start(VAList, lpszMessage); + bResult = DebugMessageV(lpszMessage, VAList); + va_end(VAList); + + return bResult; +} + + +////////////////////////////////////////////////////////////////////////// +// Function: DebugMessage +// +// Description: Outputs variable argument debug string. +// +// +// Parameters: +// +// lpszMessage Format string. +// +// +// Returns: +// +// +// Comments: +// +// +////////////////////////////////////////////////////////////////////////// + +BOOL DebugMessage(LPCWSTR lpszMessage, ...) +{ + BOOL bResult; + va_list VAList; + + + // Pass the variable parameters to DebugMessageV to be processed. + va_start(VAList, lpszMessage); + bResult = DebugMessageV(MAX_PATH, lpszMessage, VAList); + va_end(VAList); + + return bResult; +} + +void Dump(PPUBLISHERINFO pPublisherInfo) +{ + VERBOSE(TEXT("pPublisherInfo:\r\n")); + if(NULL == pPublisherInfo) + { + VERBOSE(TEXT("\tpPublisherInfo is NULL!\r\n")); + return; + } + VERBOSE(TEXT("\tdwMode = %#x\r\n"), pPublisherInfo->dwMode); + VERBOSE(TEXT("\twMinoutlinePPEM = %d\r\n"), pPublisherInfo->wMinoutlinePPEM); + VERBOSE(TEXT("\twMaxbitmapPPEM = %d\r\n"), pPublisherInfo->wMaxbitmapPPEM); +} + +void Dump(POEMDMPARAM pOemDMParam) +{ + VERBOSE(TEXT("pOemDMParam:\r\n")); + if(NULL == pOemDMParam) + { + VERBOSE(TEXT("\tpOemDMParam is NULL!\r\n")); + return; + } + VERBOSE(TEXT("\tcbSize = %d\r\n"), pOemDMParam->cbSize); + VERBOSE(TEXT("\tpdriverobj = %#x\r\n"), pOemDMParam->pdriverobj); + VERBOSE(TEXT("\thPrinter = %#x\r\n"), pOemDMParam->hPrinter); + VERBOSE(TEXT("\thModule = %#x\r\n"), pOemDMParam->hModule); + VERBOSE(TEXT("\tpPublicDMIn = %#x\r\n"), pOemDMParam->pPublicDMIn); + VERBOSE(TEXT("\tpPublicDMOut = %#x\r\n"), pOemDMParam->pPublicDMOut); + VERBOSE(TEXT("\tpOEMDMIn = %#x\r\n"), pOemDMParam->pOEMDMIn); + VERBOSE(TEXT("\tpOEMDMOut = %#x\r\n"), pOemDMParam->pOEMDMOut); + VERBOSE(TEXT("\tcbBufSize = %d\r\n"), pOemDMParam->cbBufSize); +} + +void Dump(PPROPSHEETUI_INFO pPSUIInfo) +{ + VERBOSE(TEXT("pPSUIInfo:\r\n")); + if(NULL == pPSUIInfo) + { + VERBOSE(TEXT("\tpPSUIInfo is NULL!\r\n")); + return; + } + VERBOSE(TEXT("\tcbSize = %d\r\n"), pPSUIInfo->cbSize); + VERBOSE(TEXT("\tVersion = %#x\r\n"), pPSUIInfo->Version); + VERBOSE(TEXT("\tFlags = %#x\r\n"), pPSUIInfo->Flags); + VERBOSE(TEXT("\tReason = %d\r\n"), pPSUIInfo->Reason); + VERBOSE(TEXT("\thComPropSheet = %#x\r\n"), pPSUIInfo->hComPropSheet); + VERBOSE(TEXT("\tpfnComPropSheet = %#x\r\n"), pPSUIInfo->pfnComPropSheet); + VERBOSE(TEXT("\tlParamInit = %#x\r\n"), pPSUIInfo->lParamInit); + VERBOSE(TEXT("\tUserData = %#x\r\n"), pPSUIInfo->UserData); + VERBOSE(TEXT("\tResult = %#x\r\n"), pPSUIInfo->Result); +} + +void Dump(POPTITEM pOptItem) +{ + VERBOSE(TEXT("pOptItem:\r\n")); + if(NULL == pOptItem) + { + VERBOSE(TEXT("\tpOptItem is NULL!\r\n")); + return; + } + VERBOSE(TEXT("\tcbSize = %d\r\n"), pOptItem->cbSize); + VERBOSE(TEXT("\tLevel = %d\r\n"), pOptItem->Level); + VERBOSE(TEXT("\tDlgPageIdx = %d\r\n"), pOptItem->DlgPageIdx); + VERBOSE(TEXT("\tFlags = 0x%x\r\n"), pOptItem->Flags); + VERBOSE(TEXT("\tUserData = 0x%p\r\n"), pOptItem->UserData); + VERBOSE(TEXT("\tpName = %s\r\n"), pOptItem->pName ? pOptItem->pName : TEXT("<NULL>")); + VERBOSE(TEXT("\tpSel = 0x%p\r\n"), pOptItem->pSel); + VERBOSE(TEXT("\tpExtChkBox = 0x%p\r\n"), pOptItem->pExtChkBox); + VERBOSE(TEXT("\tpExtChkBox = 0x%p\r\n"), pOptItem->pExtChkBox); + VERBOSE(TEXT("\tHelpIndex = 0x%x\r\n"), pOptItem->HelpIndex); + VERBOSE(TEXT("\tDMPubID = 0x%x\r\n"), pOptItem->DMPubID); + VERBOSE(TEXT("\tUserItemID = 0x%x\r\n"), pOptItem->UserItemID); + VERBOSE(TEXT("\twReserved = 0x%x\r\n"), pOptItem->wReserved); + VERBOSE(TEXT("\tpOIExt = 0x%p\r\n"), pOptItem->pOIExt); + + Dump(pOptItem->pOptType); +} + +void Dump(POPTTYPE pOptType) +{ + VERBOSE(TEXT("\tpOptType:\r\n")); + if(NULL == pOptType) + { + VERBOSE(TEXT("\t\tpOptType is NULL!\r\n")); + return; + } + VERBOSE(TEXT("\t\tcbSize = %d\r\n"), pOptType->cbSize); + VERBOSE(TEXT("\t\tType = 0x%x\r\n"), pOptType->Type); + VERBOSE(TEXT("\t\tFlags = 0x%x\r\n"), pOptType->Flags); + VERBOSE(TEXT("\t\tCount = %d\r\n"), pOptType->Count); + VERBOSE(TEXT("\t\tCount = 0x%x\r\n"), pOptType->BegCtrlID); + VERBOSE(TEXT("\t\tStyle = 0x%x\r\n"), pOptType->Style); + + Dump(pOptType->pOptParam, pOptType->Count); +} + +void Dump(POPTPARAM pOptParam, WORD wCount) +{ + if(NULL == pOptParam) + { + VERBOSE(TEXT("\t\tpOptParam is NULL!\r\n")); + return; + } + + for(WORD wIndex = 0; wIndex < wCount; ++wIndex) + { + VERBOSE(TEXT("\t\tpOptParam[wIndex]:\r\n")); + VERBOSE(TEXT("\t\t\tcbSize = %d\r\n"), pOptParam[wIndex].cbSize); + VERBOSE(TEXT("\t\t\tFlags = 0x%x\r\n"), pOptParam[wIndex].Flags); + VERBOSE(TEXT("\t\t\tStyle = 0x%x\r\n"), pOptParam[wIndex].Style); + VERBOSE(TEXT("\t\t\tpData = 0x%p\r\n"), pOptParam[wIndex].pData); + VERBOSE(TEXT("\t\t\tIconID = 0x%p\r\n"), pOptParam[wIndex].IconID); + VERBOSE(TEXT("\t\t\tlParam = 0x%p\r\n"), pOptParam[wIndex].lParam); + } +} + + +PCSTR +StripDirPrefixA( + IN PCSTR pstrFilename + ) + +/*++ + +Routine Description: + + Strip the directory prefix off a filename (ANSI version) + +Arguments: + + pstrFilename - Pointer to filename string + +Return Value: + + Pointer to the last component of a filename (without directory prefix) + +--*/ + +{ + PCSTR pstr; + + pstr = strrchr(pstrFilename, PATH_SEPARATOR); + if (pstr) + return pstr + 1; + + return pstrFilename; +} + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/debug.h b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/debug.h new file mode 100644 index 00000000..b4d57b0b --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/debug.h @@ -0,0 +1,166 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1996 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Debug.H +// +// +// PURPOSE: Define common data types, and external function prototypes +// for debugging functions. +// +// + +#pragma once + +// VC and Build use different debug defines. +// The following makes it so either will +// cause the inclusion of debugging code. +#if !defined(_DEBUG) && defined(DBG) + #define _DEBUG DBG +#elif defined(_DEBUG) && !defined(DBG) + #define DBG _DEBUG +#endif + + + +///////////////////////////////////////////////////////// +// Macros +///////////////////////////////////////////////////////// + +// +// These macros are used for debugging purposes. They expand +// to white spaces on a free build. Here is a brief description +// of what they do and how they are used: +// +// giDebugLevel +// Global variable which set the current debug level to control +// the amount of debug messages emitted. +// +// VERBOSE(msg) +// Display a message if the current debug level is <= DBG_VERBOSE. +// +// TERSE(msg) +// Display a message if the current debug level is <= DBG_TERSE. +// +// WARNING(msg) +// Display a message if the current debug level is <= DBG_WARNING. +// The message format is: WRN filename (linenumber): message +// +// ERR(msg) +// Similiar to WARNING macro above - displays a message +// if the current debug level is <= DBG_ERROR. +// +// ASSERT(cond) +// Verify a condition is true. If not, force a breakpoint. +// +// ASSERTMSG(cond, msg) +// Verify a condition is true. If not, display a message and +// force a breakpoint. +// +// RIP(msg) +// Display a message and force a breakpoint. +// +// Usage: +// These macros require extra parantheses for the msg argument +// example, ASSERTMSG(x > 0, ("x is less than 0\n")); +// WARNING(("App passed NULL pointer, ignoring...\n")); +// + +#define DBG_VERBOSE 1 +#define DBG_TERSE 2 +#define DBG_WARNING 3 +#define DBG_ERROR 4 +#define DBG_RIP 5 +#define DBG_NONE 6 + +#if DBG + + #define DebugMsg DebugMessage + + // + // Strip the directory prefix from a filename (ANSI version) + // + + PCSTR + StripDirPrefixA( + IN PCSTR pstrFilename + ); + + extern INT giDebugLevel; + + + #define DBGMSG(level, prefix, msg) { \ + if (giDebugLevel <= (level)) { \ + DebugMsg("%s %s (%d): ", prefix, StripDirPrefixA(__FILE__), __LINE__); \ + DebugMsg(msg); \ + } \ + } + + #define DBGPRINT(level, msg) { \ + if (giDebugLevel <= (level)) { \ + DebugMsg(msg); \ + } \ + } + + #define VERBOSE if(giDebugLevel <= DBG_VERBOSE) DebugMsg + #define TERSE if(giDebugLevel <= DBG_TERSE) DebugMsg + #define WARNING if(giDebugLevel <= DBG_WARNING) DebugMsg + #define ERR if(giDebugLevel <= DBG_ERROR) DebugMsg + + #define ASSERT(cond) { \ + if (! (cond)) { \ + RIP(("\n")); \ + } \ + } + + #define ASSERTMSG(cond, msg) { \ + if (! (cond)) { \ + RIP(msg); \ + } \ + } + + #define RIP(msg) { \ + DBGMSG(DBG_RIP, "RIP", msg); \ + DebugBreak(); \ + } + + +#else // !DBG + + #define DebugMsg NOP_FUNCTION + + #define VERBOSE NOP_FUNCTION + #define TERSE NOP_FUNCTION + #define WARNING NOP_FUNCTION + #define ERR NOP_FUNCTION + + #define ASSERT(cond) + + #define ASSERTMSG(cond, msg) + #define RIP(msg) + #define DBGMSG(level, prefix, msg) + #define DBGPRINT(level, msg) + +#endif + + + + +///////////////////////////////////////////////////////// +// ProtoTypes +///////////////////////////////////////////////////////// + +BOOL DebugMessage(LPCSTR, ...); +BOOL DebugMessage(LPCWSTR, ...); +void Dump(PPUBLISHERINFO pPublisherInfo); +void Dump(POEMDMPARAM pOemDMParam); +void Dump(PPROPSHEETUI_INFO pPSUIInfo); +void Dump(POPTITEM pOptItem); +void Dump(POPTTYPE pOptType); +void Dump(POPTPARAM pOptParam, WORD wCount); + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/devmode.cpp b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/devmode.cpp new file mode 100644 index 00000000..2a19310c --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/devmode.cpp @@ -0,0 +1,214 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Devmode.cpp +// +// +// PURPOSE: Implementation of Devmode functions shared with OEM UI and OEM rendering modules. +// + +#include "precomp.h" +#include "oemui.h" +#include "debug.h" +#include "devmode.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +// +//Performs operation on UI Plugins Private DevMode Members. +//Called via IOemUI::DevMode +// + +HRESULT hrOEMDevMode(DWORD dwMode, POEMDMPARAM pOemDMParam) +{ + POEMDEV pOEMDevIn; + POEMDEV pOEMDevOut; + + + // Verify parameters. + if( (NULL == pOemDMParam) + || + ( (OEMDM_SIZE != dwMode) + && + (OEMDM_DEFAULT != dwMode) + && + (OEMDM_CONVERT != dwMode) + && + (OEMDM_MERGE != dwMode) + ) + ) + { + ERR(ERRORTEXT("DevMode() ERROR_INVALID_PARAMETER.\r\n")); + VERBOSE(DLLTEXT("\tdwMode = %d, pOemDMParam = %#lx.\r\n"), dwMode, pOemDMParam); + + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Cast generic (i.e. PVOID) to OEM private devomode pointer type. + pOEMDevIn = (POEMDEV) pOemDMParam->pOEMDMIn; + pOEMDevOut = (POEMDEV) pOemDMParam->pOEMDMOut; + + switch(dwMode) + { + // + //The Method should return the size of the memory allocation needed to store the UI plugin Private DEVMODE. + // + case OEMDM_SIZE: + pOemDMParam->cbBufSize = sizeof(OEMDEV); + break; + + // + //Should fill the Private DEVMODE with the default values. + // + case OEMDM_DEFAULT: + // + //OEM_DMEXTRAHEADER Members + // + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + + // + //Private members + // + pOEMDevOut->dwDriverData = 0; + pOEMDevOut->dwAdvancedData = 0; + + VERBOSE(DLLTEXT("pOEMDevOut after setting default values:\r\n")); + Dump(pOEMDevOut); + break; + + // + //The method should convert private DEVMODE members to the current version, if necessary. + // + case OEMDM_CONVERT: + ConvertOEMDevmode(pOEMDevIn, pOEMDevOut); + break; + + // + //The method should validate the information contained in private DEVMODE members and merge validated values into a private DEVMODE structure containing default values + // + case OEMDM_MERGE: + ConvertOEMDevmode(pOEMDevIn, pOEMDevOut); + MakeOEMDevmodeValid(pOEMDevOut); + break; + } + Dump(pOemDMParam); + + return S_OK; +} + + +BOOL ConvertOEMDevmode(PCOEMDEV pOEMDevIn, POEMDEV pOEMDevOut) +{ + if( (NULL == pOEMDevIn) + || + (NULL == pOEMDevOut) + ) + { + ERR(ERRORTEXT("ConvertOEMDevmode() invalid parameters.\r\n")); + return FALSE; + } + + // Check OEM Signature, if it doesn't match ours, + // then just assume DMIn is bad and use defaults. + if(pOEMDevIn->dmOEMExtra.dwSignature == pOEMDevOut->dmOEMExtra.dwSignature) + { + VERBOSE(DLLTEXT("Converting private OEM Devmode.\r\n")); + VERBOSE(DLLTEXT("pOEMDevIn:\r\n")); + Dump(pOEMDevIn); + + // Set the devmode defaults so that anything the isn't copied over will + // be set to the default value. + pOEMDevOut->dwDriverData = 0; + pOEMDevOut->dwAdvancedData = 0; + + // Copy the old structure in to the new using which ever size is the smaller. + // Devmode maybe from newer Devmode (not likely since there is only one), or + // Devmode maybe a newer Devmode, in which case it maybe larger, + // but the first part of the structure should be the same. + + // DESIGN ASSUMPTION: the private DEVMODE structure only gets added to; + // the fields that are in the DEVMODE never change only new fields get added to the end. + + memcpy(pOEMDevOut, pOEMDevIn, __min(pOEMDevOut->dmOEMExtra.dwSize, pOEMDevIn->dmOEMExtra.dwSize)); + + // Re-fill in the size and version fields to indicated + // that the DEVMODE is the current private DEVMODE version. + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + } + else + { + WARNING(DLLTEXT("Unknown DEVMODE signature, pOEMDMIn ignored.\r\n")); + + // Don't know what the input DEVMODE is, so just use defaults. + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + pOEMDevOut->dwDriverData = 0; + pOEMDevOut->dwAdvancedData = 0; + } + + return TRUE; +} + + +BOOL MakeOEMDevmodeValid(POEMDEV pOEMDevmode) +{ + if(NULL == pOEMDevmode) + { + return FALSE; + } + + // ASSUMPTION: pOEMDevmode is large enough to contain OEMDEV structure. + + // Make sure that dmOEMExtra indicates the current OEMDEV structure. + pOEMDevmode->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevmode->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevmode->dmOEMExtra.dwVersion = OEM_VERSION; + + // Set driver data, if not valid. + if(pOEMDevmode->dwDriverData > 100) + { + pOEMDevmode->dwDriverData = 0; + } + + // Set Advanced driver data, if not valid. + if(pOEMDevmode->dwAdvancedData > 100) + { + pOEMDevmode->dwAdvancedData = 0; + } + + return TRUE; +} + + +void Dump(PCOEMDEV pOEMDevmode) +{ + if( (NULL != pOEMDevmode) + && + (pOEMDevmode->dmOEMExtra.dwSize >= sizeof(OEMDEV)) + && + (OEM_SIGNATURE == pOEMDevmode->dmOEMExtra.dwSignature) + ) + { + VERBOSE(TEXT("\tdmOEMExtra.dwSize = %d\r\n"), pOEMDevmode->dmOEMExtra.dwSize); + VERBOSE(TEXT("\tdmOEMExtra.dwSignature = %#x\r\n"), pOEMDevmode->dmOEMExtra.dwSignature); + VERBOSE(TEXT("\tdmOEMExtra.dwVersion = %#x\r\n"), pOEMDevmode->dmOEMExtra.dwVersion); + VERBOSE(TEXT("\tdwDriverData = %#x\r\n"), pOEMDevmode->dwDriverData); + VERBOSE(TEXT("\tdwAdvancedData = %#x\r\n"), pOEMDevmode->dwAdvancedData); + } + else + { + ERR(ERRORTEXT("Dump(POEMDEV) unknown private OEM DEVMODE.\r\n")); + } +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/devmode.h b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/devmode.h new file mode 100644 index 00000000..e2f9c6b7 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/devmode.h @@ -0,0 +1,57 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Devmode.h +// +// PURPOSE: Define common data types, and external function prototypes +// for devmode functions. +// +#pragma once + +//////////////////////////////////////////////////////// +// OEM Devmode Defines +//////////////////////////////////////////////////////// + + + + +//////////////////////////////////////////////////////// +// OEM Devmode Type Definitions +//////////////////////////////////////////////////////// + +// +//Can add info to the private devmode bellow here. +//Note : +// This structure must be prefixed by OEM_DMEXTRAHEADER +// Your plug-in must implement the IPrintOemUI::DevMode method +// +typedef struct tagOEMDEV +{ + OEM_DMEXTRAHEADER dmOEMExtra; + DWORD dwDriverData; + DWORD dwAdvancedData; + + // + //Private DevMode Members + // + +} OEMDEV, *POEMDEV; + +typedef const OEMDEV *PCOEMDEV; + + + +///////////////////////////////////////////////////////// +// ProtoTypes +///////////////////////////////////////////////////////// + +HRESULT hrOEMDevMode(DWORD dwMode, POEMDMPARAM pOemDMParam); +BOOL ConvertOEMDevmode(PCOEMDEV pOEMDevIn, POEMDEV pOEMDevOut); +BOOL MakeOEMDevmodeValid(POEMDEV pOEMDevmode); +void Dump(PCOEMDEV pOEMDevIn); + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/dllentry.cpp b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/dllentry.cpp new file mode 100644 index 00000000..dcac51ef --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/dllentry.cpp @@ -0,0 +1,49 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: dllentry.cpp +// +// PURPOSE: Source module for DLL entry function(s). +// + +#include "precomp.h" +#include "oemui.h" +#include "debug.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +/////////////////////////////////////////////////////////// +// +// DLL entry point +// +BOOL WINAPI DllMain(HINSTANCE hInst, WORD wReason, LPVOID lpReserved) +{ + UNREFERENCED_PARAMETER(lpReserved); + + switch(wReason) + { + case DLL_PROCESS_ATTACH: + VERBOSE(DLLTEXT("Process attach.\r\n")); + ghInstance = hInst; + break; + + case DLL_THREAD_ATTACH: + VERBOSE(DLLTEXT("Thread attach.\r\n")); + break; + + case DLL_PROCESS_DETACH: + VERBOSE(DLLTEXT("Process detach.\r\n")); + break; + + case DLL_THREAD_DETACH: + VERBOSE(DLLTEXT("Thread detach.\r\n")); + break; + } + + return TRUE; +} diff --git a/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/globals.cpp b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/globals.cpp new file mode 100644 index 00000000..9e77a228 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/globals.cpp @@ -0,0 +1,26 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Globals.cpp +// +// +// PURPOSE: File that contains all the globals. +// +// +#include "precomp.h" + +#include "oemui.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +/////////////////////////////////////// +// Globals +/////////////////////////////////////// + +// Module's Instance handle from DLLEntry of process. +HINSTANCE ghInstance = NULL; diff --git a/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/globals.h b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/globals.h new file mode 100644 index 00000000..b6c7d0ee --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/globals.h @@ -0,0 +1,22 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Globals.h +// +// +// PURPOSE: Lists of globals declared in Globals.cpp. +// +// +#pragma once + +/////////////////////////////////////// +// Globals +/////////////////////////////////////// + +// Module's Instance handle from DLLEntry of process. +extern HINSTANCE ghInstance; + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/intrface.cpp b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/intrface.cpp new file mode 100644 index 00000000..493d36f7 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/intrface.cpp @@ -0,0 +1,612 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: intrface.cpp +// +// PURPOSE: UI plug-in implementation. +// +// + +#include "precomp.h" + +#include "oemui.h" +#include "debug.h" +#include "intrface.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +//////////////////////////////////////////////////////// +// Internal Globals +//////////////////////////////////////////////////////// + +static long g_cComponents = 0 ; // Count of active components +static long g_cServerLocks = 0 ; // Count of locks + + + +//////////////////////////////////////////////////////////////////////////////// +// +// IOemUI body +// +IOemUI::~IOemUI() +{ + // Make sure that helper interface is released. + if(NULL != m_pOEMHelp) + { + m_pOEMHelp->Release(); + m_pOEMHelp = NULL; + } + + // If this instance of the object is being deleted, then the reference + // count should be zero. + assert(0 == m_cRef); +} + +HRESULT __stdcall IOemUI::QueryInterface(const IID& iid, void** ppv) +{ + VERBOSE(DLLTEXT("IOemUI:QueryInterface entry.\r\n\r\n")); + if (iid == IID_IUnknown) + { + *ppv = static_cast<IUnknown*>(this); + VERBOSE(DLLTEXT("IOemUI:Return pointer to IUnknown.\r\n\r\n")); + } + else if (iid == IID_IPrintOemUI) + { + *ppv = static_cast<IPrintOemUI*>(this) ; + VERBOSE(DLLTEXT("IOemUI:Return pointer to IPrintOemUI.\r\n")); + } + else + { + *ppv = NULL ; + VERBOSE(DLLTEXT("IOemUI:No Interface. Return NULL.\r\n")); + return E_NOINTERFACE ; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef() ; + return S_OK ; +} + +ULONG __stdcall IOemUI::AddRef() +{ + VERBOSE(DLLTEXT("IOemUI:AddRef entry.\r\n")); + return InterlockedIncrement(&m_cRef) ; +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall IOemUI::Release() +{ + VERBOSE(DLLTEXT("IOemUI:Release entry.\r\n")); + ASSERT( 0 != m_cRef); + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + + } + return cRef; +} + +// +//(Implamentation is required) Supplies a pointer to UNIDRIVE /PScript IPrintOemDriverUI +// +HRESULT __stdcall IOemUI::PublishDriverInterface( + IUnknown *pIUnknown) +{ + VERBOSE(DLLTEXT("IOemUI:PublishDriverInterface entry.\r\n")); + + // Need to store pointer to Driver Helper functions, if we already haven't. + if (m_pOEMHelp == NULL) + { + HRESULT hResult; + + + // Get Interface to Helper Functions. + hResult = pIUnknown->QueryInterface(IID_IPrintOemDriverUI, (void** ) &(m_pOEMHelp)); + + if(!SUCCEEDED(hResult)) + { + // Make sure that interface pointer reflects interface query failure. + m_pOEMHelp = NULL; + + return E_FAIL; + } + } + + return S_OK; +} + +// +//(Implamentation is required) Returns the UI Plugin's identification information +// +HRESULT __stdcall IOemUI::GetInfo( + DWORD dwMode, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded) +{ + VERBOSE(DLLTEXT("IOemUI::GetInfo(%d) entry.\r\r\n"), dwMode); + + // Validate parameters. + if( (NULL == pcbNeeded) + || + ( (OEMGI_GETSIGNATURE != dwMode) + && + (OEMGI_GETVERSION != dwMode) + && + (OEMGI_GETPUBLISHERINFO != dwMode) + ) + ) + { + WARNING(DLLTEXT("IOemUI::GetInfo() exit pcbNeeded is NULL! ERROR_INVALID_PARAMETER\r\r\n")); + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Set expected buffer size and number of bytes written. + *pcbNeeded = sizeof(DWORD); + + // Check buffer size is sufficient. + if((cbSize < *pcbNeeded) || (NULL == pBuffer)) + { + WARNING(DLLTEXT("IOemUI::GetInfo() exit insufficient buffer!\r\r\n")); + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return E_FAIL; + } + + switch(dwMode) + { + // OEM DLL Signature + case OEMGI_GETSIGNATURE: + *(PDWORD)pBuffer = OEM_SIGNATURE; + break; + + // OEM DLL version + case OEMGI_GETVERSION: + *(PDWORD)pBuffer = OEM_VERSION; + break; + + // dwMode not supported. + default: + // Set written bytes to zero since nothing was written. + WARNING(DLLTEXT("IOemUI::GetInfo() exit mode not supported.\r\r\n")); + *pcbNeeded = 0; + SetLastError(ERROR_NOT_SUPPORTED); + return E_FAIL; + } + + VERBOSE(DLLTEXT("IOemUI::GetInfo() exit S_OK, (*pBuffer is %#x).\r\r\n"), *(PDWORD)pBuffer); + return S_OK; +} + + +// +//Performs operation on UI Plugins Private DevMode Members. +// +HRESULT __stdcall IOemUI::DevMode( + DWORD dwMode, + POEMDMPARAM pOemDMParam) +{ + VERBOSE(DLLTEXT("IOemUI:DevMode(%d, %#x) entry.\r\n"), dwMode, pOemDMParam); + + return hrOEMDevMode(dwMode, pOemDMParam); +} + + +// +//Allows UI Plugin to Modifiy Existing printer porp sheet and document property sheet page.. +// +HRESULT __stdcall IOemUI::CommonUIProp( + DWORD dwMode, + POEMCUIPPARAM pOemCUIPParam) +{ + VERBOSE(DLLTEXT("IOemUI:CommonUIProp entry.\r\n")); + + // + //We want to keep this pointer so the we can modifie the data and OPTITEMS from the OEM plugin page. + // + m_OemSheetData.pOEMCUIParam = pOemCUIPParam; + return hrOEMPropertyPage(dwMode, pOemCUIPParam); +} + + +// +//Adds a New page to the device Documment property sheet. +// + +HRESULT __stdcall IOemUI::DocumentPropertySheets( + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam) +{ + VERBOSE(DLLTEXT("IOemUI:DocumentPropertySheets entry.\r\n")); + + return hrOEMDocumentPropertySheets(pPSUIInfo, lParam, m_pOEMHelp); +} + +// +//Adds a New page to the device printer property page. +// +HRESULT __stdcall IOemUI::DevicePropertySheets( + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam) +{ + VERBOSE(DLLTEXT("IOemUI:DevicePropertySheets entry.\r\n")); + + // + //Store the This pointer in the OEMSHEETDATA + // + m_OemSheetData.pOEMHelp = m_pOEMHelp; + return hrOEMDevicePropertySheets(pPSUIInfo, lParam, &(m_OemSheetData)); +} + + +// +//Allows the UI plugin to spec Customized device capabilaties (TODO) +// +HRESULT __stdcall IOemUI::DeviceCapabilities( + POEMUIOBJ poemuiobj, + HANDLE hPrinter, + _In_ PWSTR pDeviceName, + WORD wCapability, + PVOID pOutput, + PDEVMODE pPublicDM, + PVOID pOEMDM, + DWORD dwOld, + DWORD *dwResult) +{ + VERBOSE(DLLTEXT("IOemUI:DeviceCapabilities entry.\r\n")); + + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(pDeviceName); + UNREFERENCED_PARAMETER(wCapability); + UNREFERENCED_PARAMETER(pOutput); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + UNREFERENCED_PARAMETER(dwOld); + UNREFERENCED_PARAMETER(dwResult); + + return E_NOTIMPL; +} + + +// +//Allows the UI plugin to help determine if a print Job is printable. +// +HRESULT __stdcall IOemUI::DevQueryPrintEx( + POEMUIOBJ poemuiobj, + PDEVQUERYPRINT_INFO pDQPInfo, + PDEVMODE pPublicDM, + PVOID pOEMDM) +{ + VERBOSE(DLLTEXT("IOemUI:DevQueryPrintEx entry.\r\n")); + + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(pDQPInfo); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + + return E_NOTIMPL; +} + + +// +//Allows the UI Plugin to upgrade its dev options stored in the registry. +// +HRESULT __stdcall IOemUI::UpgradePrinter( + DWORD dwLevel, + PBYTE pDriverUpgradeInfo) +{ + VERBOSE(DLLTEXT("IOemUI:UpgradePrinter entry.\r\n")); + + UNREFERENCED_PARAMETER(dwLevel); + UNREFERENCED_PARAMETER(pDriverUpgradeInfo); + + return E_NOTIMPL; +} + +HRESULT __stdcall IOemUI::PrinterEvent( + _In_ PWSTR pPrinterName, + INT iDriverEvent, + DWORD dwFlags, + LPARAM lParam) +{ + VERBOSE(DLLTEXT("IOemUI:PrinterEvent entry.\r\n")); + + UNREFERENCED_PARAMETER(pPrinterName); + UNREFERENCED_PARAMETER(iDriverEvent); + UNREFERENCED_PARAMETER(dwFlags); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +} + +HRESULT __stdcall IOemUI::DriverEvent( + DWORD dwDriverEvent, + DWORD dwLevel, + LPBYTE pDriverInfo, + LPARAM lParam) +{ + VERBOSE(DLLTEXT("IOemUI:DriverEvent entry.\r\n")); + + UNREFERENCED_PARAMETER(dwDriverEvent); + UNREFERENCED_PARAMETER(dwLevel); + UNREFERENCED_PARAMETER(pDriverInfo); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +}; + + +#define PROFILE_NAME L"OEMPROFILE.icm\0" + +HRESULT __stdcall IOemUI::QueryColorProfile( + HANDLE hPrinter, + POEMUIOBJ poemuiobj, + PDEVMODE pPublicDM, + PVOID pOEMDM, + ULONG ulQueryMode, + VOID *pvProfileData, + ULONG *pcbProfileData, + FLONG *pflProfileData) +{ + HRESULT Result = E_FAIL; + + VERBOSE(DLLTEXT("IOemUI:QueryColorProfile entry.\r\n")); + + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + + if(QCP_DEVICEPROFILE == ulQueryMode) + { + if(NULL == pvProfileData) + { + *pcbProfileData = sizeof(PROFILE_NAME); + SetLastError(ERROR_INSUFFICIENT_BUFFER); + } + else + { + if(*pcbProfileData < sizeof(PROFILE_NAME)) + { + *pcbProfileData = sizeof(PROFILE_NAME); + SetLastError(ERROR_INSUFFICIENT_BUFFER); + } + else + { + Result = StringCbCopy((LPWSTR)pvProfileData, *pcbProfileData, PROFILE_NAME); + *pcbProfileData = sizeof(PROFILE_NAME); + *pflProfileData = QCP_PROFILEDISK; + + if(FAILED(Result)) + { + SetLastError(Result); + } + } + } + } + + return Result; +}; + +HRESULT __stdcall IOemUI::FontInstallerDlgProc( + HWND hWnd, + UINT usMsg, + WPARAM wParam, + LPARAM lParam) +{ + VERBOSE(DLLTEXT("IOemUI:FontInstallerDlgProc entry.\r\n")); + + UNREFERENCED_PARAMETER(hWnd); + UNREFERENCED_PARAMETER(usMsg); + UNREFERENCED_PARAMETER(wParam); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +}; + +HRESULT __stdcall IOemUI::UpdateExternalFonts( + HANDLE hPrinter, + HANDLE hHeap, + _In_ PWSTR pwstrCartridges) +{ + VERBOSE(DLLTEXT("IOemUI:UpdateExternalFonts entry.\r\n")); + + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(hHeap); + UNREFERENCED_PARAMETER(pwstrCartridges); + + return E_NOTIMPL; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// oem class factory +// +class IOemCF : public IClassFactory +{ +public: + // *** IUnknown methods *** + + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release) (THIS); + + // *** IClassFactory methods *** + STDMETHOD(CreateInstance) (THIS_ + LPUNKNOWN pUnkOuter, + REFIID riid, + LPVOID FAR* ppvObject); + STDMETHOD(LockServer) (THIS_ BOOL bLock); + + + // Constructor + IOemCF(): m_cRef(1) { }; + ~IOemCF() { }; + +protected: + LONG m_cRef; + +}; + +/////////////////////////////////////////////////////////// +// +// Class factory body +// +HRESULT __stdcall IOemCF::QueryInterface(const IID& iid, void** ppv) +{ + if ((iid == IID_IUnknown) || (iid == IID_IClassFactory)) + { + *ppv = static_cast<IOemCF*>(this) ; + } + else + { + *ppv = NULL ; + return E_NOINTERFACE ; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef() ; + return S_OK ; +} + +ULONG __stdcall IOemCF::AddRef() +{ + return InterlockedIncrement(&m_cRef) ; +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall IOemCF::Release() +{ + ASSERT( 0 != m_cRef); + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + + } + return cRef; +} + +// IClassFactory implementation +HRESULT __stdcall IOemCF::CreateInstance(IUnknown* pUnknownOuter, + const IID& iid, + void** ppv) +{ + //DbgPrint(DLLTEXT("Class factory:\t\tCreate component.")) ; + + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Cannot aggregate. + if (pUnknownOuter != NULL) + { + return CLASS_E_NOAGGREGATION ; + } + + // Create component. + IOemUI* pOemCB = new IOemUI ; + if (pOemCB == NULL) + { + return E_OUTOFMEMORY ; + } + // Get the requested interface. + HRESULT hr = pOemCB->QueryInterface(iid, ppv) ; + + // Release the IUnknown pointer. + // (If QueryInterface failed, component will delete itself.) + pOemCB->Release() ; + return hr ; +} + +// LockServer +HRESULT __stdcall IOemCF::LockServer(BOOL bLock) +{ + if (bLock) + { + InterlockedIncrement(&g_cServerLocks) ; + } + else + { + InterlockedDecrement(&g_cServerLocks) ; + } + return S_OK ; +} + +/////////////////////////////////////////////////////////// +// +// Exported functions +// + + +// Can DLL unload now? +// +STDAPI DllCanUnloadNow() +{ + // + // To avoid leaving OEM DLL still in memory when Unidrv or Pscript drivers + // are unloaded, Unidrv and Pscript driver ignore the return value of + // DllCanUnloadNow of the OEM DLL, and always call FreeLibrary on the OEMDLL. + // + // If OEM DLL spins off a working thread that also uses the OEM DLL, the + // thread needs to call LoadLibrary and FreeLibraryAndExitThread, otherwise + // it may crash after Unidrv or Pscript calls FreeLibrary. + // + + if ((g_cComponents == 0) && (g_cServerLocks == 0)) + { + return S_OK ; + } + else + { + return S_FALSE; + } +} + +// +// Get class factory +// +STDAPI DllGetClassObject( + _In_ REFCLSID clsid, + _In_ REFIID iid, + _Outptr_ LPVOID* ppv) +{ + VERBOSE(DLLTEXT("DllGetClassObject:Create class factory.\r\n")); + + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Can we create this component? + if (clsid != CLSID_OEMUI) + { + return CLASS_E_CLASSNOTAVAILABLE ; + } + + // Create class factory. + IOemCF* pFontCF = new IOemCF ; // Reference count set to 1 + // in constructor + if (pFontCF == NULL) + { + return E_OUTOFMEMORY ; + } + + // Get requested interface. + HRESULT hr = pFontCF->QueryInterface(iid, ppv) ; + pFontCF->Release() ; + + return hr ; +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/intrface.h b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/intrface.h new file mode 100644 index 00000000..6ec38f73 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/intrface.h @@ -0,0 +1,192 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: intrface.h +// +// PURPOSE: UI plug-in definition. +// +// +#pragma once + +//////////////////////////////////////////////////////////////////////////////// +// +// IOemUI +// +class IOemUI: public IPrintOemUI +{ +public: + // *** IUnknown methods *** + + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release) (THIS); + + // + // Method for publishing Driver interface. + // + STDMETHOD(PublishDriverInterface)(THIS_ IUnknown *pIUnknown); + + // + // Get OEM dll related information + // + + STDMETHOD(GetInfo) (THIS_ DWORD dwMode, PVOID pBuffer, DWORD cbSize, + PDWORD pcbNeeded); + + // + // OEMDevMode + // + + STDMETHOD(DevMode) (THIS_ DWORD dwMode, POEMDMPARAM pOemDMParam) ; + + // + // OEMCommonUIProp + // + + STDMETHOD(CommonUIProp) (THIS_ + DWORD dwMode, + POEMCUIPPARAM pOemCUIPParam + ); + + // + // OEMDocumentPropertySheets + // + + STDMETHOD(DocumentPropertySheets) (THIS_ + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam + ); + + // + // OEMDevicePropertySheets + // + + STDMETHOD(DevicePropertySheets) (THIS_ + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam + ); + + + // + // OEMDevQueryPrintEx + // + + STDMETHOD(DevQueryPrintEx) (THIS_ + POEMUIOBJ poemuiobj, + PDEVQUERYPRINT_INFO pDQPInfo, + PDEVMODE pPublicDM, + PVOID pOEMDM + ); + + // + // OEMDeviceCapabilities + // + + STDMETHOD(DeviceCapabilities) (THIS_ + POEMUIOBJ poemuiobj, + HANDLE hPrinter, + _In_ PWSTR pDeviceName, + WORD wCapability, + PVOID pOutput, + PDEVMODE pPublicDM, + PVOID pOEMDM, + DWORD dwOld, + DWORD *dwResult + ); + + // + // OEMUpgradePrinter + // + + STDMETHOD(UpgradePrinter) (THIS_ + DWORD dwLevel, + PBYTE pDriverUpgradeInfo + ); + + // + // OEMPrinterEvent + // + + STDMETHOD(PrinterEvent) (THIS_ + _In_ PWSTR pPrinterName, + INT iDriverEvent, + DWORD dwFlags, + LPARAM lParam + ); + + // + // OEMDriverEvent + // + + STDMETHOD(DriverEvent)(THIS_ + DWORD dwDriverEvent, + DWORD dwLevel, + LPBYTE pDriverInfo, + LPARAM lParam + ); + + // + // OEMQueryColorProfile + // + + STDMETHOD(QueryColorProfile) (THIS_ + HANDLE hPrinter, + POEMUIOBJ poemuiobj, + PDEVMODE pPublicDM, + PVOID pOEMDM, + ULONG ulReserved, + VOID *pvProfileData, + ULONG *pcbProfileData, + FLONG *pflProfileData); + + // + // OEMFontInstallerDlgProc + // + + STDMETHOD(FontInstallerDlgProc) (THIS_ + HWND hWnd, + UINT usMsg, + WPARAM wParam, + LPARAM lParam + ); + // + // UpdateExternalFonts + // + + STDMETHOD(UpdateExternalFonts) (THIS_ + HANDLE hPrinter, + HANDLE hHeap, + _In_ PWSTR pwstrCartridges + ); + + IOemUI() + { + m_cRef = 1; + m_pOEMHelp = NULL; + m_OemSheetData.pfnComPropSheet = NULL; + m_OemSheetData.pOEMCUIParam=NULL; + m_OemSheetData.hComPropSheet=INVALID_HANDLE_VALUE; + m_OemSheetData.hmyPlugin=INVALID_HANDLE_VALUE; + }; + + ~IOemUI(); + +protected: + LONG m_cRef; + IPrintOemDriverUI* m_pOEMHelp; + + // + //Used to link common ui in device settings tab and the OEM plugin tab. + // + OEMSHEETDATA m_OemSheetData; +}; + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/oem.h b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/oem.h new file mode 100644 index 00000000..daad3e27 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/oem.h @@ -0,0 +1,24 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: oem.h +// +// +// PURPOSE: Define common data types, and external function prototypes +// for debug.cpp. +// + +#pragma once + +//////////////////////////////////////////////////////// +// OEM Defines +//////////////////////////////////////////////////////// + +#define OEM_SIGNATURE 'MSFT' +#define OEM_VERSION 0x00000001L + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/oemui.cpp b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/oemui.cpp new file mode 100644 index 00000000..5802a776 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/oemui.cpp @@ -0,0 +1,1099 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: OEMUI.cpp +// +// PURPOSE: Main file for OEM UI test module. +// + +#include "precomp.h" +#include "resource.h" +#include "debug.h" +#include "oemui.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +//////////////////////////////////////////////////////// +// INTERNAL MACROS and DEFINES +//////////////////////////////////////////////////////// + +typedef struct _tagCBUserData +{ + HANDLE hComPropSheet; + HANDLE hPropPage; + POEMUIPSPARAM pOEMUIParam; + PFNCOMPROPSHEET pfnComPropSheet; + +} CBUSERDATA, *PCBUSERDATA; + + +//////////////////////////////////////////////////////// +// INTERNAL PROTOTYPES +//////////////////////////////////////////////////////// + +static HRESULT hrDocumentPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam); +static HRESULT hrPrinterPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam); + +LONG APIENTRY OEMPrinterUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam); +LONG APIENTRY OEMDocUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam); +LONG APIENTRY OEMDocUICallBack2(PCPSUICBPARAM pCallbackParam); +INT_PTR CALLBACK DevicePropPageProc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam); + +void SetOEMUiState (HWND hDlg, POEMSHEETDATA pOEMSheetData); +void SetOEMCommonDataIntoOptItem (POEMSHEETDATA pOEMSheetData, _In_ PSTR PName, LONG Sel); +void ChangeOpItem (IPrintOemDriverUI *pIPrintOEMDrvUI, POEMUIOBJ pOEMObj, POPTITEM pOptItem, int iSel); +POPTITEM FindDrvOptItem (POPTITEM pDrvOptItems, DWORD dwItemCount, _In_ PSTR pKeyWordName, BYTE dmPubID = DMPUB_NONE); + +static POPTITEM CreateOptItems(HANDLE hHeap, DWORD dwOptItems); +static void InitOptItems(POPTITEM pOptItems, DWORD dwOptItems); +static POPTTYPE CreateOptType(HANDLE hHeap, WORD wOptParams); +static PTSTR GetStringResource(HANDLE hHeap, HANDLE hModule, UINT uResource); + +//////////////////////////////////////////////////////////////////////////////// +// +// Initializes OptItems to display OEM device or document property UI. +// Called via IOemUI::CommonUIProp +// +HRESULT hrOEMPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam) +{ + HRESULT hResult = S_OK; + + + VERBOSE(DLLTEXT("hrOEMPropertyPage(%d) entry.\r\n"), dwMode); + + // Validate parameters. + if( (OEMCUIP_DOCPROP != dwMode) + && + (OEMCUIP_PRNPROP != dwMode) + ) + { + ERR(ERRORTEXT("hrOEMPropertyPage() ERROR_INVALID_PARAMETER.\r\n")); + VERBOSE(DLLTEXT("\tdwMode = %d, pOEMUIParam = %#lx.\r\n"), dwMode, pOEMUIParam); + + // Return invalid parameter error. + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + switch(dwMode) + { + case OEMCUIP_DOCPROP: + hResult = hrDocumentPropertyPage(dwMode, pOEMUIParam); + break; + + case OEMCUIP_PRNPROP: + hResult = hrPrinterPropertyPage(dwMode, pOEMUIParam); + break; + + default: + // Should never reach this! + ERR(ERRORTEXT("hrOEMPropertyPage() Invalid dwMode, %d"), dwMode); + SetLastError(ERROR_INVALID_PARAMETER); + hResult = E_FAIL; + break; + } + + return hResult; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// Initializes OptItems to display OEM document property UI. +// +static HRESULT hrDocumentPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam) +{ + UNREFERENCED_PARAMETER(dwMode); + + if(NULL == pOEMUIParam->pOEMOptItems) + { + // Fill in the number of OptItems to create for OEM document property UI. + pOEMUIParam->cOEMOptItems = 1; + VERBOSE(DLLTEXT("hrDocumentPropertyPage() requesting %d number of items.\r\n"), pOEMUIParam->cOEMOptItems); + } + else + { + POEMDEV pOEMDev = (POEMDEV) pOEMUIParam->pOEMDM; + + + VERBOSE(DLLTEXT("hrDocumentPropertyPage() fill out %d items.\r\n"), pOEMUIParam->cOEMOptItems); + + // Init UI Callback reference. + pOEMUIParam->OEMCUIPCallback = OEMDocUICallBack; + + // Init OEMOptItmes. + InitOptItems(pOEMUIParam->pOEMOptItems, pOEMUIParam->cOEMOptItems); + + // Fill out tree view items. + + // New section. + pOEMUIParam->pOEMOptItems[0].Level = 1; + pOEMUIParam->pOEMOptItems[0].Flags = OPTIF_COLLAPSE; + pOEMUIParam->pOEMOptItems[0].pName = GetStringResource(pOEMUIParam->hOEMHeap, pOEMUIParam->hModule, IDS_ADV_SECTION); + pOEMUIParam->pOEMOptItems[0].Sel = pOEMDev->dwAdvancedData; + + pOEMUIParam->pOEMOptItems[0].pOptType = CreateOptType(pOEMUIParam->hOEMHeap, 2); + + // + //Setup the Optional Item + // + pOEMUIParam->pOEMOptItems[0].pOptType->Type = TVOT_UDARROW; + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].IconID = 0; + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].lParam = 100; + } + + return S_OK; +} + + + +//////////////////////////////////////////////////////////////////////////////// +// +// Initializes OptItems to display OEM printer property UI. +// +static HRESULT hrPrinterPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam) +{ + UNREFERENCED_PARAMETER(dwMode); + + // + //This is null the first time the interface is called. + // + if(NULL == pOEMUIParam->pOEMOptItems) + { + // Fill in the number of OptItems to create for OEM printer property UI. + pOEMUIParam->cOEMOptItems = 1; + VERBOSE(DLLTEXT("hrPrinterPropertyPage() requesting %d number of items.\r\n"), pOEMUIParam->cOEMOptItems); + } + else + { + // + //This is the second time we are called Now setup the optional items. + // + DWORD dwError; + DWORD dwDeviceValue; + DWORD dwType; + DWORD dwNeeded; + + VERBOSE(DLLTEXT("hrPrinterPropertyPage() fill out %d items.\r\n"), pOEMUIParam->cOEMOptItems); + + // + //Add OEM Optitem to the Device + // + + // Get device settings value from printer. + dwError = GetPrinterData(pOEMUIParam->hPrinter, OEMUI_VALUE, &dwType, (PBYTE) &dwDeviceValue, + sizeof(dwDeviceValue), &dwNeeded); + if( (ERROR_SUCCESS != dwError) + || + (dwDeviceValue > 100) + ) + { + // Failed to get the device value or value is invalid, just use the default. + dwDeviceValue = 0; + } + + // Init UI Callback reference. + pOEMUIParam->OEMCUIPCallback = OEMPrinterUICallBack; + + + // Init OEMOptItmes. + InitOptItems(pOEMUIParam->pOEMOptItems, pOEMUIParam->cOEMOptItems); + + // Fill out tree view items. + // New section. + pOEMUIParam->pOEMOptItems[0].Level = 1; + pOEMUIParam->pOEMOptItems[0].Flags = OPTIF_COLLAPSE; + pOEMUIParam->pOEMOptItems[0].pName = GetStringResource(pOEMUIParam->hOEMHeap, pOEMUIParam->hModule, IDS_DEV_SECTION); + pOEMUIParam->pOEMOptItems[0].Sel = dwDeviceValue; + + pOEMUIParam->pOEMOptItems[0].pOptType = CreateOptType(pOEMUIParam->hOEMHeap, 2); + + // + //Setup the Optional Item + // + pOEMUIParam->pOEMOptItems[0].pOptType->Type = TVOT_UDARROW; + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].IconID = 0; + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].lParam = 100; + + + } + return S_OK; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// Adds property page to Document property sheet. Called via IOemUI::DocumentPropertySheets +// +HRESULT hrOEMDocumentPropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam, + IPrintOemDriverUI* pOEMHelp) +{ + LONG_PTR lResult = 0; + HRESULT hrResult = S_OK; + + VERBOSE(DLLTEXT("hrOEMDocumentPropertySheets() entry.\r\n")); + + UNREFERENCED_PARAMETER(pOEMHelp); + + // Validate parameters. + if( (NULL == pPSUIInfo) + || + (PROPSHEETUI_INFO_VERSION != pPSUIInfo->Version) + ) + { + ERR(ERRORTEXT("hrOEMDocumentPropertySheets() ERROR_INVALID_PARAMETER.\r\n")); + + // Return invalid parameter error. + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Do action. + switch(pPSUIInfo->Reason) + { + case PROPSHEETUI_REASON_INIT: + { + DWORD dwSheets = 0; + PCBUSERDATA pUserData; + POEMUIPSPARAM pOEMUIParam = (POEMUIPSPARAM) pPSUIInfo->lParamInit; + HANDLE hHeap = pOEMUIParam->hOEMHeap; + POEMDEV pOEMDev = (POEMDEV) pOEMUIParam->pOEMDM; + COMPROPSHEETUI Sheet; + + + // Init property page. + memset(&Sheet, 0, sizeof(COMPROPSHEETUI)); + Sheet.cbSize = sizeof(COMPROPSHEETUI); + Sheet.Flags = CPSUIF_UPDATE_PERMISSION; + Sheet.hInstCaller = ghInstance; + Sheet.pCallerName = GetStringResource(hHeap, ghInstance, IDS_NAME); + Sheet.pHelpFile = NULL; + Sheet.pfnCallBack = OEMDocUICallBack2; + Sheet.pDlgPage = CPSUI_PDLGPAGE_TREEVIEWONLY; + Sheet.cOptItem = 1; + Sheet.IconID = IDI_CPSUI_PRINTER; + Sheet.pOptItemName = GetStringResource(hHeap, ghInstance, IDS_SECTION); + Sheet.CallerVersion = 0x100; + Sheet.OptItemVersion = 0x100; + + // Init user data. + pUserData = (PCBUSERDATA) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(CBUSERDATA)); + if (NULL == pUserData) + { + ERR(ERRORTEXT("hrOEMDocumentPropertySheets() failed to allocate user data.\r\n")); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + pUserData->hComPropSheet = pPSUIInfo->hComPropSheet; + pUserData->pfnComPropSheet = pPSUIInfo->pfnComPropSheet; + pUserData->pOEMUIParam = pOEMUIParam; + Sheet.UserData = (ULONG_PTR) pUserData; + + // Create OptItems for page. + Sheet.pOptItem = CreateOptItems(hHeap, Sheet.cOptItem); + if (NULL == Sheet.pOptItem) + { + ERR(ERRORTEXT("hrOEMDocumentPropertySheets() failed to allocate OPTITEMs.\r\n")); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + // Initialize OptItems + Sheet.pOptItem[0].Level = 1; + Sheet.pOptItem[0].Flags = OPTIF_COLLAPSE; + Sheet.pOptItem[0].pName = GetStringResource(hHeap, ghInstance, IDS_SECTION); + Sheet.pOptItem[0].Sel = pOEMDev->dwDriverData; + + Sheet.pOptItem[0].pOptType = CreateOptType(hHeap, 2); + if (NULL == Sheet.pOptItem[0].pOptType) + { + ERR(ERRORTEXT("hrOEMDocumentPropertySheets() failed to allocate OPTTYPE.\r\n")); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + // + //Set the UI prop of this OPTYPE item. + // + Sheet.pOptItem[0].pOptType->Type = TVOT_UDARROW; + Sheet.pOptItem[0].pOptType->pOptParam[1].IconID = 0; + Sheet.pOptItem[0].pOptType->pOptParam[1].lParam = 100; + + // Adds the property sheets. + lResult = pPSUIInfo->pfnComPropSheet(pPSUIInfo->hComPropSheet, CPSFUNC_ADD_PCOMPROPSHEETUI, + (LPARAM)&Sheet, (LPARAM)&dwSheets); + } + break; + + case PROPSHEETUI_REASON_GET_INFO_HEADER: + { + PPROPSHEETUI_INFO_HEADER pHeader = (PPROPSHEETUI_INFO_HEADER) lParam; + + pHeader->pTitle = (LPTSTR)PROP_TITLE; + lResult = TRUE; + } + break; + + case PROPSHEETUI_REASON_GET_ICON: + // No icon + lResult = 0; + break; + + case PROPSHEETUI_REASON_SET_RESULT: + { + PSETRESULT_INFO pInfo = (PSETRESULT_INFO) lParam; + + lResult = pInfo->Result; + } + break; + + case PROPSHEETUI_REASON_DESTROY: + lResult = TRUE; + break; + } + +Exit: + + pPSUIInfo->Result = lResult; + return hrResult; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Adds property page to printer property sheet. Called via IOemUI::DevicePropertySheets +// +HRESULT hrOEMDevicePropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam, POEMSHEETDATA pOemSheetData) +{ + LONG_PTR lResult = 0; + + + VERBOSE(DLLTEXT("hrOEMDevicePropertySheets(%#x, %#x) entry\r\n"), pPSUIInfo, lParam); + + // Validate parameters. + if( (NULL == pPSUIInfo) + + || + (PROPSHEETUI_INFO_VERSION != pPSUIInfo->Version) + ) + { + ERR(ERRORTEXT("hrOEMDevicePropertySheets() ERROR_INVALID_PARAMETER.\r\n")); + + // Return invalid parameter error. + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + Dump(pPSUIInfo); + + + // Do action. + switch(pPSUIInfo->Reason) + { + + case PROPSHEETUI_REASON_INIT: + { + PROPSHEETPAGE Page; + + // Init property page. + memset(&Page, 0, sizeof(PROPSHEETPAGE)); + Page.dwSize = sizeof(PROPSHEETPAGE); + Page.dwFlags = PSP_DEFAULT; + Page.hInstance = ghInstance; + Page.pszTemplate = MAKEINTRESOURCE(IDD_DEVICE_PROPPAGE); + Page.pfnDlgProc = DevicePropPageProc; + + // + //This is the OEMPlugIN Sheets Shared Data. Use this Pointer to gain access to shared driver data + // + pOemSheetData->hComPropSheet = pPSUIInfo->hComPropSheet; + pOemSheetData->pfnComPropSheet = pPSUIInfo->pfnComPropSheet; + Page.lParam = (LPARAM)pOemSheetData; + + // Add property sheets. + pOemSheetData->hmyPlugin = (HANDLE)(pPSUIInfo->pfnComPropSheet(pPSUIInfo->hComPropSheet, CPSFUNC_ADD_PROPSHEETPAGE, (LPARAM)&Page, 0)); + + VERBOSE(DLLTEXT("hrOEMDevicePropertySheets() pfnComPropSheet returned %d.\r\n"), pOemSheetData->hmyPlugin); + } + break; + + case PROPSHEETUI_REASON_GET_INFO_HEADER: + { + PPROPSHEETUI_INFO_HEADER pHeader = (PPROPSHEETUI_INFO_HEADER) lParam; + + pHeader->pTitle = (LPTSTR)PROP_TITLE; + lResult = TRUE; + } + break; + + case PROPSHEETUI_REASON_GET_ICON: + // No icon + lResult = 0; + break; + + case PROPSHEETUI_REASON_SET_RESULT: + { + PSETRESULT_INFO pInfo = (PSETRESULT_INFO) lParam; + + lResult = pInfo->Result; + } + break; + + case PROPSHEETUI_REASON_DESTROY: + lResult = TRUE; + break; + } + + pPSUIInfo->Result = lResult; + return S_OK; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// OptItems call back for OEM printer property UI. +// +LONG APIENTRY OEMPrinterUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam) +{ + LONG lReturn = CPSUICB_ACTION_NONE; + + VERBOSE(DLLTEXT("OEMPrinterUICallBack() entry, Reason is %d.\r\n"), pCallbackParam->Reason); + + switch(pCallbackParam->Reason) + { + case CPSUICB_REASON_APPLYNOW: + { + DWORD dwDriverValue = pOEMUIParam->pOEMOptItems[0].Sel; + + // + // Store OptItems state in printer data. + // + SetPrinterData(pOEMUIParam->hPrinter, OEMUI_VALUE, REG_DWORD, (PBYTE) &dwDriverValue, sizeof(DWORD)); + } + break; + + // + //Because the plugin page is changing items in this CPSUI page we need to rinitalise the data on the page. + // + case CPSUICB_REASON_SETACTIVE: + return CPSUICB_ACTION_OPTIF_CHANGED; + break; + + default: + break; + } + + return lReturn; +} + + + +//////////////////////////////////////////////////////////////////////////////// +// +// Call back for OEM device property UI. +// +// This OEM plugin page is using the OPTITEMS in the Device tab to store data. (Installabale Options) +// If you hide these option in the device tab and only access them from your UI you dont have to worry about sync the views. +// If you want the Options in both tabs you need to have a CPSUICALLBACK function defined for the Device tab. (OEMPrinterUICallBack) +// OEMPrinterUICallBack will return CPSUICB_ACTION_OPTIF_CHANGED; to indicate that some of the controls have change. Resulting in CPSUI to refresh the view. +// +INT_PTR CALLBACK DevicePropPageProc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) +{ + + VERBOSE(DLLTEXT("DevicePropPageProc() entry, Reason is %d.\r\n"), uiMsg); + + POEMSHEETDATA pOEMSheetData = NULL; + LONG lState = 0; + DWORD fDataValid = 0; + WORD dlgControl = 0; + PSTR pControlName = NULL; + + + if ( uiMsg != WM_INITDIALOG ) + { + // + //Retrieves Application data storded by the call to SetWindowLongPtr. + // + pOEMSheetData = (POEMSHEETDATA)GetWindowLongPtr( hDlg, DWLP_USER); + + + if (!pOEMSheetData) + { + // + //Failed to get the OEM Prop Page Data Pointer. + // + ERR(ERRORTEXT("DevicePropPageProc : GetWindowLongPtr Failed (%d)\r\n"), GetLastError()); + return FALSE; + } + } + + switch (uiMsg) + { + case WM_INITDIALOG: + // + //PROPSHEETPAGE structure is passed to the dialog box procedure with a WM_INITDIALOG message. + //The lParam member is provided to allow you to pass application-specific information to the dialog box procedure + // + SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR)((LPPROPSHEETPAGE)lParam)->lParam); + break; + + case WM_COMMAND: + switch(HIWORD(wParam)) + { + + case BN_CLICKED: + + // + //Change the UI to activate the apply button Send the prop dailog a change message. + // + PropSheet_Changed(GetParent(hDlg), hDlg); + + switch(LOWORD(wParam)) + { + + // + //USER modified OEM Controls on the plugin page. + // + case IDC_CHECK_DUPLPEX: + dlgControl = IDC_CHECK_DUPLPEX; + fDataValid = TRUE; + pControlName = (PSTR)DUPLEXUNIT; + break; + + case IDC_CHECK_HDRIVE: + dlgControl = IDC_CHECK_HDRIVE; + fDataValid = TRUE; + pControlName = (PSTR)PRINTERHDISK; + break; + + case IDC_CHECK_ENVFEEDER: + dlgControl = IDC_CHECK_ENVFEEDER; + fDataValid = TRUE; + pControlName = (PSTR)ENVFEEDER; + break; + + default: + fDataValid = 0; + break; + + } + + // + //If the Control is valid Get the ctrl state and UPdate the OPTITEM. + // + if ( fDataValid ) + { + lState = (LONG)(SendDlgItemMessage (hDlg, dlgControl, BM_GETSTATE, 0, 0) & 0x0003); + VERBOSE(DLLTEXT("DevicePropPageProc : Clicked dlgControl (%d)\r\n"), lState); + + // + //Saves the Data to the OPTITEMS in the device settings page. + // + SetOEMCommonDataIntoOptItem (pOEMSheetData, pControlName, lState); + } + break; + + + default: + return FALSE; + } + return TRUE; + + // + //Dailog is going to paint set up the UI controls to match the relavent OPTITEMS Data. + // + case WM_CTLCOLORDLG: + { + VERBOSE(DLLTEXT("DevicePropPageProc : WM_CTLCOLORDLG \r\n")); + SetOEMUiState (hDlg, pOEMSheetData); + } + return TRUE; + + + case WM_NOTIFY: + { + switch (((LPNMHDR)lParam)->code) // type of notification message + { + case PSN_SETACTIVE: + return TRUE; + break; + + case PSN_KILLACTIVE: + return TRUE; + break; + + case PSN_APPLY: + + // + //Calls ComPropSheet + //causes the ComPropSheet function to pass a specified result value to all PFNPROPSHEETUI-typed functions associated with a specified page and its parents + // + pOEMSheetData->pfnComPropSheet(pOEMSheetData->hComPropSheet, + CPSFUNC_SET_RESULT, + (LPARAM) pOEMSheetData->hmyPlugin, + (LPARAM)CPSUI_OK); + + // + //Accept the apply if the data was invalid and you are checking for this set PSNRET_INVALID | PSNRET_INVALID_NOCHANGEPAGE + //Disables the APPLY button and saves the Data. + // + PropSheet_UnChanged(GetParent(hDlg), hDlg); + SetWindowLongPtr(hDlg,DWLP_MSGRESULT,PSNRET_NOERROR); + return TRUE; + break; + + // + // Need To undo the changes + // + case PSN_RESET: + break; + } + } + break; + } + + return FALSE; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// Update the OEM page controls to match the Device settings page +// + +void SetOEMUiState (HWND hDlg, POEMSHEETDATA pOEMSheetData) +{ + LRESULT lstate = 0; + POEMCUIPPARAM pOEMCUIParam = NULL; + PUSERDATA pUserData = NULL; + POPTITEM pOptItem = NULL; + DWORD cDrvOptItems = 0; + + + if (pOEMSheetData->pOEMCUIParam) + { + pOEMCUIParam = pOEMSheetData->pOEMCUIParam; + cDrvOptItems = pOEMCUIParam->cDrvOptItems; + } + + // + //loop down the OPITEMS and retrieve the data that is needed from the control + //(all Optitesm are ref from DMPubID of the UserData->pKeyWordName) + // + for (DWORD i=0; i < cDrvOptItems; i++) + { + pOptItem = &(pOEMCUIParam->pDrvOptItems[i]); + if (pOptItem->UserData) + { + pUserData = (PUSERDATA)(pOptItem->UserData); + if ( pUserData->pKeyWordName ) + { + // + //Get the Selection of the OPITEM + // + if (pOptItem->Sel) + { + lstate = BST_CHECKED; + } + else + { + lstate = BST_UNCHECKED; + } + + // + //Update the Data in OEM Page to mactch the data in the Device Settings TAB. + //Send a message to the Cntrol to update its State. + // + + //Set the Duplex Option + if ( strcmp(pUserData->pKeyWordName, DUPLEXUNIT ) == 0 ) + { + SendDlgItemMessage (hDlg, IDC_CHECK_DUPLPEX, BM_SETCHECK, lstate, 0); + } + + //Set HardDrive Option + if ( strcmp (pUserData->pKeyWordName, PRINTERHDISK ) == 0 ) + { + SendDlgItemMessage (hDlg, IDC_CHECK_HDRIVE, BM_SETCHECK, lstate, 0); + } + + //Set the Env Feeder Option + if ( strcmp (pUserData->pKeyWordName, ENVFEEDER ) == 0 ) + { + SendDlgItemMessage (hDlg, IDC_CHECK_ENVFEEDER, BM_SETCHECK, lstate, 0); + } + } + } + } +} + +//////////////////////////////////////////////////////////////////////////////// +// +// Save the OEM change into the correct OPTITEM. +// The UI data is been stored in the driver supplied OPTITEM +// +void SetOEMCommonDataIntoOptItem (POEMSHEETDATA pOEMSheetData, _In_ PSTR PName, LONG Sel) +{ + + VERBOSE(DLLTEXT("SetOEMCommonDataIntoOptItem (%S) \r\n"), PName); + + POEMCUIPPARAM pOEMCUIParam = pOEMSheetData->pOEMCUIParam; + POPTITEM pOptItem = NULL; + + // + //Find the OPTITEM that needs to be Updated. + // + pOptItem = FindDrvOptItem (pOEMCUIParam->pDrvOptItems, + pOEMCUIParam->cDrvOptItems, + PName, + DMPUB_NONE); + + if (pOptItem) + { + ChangeOpItem (pOEMSheetData->pOEMHelp, + pOEMCUIParam->poemuiobj, + pOptItem, + Sel); + } + else + { + ERR(ERRORTEXT("SetOEMCommonDataIntoOptItem Item Not Found OPTITEM(%S) \r\n"), PName); + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Help Change the data set in the OPTITEM +// +void ChangeOpItem (IPrintOemDriverUI *pIPrintOEMDrvUI, POEMUIOBJ pOEMUIObj, POPTITEM pOptItem, int iSel) +{ + HRESULT hRestult = S_OK; + + // + //Change the Item (Change which OPTPARAM is selected fot the required OPTTYPE) + // + pOptItem->Sel = iSel; + + // + //Set the Flag indicating it is changed + // + pOptItem->Flags |= OPTIF_CHANGED; + + // + //Update the Driver UI. (this updates the UI but it does not cause CPSUI to update the its pages), + //Look at OEMPrinterUICallBack to see how CPSUI pages are updated + //The IPrintOemDriverUI::DrvUpdateUISetting method is provided by the + //Unidrv and Pscript5 minidrivers so that user interface plug-ins can + //notify the driver of a modified user interface option. + // + hRestult = pIPrintOEMDrvUI->DrvUpdateUISetting((PVOID)pOEMUIObj, (PVOID)pOptItem, 0, OEMCUIP_PRNPROP); + + if (hRestult != S_OK) + { + ERR(ERRORTEXT("ChangeOpItem DrvUpdateUISetting FAILED \r\n") ); + } + +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Help Find a OPTITEM from the array based on USERDATA->pKeyWordName or DMPubID +// +POPTITEM FindDrvOptItem (POPTITEM pDrvOptItems, DWORD dwItemCount, _In_ PSTR pKeyWordName, BYTE dmPubID ) +{ + VERBOSE(DLLTEXT("FindDrvOptItem Looking (%S) (%d) \r\n"), pKeyWordName, dmPubID); + + POPTITEM pOptItem = NULL; + PUSERDATA pUserData = NULL; + + for (DWORD i=0; i < dwItemCount; i++) + { + // + //OPTITEM has valid data compare these now (Search on DMPubID) + // + if (pKeyWordName == NULL) + { + if (dmPubID == pDrvOptItems[i].DMPubID) + { + pOptItem = &(pDrvOptItems[i]); + break; + } + } + else + { + // + //(Search a printer freature pKeyWordName) + // + //For Common Printer Features the key name is set to a common non localised string + //Note the these are only ansi strings ie PSTR + // + if (pDrvOptItems[i].UserData) + { + pUserData = (PUSERDATA)pDrvOptItems[i].UserData; + if (pUserData->pKeyWordName) + { + // + //OPTITEM has valid data compare these now + // + if ( strcmp (pUserData->pKeyWordName, pKeyWordName) == 0) + { + pOptItem = &(pDrvOptItems[i]); + break; + } + } + } + } + } + + if (!pOptItem) + { + ERR(ERRORTEXT("FindDrvOptItem OPTITEM NOT Found \r\n") ); + } + + return pOptItem; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// OptItems call back for OEM document property UI. +// +LONG APIENTRY OEMDocUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam) +{ + LONG lReturn = CPSUICB_ACTION_NONE; + POEMDEV pOEMDev = (POEMDEV) pOEMUIParam->pOEMDM; + + + VERBOSE(DLLTEXT("OEMDocUICallBack() entry, Reason is %d.\r\n"), pCallbackParam->Reason); + + switch(pCallbackParam->Reason) + { + case CPSUICB_REASON_APPLYNOW: + // Store OptItems state in DEVMODE. + pOEMDev->dwAdvancedData = pOEMUIParam->pOEMOptItems[0].Sel; + break; + + case CPSUICB_REASON_KILLACTIVE: + pOEMDev->dwAdvancedData = pOEMUIParam->pOEMOptItems[0].Sel; + break; + + // + //Refress the Data in the view and tell CPUSI that the data has changed by ret CPSUICB_ACTION_OPTIF_CHANGED + // + case CPSUICB_REASON_SETACTIVE: + if((DWORD)(pOEMUIParam->pOEMOptItems[0].Sel) != pOEMDev->dwAdvancedData) + { + pOEMUIParam->pOEMOptItems[0].Sel = pOEMDev->dwAdvancedData; + pOEMUIParam->pOEMOptItems[0].Flags |= OPTIF_CHANGED; + lReturn = CPSUICB_ACTION_OPTIF_CHANGED; + } + break; + + default: + break; + } + + return lReturn; +} + + +LONG APIENTRY OEMDocUICallBack2(PCPSUICBPARAM pCallbackParam) +{ + LONG lReturn = CPSUICB_ACTION_NONE; + PCBUSERDATA pUserData = (PCBUSERDATA) pCallbackParam->UserData; + POEMDEV pOEMDev = (POEMDEV) pUserData->pOEMUIParam->pOEMDM; + + + VERBOSE(DLLTEXT("OEMDocUICallBack2() entry, Reason is %d.\r\n"), pCallbackParam->Reason); + + switch(pCallbackParam->Reason) + { + case CPSUICB_REASON_APPLYNOW: + pOEMDev->dwDriverData = pCallbackParam->pOptItem[0].Sel; + pUserData->pfnComPropSheet(pUserData->hComPropSheet, CPSFUNC_SET_RESULT, + (LPARAM)pUserData->hPropPage, + (LPARAM)CPSUI_OK); + break; + + case CPSUICB_REASON_KILLACTIVE: + pOEMDev->dwDriverData = pCallbackParam->pOptItem[0].Sel; + break; + + case CPSUICB_REASON_SETACTIVE: + if((DWORD)(pCallbackParam->pOptItem[0].Sel) != pOEMDev->dwDriverData) + { + pCallbackParam->pOptItem[0].Sel = pOEMDev->dwDriverData; + pCallbackParam->pOptItem[0].Flags |= OPTIF_CHANGED; + lReturn = CPSUICB_ACTION_OPTIF_CHANGED; + } + break; + + default: + break; + } + + return lReturn; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Creates and Initializes OptItems. +// +static POPTITEM CreateOptItems(HANDLE hHeap, DWORD dwOptItems) +{ + POPTITEM pOptItems = NULL; + SIZE_T sizeOfOptItems = 0; + + // Compute the size of memory needed for the OptItems: + if (SUCCEEDED(SIZETMult(sizeof(OPTITEM), (SIZE_T)dwOptItems, &sizeOfOptItems))) + { + // Allocate memory for OptItems; + pOptItems = (POPTITEM) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeOfOptItems); + if(NULL != pOptItems) + { + InitOptItems(pOptItems, dwOptItems); + } + else + { + ERR(ERRORTEXT("CreateOptItems() failed to allocate memory for OPTITEMs!\r\n")); + } + } + else + { + ERR(ERRORTEXT("CreateOptItems() failed to compute necessary memory size for OPTITEMs!\r\n")); + } + + return pOptItems; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Initializes OptItems. +// +static void InitOptItems(POPTITEM pOptItems, DWORD dwOptItems) +{ + VERBOSE(DLLTEXT("InitOptItems() entry.\r\n")); + + // Zero out memory. + memset(pOptItems, 0, sizeof(OPTITEM) * dwOptItems); + + // Set each OptItem's size, and Public DM ID. + for(DWORD dwCount = 0; dwCount < dwOptItems; dwCount++) + { + pOptItems[dwCount].cbSize = sizeof(OPTITEM); + pOptItems[dwCount].DMPubID = DMPUB_NONE; + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Allocates and initializes OptType for OptItem. +// +static POPTTYPE CreateOptType(HANDLE hHeap, WORD wOptParams) +{ + POPTTYPE pOptType = NULL; + + + VERBOSE(DLLTEXT("CreateOptType() entry.\r\n")); + + // Allocate memory from the heap for the OPTTYPE; the driver will take care of clean up. + pOptType = (POPTTYPE) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(OPTTYPE)); + if(NULL != pOptType) + { + // Initialize OPTTYPE. + pOptType->cbSize = sizeof(OPTTYPE); + pOptType->Count = wOptParams; + + // Allocate memory from the heap for the OPTPARAMs for the OPTTYPE. + pOptType->pOptParam = (POPTPARAM) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, wOptParams * sizeof(OPTPARAM)); + if(NULL != pOptType->pOptParam) + { + // Initialize the OPTPARAMs. + for(WORD wCount = 0; wCount < wOptParams; wCount++) + { + pOptType->pOptParam[wCount].cbSize = sizeof(OPTPARAM); + } + } + else + { + ERR(ERRORTEXT("CreateOptType() failed to allocated memory for OPTPARAMs!\r\n")); + + // Free allocated memory and return NULL. + HeapFree(hHeap, 0, pOptType); + pOptType = NULL; + } + } + else + { + ERR(ERRORTEXT("CreateOptType() failed to allocated memory for OPTTYPE!\r\n")); + } + + return pOptType; +} + +//////////////////////////////////////////////////////////////////////////////////// +// +// Retrieves pointer to a String resource. +// +static PTSTR GetStringResource(HANDLE hHeap, HANDLE hModule, UINT uResource) +{ + int nResult; + DWORD dwSize = MAX_PATH; + PTSTR pszString = NULL; + + + VERBOSE(DLLTEXT("GetStringResource(%#x, %#x, %d) entered.\r\n"), hHeap, hModule, uResource); + + // Allocate buffer for string resource from heap; let the driver clean it up. + pszString = (PTSTR) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwSize * sizeof(TCHAR)); + if(NULL != pszString) + { + // Load string resource; resize after loading so as not to waste memory. + nResult = LoadString((HMODULE)hModule, uResource, pszString, dwSize); + if(nResult > 0) + { + PTSTR pszTemp; + + + VERBOSE(DLLTEXT("LoadString() returned %d!\r\n"), nResult); + VERBOSE(DLLTEXT("String load was \"%s\".\r\n"), pszString); + + pszTemp = (PTSTR) HeapReAlloc(hHeap, HEAP_ZERO_MEMORY, pszString, (nResult + 1) * sizeof(TCHAR)); + if(NULL != pszTemp) + { + pszString = pszTemp; + } + else + { + ERR(ERRORTEXT("GetStringResource() HeapReAlloc() of string retrieved failed! (Last Error was %d)\r\n"), GetLastError()); + } + } + else + { + ERR(ERRORTEXT("LoadString() returned %d! (Last Error was %d)\r\n"), nResult, GetLastError()); + ERR(ERRORTEXT("GetStringResource() failed to load string resource %d!\r\n"), uResource); + + pszString = NULL; + } + } + else + { + ERR(ERRORTEXT("GetStringResource() failed to allocate string buffer!\r\n")); + } + + return pszString; +} + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/oemui.h b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/oemui.h new file mode 100644 index 00000000..1c07802f --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/oemui.h @@ -0,0 +1,74 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: OEMUI.H +// +// +// PURPOSE: Define common data types, and external function prototypes +// for OEMUI Test Module. +// +// +#pragma once + +#include "OEM.H" +#include "DEVMODE.H" +#include "globals.h" + +//////////////////////////////////////////////////////// +// OEM UI Defines +//////////////////////////////////////////////////////// + + +// OEM Signature and version. +#define PROP_TITLE L"OEM UI Page" +#define DLLTEXT(s) __TEXT("UI: ") __TEXT(s) + +// OEM UI Misc defines. +#define ERRORTEXT(s) __TEXT("ERROR ") DLLTEXT(s) + + +// Printer registry keys where OEM data is stored. +#define OEMUI_VALUE TEXT("OEMUI_VALUE") +#define OEMUI_DEVICE_VALUE TEXT("OEMUI_DEVICE_VALUE") + +// +//KeyWordNames for OPTITEMS (These are nonlocalised keywords assocaited with driver features. in the OPTITEMS) +// +const char DUPLEXUNIT[] = "DuplexUnit"; +const char ENVFEEDER[] = "EnvFeeder"; +const char PRINTERHDISK[] = "PrinterHardDisk"; + +// +//This structure is used to link the common pages and the OEM plugin page. +// +typedef struct _OEMSHEETDATA { + + // + //Any other OEM Data you may want to store. + // + + + // + //Hold Pointers you may need. + // + HANDLE hComPropSheet; //Handle to the Prop Sheet Parent Page Used when calling ComPropSheet + HANDLE hmyPlugin; //Handle to the OEM Plugin page. Page Used when calling ComPropSheet + PFNCOMPROPSHEET pfnComPropSheet; //Is the Pointer to ComPropSheet This is needed when APPLY is clicked (CPSFUNC_SET_RESULT) + + POEMCUIPPARAM pOEMCUIParam; //Holds links to the DEVMODE and OPTITEMS needed. + IPrintOemDriverUI* pOEMHelp; + +} OEMSHEETDATA, *POEMSHEETDATA; + +//////////////////////////////////////////////////////// +// Prototypes +//////////////////////////////////////////////////////// + +HRESULT hrOEMPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam); +HRESULT hrOEMDocumentPropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam, IPrintOemDriverUI* pOEMHelp); +HRESULT hrOEMDevicePropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam, POEMSHEETDATA pOemSheetData); + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/oemui.rc b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/oemui.rc new file mode 100644 index 00000000..e87badbe --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/oemui.rc @@ -0,0 +1,175 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "Written by Windows Printing & Imaging Team" + VALUE "CompanyName", "Microsoft Corp." + VALUE "FileDescription", "OEM UI Test Module." + VALUE "FileVersion", "1, 0, 0, 1" + VALUE "InternalName", "OEMUI" + VALUE "LegalCopyright", "Copyright � 1998 - 2003 Microsoft Corp." + VALUE "LegalTrademarks", "Microsoft� is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation" + VALUE "OriginalFilename", "OEMUI.dll" + VALUE "ProductName", "Microsoft OEMUI" + VALUE "ProductVersion", "1.1" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_DEVICE_PROPPAGE DIALOG 0, 0, 179, 113 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Device Property Page" +FONT 8, "MS Shell Dialog" +BEGIN + GROUPBOX "Oem Install Options",IDC_STATIC,15,29,81,59 + LTEXT "OEM UI Controls",IDC_STATIC,55,14,68,11,WS_TABSTOP + CONTROL "Duplex Unit",IDC_CHECK_DUPLPEX,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,20,42,54,10 + CONTROL "Printer Hard Drive",IDC_CHECK_HDRIVE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,20,67,75,10 + CONTROL "Envelope Feeder",IDC_CHECK_ENVFEEDER,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,20,54,71,10 +END + +IDD_DOC_PROPPAGE DIALOG 0, 0, 210, 154 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Document Property Page" +FONT 8, "MS Shell Dialog" +BEGIN + LTEXT "OEM UI Document Property Page",IDC_STATIC,60,73,108,8 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_DEVICE_PROPPAGE, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 170 + TOPMARGIN, 8 + BOTTOMMARGIN, 106 + END + + IDD_DOC_PROPPAGE, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 203 + TOPMARGIN, 7 + BOTTOMMARGIN, 147 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDS_SECTION "OEM UI Added Item" + IDS_CALIBRATED "Printer has been calibrated." + IDS_NAME "OEM UI Customization DLL" + IDS_DEV_SECTION "Device Settings OEM UI Added Item" + IDS_ADV_SECTION "Advanced OEM UI Added Item" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/precomp.h b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/precomp.h new file mode 100644 index 00000000..2d502998 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/precomp.h @@ -0,0 +1,53 @@ +// +// +// PURPOSE: Header files that should be in the precompiled header. +// +// + +#pragma once + + +// Necessary for compiling under VC. +#if(!defined(WINVER) || (WINVER < 0x0500)) + #undef WINVER + #define WINVER 0x0500 +#endif +#if(!defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500)) + #undef _WIN32_WINNT + #define _WIN32_WINNT 0x0500 +#endif + + +// Required header files that shouldn't change often. + + +#include <STDDEF.H> +#include <STDLIB.H> +#include <OBJBASE.H> +#include <STDARG.H> +#include <STDIO.H> +#include <WINDEF.H> +#include <WINERROR.H> +#include <WINBASE.H> +#include <WINGDI.H> +#include <WINDDI.H> +#include <WINSPOOL.H> +#include <TCHAR.H> +#include <EXCPT.H> +#include <ASSERT.H> +#include <PRSHT.H> +#include <COMPSTUI.H> +#include <WINDDIUI.H> +#include <PRINTOEM.H> +#include <INITGUID.H> +#include <PRCOMOEM.H> + +// Safe integer functions to detect integer overflow/underflow conditions: +#include <intsafe.h> + +// Include this last to disallow +// unsafe string functions +#include <strsafe.h> + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/precompsrc.cpp b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/precompsrc.cpp new file mode 100644 index 00000000..5944cf51 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/precompsrc.cpp @@ -0,0 +1 @@ +#include "precomp.h"
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/resource.h b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/resource.h new file mode 100644 index 00000000..aacf0218 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/resource.h @@ -0,0 +1,28 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by oemui.rc +// +#define IDS_SECTION 1 +#define IDS_CALIBRATED 2 +#define IDS_NAME 3 +#define IDS_HELPFILE 4 +#define IDS_DEV_SECTION 5 +#define IDS_ADV_SECTION 10 +#define IDD_DEVICE_PROPPAGE 106 +#define IDD_DOC_PROPPAGE 107 +#define IDC_CALIBRATE 1001 +#define IDC_RADIO3 1004 +#define IDC_CHECK_DUPLPEX 1008 +#define IDC_CHECK_HDRIVE 1009 +#define IDC_CHECK_ENVFEEDER 1010 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 103 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1011 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/OEMUI.rc b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/OEMUI.rc new file mode 100644 index 00000000..a6491905 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/OEMUI.rc @@ -0,0 +1,169 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "Written by Windows Printing & Imaging Team" + VALUE "CompanyName", "Microsoft Corp." + VALUE "FileDescription", "OEM UI Test Module." + VALUE "FileVersion", "1, 0, 0, 1" + VALUE "InternalName", "OEMUI" + VALUE "LegalCopyright", "Copyright � 1998 - 2003 Microsoft Corp." + VALUE "LegalTrademarks", "Microsoft� is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation" + VALUE "OriginalFilename", "OEMUI.dll" + VALUE "ProductName", "Microsoft OEMUI" + VALUE "ProductVersion", "1.1" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_DEVICE_PROPPAGE DIALOG 0, 0, 179, 113 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Device Property Page" +FONT 8, "MS Shell Dialog" +BEGIN + LTEXT "OEM UI Added Page",IDC_STATIC,55,14,68,11 + PUSHBUTTON "Calibrate",IDC_CALIBRATE,61,34,50,14 +END + +IDD_DOC_PROPPAGE DIALOG 0, 0, 210, 154 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Document Property Page" +FONT 8, "MS Shell Dialog" +BEGIN + LTEXT "OEM UI Document Property Page",IDC_STATIC,60,73,108,8 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_DEVICE_PROPPAGE, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 172 + TOPMARGIN, 8 + BOTTOMMARGIN, 106 + END + + IDD_DOC_PROPPAGE, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 203 + TOPMARGIN, 7 + BOTTOMMARGIN, 147 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDS_SECTION "OEM UI Added Item" + IDS_CALIBRATED "Printer has been calibrated." + IDS_NAME "OEM UI Customization DLL" + IDS_DEV_SECTION "Device Settings OEM UI Added Item" + IDS_ADV_SECTION "Advanced OEM UI Added Item" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/ThemeUI.Manifest b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/ThemeUI.Manifest new file mode 100644 index 00000000..bb48af65 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/ThemeUI.Manifest @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> +<assemblyIdentity + version=SXS_ASSEMBLY_VERSION + processorArchitecture=SXS_PROCESSOR_ARCHITECTURE + name=SXS_ASSEMBLY_NAME + type="win32" +/> +<description>Your app description here</description> +<dependency> + <dependentAssembly> + <assemblyIdentity + type="win32" + name="Microsoft.Windows.Common-Controls" + version="6.0.0.0" + processorArchitecture=SXS_PROCESSOR_ARCHITECTURE + publicKeyToken="6595b64144ccf1df" + language="*" + /> + </dependentAssembly> +</dependency> +</assembly> diff --git a/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/ThemeUISmpl.vcxproj b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/ThemeUISmpl.vcxproj new file mode 100644 index 00000000..4abfd7bb --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/ThemeUISmpl.vcxproj @@ -0,0 +1,1120 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Win10 Debug|ARM64"> + <Configuration>Win10 Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|Win32"> + <Configuration>Win10 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|x64"> + <Configuration>Win10 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|ARM64"> + <Configuration>Win10 Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|Win32"> + <Configuration>Win10 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|x64"> + <Configuration>Win10 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|Win32"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|Win32"> + <Configuration>Win8 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|Win32"> + <Configuration>Win7 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|Win32"> + <Configuration>Win8.1 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|Win32"> + <Configuration>Win8 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|Win32"> + <Configuration>Win7 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|x64"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|x64"> + <Configuration>Win8 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|x64"> + <Configuration>Win7 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|x64"> + <Configuration>Win8.1 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|x64"> + <Configuration>Win8 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|x64"> + <Configuration>Win7 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{EA206DEA-26E6-4FD4-BF68-23F222C5E211}</ProjectGuid> + <RootNamespace>$(MSBuildProjectName)</RootNamespace> + <Configuration Condition="'$(Configuration)' == ''">Win10 Debug</Configuration> + <Platform Condition="'$(Platform)' == ''">Win32</Platform> + <SampleGuid>{7ABB810D-F51B-46DA-8A6C-6883AF316932}</SampleGuid> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <PropertyGroup> + <OutDir>$(IntDir)</OutDir> + </PropertyGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ItemGroup Label="WrappedTaskItems" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetName>ThemeUISmpl</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetName>ThemeUISmpl</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetName>ThemeUISmpl</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <TargetName>ThemeUISmpl</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <TargetName>ThemeUISmpl</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetName>ThemeUISmpl</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetName>ThemeUISmpl</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetName>ThemeUISmpl</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <TargetName>ThemeUISmpl</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <TargetName>ThemeUISmpl</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetName>ThemeUISmpl</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetName>ThemeUISmpl</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetName>ThemeUISmpl</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <TargetName>ThemeUISmpl</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetName>ThemeUISmpl</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetName>ThemeUISmpl</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetName>ThemeUISmpl</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <TargetName>ThemeUISmpl</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) -ignore:4049,4217</AdditionalOptions> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ResourceCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) -ignore:4049,4217</AdditionalOptions> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ResourceCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) -ignore:4049,4217</AdditionalOptions> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ResourceCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) -ignore:4049,4217</AdditionalOptions> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ResourceCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) -ignore:4049,4217</AdditionalOptions> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ResourceCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) -ignore:4049,4217</AdditionalOptions> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ResourceCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) -ignore:4049,4217</AdditionalOptions> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ResourceCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) -ignore:4049,4217</AdditionalOptions> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ResourceCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) -ignore:4049,4217</AdditionalOptions> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ResourceCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) -ignore:4049,4217</AdditionalOptions> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ResourceCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) -ignore:4049,4217</AdditionalOptions> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ResourceCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) -ignore:4049,4217</AdditionalOptions> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ResourceCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) -ignore:4049,4217</AdditionalOptions> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ResourceCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) -ignore:4049,4217</AdditionalOptions> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ResourceCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) -ignore:4049,4217</AdditionalOptions> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ResourceCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) -ignore:4049,4217</AdditionalOptions> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ResourceCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) -ignore:4049,4217</AdditionalOptions> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ResourceCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) -ignore:4049,4217</AdditionalOptions> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE;ISOLATION_AWARE_ENABLED</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions);MANIFEST_RESOURCE=2</PreprocessorDefinitions> + </ResourceCompile> + </ItemDefinitionGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Link> + <ModuleDefinitionFile>ThemeUISmpl.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Link> + <ModuleDefinitionFile>ThemeUISmpl.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Link> + <ModuleDefinitionFile>ThemeUISmpl.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <Link> + <ModuleDefinitionFile>ThemeUISmpl.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <Link> + <ModuleDefinitionFile>ThemeUISmpl.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Link> + <ModuleDefinitionFile>ThemeUISmpl.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Link> + <ModuleDefinitionFile>ThemeUISmpl.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Link> + <ModuleDefinitionFile>ThemeUISmpl.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <Link> + <ModuleDefinitionFile>ThemeUISmpl.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <Link> + <ModuleDefinitionFile>ThemeUISmpl.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Link> + <ModuleDefinitionFile>ThemeUISmpl.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Link> + <ModuleDefinitionFile>ThemeUISmpl.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Link> + <ModuleDefinitionFile>ThemeUISmpl.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <Link> + <ModuleDefinitionFile>ThemeUISmpl.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>ThemeUISmpl.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>ThemeUISmpl.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>ThemeUISmpl.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>ThemeUISmpl.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="devmode.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="dllentry.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="fusutils.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="globals.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="OEMUI.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Create</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ResourceCompile Include="OEMUI.rc" /> + </ItemGroup> + <ItemGroup> + <Inf Exclude="@(Inf)" Include="*.inf" /> + <FilesToPackage Include="$(TargetPath)" Condition="'$(ConfigurationType)'=='Driver' or '$(ConfigurationType)'=='DynamicLibrary'" /> + </ItemGroup> + <ItemGroup> + <None Exclude="@(None)" Include="*.txt;*.htm;*.html" /> + <None Exclude="@(None)" Include="*.ico;*.cur;*.bmp;*.dlg;*.rct;*.gif;*.jpg;*.jpeg;*.wav;*.jpe;*.tiff;*.tif;*.png;*.rc2" /> + <None Exclude="@(None)" Include="*.def;*.bat;*.hpj;*.asmx" /> + </ItemGroup> + <ItemGroup> + <ClInclude Exclude="@(ClInclude)" Include="*.h;*.hpp;*.hxx;*.hm;*.inl;*.xsd" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/ThemeUISmpl.vcxproj.Filters b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/ThemeUISmpl.vcxproj.Filters new file mode 100644 index 00000000..d8206354 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/ThemeUISmpl.vcxproj.Filters @@ -0,0 +1,327 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;*</Extensions> + <UniqueIdentifier>{18CF118F-704E-4B55-9621-B0D2F73CBFBE}</UniqueIdentifier> + </Filter> + <Filter Include="Header Files"> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + <UniqueIdentifier>{44047F2E-3DA5-4847-BAE3-6573B04506AF}</UniqueIdentifier> + </Filter> + <Filter Include="Resource Files"> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms;man;xml</Extensions> + <UniqueIdentifier>{695ECF76-7AFF-4B2D-A4E5-2138B4CC5B5A}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClCompile Include="devmode.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="dllentry.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="fusutils.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="globals.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="OEMUI.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="fusutils.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="fusutils.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="fusutils.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="fusutils.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="fusutils.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="fusutils.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="fusutils.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="fusutils.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="fusutils.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="fusutils.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="fusutils.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="fusutils.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="fusutils.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="fusutils.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="fusutils.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="fusutils.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="fusutils.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="fusutils.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="fusutils.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="fusutils.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="fusutils.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="fusutils.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="fusutils.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="fusutils.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="fusutils.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oem.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="OEMUI.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> + <ItemGroup> + <None Include="themeuismpl.def"> + <Filter>Source Files</Filter> + </None> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/debug.h b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/debug.h new file mode 100644 index 00000000..0414569c --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/debug.h @@ -0,0 +1,82 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1996 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Debug.H +// +// PURPOSE: Define common data types, and external function prototypes +// for debugging functions. Also defines the various debug macros. +// +// + +#pragma once + +///////////////////////////////////////////////////////// +// Macros +///////////////////////////////////////////////////////// +// +// These macros are used for debugging purposes. They expand +// to white spaces on a free build. Here is a brief description +// of what they do and how they are used: +// +// giDebugLevel +// Global variable which set the current debug level to control +// the amount of debug messages emitted. +// +// WARNING(msg) +// Display a message if the current debug level is <= DBG_WARNING. +// The message format is: WRN filename (linenumber): message +// +// ERR(msg) +// Similiar to WARNING macro above - displays a message +// if the current debug level is <= DBG_ERROR. +// +// ASSERT(cond) +// Verify a condition is true. If not, force a breakpoint. +// +// RIP(msg) +// Display a message and force a breakpoint. +// +// Usage: +// WARNING("App passed NULL pointer, ignoring...\n"); +// + +#define DBG_VERBOSE 0 +#define DBG_WARNING 1 +#define DBG_ERROR 2 +#define DBG_NONE 3 + +// VC and Build use different debug defines. +#if defined (DBG) || defined (_DEBUG) + + // __declspec(selectany) ensures that even if this is defined in multiple compilation + // modules, they will all resolve to the same symbol in the linked DLL + __declspec(selectany) INT giDebugLevel = 2; + + #define STRINGIZE(x) #x + #define QUOTE(x) STRINGIZE(x) + #define FILE_AND_LINE __FILE__ "@" QUOTE(__LINE__) + + #define VERBOSE(msg) { if(giDebugLevel <= DBG_VERBOSE) OutputDebugStringA( FILE_AND_LINE ": " msg); } + #define WARNING(msg) { if(giDebugLevel <= DBG_WARNING) OutputDebugStringA( FILE_AND_LINE ": Warning: " msg); } + #define ERR(msg) { if(giDebugLevel <= DBG_ERROR) OutputDebugStringA(FILE_AND_LINE ": Error:" msg); } + #define ASSERT(cond) { if (!(cond)) RIP("\n"); } + #define RIP(msg) { OutputDebugStringA(FILE_AND_LINE ": Error (not recoverable): " msg); DebugBreak(); } + +#else // !DBG + + #define VERBOSE(msg) + #define WARNING(msg) + #define ERR(msg) + #define ASSERT(cond) + #define RIP(msg) + +#endif + + + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/devmode.cpp b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/devmode.cpp new file mode 100644 index 00000000..15234361 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/devmode.cpp @@ -0,0 +1,187 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Devmode.cpp +// +// +// PURPOSE: Implementation of Devmode functions shared with OEM UI and OEM rendering modules. +// + + +#include "precomp.h" +#include "oemui.h" +#include "debug.h" +#include "devmode.h" + + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +// +//Performs operation on UI Plugins Private DevMode Members. +//Called via IOemUI::DevMode +// + +HRESULT hrOEMDevMode(DWORD dwMode, POEMDMPARAM pOemDMParam) +{ + POEMDEV pOEMDevIn; + POEMDEV pOEMDevOut; + + + // Verify parameters. + if( (NULL == pOemDMParam) + || + ( (OEMDM_SIZE != dwMode) + && + (OEMDM_DEFAULT != dwMode) + && + (OEMDM_CONVERT != dwMode) + && + (OEMDM_MERGE != dwMode) + ) + ) + { + ERR(DLLTEXT("DevMode() ERROR_INVALID_PARAMETER.\r\n")); + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Cast generic (i.e. PVOID) to OEM private devomode pointer type. + pOEMDevIn = (POEMDEV) pOemDMParam->pOEMDMIn; + pOEMDevOut = (POEMDEV) pOemDMParam->pOEMDMOut; + + switch(dwMode) + { + // + //The Method should return the size of the memory allocation needed to store the UI plugin Private DEVMODE. + // + case OEMDM_SIZE: + pOemDMParam->cbBufSize = sizeof(OEMDEV); + break; + + // + //Should fill the Private DEVMODE with the default values. + // + case OEMDM_DEFAULT: + // + //OEM_DMEXTRAHEADER Members + // + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + + // + //Private members + // + pOEMDevOut->dwDriverData = 0; + pOEMDevOut->dwAdvancedData = 0; + + VERBOSE(DLLTEXT("pOEMDevOut after setting default values:\r\n")); + break; + + // + //The method should convert private DEVMODE members to the current version, if necessary. + // + case OEMDM_CONVERT: + ConvertOEMDevmode(pOEMDevIn, pOEMDevOut); + break; + + // + //The method should validate the information contained in private DEVMODE members and merge validated values into a private DEVMODE structure containing default values + // + case OEMDM_MERGE: + ConvertOEMDevmode(pOEMDevIn, pOEMDevOut); + MakeOEMDevmodeValid(pOEMDevOut); + break; + } + + return S_OK; +} + + +BOOL ConvertOEMDevmode(PCOEMDEV pOEMDevIn, POEMDEV pOEMDevOut) +{ + if( (NULL == pOEMDevIn) + || + (NULL == pOEMDevOut) + ) + { + ERR(DLLTEXT("ConvertOEMDevmode() invalid parameters.\r\n")); + return FALSE; + } + + // Check OEM Signature, if it doesn't match ours, + // then just assume DMIn is bad and use defaults. + if(pOEMDevIn->dmOEMExtra.dwSignature == pOEMDevOut->dmOEMExtra.dwSignature) + { + VERBOSE(DLLTEXT("Converting private OEM Devmode.\r\n")); + VERBOSE(DLLTEXT("pOEMDevIn:\r\n")); + + // Set the devmode defaults so that anything the isn't copied over will + // be set to the default value. + pOEMDevOut->dwDriverData = 0; + pOEMDevOut->dwAdvancedData = 0; + + // Copy the old structure in to the new using which ever size is the smaller. + // Devmode maybe from newer Devmode (not likely since there is only one), or + // Devmode maybe a newer Devmode, in which case it maybe larger, + // but the first part of the structure should be the same. + + // DESIGN ASSUMPTION: the private DEVMODE structure only gets added to; + // the fields that are in the DEVMODE never change only new fields get added to the end. + + memcpy(pOEMDevOut, pOEMDevIn, __min(pOEMDevOut->dmOEMExtra.dwSize, pOEMDevIn->dmOEMExtra.dwSize)); + + // Re-fill in the size and version fields to indicated + // that the DEVMODE is the current private DEVMODE version. + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + } + else + { + WARNING(DLLTEXT("Unknown DEVMODE signature, pOEMDMIn ignored.\r\n")); + + // Don't know what the input DEVMODE is, so just use defaults. + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + pOEMDevOut->dwDriverData = 0; + pOEMDevOut->dwAdvancedData = 0; + } + + return TRUE; +} + + +BOOL MakeOEMDevmodeValid(POEMDEV pOEMDevmode) +{ + if(NULL == pOEMDevmode) + { + return FALSE; + } + + // ASSUMPTION: pOEMDevmode is large enough to contain OEMDEV structure. + + // Make sure that dmOEMExtra indicates the current OEMDEV structure. + pOEMDevmode->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevmode->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevmode->dmOEMExtra.dwVersion = OEM_VERSION; + + // Set driver data, if not valid. + if(pOEMDevmode->dwDriverData > 100) + { + pOEMDevmode->dwDriverData = 0; + } + + // Set Advanced driver data, if not valid. + if(pOEMDevmode->dwAdvancedData > 100) + { + pOEMDevmode->dwAdvancedData = 0; + } + + return TRUE; +} diff --git a/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/devmode.h b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/devmode.h new file mode 100644 index 00000000..b55fb016 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/devmode.h @@ -0,0 +1,55 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Devmode.h +// +// +// PURPOSE: Define common data types, and external function prototypes +// for devmode functions. +// +#pragma once + +//////////////////////////////////////////////////////// +// OEM Devmode Defines +//////////////////////////////////////////////////////// + + + + +//////////////////////////////////////////////////////// +// OEM Devmode Type Definitions +//////////////////////////////////////////////////////// + +// +//Can add info to the private devmode bellow here. +//Note : +// This structure must be prefixed by OEM_DMEXTRAHEADER +// Your plug-in must implement the IPrintOemUI::DevMode method +// +typedef struct tagOEMDEV +{ + OEM_DMEXTRAHEADER dmOEMExtra; + DWORD dwDriverData; + DWORD dwAdvancedData; + + // + //Private DevMode Members + // + +} OEMDEV, *POEMDEV; + +typedef const OEMDEV *PCOEMDEV; + + + +///////////////////////////////////////////////////////// +// ProtoTypes +///////////////////////////////////////////////////////// + +HRESULT hrOEMDevMode(DWORD dwMode, POEMDMPARAM pOemDMParam); +BOOL ConvertOEMDevmode(PCOEMDEV pOEMDevIn, POEMDEV pOEMDevOut); +BOOL MakeOEMDevmodeValid(POEMDEV pOEMDevmode); diff --git a/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/dllentry.cpp b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/dllentry.cpp new file mode 100644 index 00000000..a7c846b7 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/dllentry.cpp @@ -0,0 +1,66 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: dllentry.cpp +// +// +// PURPOSE: Source module for DLL entry function(s). +// + +#include "precomp.h" +#include "oemui.h" +#include "fusutils.h" +#include "debug.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +/////////////////////////////////////////////////////////// +// +// DLL entry point +// +BOOL WINAPI DllMain(HINSTANCE hInst, WORD wReason, LPVOID lpReserved) +{ + UNREFERENCED_PARAMETER(lpReserved); + + switch(wReason) + { + case DLL_PROCESS_ATTACH: + VERBOSE(DLLTEXT("Process attach.\r\n")); + + // Store the module handle in case we need it later. + ghInstance = hInst; + + // NOTE: We don't create an Activation Context on module load, + // but on need of an Avtivation Context; the first time + // GetMyActivationContext() or CreateMyActivationContext() is called. + break; + + case DLL_THREAD_ATTACH: + VERBOSE(DLLTEXT("Thread attach.\r\n")); + break; + + case DLL_PROCESS_DETACH: + VERBOSE(DLLTEXT("Process detach.\r\n")); + + // Release the Activation Context if we created one somewhere + // by calling GetMyActivationContext() or CreateMyActivationContext(); + if(INVALID_HANDLE_VALUE != ghActCtx) + { + ReleaseActCtx(ghActCtx); + ghActCtx = INVALID_HANDLE_VALUE; + } + break; + + case DLL_THREAD_DETACH: + VERBOSE(DLLTEXT("Thread detach.\r\n")); + break; + } + + return TRUE; +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/fusutils.cpp b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/fusutils.cpp new file mode 100644 index 00000000..0f9bf2c3 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/fusutils.cpp @@ -0,0 +1,118 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: fsutils.h +// +// +// PURPOSE: Fusion utilities +// + +#include "precomp.h" +#include "globals.h" +#include "fusutils.h" + +#define MAX_LOOP 10 + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +HANDLE GetMyActivationContext() +{ + // Make sure we've created our activation context. + CreateMyActivationContext(); + + // Return the global. + return ghActCtx; +} + + +BOOL CreateMyActivationContext() +{ + if(INVALID_HANDLE_VALUE != ghActCtx) + { + return TRUE; + } + + ghActCtx = CreateActivationContextFromResource(ghInstance, MAKEINTRESOURCE(MANIFEST_RESOURCE)); + + return (INVALID_HANDLE_VALUE != ghActCtx); +} + + + +HANDLE CreateActivationContextFromResource(HMODULE hModule, LPCTSTR pszResourceName) +{ + DWORD dwSize = MAX_PATH; + DWORD dwUsed = 0; + DWORD dwLoop; + PTSTR pszModuleName = NULL; + ACTCTX act; + HANDLE hActCtx = INVALID_HANDLE_VALUE; + + + // Get the name for the module that contains the manifest resource + // to create the Activation Context from. + dwLoop = 0; + do + { + // May need to allocate or re-alloc buffer for module name. + if(NULL != pszModuleName) + { + // Need to re-alloc bigger buffer. + + // First, delete old buffer. + delete[] pszModuleName; + + // Second, increase buffer alloc size. + dwSize <<= 1; + } + pszModuleName = new TCHAR[dwSize]; + if(NULL == pszModuleName) + { + goto Exit; + } + + // Try to get the module name. + dwUsed = GetModuleFileName(hModule, pszModuleName, dwSize); + + // Check to see if it failed. + if(0 == dwUsed) + { + goto Exit; + } + + // If dwUsed is equla to dwSize or larger, + // the buffer passed in wasn't big enough. + } while ( (dwUsed >= dwSize) && (++dwLoop < MAX_LOOP) ); + + // Now let's try to create an activation context + // from manifest resource. + ::ZeroMemory(&act, sizeof(act)); + act.cbSize = sizeof(act); + act.dwFlags = ACTCTX_FLAG_RESOURCE_NAME_VALID; + act.lpResourceName = pszResourceName; + act.lpSource = pszModuleName; + + hActCtx = CreateActCtx(&act); + + +Exit: + + // + // Clean up. + // + + if(NULL != pszModuleName) + { + delete[] pszModuleName; + } + + return hActCtx; +} + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/fusutils.h b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/fusutils.h new file mode 100644 index 00000000..2f79c522 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/fusutils.h @@ -0,0 +1,18 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: fsutils.h +// +// +// PURPOSE: Fusion utilities +// +#pragma once + +HANDLE GetMyActivationContext(); +BOOL CreateMyActivationContext(); +HANDLE CreateActivationContextFromResource(HMODULE hModule, LPCTSTR pszResourceName); + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/globals.cpp b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/globals.cpp new file mode 100644 index 00000000..d2af1b8b --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/globals.cpp @@ -0,0 +1,29 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Globals.cpp +// +// +// PURPOSE: File that contains all the globals. +// + +#include "precomp.h" +#include "globals.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +/////////////////////////////////////// +// Globals +/////////////////////////////////////// + + +// Module's Instance handle from DLLEntry of process. +HINSTANCE ghInstance = NULL; + +// Module's Activation Context from DLLEntry of process. +HANDLE ghActCtx = INVALID_HANDLE_VALUE; diff --git a/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/globals.h b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/globals.h new file mode 100644 index 00000000..a5a58cb8 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/globals.h @@ -0,0 +1,21 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Globals.h +// +// +// PURPOSE: Lists of globals declared in Globals.cpp. +// +#pragma once + +/////////////////////////////////////// +// Globals +/////////////////////////////////////// + +extern HINSTANCE ghInstance; // Module's Instance handle from DLLEntry of process. +extern HANDLE ghActCtx; // Module's Activation Context from DLLEntry of process. + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/intrface.cpp b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/intrface.cpp new file mode 100644 index 00000000..3b966a58 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/intrface.cpp @@ -0,0 +1,575 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Intrface.cpp +// +// +// PURPOSE: Implementation of interface for PScript4, PScript5, Unidrv4, +// Unidrv5 UI plug-ins. +// + +#include "precomp.h" + +#include "oemui.h" +#include "debug.h" +#include "intrface.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +//////////////////////////////////////////////////////// +// Internal Globals +//////////////////////////////////////////////////////// + +static long g_cComponents = 0 ; // Count of active components +static long g_cServerLocks = 0 ; // Count of locks + + + +//////////////////////////////////////////////////////////////////////////////// +// +// IOemUI body +// +IOemUI::~IOemUI() +{ + // Make sure that helper interface is released. + if(NULL != m_pOEMHelp) + { + m_pOEMHelp->Release(); + m_pOEMHelp = NULL; + } + + // If this instance of the object is being deleted, then the reference + // count should be zero. + assert(0 == m_cRef); +} + +HRESULT __stdcall IOemUI::QueryInterface(const IID& iid, void** ppv) +{ + VERBOSE(DLLTEXT("IOemUI:QueryInterface entry.\r\n\r\n")); + if (iid == IID_IUnknown) + { + *ppv = static_cast<IUnknown*>(this); + VERBOSE(DLLTEXT("IOemUI:Return pointer to IUnknown.\r\n\r\n")); + } + else if (iid == IID_IPrintOemUI) + { + *ppv = static_cast<IPrintOemUI*>(this) ; + VERBOSE(DLLTEXT("IOemUI:Return pointer to IPrintOemUI.\r\n")); + } + else + { + VERBOSE(DLLTEXT("IOemUI::QueryInterface interface not supported.\r\n")); + *ppv = NULL ; + return E_NOINTERFACE ; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef() ; + return S_OK ; +} + +ULONG __stdcall IOemUI::AddRef() +{ + VERBOSE(DLLTEXT("IOemUI:AddRef entry.\r\n")); + return InterlockedIncrement(&m_cRef) ; +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall IOemUI::Release() +{ + VERBOSE(DLLTEXT("IOemUI:Release entry.\r\n")); + ASSERT( 0 != m_cRef); + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + + } + return cRef; +} + +HRESULT __stdcall IOemUI::PublishDriverInterface( + IUnknown *pIUnknown) +{ + VERBOSE(DLLTEXT("IOemUI:PublishDriverInterface entry.\r\n")); + + // Need to store pointer to Driver Helper functions, if we already haven't. + if (m_pOEMHelp == NULL) + { + HRESULT hResult; + + + // Get Interface to Helper Functions. + hResult = pIUnknown->QueryInterface(IID_IPrintOemDriverUI, (void** ) &(m_pOEMHelp)); + + if(!SUCCEEDED(hResult)) + { + // Make sure that interface pointer reflects interface query failure. + m_pOEMHelp = NULL; + + return E_FAIL; + } + } + + return S_OK; +} + +HRESULT __stdcall IOemUI::GetInfo( + DWORD dwMode, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded) +{ + VERBOSE(DLLTEXT("IOemUI::GetInfo entry.\r\r\n")); + + // Validate parameters. + if( (NULL == pcbNeeded) + || + ( (OEMGI_GETSIGNATURE != dwMode) + && + (OEMGI_GETVERSION != dwMode) + && + (OEMGI_GETPUBLISHERINFO != dwMode) + ) + ) + { + WARNING(DLLTEXT("IOemUI::GetInfo() exit pcbNeeded is NULL! ERROR_INVALID_PARAMETER\r\r\n")); + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Set expected buffer size and number of bytes written. + *pcbNeeded = sizeof(DWORD); + + // Check buffer size is sufficient. + if((cbSize < *pcbNeeded) || (NULL == pBuffer)) + { + WARNING(DLLTEXT("IOemUI::GetInfo() exit insufficient buffer!\r\r\n")); + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return E_FAIL; + } + + switch(dwMode) + { + // OEM DLL Signature + case OEMGI_GETSIGNATURE: + *(PDWORD)pBuffer = OEM_SIGNATURE; + break; + + // OEM DLL version + case OEMGI_GETVERSION: + *(PDWORD)pBuffer = OEM_VERSION; + break; + + // dwMode not supported. + default: + // Set written bytes to zero since nothing was written. + WARNING(DLLTEXT("IOemUI::GetInfo() exit mode not supported.\r\r\n")); + *pcbNeeded = 0; + SetLastError(ERROR_NOT_SUPPORTED); + return E_FAIL; + } + + VERBOSE(DLLTEXT("IOemUI::GetInfo() exit S_OK.\r\r\n")); + return S_OK; +} + +HRESULT __stdcall IOemUI::DevMode( + DWORD dwMode, + POEMDMPARAM pOemDMParam) +{ + VERBOSE(DLLTEXT("IOemUI:DevMode entry.\r\n")); + + return hrOEMDevMode(dwMode, pOemDMParam); +} + +HRESULT __stdcall IOemUI::CommonUIProp( + DWORD dwMode, + POEMCUIPPARAM pOemCUIPParam) +{ + VERBOSE(DLLTEXT("IOemUI:CommonUIProp entry.\r\n")); + + return hrOEMPropertyPage(dwMode, pOemCUIPParam); +} + + +HRESULT __stdcall IOemUI::DocumentPropertySheets( + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam) +{ + VERBOSE(DLLTEXT("IOemUI:DocumentPropertySheets entry.\r\n")); + + return hrOEMDocumentPropertySheets(pPSUIInfo, lParam, m_pOEMHelp); +} + +HRESULT __stdcall IOemUI::DevicePropertySheets( + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam) +{ + VERBOSE(DLLTEXT("IOemUI:DevicePropertySheets entry.\r\n")); + + return hrOEMDevicePropertySheets(pPSUIInfo, lParam); +} + +HRESULT __stdcall IOemUI::DeviceCapabilities( + POEMUIOBJ poemuiobj, + HANDLE hPrinter, + _In_ PWSTR pDeviceName, + WORD wCapability, + PVOID pOutput, + PDEVMODE pPublicDM, + PVOID pOEMDM, + DWORD dwOld, + DWORD *dwResult) +{ + VERBOSE(DLLTEXT("IOemUI:DeviceCapabilities entry.\r\n")); + + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(pDeviceName); + UNREFERENCED_PARAMETER(wCapability); + UNREFERENCED_PARAMETER(pOutput); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + UNREFERENCED_PARAMETER(dwOld); + UNREFERENCED_PARAMETER(dwResult); + + return E_NOTIMPL; +} + +HRESULT __stdcall IOemUI::DevQueryPrintEx( + POEMUIOBJ poemuiobj, + PDEVQUERYPRINT_INFO pDQPInfo, + PDEVMODE pPublicDM, + PVOID pOEMDM) +{ + VERBOSE(DLLTEXT("IOemUI:DevQueryPrintEx entry.\r\n")); + + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(pDQPInfo); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + + return E_NOTIMPL; +} + +HRESULT __stdcall IOemUI::UpgradePrinter( + DWORD dwLevel, + PBYTE pDriverUpgradeInfo) +{ + VERBOSE(DLLTEXT("IOemUI:UpgradePrinter entry.\r\n")); + + UNREFERENCED_PARAMETER(dwLevel); + UNREFERENCED_PARAMETER(pDriverUpgradeInfo); + + return E_NOTIMPL; +} + +HRESULT __stdcall IOemUI::PrinterEvent( + _In_ PWSTR pPrinterName, + INT iDriverEvent, + DWORD dwFlags, + LPARAM lParam) +{ + VERBOSE(DLLTEXT("IOemUI:PrinterEvent entry.\r\n")); + + UNREFERENCED_PARAMETER(pPrinterName); + UNREFERENCED_PARAMETER(iDriverEvent); + UNREFERENCED_PARAMETER(dwFlags); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +} + +HRESULT __stdcall IOemUI::DriverEvent( + DWORD dwDriverEvent, + DWORD dwLevel, + LPBYTE pDriverInfo, + LPARAM lParam) +{ + VERBOSE(DLLTEXT("IOemUI:DriverEvent entry.\r\n")); + + UNREFERENCED_PARAMETER(dwDriverEvent); + UNREFERENCED_PARAMETER(dwLevel); + UNREFERENCED_PARAMETER(pDriverInfo); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +}; + + +#define PROFILE_NAME L"OEMPROFILE.icm\0" + +HRESULT __stdcall IOemUI::QueryColorProfile( + HANDLE hPrinter, + POEMUIOBJ poemuiobj, + PDEVMODE pPublicDM, + PVOID pOEMDM, + ULONG ulQueryMode, + VOID *pvProfileData, + ULONG *pcbProfileData, + FLONG *pflProfileData) +{ + HRESULT Result = E_FAIL; + + + VERBOSE(DLLTEXT("IOemUI:QueryColorProfile entry.\r\n")); + + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + + if(QCP_DEVICEPROFILE == ulQueryMode) + { + if(NULL == pvProfileData) + { + *pcbProfileData = sizeof(PROFILE_NAME); + SetLastError(ERROR_INSUFFICIENT_BUFFER); + } + else + { + if(*pcbProfileData < sizeof(PROFILE_NAME)) + { + *pcbProfileData = sizeof(PROFILE_NAME); + SetLastError(ERROR_INSUFFICIENT_BUFFER); + } + else + { + Result = StringCbCopy((LPWSTR)pvProfileData, *pcbProfileData, PROFILE_NAME); + *pcbProfileData = sizeof(PROFILE_NAME); + *pflProfileData = QCP_PROFILEDISK; + + if(FAILED(Result)) + { + SetLastError(Result); + } + } + } + } + + return Result; +}; + +HRESULT __stdcall IOemUI::FontInstallerDlgProc( + HWND hWnd, + UINT usMsg, + WPARAM wParam, + LPARAM lParam) +{ + VERBOSE(DLLTEXT("IOemUI:FontInstallerDlgProc entry.\r\n")); + + UNREFERENCED_PARAMETER(hWnd); + UNREFERENCED_PARAMETER(usMsg); + UNREFERENCED_PARAMETER(wParam); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +}; + +HRESULT __stdcall IOemUI::UpdateExternalFonts( + HANDLE hPrinter, + HANDLE hHeap, + _In_ PWSTR pwstrCartridges) +{ + VERBOSE(DLLTEXT("IOemUI:UpdateExternalFonts entry.\r\n")); + + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(hHeap); + UNREFERENCED_PARAMETER(pwstrCartridges); + + return E_NOTIMPL; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// oem class factory +// +class IOemCF : public IClassFactory +{ +public: + // *** IUnknown methods *** + + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release) (THIS); + + // *** IClassFactory methods *** + STDMETHOD(CreateInstance) (THIS_ + LPUNKNOWN pUnkOuter, + REFIID riid, + LPVOID FAR* ppvObject); + STDMETHOD(LockServer) (THIS_ BOOL bLock); + + + // Constructor + IOemCF(): m_cRef(1) { }; + ~IOemCF() { }; + +protected: + LONG m_cRef; + +}; + +/////////////////////////////////////////////////////////// +// +// Class factory body +// +HRESULT __stdcall IOemCF::QueryInterface(const IID& iid, void** ppv) +{ + if ((iid == IID_IUnknown) || (iid == IID_IClassFactory)) + { + *ppv = static_cast<IOemCF*>(this) ; + } + else + { + WARNING(DLLTEXT("IOemCF::QueryInterface interface not supported.\r\n")); + *ppv = NULL ; + return E_NOINTERFACE ; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef() ; + return S_OK ; +} + +ULONG __stdcall IOemCF::AddRef() +{ + return InterlockedIncrement(&m_cRef) ; +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall IOemCF::Release() +{ + ASSERT( 0 != m_cRef); + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + + } + return cRef; +} + +// IClassFactory implementation +HRESULT __stdcall IOemCF::CreateInstance(IUnknown* pUnknownOuter, + const IID& iid, + void** ppv) +{ + //DbgPrint(DLLTEXT("Class factory:\t\tCreate component.")) ; + + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Cannot aggregate. + if (pUnknownOuter != NULL) + { + return CLASS_E_NOAGGREGATION ; + } + + // Create component. + IOemUI* pOemCB = new IOemUI ; + if (pOemCB == NULL) + { + return E_OUTOFMEMORY ; + } + // Get the requested interface. + HRESULT hr = pOemCB->QueryInterface(iid, ppv) ; + + // Release the IUnknown pointer. + // (If QueryInterface failed, component will delete itself.) + pOemCB->Release() ; + return hr ; +} + +// LockServer +HRESULT __stdcall IOemCF::LockServer(BOOL bLock) +{ + if (bLock) + { + InterlockedIncrement(&g_cServerLocks) ; + } + else + { + InterlockedDecrement(&g_cServerLocks) ; + } + return S_OK ; +} + +/////////////////////////////////////////////////////////// +// +// Exported functions +// + + +// Can DLL unload now? +// +STDAPI DllCanUnloadNow() +{ + // + // To avoid leaving OEM DLL still in memory when Unidrv or Pscript drivers + // are unloaded, Unidrv and Pscript driver ignore the return value of + // DllCanUnloadNow of the OEM DLL, and always call FreeLibrary on the OEMDLL. + // + // If OEM DLL spins off a working thread that also uses the OEM DLL, the + // thread needs to call LoadLibrary and FreeLibraryAndExitThread, otherwise + // it may crash after Unidrv or Pscript calls FreeLibrary. + // + + if ((g_cComponents == 0) && (g_cServerLocks == 0)) + { + return S_OK ; + } + else + { + return S_FALSE; + } +} + +// +// Get class factory +// +STDAPI DllGetClassObject( + _In_ REFCLSID clsid, + _In_ REFIID iid, + _Outptr_ LPVOID* ppv) +{ + VERBOSE(DLLTEXT("DllGetClassObject:Create class factory.\r\n")); + + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Can we create this component? + if (clsid != CLSID_OEMUI) + { + return CLASS_E_CLASSNOTAVAILABLE ; + } + + // Create class factory. + IOemCF* pFontCF = new IOemCF ; // Reference count set to 1 + // in constructor + if (pFontCF == NULL) + { + return E_OUTOFMEMORY ; + } + + // Get requested interface. + HRESULT hr = pFontCF->QueryInterface(iid, ppv) ; + pFontCF->Release() ; + + return hr ; +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/intrface.h b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/intrface.h new file mode 100644 index 00000000..d9bdf3a2 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/intrface.h @@ -0,0 +1,179 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Intrface.h +// +// +// PURPOSE: Header of interface for PScript5 and Unidrv5 UI plug-in. +// +#pragma once + +//////////////////////////////////////////////////////////////////////////////// +// +// IOemUI +// +class IOemUI: public IPrintOemUI +{ +public: + // *** IUnknown methods *** + + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release) (THIS); + + // + // Method for publishing Driver interface. + // + STDMETHOD(PublishDriverInterface)(THIS_ IUnknown *pIUnknown); + + // + // Get OEM dll related information + // + + STDMETHOD(GetInfo) (THIS_ DWORD dwMode, PVOID pBuffer, DWORD cbSize, + PDWORD pcbNeeded); + + // + // OEMDevMode + // + + STDMETHOD(DevMode) (THIS_ DWORD dwMode, POEMDMPARAM pOemDMParam) ; + + // + // OEMCommonUIProp + // + + STDMETHOD(CommonUIProp) (THIS_ + DWORD dwMode, + POEMCUIPPARAM pOemCUIPParam + ); + + // + // OEMDocumentPropertySheets + // + + STDMETHOD(DocumentPropertySheets) (THIS_ + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam + ); + + // + // OEMDevicePropertySheets + // + + STDMETHOD(DevicePropertySheets) (THIS_ + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam + ); + + + // + // OEMDevQueryPrintEx + // + + STDMETHOD(DevQueryPrintEx) (THIS_ + POEMUIOBJ poemuiobj, + PDEVQUERYPRINT_INFO pDQPInfo, + PDEVMODE pPublicDM, + PVOID pOEMDM + ); + + // + // OEMDeviceCapabilities + // + + STDMETHOD(DeviceCapabilities) (THIS_ + POEMUIOBJ poemuiobj, + HANDLE hPrinter, + _In_ PWSTR pDeviceName, + WORD wCapability, + PVOID pOutput, + PDEVMODE pPublicDM, + PVOID pOEMDM, + DWORD dwOld, + DWORD *dwResult + ); + + // + // OEMUpgradePrinter + // + + STDMETHOD(UpgradePrinter) (THIS_ + DWORD dwLevel, + PBYTE pDriverUpgradeInfo + ); + + // + // OEMPrinterEvent + // + + STDMETHOD(PrinterEvent) (THIS_ + _In_ PWSTR pPrinterName, + INT iDriverEvent, + DWORD dwFlags, + LPARAM lParam + ); + + // + // OEMDriverEvent + // + + STDMETHOD(DriverEvent)(THIS_ + DWORD dwDriverEvent, + DWORD dwLevel, + LPBYTE pDriverInfo, + LPARAM lParam + ); + + // + // OEMQueryColorProfile + // + + STDMETHOD(QueryColorProfile) (THIS_ + HANDLE hPrinter, + POEMUIOBJ poemuiobj, + PDEVMODE pPublicDM, + PVOID pOEMDM, + ULONG ulReserved, + VOID *pvProfileData, + ULONG *pcbProfileData, + FLONG *pflProfileData); + + // + // OEMFontInstallerDlgProc + // + + STDMETHOD(FontInstallerDlgProc) (THIS_ + HWND hWnd, + UINT usMsg, + WPARAM wParam, + LPARAM lParam + ); + // + // UpdateExternalFonts + // + + STDMETHOD(UpdateExternalFonts) (THIS_ + HANDLE hPrinter, + HANDLE hHeap, + _In_ PWSTR pwstrCartridges + ); + + + IOemUI() { m_cRef = 1; m_pOEMHelp = NULL; }; + ~IOemUI(); + +protected: + LONG m_cRef; + IPrintOemDriverUI* m_pOEMHelp; +}; + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/oem.h b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/oem.h new file mode 100644 index 00000000..bf3d75f9 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/oem.h @@ -0,0 +1,22 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: oem.h +// +// +// PURPOSE: Define common data types, and external function prototypes +// for debug.cpp. +// +#pragma once + +//////////////////////////////////////////////////////// +// OEM Defines +//////////////////////////////////////////////////////// + +#define OEM_SIGNATURE 'MSFT' +#define OEM_VERSION 0x00000001L + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/oemui.cpp b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/oemui.cpp new file mode 100644 index 00000000..61f3d378 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/oemui.cpp @@ -0,0 +1,756 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: OEMUI.cpp +// +// +// PURPOSE: Main file for OEM UI test module. +// +// + +#include "precomp.h" +#include "resource.h" +#include "debug.h" +#include "fusutils.h" +#include "oemui.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +//////////////////////////////////////////////////////// +// INTERNAL MACROS and DEFINES +//////////////////////////////////////////////////////// + +typedef struct _tagCBUserData +{ + HANDLE hComPropSheet; + HANDLE hPropPage; + POEMUIPSPARAM pOEMUIParam; + PFNCOMPROPSHEET pfnComPropSheet; + +} CBUSERDATA, *PCBUSERDATA; + + + +//////////////////////////////////////////////////////// +// INTERNAL PROTOTYPES +//////////////////////////////////////////////////////// + +static HRESULT hrDocumentPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam); +static HRESULT hrPrinterPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam); +LONG APIENTRY OEMPrinterUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam); +LONG APIENTRY OEMDocUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam); +LONG APIENTRY OEMDocUICallBack2(PCPSUICBPARAM pCallbackParam); +INT_PTR CALLBACK DevicePropPageProc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam); +static POPTITEM CreateOptItems(HANDLE hHeap, DWORD dwOptItems); +static void InitOptItems(POPTITEM pOptItems, DWORD dwOptItems); +static POPTTYPE CreateOptType(HANDLE hHeap, WORD wOptParams); +static PTSTR GetStringResource(HANDLE hHeap, HANDLE hModule, UINT uResource); + + + +//////////////////////////////////////////////////////////////////////////////// +// +// Initializes OptItems to display OEM device or document property UI. +// +HRESULT hrOEMPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam) +{ + HRESULT hResult = S_OK; + + + VERBOSE(DLLTEXT("hrOEMPropertyPage entry.\r\n")); + + // Validate parameters. + if( (OEMCUIP_DOCPROP != dwMode) + && + (OEMCUIP_PRNPROP != dwMode) + ) + { + ERR(DLLTEXT("hrOEMPropertyPage() ERROR_INVALID_PARAMETER.\r\n")); + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + switch(dwMode) + { + case OEMCUIP_DOCPROP: + hResult = hrDocumentPropertyPage(dwMode, pOEMUIParam); + break; + + case OEMCUIP_PRNPROP: + hResult = hrPrinterPropertyPage(dwMode, pOEMUIParam); + break; + + default: + // Should never reach this! + ERR(DLLTEXT("hrOEMPropertyPage() Invalid dwMode")); + SetLastError(ERROR_INVALID_PARAMETER); + hResult = E_FAIL; + break; + } + + return hResult; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// Initializes OptItems to display OEM document property UI. +// +static HRESULT hrDocumentPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam) +{ + UNREFERENCED_PARAMETER(dwMode); + + if(NULL == pOEMUIParam->pOEMOptItems) + { + // Fill in the number of OptItems to create for OEM document property UI. + pOEMUIParam->cOEMOptItems = 1; + + VERBOSE(DLLTEXT("hrDocumentPropertyPage() requesting items.\r\n")); + } + else + { + POEMDEV pOEMDev = (POEMDEV) pOEMUIParam->pOEMDM; + + + VERBOSE(DLLTEXT("hrDocumentPropertyPage() fill out items.\r\n")); + + // Init UI Callback reference. + pOEMUIParam->OEMCUIPCallback = OEMDocUICallBack; + + // Init OEMOptItmes. + InitOptItems(pOEMUIParam->pOEMOptItems, pOEMUIParam->cOEMOptItems); + + // Fill out tree view items. + + // New section. + pOEMUIParam->pOEMOptItems[0].Level = 1; + pOEMUIParam->pOEMOptItems[0].Flags = OPTIF_COLLAPSE; + pOEMUIParam->pOEMOptItems[0].pName = GetStringResource(pOEMUIParam->hOEMHeap, pOEMUIParam->hModule, IDS_ADV_SECTION); + pOEMUIParam->pOEMOptItems[0].Sel = pOEMDev->dwAdvancedData; + + pOEMUIParam->pOEMOptItems[0].pOptType = CreateOptType(pOEMUIParam->hOEMHeap, 2); + + pOEMUIParam->pOEMOptItems[0].pOptType->Type = TVOT_UDARROW; + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].IconID = 0; + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].lParam = 100; + } + + return S_OK; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// Initializes OptItems to display OEM printer property UI. +// +static HRESULT hrPrinterPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam) +{ + UNREFERENCED_PARAMETER(dwMode); + + if(NULL == pOEMUIParam->pOEMOptItems) + { + // Fill in the number of OptItems to create for OEM printer property UI. + pOEMUIParam->cOEMOptItems = 1; + + VERBOSE(DLLTEXT("hrPrinterPropertyPage() requesting items.\r\n")); + } + else + { + DWORD dwError; + DWORD dwDeviceValue; + DWORD dwType; + DWORD dwNeeded; + + + VERBOSE(DLLTEXT("hrPrinterPropertyPage() fill out items.\r\n")); + + // Get device settings value from printer. + dwError = GetPrinterData(pOEMUIParam->hPrinter, OEMUI_VALUE, &dwType, (PBYTE) &dwDeviceValue, + sizeof(dwDeviceValue), &dwNeeded); + if( (ERROR_SUCCESS != dwError) + || + (dwDeviceValue > 100) + ) + { + // Failed to get the device value or value is invalid, just use the default. + dwDeviceValue = 0; + } + + // Init UI Callback reference. + pOEMUIParam->OEMCUIPCallback = OEMPrinterUICallBack; + + // Init OEMOptItmes. + InitOptItems(pOEMUIParam->pOEMOptItems, pOEMUIParam->cOEMOptItems); + + // Fill out tree view items. + + // New section. + pOEMUIParam->pOEMOptItems[0].Level = 1; + pOEMUIParam->pOEMOptItems[0].Flags = OPTIF_COLLAPSE; + pOEMUIParam->pOEMOptItems[0].pName = GetStringResource(pOEMUIParam->hOEMHeap, pOEMUIParam->hModule, IDS_DEV_SECTION); + pOEMUIParam->pOEMOptItems[0].Sel = dwDeviceValue; + + pOEMUIParam->pOEMOptItems[0].pOptType = CreateOptType(pOEMUIParam->hOEMHeap, 2); + + pOEMUIParam->pOEMOptItems[0].pOptType->Type = TVOT_UDARROW; + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].IconID = 0; + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].lParam = 100; + } + + return S_OK; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Adds property page to Document property sheet. +// +HRESULT hrOEMDocumentPropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam, + IPrintOemDriverUI* pOEMHelp) +{ + LONG_PTR lResult = 0; + HRESULT hrResult = S_OK; + + VERBOSE(DLLTEXT("hrOEMDocumentPropertySheets() entry.\r\n")); + + UNREFERENCED_PARAMETER(pOEMHelp); + + // Validate parameters. + if( (NULL == pPSUIInfo) + || + (PROPSHEETUI_INFO_VERSION != pPSUIInfo->Version) + ) + { + ERR(DLLTEXT("hrOEMDocumentPropertySheets() ERROR_INVALID_PARAMETER.\r\n")); + + // Return invalid parameter error. + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Do action. + switch(pPSUIInfo->Reason) + { + case PROPSHEETUI_REASON_INIT: + { + DWORD dwSheets = 0; + PCBUSERDATA pUserData; + POEMUIPSPARAM pOEMUIParam = (POEMUIPSPARAM) pPSUIInfo->lParamInit; + HANDLE hHeap = pOEMUIParam->hOEMHeap; + POEMDEV pOEMDev = (POEMDEV) pOEMUIParam->pOEMDM; + COMPROPSHEETUI Sheet; + + + // Init property page. + memset(&Sheet, 0, sizeof(COMPROPSHEETUI)); + Sheet.cbSize = sizeof(COMPROPSHEETUI); + Sheet.Flags = CPSUIF_UPDATE_PERMISSION; + Sheet.hInstCaller = ghInstance; + Sheet.pCallerName = GetStringResource(hHeap, ghInstance, IDS_NAME); + Sheet.pHelpFile = NULL; + Sheet.pfnCallBack = OEMDocUICallBack2; + Sheet.pDlgPage = CPSUI_PDLGPAGE_TREEVIEWONLY; + Sheet.cOptItem = 1; + Sheet.IconID = IDI_CPSUI_PRINTER; + Sheet.pOptItemName = GetStringResource(hHeap, ghInstance, IDS_SECTION); + Sheet.CallerVersion = 0x100; + Sheet.OptItemVersion = 0x100; + + // Init user data. + pUserData = (PCBUSERDATA) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(CBUSERDATA)); + if (NULL == pUserData) + { + ERR(DLLTEXT("hrOEMDocumentPropertySheets() failed to allocate user data.\r\n")); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + pUserData->hComPropSheet = pPSUIInfo->hComPropSheet; + pUserData->pfnComPropSheet = pPSUIInfo->pfnComPropSheet; + pUserData->pOEMUIParam = pOEMUIParam; + Sheet.UserData = (ULONG_PTR) pUserData; + + // Create OptItems for page. + Sheet.pOptItem = CreateOptItems(hHeap, Sheet.cOptItem); + if (NULL == Sheet.pOptItem) + { + ERR(DLLTEXT("hrOEMDocumentPropertySheets() failed to allocate OPTITEMs.\r\n")); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + // Initialize OptItems + Sheet.pOptItem[0].Level = 1; + Sheet.pOptItem[0].Flags = OPTIF_COLLAPSE; + Sheet.pOptItem[0].pName = GetStringResource(hHeap, ghInstance, IDS_SECTION); + Sheet.pOptItem[0].Sel = pOEMDev->dwDriverData; + + Sheet.pOptItem[0].pOptType = CreateOptType(hHeap, 2); + if (NULL == Sheet.pOptItem[0].pOptType) + { + ERR(DLLTEXT("hrOEMDocumentPropertySheets() failed to allocate OPTTYPE.\r\n")); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + Sheet.pOptItem[0].pOptType->Type = TVOT_UDARROW; + Sheet.pOptItem[0].pOptType->pOptParam[1].IconID = 0; + Sheet.pOptItem[0].pOptType->pOptParam[1].lParam = 100; + + // NOTE: Don't need to do anything with Activation Contexts + // to get Themed UI, since Compstui will create this + // page using it's Activation Context which specifies + // comctl v6. + + // Add property sheets. + lResult = pPSUIInfo->pfnComPropSheet(pPSUIInfo->hComPropSheet, CPSFUNC_ADD_PCOMPROPSHEETUI, + (LPARAM)&Sheet, (LPARAM)&dwSheets); + } + break; + + case PROPSHEETUI_REASON_GET_INFO_HEADER: + { + PPROPSHEETUI_INFO_HEADER pHeader = (PPROPSHEETUI_INFO_HEADER) lParam; + + pHeader->pTitle = (LPTSTR)PROP_TITLE; + lResult = TRUE; + } + break; + + case PROPSHEETUI_REASON_GET_ICON: + // No icon + lResult = 0; + break; + + case PROPSHEETUI_REASON_SET_RESULT: + { + PSETRESULT_INFO pInfo = (PSETRESULT_INFO) lParam; + + lResult = pInfo->Result; + } + break; + + case PROPSHEETUI_REASON_DESTROY: + lResult = TRUE; + break; + } + +Exit: + + pPSUIInfo->Result = lResult; + return hrResult; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Adds property page to printer property sheet. +// +HRESULT hrOEMDevicePropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam) +{ + LONG_PTR lResult = 0; + + + VERBOSE(DLLTEXT("hrOEMDevicePropertySheets entry\r\n")); + + // Validate parameters. + if( (NULL == pPSUIInfo) + || + (PROPSHEETUI_INFO_VERSION != pPSUIInfo->Version) + ) + { + ERR(DLLTEXT("hrOEMDevicePropertySheets() ERROR_INVALID_PARAMETER.\r\n")); + + // Return invalid parameter error. + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Do action. + switch(pPSUIInfo->Reason) + { + case PROPSHEETUI_REASON_INIT: + { + PROPSHEETPAGE Page; + + // Init property page. + memset(&Page, 0, sizeof(PROPSHEETPAGE)); + Page.dwSize = sizeof(PROPSHEETPAGE); + Page.dwFlags = PSP_DEFAULT; + Page.hInstance = ghInstance; + Page.pszTemplate = MAKEINTRESOURCE(IDD_DEVICE_PROPPAGE); + Page.pfnDlgProc = DevicePropPageProc; + Page.hActCtx = GetMyActivationContext(); + + // Set the flag to indicate that our PROPSHEETPAGE + // has an Activation Context. + // The Activation Context indicates with version of + // comctl for Compstui to create our PROPSHEETPAGE + // with. To get Themed UI we need to specify comctl v6. + if( (NULL != Page.hActCtx) && (INVALID_HANDLE_VALUE != Page.hActCtx)) + { + Page.dwFlags |= PSP_USEFUSIONCONTEXT; + } + + // Add property sheets. + lResult = pPSUIInfo->pfnComPropSheet(pPSUIInfo->hComPropSheet, CPSFUNC_ADD_PROPSHEETPAGE, (LPARAM)&Page, 0); + + // NOTE: The Activation Context is released when the DLL is unloaded + // during DLL_PROCESS_DETACH. + } + break; + + case PROPSHEETUI_REASON_GET_INFO_HEADER: + { + PPROPSHEETUI_INFO_HEADER pHeader = (PPROPSHEETUI_INFO_HEADER) lParam; + + pHeader->pTitle = (LPTSTR)PROP_TITLE; + lResult = TRUE; + } + break; + + case PROPSHEETUI_REASON_GET_ICON: + // No icon + lResult = 0; + break; + + case PROPSHEETUI_REASON_SET_RESULT: + { + PSETRESULT_INFO pInfo = (PSETRESULT_INFO) lParam; + + lResult = pInfo->Result; + } + break; + + case PROPSHEETUI_REASON_DESTROY: + lResult = TRUE; + break; + } + + pPSUIInfo->Result = lResult; + return S_OK; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// OptItems call back for OEM printer property UI. +// +LONG APIENTRY OEMPrinterUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam) +{ + LONG lReturn = CPSUICB_ACTION_NONE; + + VERBOSE(DLLTEXT("OEMPrinterUICallBack() entry.\r\n")); + + switch(pCallbackParam->Reason) + { + case CPSUICB_REASON_APPLYNOW: + { + DWORD dwDriverValue = pOEMUIParam->pOEMOptItems[0].Sel; + + // Store OptItems state in printer data. + SetPrinterData(pOEMUIParam->hPrinter, OEMUI_VALUE, REG_DWORD, (PBYTE) &dwDriverValue, sizeof(DWORD)); + } + break; + + default: + break; + } + + return lReturn; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Call back for OEM device property UI. +// +#pragma warning(push) +#pragma warning(disable:6262) // this method exceeds the default threshold for stack usage by a few bytes. +INT_PTR CALLBACK DevicePropPageProc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uiMsg) + { + case WM_COMMAND: + switch(HIWORD(wParam)) + { + case BN_CLICKED: + switch(LOWORD(wParam)) + { + case IDC_CALIBRATE: + // Just display a message that the printer is calibrated, + // since we don't acutally calibrate anything. + { + TCHAR szName[MAX_PATH]; + TCHAR szCalibrated[MAX_PATH]; + + + LoadString(ghInstance, IDS_NAME, szName, sizeof(szName)/sizeof(szName[0])); + LoadString(ghInstance, IDS_CALIBRATED, szCalibrated, sizeof(szCalibrated)/sizeof(szCalibrated[0])); + MessageBox(hDlg, szCalibrated, szName, MB_OK); + } + break; + } + break; + + default: + return FALSE; + } + return TRUE; + + case WM_NOTIFY: + { + switch (((LPNMHDR)lParam)->code) // type of notification message + { + case PSN_SETACTIVE: + break; + + case PSN_KILLACTIVE: + break; + + case PSN_APPLY: + break; + + case PSN_RESET: + break; + } + } + break; + } + + return FALSE; +} +#pragma warning(pop) + + +//////////////////////////////////////////////////////////////////////////////// +// +// OptItems call back for OEM document property UI. +// +LONG APIENTRY OEMDocUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam) +{ + LONG lReturn = CPSUICB_ACTION_NONE; + POEMDEV pOEMDev = (POEMDEV) pOEMUIParam->pOEMDM; + + VERBOSE(DLLTEXT("OEMDocUICallBack() entry.\r\n")); + + switch(pCallbackParam->Reason) + { + case CPSUICB_REASON_APPLYNOW: + // Store OptItems state in DEVMODE. + pOEMDev->dwAdvancedData = pOEMUIParam->pOEMOptItems[0].Sel; + break; + + case CPSUICB_REASON_KILLACTIVE: + pOEMDev->dwAdvancedData = pOEMUIParam->pOEMOptItems[0].Sel; + break; + + case CPSUICB_REASON_SETACTIVE: + if((DWORD)(pOEMUIParam->pOEMOptItems[0].Sel) != pOEMDev->dwAdvancedData) + { + pOEMUIParam->pOEMOptItems[0].Sel = pOEMDev->dwAdvancedData; + pOEMUIParam->pOEMOptItems[0].Flags |= OPTIF_CHANGED; + lReturn = CPSUICB_ACTION_OPTIF_CHANGED; + } + break; + + default: + break; + } + + return lReturn; +} + + +LONG APIENTRY OEMDocUICallBack2(PCPSUICBPARAM pCallbackParam) +{ + LONG lReturn = CPSUICB_ACTION_NONE; + PCBUSERDATA pUserData = (PCBUSERDATA) pCallbackParam->UserData; + POEMDEV pOEMDev = (POEMDEV) pUserData->pOEMUIParam->pOEMDM; + + + VERBOSE(DLLTEXT("OEMDocUICallBack2() entry.\r\n")); + + switch(pCallbackParam->Reason) + { + case CPSUICB_REASON_APPLYNOW: + pOEMDev->dwDriverData = pCallbackParam->pOptItem[0].Sel; + pUserData->pfnComPropSheet(pUserData->hComPropSheet, CPSFUNC_SET_RESULT, + (LPARAM)pUserData->hPropPage, + (LPARAM)CPSUI_OK); + break; + + case CPSUICB_REASON_KILLACTIVE: + pOEMDev->dwDriverData = pCallbackParam->pOptItem[0].Sel; + break; + + case CPSUICB_REASON_SETACTIVE: + if((DWORD)(pCallbackParam->pOptItem[0].Sel) != pOEMDev->dwDriverData) + { + pCallbackParam->pOptItem[0].Sel = pOEMDev->dwDriverData; + pCallbackParam->pOptItem[0].Flags |= OPTIF_CHANGED; + lReturn = CPSUICB_ACTION_OPTIF_CHANGED; + } + break; + + default: + break; + } + + return lReturn; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Creates and Initializes OptItems. +// +static POPTITEM CreateOptItems(HANDLE hHeap, DWORD dwOptItems) +{ + POPTITEM pOptItems = NULL; + SIZE_T sizeOfOptItems = 0; + + // Compute the size of memory needed for the OptItems: + if (SUCCEEDED(SIZETMult(sizeof(OPTITEM), (SIZE_T)dwOptItems, &sizeOfOptItems))) + { + // Allocate memory for OptItems; + pOptItems = (POPTITEM) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeOfOptItems); + if(NULL != pOptItems) + { + InitOptItems(pOptItems, dwOptItems); + } + else + { + ERR(DLLTEXT("CreateOptItems() failed to allocate memory for OPTITEMs!\r\n")); + } + } + else + { + ERR(DLLTEXT("CreateOptItems() failed to compute necessary memory size for OPTITEMs!\r\n")); + } + + return pOptItems; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Initializes OptItems. +// +static void InitOptItems(POPTITEM pOptItems, DWORD dwOptItems) +{ + VERBOSE(DLLTEXT("InitOptItems() entry.\r\n")); + + // Zero out memory. + memset(pOptItems, 0, sizeof(OPTITEM) * dwOptItems); + + // Set each OptItem's size, and Public DM ID. + for(DWORD dwCount = 0; dwCount < dwOptItems; dwCount++) + { + pOptItems[dwCount].cbSize = sizeof(OPTITEM); + pOptItems[dwCount].DMPubID = DMPUB_NONE; + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Allocates and initializes OptType for OptItem. +// +static POPTTYPE CreateOptType(HANDLE hHeap, WORD wOptParams) +{ + POPTTYPE pOptType = NULL; + + + VERBOSE(DLLTEXT("CreateOptType() entry.\r\n")); + + // Allocate memory from the heap for the OPTTYPE; the driver will take care of clean up. + pOptType = (POPTTYPE) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(OPTTYPE)); + if(NULL != pOptType) + { + // Initialize OPTTYPE. + pOptType->cbSize = sizeof(OPTTYPE); + pOptType->Count = wOptParams; + + // Allocate memory from the heap for the OPTPARAMs for the OPTTYPE. + pOptType->pOptParam = (POPTPARAM) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, wOptParams * sizeof(OPTPARAM)); + if(NULL != pOptType->pOptParam) + { + // Initialize the OPTPARAMs. + for(WORD wCount = 0; wCount < wOptParams; wCount++) + { + pOptType->pOptParam[wCount].cbSize = sizeof(OPTPARAM); + } + } + else + { + ERR(DLLTEXT("CreateOptType() failed to allocated memory for OPTPARAMs!\r\n")); + + // Free allocated memory and return NULL. + HeapFree(hHeap, 0, pOptType); + pOptType = NULL; + } + } + else + { + ERR(DLLTEXT("CreateOptType() failed to allocated memory for OPTTYPE!\r\n")); + } + + return pOptType; +} + +//////////////////////////////////////////////////////////////////////////////////// +// +// Retrieves pointer to a String resource. +// +static PTSTR GetStringResource(HANDLE hHeap, HANDLE hModule, UINT uResource) +{ + int nResult; + DWORD dwSize = MAX_PATH; + PTSTR pszString = NULL; + + + VERBOSE(DLLTEXT("GetStringResource entered.\r\n")); + + // Allocate buffer for string resource from heap; let the driver clean it up. + pszString = (PTSTR) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwSize * sizeof(TCHAR)); + if(NULL != pszString) + { + // Load string resource; resize after loading so as not to waste memory. + nResult = LoadString((HMODULE)hModule, uResource, pszString, dwSize); + if(nResult > 0) + { + PTSTR pszTemp; + + pszTemp = (PTSTR) HeapReAlloc(hHeap, HEAP_ZERO_MEMORY, pszString, (nResult + 1) * sizeof(TCHAR)); + if(NULL != pszTemp) + { + pszString = pszTemp; + } + else + { + ERR(DLLTEXT("GetStringResource() HeapReAlloc() of string retrieved failed!\r\n")); + } + } + else + { + ERR(DLLTEXT("GetStringResource() failed to load string resource!\r\n")); + + pszString = NULL; + } + } + else + { + ERR(DLLTEXT("GetStringResource() failed to allocate string buffer!\r\n")); + } + + return pszString; +} + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/oemui.h b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/oemui.h new file mode 100644 index 00000000..0f392cc5 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/oemui.h @@ -0,0 +1,45 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: OEMUI.H +// +// +// PURPOSE: Define common data types, and external function prototypes +// for OEMUI Test Module. +// + +#pragma once + +#include "OEM.H" +#include "DEVMODE.H" +#include "globals.h" + + +//////////////////////////////////////////////////////// +// OEM UI Defines +//////////////////////////////////////////////////////// + + +// OEM Signature and version. +#define PROP_TITLE L"OEM UI Page" +#define DLLTEXT(s) "ThemeUI: " s + + +// Printer registry keys where OEM data is stored. +#define OEMUI_VALUE TEXT("OEMUI_VALUE") +#define OEMUI_DEVICE_VALUE TEXT("OEMUI_DEVICE_VALUE") + + + +//////////////////////////////////////////////////////// +// Prototypes +//////////////////////////////////////////////////////// + +HRESULT hrOEMPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam); +HRESULT hrOEMDocumentPropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam, IPrintOemDriverUI* pOEMHelp); +HRESULT hrOEMDevicePropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam); + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/precomp.h b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/precomp.h new file mode 100644 index 00000000..0607fe55 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/precomp.h @@ -0,0 +1,61 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: precomp.H +// +// +// PURPOSE: Common headers that don't change often +// + +#pragma once + +// Necessary for compiling under VC. +#if(!defined(WINVER) || (WINVER < 0x0500)) + #undef WINVER + #define WINVER 0x0500 +#endif +#if(!defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500)) + #undef _WIN32_WINNT + #define _WIN32_WINNT 0x0500 +#endif + +// Isolation define for using ComCtrl v6. +#ifndef ISOLATION_AWARE_ENABLED + #define ISOLATION_AWARE_ENABLED +#endif + + +// Required header files that shouldn't change often. + +#include <STDDEF.H> +#include <STDLIB.H> +#include <OBJBASE.H> +#include <STDARG.H> +#include <STDIO.H> +#include <WINDEF.H> +#include <WINERROR.H> +#include <WINBASE.H> +#include <WINGDI.H> +#include <WINDDI.H> +#include <WINSPOOL.H> +#include <TCHAR.H> +#include <EXCPT.H> +#include <ASSERT.H> +#include <PRSHT.H> +#include "COMPSTUI.H" +#include <WINDDIUI.H> +#include <PRINTOEM.H> +#include <COMMCTRL.H> +#include <INITGUID.H> +#include <PRCOMOEM.H> + +// Safe character string functions to detect buffer overrun conditions: +#include <strsafe.h> + +// Safe integer functions to detect integer overflow/underflow conditions: +#include <intsafe.h> + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/precompsrc.cpp b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/precompsrc.cpp new file mode 100644 index 00000000..5944cf51 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/precompsrc.cpp @@ -0,0 +1 @@ +#include "precomp.h"
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/resource.h b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/resource.h new file mode 100644 index 00000000..71d3d3d6 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/resource.h @@ -0,0 +1,24 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by OEMUI.rc +// +#define IDS_SECTION 1 +#define IDS_CALIBRATED 2 +#define IDS_NAME 3 +#define IDS_DEV_SECTION 4 +#define IDS_DEVICE_SECTION 4 +#define IDS_ADV_SECTION 10 +#define IDD_DEVICE_PROPPAGE 106 +#define IDD_DOC_PROPPAGE 107 +#define IDC_CALIBRATE 1001 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 103 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1002 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/themeuismpl.def b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/themeuismpl.def new file mode 100644 index 00000000..8e60b60d --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/ThemeUI/themeuismpl.def @@ -0,0 +1,3 @@ +LIBRARY ThemeUISmpl +EXPORTS DllGetClassObject PRIVATE + DllCanUnloadNow PRIVATE diff --git a/print/OEM Printer Customization Plug-in Samples/C++/WMarkPS.ini b/print/OEM Printer Customization Plug-in Samples/C++/WMarkPS.ini new file mode 100644 index 00000000..11176160 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/WMarkPS.ini @@ -0,0 +1,4 @@ +[OEMFiles] +OEMConfigFile1=WMARKUI.DLL +OEMDriverFile1=WMARKPS.DLL + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/WMarkUni.ini b/print/OEM Printer Customization Plug-in Samples/C++/WMarkUni.ini new file mode 100644 index 00000000..4ae540c4 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/WMarkUni.ini @@ -0,0 +1,5 @@ +[OEMFiles] +OEMConfigFile1=WMARKUNIUI.DLL +OEMDriverFile1=WMARKUNI.DLL + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/bitmap.gpd b/print/OEM Printer Customization Plug-in Samples/C++/bitmap.gpd new file mode 100644 index 00000000..467e3e21 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/bitmap.gpd @@ -0,0 +1,509 @@ +*GPDFileName: "bitmap.gpd" +*GPDFileVersion: "1.0" +*GPDSpecVersion: "1.0" +*Include: "StdNames.gpd" +*ModelName: "Bitmap Driver" +*MasterUnits: PAIR(1200, 1200) +*ResourceDLL: "unires.dll" +*PrinterType: PAGE +*MaxCopies: 99 +*PrintRate: 16 +*PrintRateUnit: PPM +*PrintRatePPM: 16 + +*%****************************************************************************************** +*% Orientation +*%****************************************************************************************** +*Feature: Orientation +{ + *rcNameID: =ORIENTATION_DISPLAY + *DefaultOption: PORTRAIT + *Option: PORTRAIT + { + *rcNameID: =PORTRAIT_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.6 + *Cmd: "" + } + } + *Option: LANDSCAPE_CC90 + { + *rcNameID: =LANDSCAPE_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.8 + *Cmd: "" + } + } +} + +*%****************************************************************************************** +*% Input Bin +*%****************************************************************************************** +*Feature: InputBin +{ + *rcNameID: =PAPER_SOURCE_DISPLAY + *DefaultOption: AUTO + *Option: AUTO + { + *rcNameID: =AUTO_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.11 + *Cmd: "" + } + } + *Option: UPPER + { + *rcNameID: =UPPER_TRAY_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.11 + *Cmd: "" + } + } +} + +*%****************************************************************************************** +*% Resolution +*%****************************************************************************************** +*Feature: Resolution +{ + *rcNameID: =RESOLUTION_DISPLAY + *DefaultOption: Option2 + *Option: Option1 + { + *Name: "600 x 600" =DOTS_PER_INCH + *DPI: PAIR(600, 600) + *TextDPI: PAIR(600, 600) + *MinStripBlankPixels: 32 + EXTERN_GLOBAL: *StripBlanks: LIST(ENCLOSED,TRAILING) + *SpotDiameter: 100 + *Command: CmdBeginRaster { *Cmd : "" } + *Command: CmdEndRaster { *Cmd : "" } + *Command: CmdSendBlockData { *Cmd : "" } + *Command: CmdSelect + { + *Order: DOC_SETUP.7 + *Cmd: "" + } + } + *Option: Option2 + { + *Name: "300 x 300" =DOTS_PER_INCH + *DPI: PAIR(300, 300) + *TextDPI: PAIR(300, 300) + *MinStripBlankPixels: 32 + EXTERN_GLOBAL: *StripBlanks: LIST(ENCLOSED, TRAILING) + *SpotDiameter: 100 + *Command: CmdBeginRaster { *Cmd : "" } + *Command: CmdEndRaster { *Cmd : "" } + *Command: CmdSendBlockData { *Cmd : "" } + *Command: CmdSelect + { + *Order: DOC_SETUP.7 + *Cmd: "" + } + } + *Option: Option3 + { + *Name: "150 x 150" =DOTS_PER_INCH + *DPI: PAIR(150, 150) + *TextDPI: PAIR(150, 150) + *MinStripBlankPixels: 32 + EXTERN_GLOBAL: *StripBlanks: LIST(ENCLOSED, TRAILING) + *SpotDiameter: 100 + *Command: CmdBeginRaster { *Cmd : "" } + *Command: CmdEndRaster { *Cmd : "" } + *Command: CmdSendBlockData { *Cmd : "" } + *Command: CmdSelect + { + *Order: DOC_SETUP.7 + *Cmd: "" + } + } +} + +*%****************************************************************************************** +*% Paper Size +*%****************************************************************************************** +*Feature: PaperSize +{ + *rcNameID: =PAPER_SIZE_DISPLAY + *DefaultOption: LETTER + *Option: LETTER + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(9500, 12500) + *PrintableOrigin: PAIR(400, 400) + *CursorOrigin: PAIR(300, 300) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(9500, 12200) + *PrintableOrigin: PAIR(450, 300) + *CursorOrigin: PAIR(200, 12900) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "" + } + } + } + } + *Option: LEGAL + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(9000, 15500) + *PrintableOrigin: PAIR(400, 600) + *CursorOrigin: PAIR(180, 300) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(9000, 15500) + *PrintableOrigin: PAIR(400, 900) + *CursorOrigin: PAIR(180, 16500) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "" + } + } + } + } + *Option: EXECUTIVE + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(8100, 11500) + *PrintableOrigin: PAIR(300, 300) + *CursorOrigin: PAIR(300, 200) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(8300, 11500) + *PrintableOrigin: PAIR(200, 300) + *CursorOrigin: PAIR(200, 12300) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "" + } + } + } + } + *Option: A4 + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(9100, 13200) + *PrintableOrigin: PAIR(400, 300) + *CursorOrigin: PAIR(288, 180) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(9100, 13200) + *PrintableOrigin: PAIR(400, 300) + *CursorOrigin: PAIR(204, 13824) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "" + } + } + } + } + *Option: B5 + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(7900, 11140) + *PrintableOrigin: PAIR(352, 300) + *CursorOrigin: PAIR(300, 100) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(7760, 11140) + *PrintableOrigin: PAIR(300, 400) + *CursorOrigin: PAIR(100, 11940) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "" + } + } + } + } +} + +*%****************************************************************************************** +*% Media Type +*%****************************************************************************************** +*Feature: MediaType +{ + *rcNameID: =MEDIA_TYPE_DISPLAY + *DefaultOption: PLAIN + *Option: PLAIN + { + *rcNameID: =PLAIN_PAPER_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.15 + *Cmd: "" + } + } + *Option: TRANSPARENCY + { + *rcNameID: =TRANSPARENCY_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.15 + *Cmd: "" + } + } +} + +*%****************************************************************************************** +*% Color Mode +*%****************************************************************************************** +*Feature: ColorMode +{ + *rcNameID: =COLOR_PRINTING_MODE_DISPLAY + *DefaultOption: 8bpp + *Option: Mono + { + *rcNameID: =MONO_DISPLAY + *DevNumOfPlanes: 0 + *DevBPP: 0 + *IPCallbackID: 1 + *Color?: FALSE + } + *Option: Color + { + *rcNameID: =COLOR_DISPLAY + *DevNumOfPlanes: 0 + *DevBPP: 0 + *DrvBPP: 4 + *IPCallbackID: 2 + *PaletteSize: 8 + *PaletteProgrammable?: TRUE + *Command: CmdEnableDRC { *Cmd: "" } + *Command: CmdDefinePaletteEntry { *Cmd : "" } + *Command: CmdSelectPaletteEntry { *Cmd : "" } + *Command: CmdSetSrcBmpWidth { *Cmd : "" } + *Command: CmdSelect + { + *Order: PAGE_SETUP.16 + *Cmd: "" + } + } + *Option: 8bpp + { + *rcNameID: =8BPP_DISPLAY + *DevNumOfPlanes: 0 + *DevBPP: 0 + *DrvBPP: 8 + *IPCallbackID: 3 + *PaletteSize: 256 + *PaletteProgrammable? : TRUE + *Command: CmdEnableDRC { *Cmd : "" } + *Command: CmdDefinePaletteEntry { *Cmd : "" } + *Command: CmdSelectPaletteEntry { *Cmd : "" } + *Command: CmdSetSrcBmpWidth { *Cmd : "" } + *Command: CmdSelect + { + *Order: PAGE_SETUP.16 + *Cmd: "" + } + } + *Option: 24bpp + { + *rcNameID: =24BPP_DISPLAY + *DevNumOfPlanes: 0 + *DevBPP: 0 + *DrvBPP: 24 + *IPCallbackID: 5 + *PaletteSize: 256 + *PaletteProgrammable? : TRUE + *Command: CmdEnableDRC { *Cmd : "" } + *Command: CmdDefinePaletteEntry { *Cmd : "" } + *Command: CmdSelectPaletteEntry { *Cmd : "" } + *Command: CmdSetSrcBmpWidth { *Cmd : "" } + *Command: CmdSelect + { + *Order: PAGE_SETUP.16 + *Cmd: "" + } + } +} + +*%****************************************************************************************** +*% HalfTone +*%****************************************************************************************** +*Feature: Halftone +{ + *rcNameID: =HALFTONING_DISPLAY + *DefaultOption: HT_PATSIZE_AUTO + *Option: HT_PATSIZE_AUTO + { + *rcNameID: =HT_AUTO_SELECT_DISPLAY + } + *Option: HT_PATSIZE_SUPERCELL_M + { + *rcNameID: =HT_SUPERCELL_DISPLAY + } + *Option: HT_PATSIZE_6x6_M + { + *rcNameID: =HT_DITHER6X6_DISPLAY + } + *Option: HT_PATSIZE_8x8_M + { + *rcNameID: =HT_DITHER8X8_DISPLAY + } +} + +*%****************************************************************************************** +*% Duplex Unit +*%****************************************************************************************** +*Feature: DuplexUnit +{ + *rcNameID: 429 + *FeatureType: PRINTER_PROPERTY + *DefaultOption: FALSE + *Option: FALSE + { + *rcNameID: 444 + *DisabledFeatures: LIST(Duplex.VERTICAL, Duplex.HORIZONTAL) + } + *Option: TRUE + { + *rcNameID: 443 + } +} + +*%****************************************************************************************** +*% Duplex Type +*%****************************************************************************************** +*Feature: Duplex +{ + *rcNameID: =TWO_SIDED_PRINTING_DISPLAY + *DefaultOption: NONE + *Option: NONE + { + *rcNameID: =NONE_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.9 + *Cmd: "" + } + } + *Option: VERTICAL + { + *rcNameID: =FLIP_ON_LONG_EDGE_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.9 + *Cmd: "" + } + } + *Option: HORIZONTAL + { + *rcNameID: =FLIP_ON_SHORT_EDGE_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.9 + *Cmd: "" + } + } +} + +*%****************************************************************************************** +*% Doc setup commands +*%****************************************************************************************** +*Command: CmdStartDoc +{ + *Order: DOC_SETUP.7 + *Cmd: "" +} +*Command: CmdStartPage +{ + *Order: PAGE_SETUP.1 + *Cmd: "" +} +*Command: CmdEndJob +{ + *Order: JOB_FINISH.1 + *Cmd: "" +} +*Command: CmdCopies +{ + *Order: DOC_SETUP.13 + *Cmd: "" +} + +*%****************************************************************************************** +*% Cursor and Page Commands +*%****************************************************************************************** +*RotateCoordinate?: TRUE +*RotateRaster?: TRUE +*RotateFont?: TRUE +*TextCaps: LIST(TC_CR_90,TC_UA_ABLE) +*MemoryUsage: LIST(FONT, RASTER, VECTOR) +*CursorXAfterCR: AT_PRINTABLE_X_ORIGIN +*BadCursorMoveInGrxMode: LIST(X_PORTRAIT,Y_LANDSCAPE) +*XMoveThreshold: 0 +*YMoveThreshold: 0 +*XMoveUnit: 300 +*YMoveUnit: 300 +*EjectPageWithFF?: TRUE +*OutputDataFormat: H_BYTE +*OptimizeLeftBound?: TRUE +*CursorXAfterSendBlockData: AT_GRXDATA_ORIGIN +*CursorYAfterSendBlockData: AUTO_INCREMENT + +*Command: CmdCR { *Cmd : "" } +*Command: CmdLF { *Cmd : "" } +*Command: CmdFF { *Cmd : "" } diff --git a/print/OEM Printer Customization Plug-in Samples/C++/bitmap.inf b/print/OEM Printer Customization Plug-in Samples/C++/bitmap.inf new file mode 100644 index 00000000..247fb069 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/bitmap.inf @@ -0,0 +1,118 @@ +; BITMAP.INF +; +; INF file for the base WDK sample +; +; Copyright 1999 - 2001 Microsoft Corporation + + +[Version] +Signature="$Windows NT$" +Provider=%MS% +LayoutFile=ntprint.inf +ClassGUID={4D36E979-E325-11CE-BFC1-08002BE10318} +Class=Printer +DriverVer=6/07/2001,1.0.0.1 + +; +; Manufacturer section. +; +; This section lists all of the manufacturers +; that we will display in the Dialog box +; +[Manufacturer] +"Microsoft"=Microsoft, NTx86, NTamd64, NTia64 + +; +; Model sections. +; +; Each section here corresponds with an entry listed in the +; [Manufacturer] section, above. The models will be displayed in the order +; that they appear in the INF file. +; + +[Microsoft] +"Bitmap Driver" = BITMAP + +[Microsoft.NTx86] +"Bitmap Driver" = BITMAP + +[Microsoft.NTamd64] +"Bitmap Driver" = BITMAP + +[Microsoft.NTia64] +"Bitmap Driver" = BITMAP + +; +; Installer Sections +; +; These sections control file installation, and reference all files that +; need to be copied. The section name will be assumed to be the driver +; file, unless there is an explicit DriverFile section listed. +; + +[BITMAP] +CopyFiles=BMP +DataFile=BITMAP.GPD +DataSection=UNIDRV_DATA +Include=NTPRINT.INF +Needs=UNIDRV.OEM,UNIDRV_DATA + + +; Copy Sections +; +; Lists of files that are actually copied. These sections are referenced +; from the installer sections, above. Only create a section if it contains +; two or more files (if we only copy a single file, identify it in the +; installer section, using the @filename notation) or if it's a color +; profile (since the DestinationDirs can only handle sections, and not +; individual files). +; + +[BMP] +BITMAP.DLL + + +; +; Data Sections +; + +; These sections contain data that is shared between devices. +; + + + +; +; Location of source files not in Layout.inf. +; + +[SourceDisksNames] +100 = %OEMSample% + +[SourceDisksFiles.x86] +bitmap.dll = 100,bitmap\x86 + +[SourceDisksFiles.amd64] +bitmap.dll = 100,bitmap\amd64 + +[SourceDisksFiles.ia64] +bitmap.dll = 100,bitmap\ia64 + +[SourceDisksFiles] +BITMAP.GPD = 100 +BITMAP.INI = 100 + +; +; Call SetupSetDirectoryId with 66000 to set the target directory at runtime +; (depending on which environment drivers are getting installed) +; + +[DestinationDirs] +DefaultDestDir=66000 + +; +; Localizable Strings +; +[Strings] +MS="Microsoft WDK Sample" diff --git a/print/OEM Printer Customization Plug-in Samples/C++/bitmap.ini b/print/OEM Printer Customization Plug-in Samples/C++/bitmap.ini new file mode 100644 index 00000000..2388914c --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/bitmap.ini @@ -0,0 +1,5 @@ +[OEMFiles] +OEMDriverFile1=BITMAP.DLL + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/bitmap/bitmap.def b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/bitmap.def new file mode 100644 index 00000000..1a4df55f --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/bitmap.def @@ -0,0 +1,4 @@ +LIBRARY bitmap +EXPORTS DllGetClassObject PRIVATE + DllCanUnloadNow PRIVATE + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/bitmap/bitmap.h b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/bitmap.h new file mode 100644 index 00000000..ee068c02 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/bitmap.h @@ -0,0 +1,81 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: BITMAP.H +// +// +// PURPOSE: Define the COemPDEV class which stores the private +// PDEV for the driver. +// + + +#pragma once + +#define OEM_SIGNATURE 'MSFT' +#define OEM_VERSION 0x00000001L + +#define RGB_BLACK RGB(0, 0, 0) +#define RGB_WHITE RGB(255, 255, 255) + +class COemPDEV +{ +public: + COemPDEV(void) : + m_pfnDrvEndDoc(NULL), + pBufStart(NULL), + dwBufSize(0), + cPalColors(0), + hpalDefault(), + prgbq(NULL), + cbHeaderOffBits(0), + bHeadersFilled(FALSE), + bColorTable(FALSE) + { + memset(&bmFileHeader, 0, sizeof(bmFileHeader)); + memset(&bmInfoHeader, 0, sizeof(bmInfoHeader)); + } + + virtual ~COemPDEV(void) + { + } + + void InitializeDDITable(DRVENABLEDATA* pded) + { + UINT iDrvFn; + UINT cDrvFn = pded->c; + PDRVFN pDrvFn = pded->pdrvfn; + + for (iDrvFn = 0; iDrvFn < cDrvFn; ++iDrvFn, ++pDrvFn) + { + if (pDrvFn->iFunc == INDEX_DrvEndDoc) + { + m_pfnDrvEndDoc = (PFN_DrvEndDoc)(pDrvFn->pfn); + } + } + } + +public: + + PFN_DrvEndDoc m_pfnDrvEndDoc; // Unidrv function to call back into from the DDI hook + PBYTE pBufStart; // Pointer to start of buffer to hold the bitmap data + DWORD dwBufSize; // Buffer size + BITMAPFILEHEADER bmFileHeader; // BitmapFileHeader for each dump + BITMAPINFOHEADER bmInfoHeader; // BitmapInfoHeader for each dump + int cPalColors; // Count of colors in palette. + HPALETTE hpalDefault; // Default palette to pass to GDI. + _Field_size_(cPalColors) RGBQUAD * prgbq; // Color table + INT cbHeaderOffBits; // Offset to bits in the file + BOOL bHeadersFilled; // Flag to indicate if the header stuff has been filled + BOOL bColorTable; // Flag to indicate if color table needs to be dumped + +}; + +typedef COemPDEV* POEMPDEV; + +BOOL bGrowBuffer(POEMPDEV, DWORD); // Function to enlarge the buffer for holding the bitmap data +VOID vFreeBuffer(POEMPDEV); // Function to free the buffer for holding the bitmap data +BOOL bFillColorTable(POEMPDEV); // Function to fill the color table for the bitmap data diff --git a/print/OEM Printer Customization Plug-in Samples/C++/bitmap/bitmap.rc b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/bitmap.rc new file mode 100644 index 00000000..737bba96 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/bitmap.rc @@ -0,0 +1,110 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "Written by DDK Support Team\0" + VALUE "CompanyName", "Microsoft Corp.\0" + VALUE "FileDescription", "Bitmap Driver Sample\0" + VALUE "FileVersion", "1, 0, 0, 1\0" + VALUE "InternalName", "BITMAP\0" + VALUE "LegalCopyright", "Copyright � 1998-2003\0" + VALUE "LegalTrademarks", "Microsoft� is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation\0" + VALUE "OriginalFilename", "BITMAP.DLL\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "Microsoft Bitmap Driver Sample\0" + VALUE "ProductVersion", "1.0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // !_MAC + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/bitmap/bitmap.vcxproj b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/bitmap.vcxproj new file mode 100644 index 00000000..d530f136 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/bitmap.vcxproj @@ -0,0 +1,1090 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Win10 Debug|ARM64"> + <Configuration>Win10 Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|Win32"> + <Configuration>Win10 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|x64"> + <Configuration>Win10 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|ARM64"> + <Configuration>Win10 Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|Win32"> + <Configuration>Win10 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|x64"> + <Configuration>Win10 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|Win32"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|Win32"> + <Configuration>Win8 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|Win32"> + <Configuration>Win7 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|Win32"> + <Configuration>Win8.1 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|Win32"> + <Configuration>Win8 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|Win32"> + <Configuration>Win7 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|x64"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|x64"> + <Configuration>Win8 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|x64"> + <Configuration>Win7 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|x64"> + <Configuration>Win8.1 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|x64"> + <Configuration>Win8 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|x64"> + <Configuration>Win7 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{EDCCC34A-50DF-4894-B7B9-FC156F899947}</ProjectGuid> + <RootNamespace>$(MSBuildProjectName)</RootNamespace> + <Configuration Condition="'$(Configuration)' == ''">Win10 Debug</Configuration> + <Platform Condition="'$(Platform)' == ''">Win32</Platform> + <SampleGuid>{64A7662C-5E32-41A7-939B-B51114210693}</SampleGuid> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <PropertyGroup> + <OutDir>$(IntDir)</OutDir> + </PropertyGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ItemGroup Label="WrappedTaskItems" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetName>bitmap</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetName>bitmap</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetName>bitmap</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <TargetName>bitmap</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <TargetName>bitmap</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetName>bitmap</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetName>bitmap</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetName>bitmap</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <TargetName>bitmap</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <TargetName>bitmap</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetName>bitmap</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetName>bitmap</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetName>bitmap</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <TargetName>bitmap</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetName>bitmap</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetName>bitmap</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetName>bitmap</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <TargetName>bitmap</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;gdi32.lib;umpdddi.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;gdi32.lib;umpdddi.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;gdi32.lib;umpdddi.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;gdi32.lib;umpdddi.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;gdi32.lib;umpdddi.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;gdi32.lib;umpdddi.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;gdi32.lib;umpdddi.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;gdi32.lib;umpdddi.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;gdi32.lib;umpdddi.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;gdi32.lib;umpdddi.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;gdi32.lib;umpdddi.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;gdi32.lib;umpdddi.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;gdi32.lib;umpdddi.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;gdi32.lib;umpdddi.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;gdi32.lib;umpdddi.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;gdi32.lib;umpdddi.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;gdi32.lib;umpdddi.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;gdi32.lib;umpdddi.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Link> + <ModuleDefinitionFile>bitmap.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Link> + <ModuleDefinitionFile>bitmap.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Link> + <ModuleDefinitionFile>bitmap.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <Link> + <ModuleDefinitionFile>bitmap.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <Link> + <ModuleDefinitionFile>bitmap.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Link> + <ModuleDefinitionFile>bitmap.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Link> + <ModuleDefinitionFile>bitmap.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Link> + <ModuleDefinitionFile>bitmap.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <Link> + <ModuleDefinitionFile>bitmap.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <Link> + <ModuleDefinitionFile>bitmap.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Link> + <ModuleDefinitionFile>bitmap.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Link> + <ModuleDefinitionFile>bitmap.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Link> + <ModuleDefinitionFile>bitmap.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <Link> + <ModuleDefinitionFile>bitmap.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>bitmap.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>bitmap.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>bitmap.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>bitmap.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="ddihook.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="devmode.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="dllentry.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Create</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ResourceCompile Include="bitmap.rc" /> + </ItemGroup> + <ItemGroup> + <Inf Exclude="@(Inf)" Include="*.inf" /> + <FilesToPackage Include="$(TargetPath)" Condition="'$(ConfigurationType)'=='Driver' or '$(ConfigurationType)'=='DynamicLibrary'" /> + </ItemGroup> + <ItemGroup> + <None Exclude="@(None)" Include="*.txt;*.htm;*.html" /> + <None Exclude="@(None)" Include="*.ico;*.cur;*.bmp;*.dlg;*.rct;*.gif;*.jpg;*.jpeg;*.wav;*.jpe;*.tiff;*.tif;*.png;*.rc2" /> + <None Exclude="@(None)" Include="*.def;*.bat;*.hpj;*.asmx" /> + </ItemGroup> + <ItemGroup> + <ClInclude Exclude="@(ClInclude)" Include="*.h;*.hpp;*.hxx;*.hm;*.inl;*.xsd" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/bitmap/bitmap.vcxproj.Filters b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/bitmap.vcxproj.Filters new file mode 100644 index 00000000..a78a5c8a --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/bitmap.vcxproj.Filters @@ -0,0 +1,174 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;*</Extensions> + <UniqueIdentifier>{5A882741-1FD2-4D80-ACC9-DCFE8F90AD24}</UniqueIdentifier> + </Filter> + <Filter Include="Header Files"> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + <UniqueIdentifier>{A14D506D-8B56-426A-80B4-0CA6D7A24A0B}</UniqueIdentifier> + </Filter> + <Filter Include="Resource Files"> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms;man;xml</Extensions> + <UniqueIdentifier>{A8C3D9A5-36FC-4F1B-A9A6-605F3BD79ED7}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClCompile Include="ddihook.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="devmode.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="dllentry.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="bitmap.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="bitmap.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="bitmap.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="bitmap.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="bitmap.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="bitmap.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="bitmap.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="bitmap.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="bitmap.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="bitmap.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="bitmap.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="bitmap.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="bitmap.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="bitmap.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="bitmap.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="bitmap.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="bitmap.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> + <ItemGroup> + <None Include="bitmap.def"> + <Filter>Source Files</Filter> + </None> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/bitmap/ddihook.cpp b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/ddihook.cpp new file mode 100644 index 00000000..17984513 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/ddihook.cpp @@ -0,0 +1,114 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: DDIHook.cpp +// +// +// PURPOSE: Implementation of DDI Hook OEMEndDoc. This function +// dumps the buffered bitmap data out. +// + + +#include "precomp.h" +#include "bitmap.h" +#include "debug.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +// +// Function prototype is defined in printoem.h +// +BOOL APIENTRY +OEMEndDoc( + SURFOBJ *pso, + FLONG fl + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvEndDoc. + + DrvEndDoc is called by GDI when it has finished + sending a document to the driver for rendering. + + Please refer to DDK documentation for more details. + + This particular implementation of OEMEndDoc performs + the following operations: + - Dump the bitmap file header + - Dump the bitmap info header + - Dump the color table if one exists + - Dump the buffered bitmap data + - Free the memory for the data buffers + +Arguments: + + pso - Defines the surface object + flags - A set of flag bits + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + DWORD dwWritten; + INT cScans; + + if (pOemPDEV->pBufStart) + { + // Fill BitmapFileHeader + // + DWORD dwTotalBytes = pOemPDEV->cbHeaderOffBits + pOemPDEV->bmInfoHeader.biSizeImage; // File size + + pOemPDEV->bmFileHeader.bfType = 0x4d42; // Signature = 'BM' + pOemPDEV->bmFileHeader.bfSize = dwTotalBytes; // Bytes in whole file. + pOemPDEV->bmFileHeader.bfReserved1 = 0; + pOemPDEV->bmFileHeader.bfReserved2 = 0; + pOemPDEV->bmFileHeader.bfOffBits = pOemPDEV->cbHeaderOffBits; // Offset to bits in file. + + if (pOemPDEV->bColorTable) + pOemPDEV->bmFileHeader.bfOffBits += pOemPDEV->cPalColors * sizeof(ULONG); + + // Num of scanlines + // + cScans = pOemPDEV->bmInfoHeader.biHeight; + + // Flip the biHeight member so that it denotes top-down bitmap + // + pOemPDEV->bmInfoHeader.biHeight = cScans * -1; + + // Dump headers first + // + dwWritten = pDevObj->pDrvProcs->DrvWriteSpoolBuf(pDevObj, (void*)&(pOemPDEV->bmFileHeader), sizeof(BITMAPFILEHEADER)); + dwWritten = pDevObj->pDrvProcs->DrvWriteSpoolBuf(pDevObj, (void*)&(pOemPDEV->bmInfoHeader), sizeof(BITMAPINFOHEADER)); + if (pOemPDEV->bColorTable) + { + dwWritten = pDevObj->pDrvProcs->DrvWriteSpoolBuf(pDevObj, pOemPDEV->prgbq, pOemPDEV->cPalColors * sizeof(ULONG)); + LocalFree(pOemPDEV->prgbq); + } + + // Dump the data now + // + dwWritten = pDevObj->pDrvProcs->DrvWriteSpoolBuf(pDevObj, pOemPDEV->pBufStart, pOemPDEV->bmInfoHeader.biSizeImage); + + // Free memory for the data buffers + // + vFreeBuffer(pOemPDEV); + } + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvEndDoc)(pso, fl); +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/bitmap/debug.h b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/debug.h new file mode 100644 index 00000000..0414569c --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/debug.h @@ -0,0 +1,82 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1996 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Debug.H +// +// PURPOSE: Define common data types, and external function prototypes +// for debugging functions. Also defines the various debug macros. +// +// + +#pragma once + +///////////////////////////////////////////////////////// +// Macros +///////////////////////////////////////////////////////// +// +// These macros are used for debugging purposes. They expand +// to white spaces on a free build. Here is a brief description +// of what they do and how they are used: +// +// giDebugLevel +// Global variable which set the current debug level to control +// the amount of debug messages emitted. +// +// WARNING(msg) +// Display a message if the current debug level is <= DBG_WARNING. +// The message format is: WRN filename (linenumber): message +// +// ERR(msg) +// Similiar to WARNING macro above - displays a message +// if the current debug level is <= DBG_ERROR. +// +// ASSERT(cond) +// Verify a condition is true. If not, force a breakpoint. +// +// RIP(msg) +// Display a message and force a breakpoint. +// +// Usage: +// WARNING("App passed NULL pointer, ignoring...\n"); +// + +#define DBG_VERBOSE 0 +#define DBG_WARNING 1 +#define DBG_ERROR 2 +#define DBG_NONE 3 + +// VC and Build use different debug defines. +#if defined (DBG) || defined (_DEBUG) + + // __declspec(selectany) ensures that even if this is defined in multiple compilation + // modules, they will all resolve to the same symbol in the linked DLL + __declspec(selectany) INT giDebugLevel = 2; + + #define STRINGIZE(x) #x + #define QUOTE(x) STRINGIZE(x) + #define FILE_AND_LINE __FILE__ "@" QUOTE(__LINE__) + + #define VERBOSE(msg) { if(giDebugLevel <= DBG_VERBOSE) OutputDebugStringA( FILE_AND_LINE ": " msg); } + #define WARNING(msg) { if(giDebugLevel <= DBG_WARNING) OutputDebugStringA( FILE_AND_LINE ": Warning: " msg); } + #define ERR(msg) { if(giDebugLevel <= DBG_ERROR) OutputDebugStringA(FILE_AND_LINE ": Error:" msg); } + #define ASSERT(cond) { if (!(cond)) RIP("\n"); } + #define RIP(msg) { OutputDebugStringA(FILE_AND_LINE ": Error (not recoverable): " msg); DebugBreak(); } + +#else // !DBG + + #define VERBOSE(msg) + #define WARNING(msg) + #define ERR(msg) + #define ASSERT(cond) + #define RIP(msg) + +#endif + + + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/bitmap/devmode.cpp b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/devmode.cpp new file mode 100644 index 00000000..7845d5c1 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/devmode.cpp @@ -0,0 +1,132 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Devmode.cpp +// +// +// PURPOSE: Helper functions for manipulating the DEVMODE. These are commonly +// shared by UI & rendering modules +// + + +#include "precomp.h" +#include "bitmap.h" +#include "debug.h" +#include "devmode.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +BOOL bConvertOEMDevmode( + PCOEMDEV pOEMDevIn, + POEMDEV pOEMDevOut + ) + +/*++ + +Routine Description: + + Converts private DEVMODE members to the + current version. + +Arguments: + + pOEMDevIn - pointer to OEM private devmode + pOEMDevOut - pointer to OEM private devmode + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + if( (NULL == pOEMDevIn) + || + (NULL == pOEMDevOut) + ) + { + ERR("ConvertOEMDevmode() invalid parameters.\r\n"); + return FALSE; + } + + // Check OEM Signature, if it doesn't match ours, + // then just assume DMIn is bad and use defaults. + if(pOEMDevIn->dmOEMExtra.dwSignature == pOEMDevOut->dmOEMExtra.dwSignature) + { + // Set the devmode defaults so that anything the isn't copied over will + // be set to the default value. + pOEMDevOut->dwDriverData = 0; + + // Copy the old structure in to the new using which ever size is the smaller. + // Devmode maybe from newer Devmode (not likely since there is only one), or + // Devmode maybe a newer Devmode, in which case it maybe larger, + // but the first part of the structure should be the same. + + // DESIGN ASSUMPTION: the private DEVMODE structure only gets added to; + // the fields that are in the DEVMODE never change only new fields get added to the end. + + memcpy(pOEMDevOut, pOEMDevIn, __min(pOEMDevOut->dmOEMExtra.dwSize, pOEMDevIn->dmOEMExtra.dwSize)); + + // Re-fill in the size and version fields to indicated + // that the DEVMODE is the current private DEVMODE version. + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + } + else + { + // Don't know what the input DEVMODE is, so just use defaults. + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + pOEMDevOut->dwDriverData = 0; + } + + return TRUE; +} + + +BOOL bMakeOEMDevmodeValid( + POEMDEV pOEMDevmode + ) + +/*++ + +Routine Description: + + Ensures that private OEM devmode members are valid. + +Arguments: + + pOEMDevmode - pointer to OEM private devmode + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + if(NULL == pOEMDevmode) + { + return FALSE; + } + + // ASSUMPTION: pOEMDevmode is large enough to contain OEMDEV structure. + + // Make sure that dmOEMExtra indicates the current OEMDEV structure. + pOEMDevmode->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevmode->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevmode->dmOEMExtra.dwVersion = OEM_VERSION; + + // Set driver data. + pOEMDevmode->dwDriverData = 0; + + return TRUE; +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/bitmap/devmode.h b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/devmode.h new file mode 100644 index 00000000..5f62454f --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/devmode.h @@ -0,0 +1,37 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Devmode.h +// +// +// PURPOSE: Define common data types, and external function prototypes +// for devmode functions. +// + +#pragma once + +//////////////////////////////////////////////////////// +// OEM Private Devmode Definition +//////////////////////////////////////////////////////// + +typedef struct tagOEMDEV +{ + OEM_DMEXTRAHEADER dmOEMExtra; + BOOL dwDriverData; +} OEMDEV, *POEMDEV; + +typedef const OEMDEV *PCOEMDEV; + +///////////////////////////////////////////////////////// +// ProtoTypes +///////////////////////////////////////////////////////// + +HRESULT hrOEMDevMode(DWORD dwMode, POEMDMPARAM pOemDMParam); +BOOL bConvertOEMDevmode(PCOEMDEV pOEMDevIn, POEMDEV pOEMDevOut); +BOOL bMakeOEMDevmodeValid(POEMDEV pOEMDevmode); + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/bitmap/dllentry.cpp b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/dllentry.cpp new file mode 100644 index 00000000..4483a741 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/dllentry.cpp @@ -0,0 +1,50 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: dllentry.cpp +// +// +// PURPOSE: Source module for DLL entry function(s). +// + + +#include "precomp.h" +#include "bitmap.h" +#include "debug.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +/////////////////////////////////////////////////////////// +// +// DLL entry point +// + +BOOL WINAPI DllMain(HINSTANCE hInst, WORD wReason, LPVOID lpReserved) +{ + UNREFERENCED_PARAMETER(hInst); + UNREFERENCED_PARAMETER(lpReserved); + + switch(wReason) + { + case DLL_PROCESS_ATTACH: + break; + + case DLL_THREAD_ATTACH: + break; + + case DLL_PROCESS_DETACH: + break; + + case DLL_THREAD_DETACH: + break; + } + + return TRUE; +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/bitmap/intrface.cpp b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/intrface.cpp new file mode 100644 index 00000000..dcfdcd6f --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/intrface.cpp @@ -0,0 +1,2048 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Intrface.cpp +// +// +// PURPOSE: Interface for User Mode COM Customization DLL. +// + + +#include "precomp.h" + +#include "debug.h" +#include "devmode.h" +#include "bitmap.h" +#include "intrface.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +// ================================================================== +// Internal Globals +// +static long g_cComponents; // Count of active components +static long g_cServerLocks; // Count of locks +// +// ================================================================== + +// ================================================================== +// The purpose of this array is to inform UNIDRV of the callbacks +// that are implemented in this driver. +// +// Note that there is *NO* order dependency in this array. New +// index values and their corresponding callbacks can be placed +// anywhere within the list as needed. +// +static const DRVFN s_aOemHookFuncs[] = +{ + {INDEX_DrvEndDoc, (PFN)OEMEndDoc} +}; + + +//////////////////////////////////////////////////////////////////////////////// +// +// COemUni2 body +// +COemUni2::COemUni2() +{ + m_cRef = 1; + + // Increment COM component count. + InterlockedIncrement(&g_cComponents); + + m_pOEMHelp = NULL; + +} + +COemUni2::~COemUni2() +{ + // Make sure that helper interface is released. + if(NULL != m_pOEMHelp) + { + m_pOEMHelp->Release(); + m_pOEMHelp = NULL; + } + + // If this instance of the object is being deleted, then the reference + // count should be zero. + assert(0 == m_cRef); +} + +HRESULT __stdcall +COemUni2:: +QueryInterface( + const IID& iid, + void** ppv + ) +{ + + if (iid == IID_IUnknown) + { + *ppv = static_cast<IUnknown*>(this); + } + else if (iid == IID_IPrintOemUni2) + { + *ppv = static_cast<IPrintOemUni2*>(this); + } + else + { + WARNING("COemUni2::QueryInterface NULL. Returning E_NOINTERFACE.\r\n"); + + *ppv = NULL; + return E_NOINTERFACE; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef(); + return S_OK; +} + +ULONG __stdcall +COemUni2:: +AddRef( + VOID + ) +{ + return InterlockedIncrement(&m_cRef); +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall +COemUni2:: +Release( + VOID + ) +{ + ULONG cRef = InterlockedDecrement(&m_cRef); + + if (cRef == 0) + { + delete this; + return 0; + } + return cRef; +} + +HRESULT __stdcall +COemUni2:: +CommandCallback( + PDEVOBJ pdevobj, + DWORD dwCallbackID, + DWORD dwCount, + PDWORD pdwParams, + OUT INT *piResult + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::CommandCallback + + The IPrintOemUni::CommandCallback method is used + to provide dynamically generated printer commands + for Unidrv-supported printers. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + dwCallbackID - value representing the printer command's + *CallbackID attribute in the printer's generic printer + description (GPD) file. + dwCount - value representing the number of elements + in the array pointed to by pdwParams. Can be 0. + pdwParams - pointer to an array of DWORD-sized parameters + containing values specified by the printer commands + *Params attribute in the printer's GPD file. Can be NULL. + piResult - Receives a method-supplied result value. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(dwCallbackID); + UNREFERENCED_PARAMETER(dwCount); + UNREFERENCED_PARAMETER(pdwParams); + + *piResult = 0; + + return S_OK; +} + +HRESULT __stdcall +COemUni2:: +Compression( + PDEVOBJ pdevobj, + PBYTE pInBuf, + PBYTE pOutBuf, + DWORD dwInLen, + DWORD dwOutLen, + OUT INT *piResult + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::Compression + + The IPrintOemUni::Compression method can be used + with Unidrv-supported printers to provide a customized + bitmap compression method. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pInBuf - pointer to input scan line data. + pOutBuf - pointer to an output buffer to receive + compressed scan line data. + dwInLen - length of the input data. + dwOutLen - length of the output buffer. + piResult - Receives a method-supplied result value. If the + operation succeeds, this value should be the number + of compressed bytes, which must not be larger than + the value received for dwOutLen. If an error occurs, + or if the method cannot compress, the result value + should be -1. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pInBuf); + UNREFERENCED_PARAMETER(pOutBuf); + UNREFERENCED_PARAMETER(dwInLen); + UNREFERENCED_PARAMETER(dwOutLen); + UNREFERENCED_PARAMETER(piResult); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +DevMode( + DWORD dwMode, + POEMDMPARAM pOemDMParam + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::DevMode + + The IPrintOemUni::DevMode method, provided by + rendering plug-ins for Unidrv, performs operations + on private DEVMODE members. + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::DevMode method. + + The IPrintOemUni::DevMode method, provided by + rendering plug-ins for Unidrv, performs operations + on private DEVMODE members. When both UI and rendering + plug-ins are present in a driver, this functionality + should be factored out to be common to both modules, and + provide the same behavior. + + Please refer to DDK documentation for more details. + +Arguments: + + dwMode - caller-supplied constant. Refer to the docs + for more information. + pOemDMParam - pointer to an OEMDMPARAM structure. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + + +--*/ + +{ + POEMDEV pOEMDevIn; + POEMDEV pOEMDevOut; + + // Verify parameters. + if( (NULL == pOemDMParam) + || + ( (OEMDM_SIZE != dwMode) + && + (OEMDM_DEFAULT != dwMode) + && + (OEMDM_CONVERT != dwMode) + && + (OEMDM_MERGE != dwMode) + )) + { + ERR("DevMode() ERROR_INVALID_PARAMETER.\r\n"); + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Cast generic (i.e. PVOID) to OEM private devmode pointer type. + pOEMDevIn = (POEMDEV) pOemDMParam->pOEMDMIn; + pOEMDevOut = (POEMDEV) pOemDMParam->pOEMDMOut; + + switch(dwMode) + { + case OEMDM_SIZE: + pOemDMParam->cbBufSize = sizeof(OEMDEV); + break; + + case OEMDM_DEFAULT: + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + pOEMDevOut->dwDriverData = 0; + break; + + case OEMDM_CONVERT: + bConvertOEMDevmode(pOEMDevIn, pOEMDevOut); + break; + + case OEMDM_MERGE: + bConvertOEMDevmode(pOEMDevIn, pOEMDevOut); + bMakeOEMDevmodeValid(pOEMDevOut); + break; + } + + return S_OK; +} + +HRESULT __stdcall +COemUni2:: +DisableDriver( + VOID + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::DisableDriver + + The IPrintOemUni::DisableDriver method allows + a rendering plug-in for Unidrv to free resources + that were allocated by the plug-in's + IPrintOemUni::EnableDriver method. + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::DisableDriver method. + + The IPrintOemUni::DisableDriver method allows a rendering + plug-in for Unidrv to free resources that were allocated by the + plug-in's IPrintOemUni::EnableDriver method. This is the last + IPrintOemUni interface method that is called before the rendering + plug-in is unloaded. + + Please refer to DDK documentation for more details. + +Arguments: + + VOID + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + + +--*/ + +{ + // Release reference to Printer Driver's interface. + // + if (this->m_pOEMHelp) + { + this->m_pOEMHelp->Release(); + this->m_pOEMHelp = NULL; + } + + return S_OK; +} + +HRESULT __stdcall +COemUni2:: +DisablePDEV( + PDEVOBJ pdevobj + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::DisablePDEV + + The IPrintOemUni::DisablePDEV method allows a rendering + plug-in for Unidrv to delete the private PDEV structure that + was allocated by its IPrintOemUni::EnablePDEV method. + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::DisablePDEV method. + + The IPrintOemUni::DisablePDEV method performs the same types of + operations as the DrvDisablePDEV function. Its purpose is to allow a + rendering plug-in to delete the private PDEV structure that is pointed + to by the DEVOBJ structure's pdevOEM member. This PDEV structure + is one that was allocated by the plug-in's IPrintOemUni::EnablePDEV method. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + + +--*/ + +{ + // Release our COemPDEV instance created by the call to + // EnablePDEV. + // + POEMPDEV pOemPDEV = (POEMPDEV)pdevobj->pdevOEM; + delete pOemPDEV; + pOemPDEV = NULL; + + return S_OK; +} + +HRESULT __stdcall +COemUni2:: +DownloadCharGlyph( + PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + HGLYPH hGlyph, + PDWORD pdwWidth, + OUT DWORD *pdwResult + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::DownloadCharGlyph + + The IPrintOemUni::DownloadCharGlyph method enables a + rendering plug-in for Unidrv to send a character glyph for + a specified soft font to the printer. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pUFObj - pointer to a UNIFONTOBJ structure. + hGlyph - glyph handle. + pdwWidth - pointer to receive the method-supplied width of the character. + pdwResult - Receives a method-supplied value representing the amount + of printer memory, in bytes, required to store the character glyph. + If the operation fails, the returned value should be zero. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pUFObj); + UNREFERENCED_PARAMETER(hGlyph); + UNREFERENCED_PARAMETER(pdwWidth); + UNREFERENCED_PARAMETER(pdwResult); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +DownloadFontHeader( + PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + OUT DWORD *pdwResult + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::DownloadFontHeader + + The IPrintOemUni::DownloadFontHeader method allows a + rendering plug-in for Unidrv to send a font's header + information to a printer. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pUFObj - pointer to a UNIFONTOBJ structure. + pdwResult - Receives a method-supplied value representing the amount + of printer memory, in bytes, required to store the font header + information. If the operation fails, the returned value should be zero. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pUFObj); + UNREFERENCED_PARAMETER(pdwResult); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +DriverDMS( + PVOID pDevObj, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::DriverDMS + + The IPrintOemUni::DriverDMS method allows a rendering + plug-in for Unidrv to indicate that it uses a device-managed + drawing surface instead of the default GDI-managed surface. + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::DriverDMS method. + + Please refer to DDK documentation for more details. For general info + on device managed surfaces and how to handle them, please refer to + the section titled "Handling Device-Managed Surfaces". + +Arguments: + + pDevObj - pointer to a DEVOBJ structure. + pBuffer - pointer to a buffer to receive method-specified flags. + cbSize - size, in bytes, of the buffer pointed to by pBuffer. + pcbNeeded - pointer to a location to receive the required + minimum pBuffer size. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + + +--*/ + +{ + UNREFERENCED_PARAMETER(pDevObj); + UNREFERENCED_PARAMETER(pBuffer); + UNREFERENCED_PARAMETER(cbSize); + UNREFERENCED_PARAMETER(pcbNeeded); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +EnableDriver( + DWORD dwDriverVersion, + DWORD cbSize, + PDRVENABLEDATA pded + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::EnableDriver + + The IPrintOemUni::EnableDriver method allows a rendering + plug-in for Unidrv to hook out some graphics DDI functions. + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::EnableDriver method. + + The IPrintOemUni::EnableDriver method allows a rendering + plug-in to perform the same types of operations as the + DrvEnableDriver function. Like the DrvEnableDriver function, + the IPrintOemUni::EnableDriver method is responsible for + providing addresses of internally supported graphics DDI functions, + or DDI hook functions. + + The method should fill the supplied DRVENABLEDATA structure + and allocate an array of DRVFN structures. It should fill the + array with pointers to hooking functions, along with winddi.h-defined + index values that identify the hooked out graphics DDI functions. + + Please refer to DDK documentation for more details. + +Arguments: + + DriverVersion - interface version number. This value is + defined by PRINTER_OEMINTF_VERSION, in printoem.h. + cbSize - size, in bytes, of the structure pointed to by pded. + pded - pointer to a DRVENABLEDATA structure. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + + +--*/ + +{ + UNREFERENCED_PARAMETER(dwDriverVersion); + UNREFERENCED_PARAMETER(cbSize); + + // We need to return the DDI functions that have been hooked + // in pded. Here we fill out the fields in pded. + // + pded->iDriverVersion = PRINTER_OEMINTF_VERSION; + pded->c = _countof(s_aOemHookFuncs); + pded->pdrvfn = (DRVFN *) s_aOemHookFuncs; + + // Even if nothing is done, need to return S_OK so + // that DisableDriver() will be called, which releases + // the reference to the Printer Driver's interface. + // + return S_OK; +} + +HRESULT __stdcall +COemUni2:: +EnablePDEV( + PDEVOBJ pdevobj, + _In_ PWSTR pPrinterName, + ULONG cPatterns, + HSURF *phsurfPatterns, + ULONG cjGdiInfo, + GDIINFO *pGdiInfo, + ULONG cjDevInfo, + DEVINFO *pDevInfo, + DRVENABLEDATA *pded, + OUT PDEVOEM *pDevOem + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::EnablePDEV + + The IPrintOemUni::EnablePDEV method allows a rendering + plug-in for Unidrv to create its own PDEV structure. + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::EnablePDEV method. + + The IPrintOemUni::EnablePDEV method performs the same types + of operations as the DrvEnablePDEV function that is exported + by a printer graphics DLL. Its purpose is to allow a rendering + plug-in to create its own PDEV structure. For more information + about PDEV structures, see "Customized PDEV Structures" in the DDK docs. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pPrinterName - pointer to a text string representing the + logical address of the printer. + cPatterns - value representing the number of HSURF-typed + surface handles contained in the buffer pointed to by + phsurfPatterns. + phsurfPatterns - pointer to a buffer that is large enough to + contain cPatterns number of HSURF-typed surface handles. + The handles represent surface fill patterns. + cjGdiInfo - value representing the size of the structure pointed + to by pGdiInfo. + pGdiInfo - pointer to a GDIINFO structure. + cjDevInfo - value representing the size of the structure pointed + to by pDevInfo. + pDevInfo - pointer to a DEVINFO structure. + pded - pointer to a DRVENABLEDATA structure containing the + addresses of the printer driver's graphics DDI hooking functions. + pDevOem - Receives a method-supplied pointer to a private PDEV structure. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + + If the operation fails, the method should call SetLastError to set an error code. + + +--*/ + +{ + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pPrinterName); + UNREFERENCED_PARAMETER(cPatterns); + UNREFERENCED_PARAMETER(phsurfPatterns); + UNREFERENCED_PARAMETER(cjGdiInfo); + UNREFERENCED_PARAMETER(cjDevInfo); + + // Allocate an instance of our private PDEV. + // + POEMPDEV pOemPDEV = new COemPDEV(); + + if (NULL == pOemPDEV) + { + return E_FAIL; + } + + pOemPDEV->InitializeDDITable(pded); + + // Initializing private oempdev stuff + // + pOemPDEV->bHeadersFilled = FALSE; + pOemPDEV->bColorTable = FALSE; + pOemPDEV->cbHeaderOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); + pOemPDEV->bmInfoHeader.biHeight = 0; + pOemPDEV->bmInfoHeader.biSizeImage = 0; + pOemPDEV->pBufStart = NULL; + pOemPDEV->dwBufSize = 0; + + // We create a BGR palette for 24bpp so that we can avoid color byte order manipulation + // + if (pGdiInfo->cBitsPixel == 24) + pDevInfo->hpalDefault = EngCreatePalette(PAL_BGR, 0, 0, 0, 0, 0); + + // Store the handle to the default palette so that we can fill the color table later + // + pOemPDEV->hpalDefault = pDevInfo->hpalDefault; + + *pDevOem = pOemPDEV; + + return S_OK; +} + +HRESULT __stdcall +COemUni2:: +FilterGraphics( + PDEVOBJ pdevobj, + PBYTE pBuf, + DWORD dwLen + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::FilterGraphics + + The IPrintOemUni::FilterGraphics method can be used with + Unidrv-supported printers to modify scan line data and send + it to the spooler. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pBuf - pointer to a buffer containing scan line data to be printed. + dwLen - value representing the length, in bytes, of the data + pointed to by pBuf. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + DWORD dwResult; + + m_pOEMHelp->DrvWriteSpoolBuf(pdevobj, pBuf, dwLen, &dwResult); + + if (dwResult == dwLen) + return S_OK; + else + return S_FALSE; +} + +HRESULT __stdcall +COemUni2:: +GetImplementedMethod( + _In_ PSTR pMethodName + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::GetImplementedMethod + + The IPrintOemUni::GetImplementedMethod method is used by + Unidrv to determine which IPrintOemUni interface methods + have been implemented by a rendering plug-in. + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::GetImplemented method. + + Please refer to DDK documentation for more details. + +Arguments: + + pMethodName - pointer to a string representing the name of an + IPrintOemUni interface method, such as "ImageProcessing" + for IPrintOemUni::ImageProcessing or "FilterGraphics" for + IPrintOemUni::FilterGraphics. + +Return Value: + + S_OK The operation succeeded (the specified method is implemented). + S_FALSE The operation failed (the specified method is not implemented). + + +--*/ + +{ + HRESULT Result = S_FALSE; + + // Unidrv only calls GetImplementedMethod for optional + // methods. The required methods are assumed to be + // supported. + + // Return S_OK for supported function (i.e. implemented), + // and S_FALSE for functions that aren't supported (i.e. not implemented). + switch (*pMethodName) + { + case 'C': + if (!strcmp(NAME_CommandCallback, pMethodName)) + { + Result = S_OK; + } + break; + case 'F': + if (!strcmp(NAME_FilterGraphics, pMethodName)) + { + Result = S_OK; + } + break; + case 'I': + if (!strcmp(NAME_ImageProcessing, pMethodName)) + { + Result = S_OK; + } + break; + } + + return Result; +} + +HRESULT __stdcall +COemUni2:: +GetInfo( + DWORD dwMode, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::GetInfo + + A rendering plug-in's IPrintOemUni::GetInfo method returns + identification information. + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::GetInfo method. + + Please refer to DDK documentation for more details. + +Arguments: + + dwMode - Contains one of the following caller-supplied integer constants. + OEMGI_GETSIGNATURE - The method must return a unique four-byte + identification signature. The plug-in must also place this signature + in OPTITEM structures, as described in the description of the + OEMCUIPPARAM. structure's pOEMOptItems member. + OEMGI_GETVERSION - The method must return the user interface + plug-in's version number as a DWORD. The version format is + developer-defined. + pBuffer - pointer to memory allocated to receive the information specified + by dwInfo. + cbSize - size of the buffer pointed to by pBuffer. + pcbNeeded - pointer to a location to receive the number of bytes written + into the buffer pointed to by pBuffer. + +Return Value: + + S_OK The operation succeeded (the specified method is implemented). + S_FALSE The operation failed (the specified method is not implemented). + + +--*/ + +{ + PWSTR pszTag = L"COemUni2::GetInfo entry."; + switch(dwMode) + { + case OEMGI_GETSIGNATURE: pszTag = L"COemUni2::GetInfo entry. [OEMGI_GETSIGNATURE]"; break; + case OEMGI_GETVERSION: pszTag = L"COemUni2::GetInfo entry. [OEMGI_GETVERSION]"; break; + + } + + // Validate parameters. + if( (NULL == pcbNeeded) + || + ( (OEMGI_GETSIGNATURE != dwMode) + && + (OEMGI_GETVERSION != dwMode) ) ) + { + WARNING("COemUni2::GetInfo() exit pcbNeeded is NULL! ERROR_INVALID_PARAMETER.\r\n"); + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Set expected buffer size. + *pcbNeeded = sizeof(DWORD); + + // Check buffer size is sufficient. If not, return error, and also ensure that + // the required buffer size is provided to the caller. + if((cbSize < *pcbNeeded) || (NULL == pBuffer)) + { + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return E_FAIL; + } + + switch(dwMode) + { + // OEM DLL Signature + case OEMGI_GETSIGNATURE: + *(PDWORD)pBuffer = OEM_SIGNATURE; + break; + + // OEM DLL version + case OEMGI_GETVERSION: + *(PDWORD)pBuffer = OEM_VERSION; + break; + + // dwMode not supported. + default: + // Set written bytes to zero since nothing was written. + WARNING("COemUni2::GetInfo() exit mode not supported.\r\n"); + *pcbNeeded = 0; + SetLastError(ERROR_NOT_SUPPORTED); + return E_FAIL; + } + + return S_OK; +} + +HRESULT __stdcall +COemUni2:: +HalftonePattern( + PDEVOBJ pdevobj, + PBYTE pHTPattern, + DWORD dwHTPatternX, + DWORD dwHTPatternY, + DWORD dwHTNumPatterns, + DWORD dwCallbackID, + PBYTE pResource, + DWORD dwResourceSize + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::HalftonePattern + + The IPrintOemUni::HalftonePattern method can be used with + Unidrv-supported printers to create or modify a halftone + pattern before it is used in a halftoning operation. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pHTPattern - pointer to a buffer to receive the method-supplied + halftone pattern. Buffer size, in bytes, is: + (((dwHTPatternX * dwHTPatternY) + 3)/4) * 4 * dwHTNumPatterns. + dwHTPatternX - length, in pixels, of the halftone pattern, as specified + by the GPD file's *HTPatternSize attribute. + dwHTPatternY - height, in pixels, of the halftone pattern, as specified + by the GPD file's *HTPatternSize attribute. + dwHTNumPatterns - number of patterns, as specified by the GPD file's + *HTNumPatterns attribute. This can be 1 or 3. + dwCallbackID - value identifying the halftone method, as specified by + the GPD file's *HTCallbackID attribute. + pResource - pointer to a buffer containing a halftone pattern, as + specified by the GPD file's *rcHTPatternID attribute. This can be NULL. + dwResourceSize - size of the halftone pattern contained in the buffer + pointed to by pResource. This is zero if pResource is NULL. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pHTPattern); + UNREFERENCED_PARAMETER(dwHTPatternX); + UNREFERENCED_PARAMETER(dwHTPatternY); + UNREFERENCED_PARAMETER(dwHTNumPatterns); + UNREFERENCED_PARAMETER(dwCallbackID); + UNREFERENCED_PARAMETER(pResource); + UNREFERENCED_PARAMETER(dwResourceSize); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +ImageProcessing( + PDEVOBJ pdevobj, + PBYTE pSrcBitmap, + PBITMAPINFOHEADER pBitmapInfoHeader, + PBYTE pColorTable, + DWORD dwCallbackID, + PIPPARAMS pIPParams, + OUT PBYTE *ppbResult + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::ImageProcessing + + The IPrintOemUni::ImageProcessing method can be used with + Unidrv-supported printers to modify image bitmap data, in order + to perform color formatting or halftoning. The method can return + the modified bitmap to Unidrv or send it directly to the print spooler. + + Please refer to DDK documentation for more details. + + The algorithm for this particular implementation of ImageProcessing is as follows. + - If headers have not been filled as yet, fill them. + - We fill out only the info header and the color table here. The file header is filled + out in OEMEndDoc. + - The height and image size in the bitmap info header are updated every time + we enter ImageProcessing. + - Increase the size of the data buffer by the size of the current band. + - Copy over the data from the current band to the buffer. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pSrcBitmap - pointer to an input device-independent bitmap (DIB). + pBitmapInfoHeader - pointer to a BITMAPINFOHEADER structure + that describes the bitmap pointed to by pSrcBitmap. + pColorTable - pointer to a color table. Used only if the output format is + eight bits per pixel. + dwCallbackID - value assigned to the *IPCallbackID attribute of the + currently selected option for the ColorMode feature. + pIPParams - pointer to an IPPARAMS structure. + ppbResult - + If the method returns the converted DIB to Unidrv: + If the conversion succeeds, the method should return a + pointer to a buffer containing the converted DIB. + Otherwise it should return NULL. + If the method sends the converted DIB to the print spooler: + If the operation succeeds, the method should return TRUE. + Otherwise it should return FALSE. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + UNREFERENCED_PARAMETER(pColorTable); + + POEMPDEV pOemPDEV = (POEMPDEV)pdevobj->pdevOEM; + + // We want to set ppbResult to NULL in case this function fails and returns E_FAIL + // + *ppbResult = NULL; + + // We want to keep track of the current offset from the start + // of the buffer before the size is increased. + // + DWORD dwBufOffset = pOemPDEV->dwBufSize; + + // We fill out the file header in OEMEndDoc. But for the info header, we take the easy route + // and copy the stuff from pBitmapInfoHeader. Only height and image size will be updated + // every time we enter ImageProcessing. + // + if (!pOemPDEV->bHeadersFilled) + { + ULONG ulMonoPalette[2] = { RGB_BLACK, RGB_WHITE, }; + + pOemPDEV->bHeadersFilled = TRUE; + pOemPDEV->bmInfoHeader.biSize = pBitmapInfoHeader->biSize; + pOemPDEV->bmInfoHeader.biPlanes = pBitmapInfoHeader->biPlanes; + pOemPDEV->bmInfoHeader.biBitCount = pBitmapInfoHeader->biBitCount; + pOemPDEV->bmInfoHeader.biCompression = pBitmapInfoHeader->biCompression; + pOemPDEV->bmInfoHeader.biXPelsPerMeter = pBitmapInfoHeader->biXPelsPerMeter; + pOemPDEV->bmInfoHeader.biYPelsPerMeter = pBitmapInfoHeader->biYPelsPerMeter; + pOemPDEV->bmInfoHeader.biClrUsed = pBitmapInfoHeader->biClrUsed; + pOemPDEV->bmInfoHeader.biClrImportant = pBitmapInfoHeader->biClrImportant; + pOemPDEV->bmInfoHeader.biWidth = pBitmapInfoHeader->biWidth; // We support only Portrait. So width is constant and needs to be updated only once. + + if (dwCallbackID != BMF_24BPP) // We need color table only if it is not 24bpp + { + DWORD cbMemAllocSize; + + pOemPDEV->bColorTable = TRUE; // Indicates that color table needs to be dumped at EndDoc time + + switch(dwCallbackID) + { + case BMF_1BPP: // 1 + pOemPDEV->cPalColors = 2; + + pOemPDEV->prgbq = NULL; + + // Call intsafe.h function to ensure there's no integer overflow or underflow + if (!SUCCEEDED(DWordMult(pOemPDEV->cPalColors, sizeof(RGBQUAD), &cbMemAllocSize)) || + (NULL == (pOemPDEV->prgbq = (RGBQUAD *)LocalAlloc(LPTR, cbMemAllocSize)))) + { + return E_FAIL; + } + + for (int i = 0; i < pOemPDEV->cPalColors; i++) + { + pOemPDEV->prgbq[i].rgbBlue = GetBValue(ulMonoPalette[i]); + pOemPDEV->prgbq[i].rgbGreen = GetGValue(ulMonoPalette[i]); + pOemPDEV->prgbq[i].rgbRed = GetRValue(ulMonoPalette[i]); + } + break; + case BMF_4BPP: // 2 + pOemPDEV->cPalColors = 16; + if (!bFillColorTable(pOemPDEV)) + return E_FAIL; + break; + case BMF_8BPP: // 3 + pOemPDEV->cPalColors = 256; + if (!bFillColorTable(pOemPDEV)) + return E_FAIL; + break; + } + } + + } + + // Keep track of the overall height and image size + // + pOemPDEV->bmInfoHeader.biHeight += pBitmapInfoHeader->biHeight; + pOemPDEV->bmInfoHeader.biSizeImage += pBitmapInfoHeader->biSizeImage; + + // Increase the buffer by the size of the current band + // + if (!bGrowBuffer(pOemPDEV, pBitmapInfoHeader->biSizeImage)) + return E_FAIL; + + if (!pIPParams->bBlankBand) // Non-blank band + { + CopyMemory((pOemPDEV->pBufStart + dwBufOffset), pSrcBitmap, pBitmapInfoHeader->biSizeImage); + } + else // For blanks bands, buffer blank scanlines + { + memset((pOemPDEV->pBufStart + dwBufOffset), 0xff, pBitmapInfoHeader->biSizeImage); + } + + // Set ppbResult to TRUE + // + *ppbResult = (LPBYTE)(INT_PTR)(TRUE); + + return S_OK; +} + +HRESULT __stdcall +COemUni2:: +MemoryUsage( + PDEVOBJ pdevobj, + POEMMEMORYUSAGE pMemoryUsage + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::MemoryUsage + + The IPrintOemUni::MemoryUsage method can be used with + Unidrv-supported printers to specify the amount of memory + required for use by a rendering plug-in's IPrintOemUni::ImageProcessing + method. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pMemoryUsage - pointer to an OEMMEMORYUSAGE structure. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pMemoryUsage); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +OutputCharStr( + PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + DWORD dwType, + DWORD dwCount, + PVOID pGlyph + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::OutputCharStr + + The IPrintOemUni::OutputCharStr method enables a rendering + plug-in to control the printing of font glyphs. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pUFObj - pointer to a UNIFONTOBJ structure. + dwType - value indicating the type of glyph specifier array + pointed to by pGlyph. Valid values are as follows: + TYPE_GLYPHHANDLE The pGlyph array elements are glyph + handles of type HGLYPH. + TYPE_GLYPHID The pGlyph array elements are glyph + identifiers of type DWORD. + dwCount - value representing the number of glyph specifiers in + the array pointed to by pGlyph. + pGlyph - pointer to an array of glyph specifiers, where the array + element type is indicated by dwType. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pUFObj); + UNREFERENCED_PARAMETER(dwType); + UNREFERENCED_PARAMETER(dwCount); + UNREFERENCED_PARAMETER(pGlyph); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +PublishDriverInterface( + IUnknown *pIUnknown + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::PublishDriverInterface + + The IPrintOemUni::PublishDriverInterface method allows a + rendering plug-in for Unidrv to obtain the Unidrv driver's + IPrintOemDriverUni interface. + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::PublishDriverInterface method and the method + must return S_OK, or the driver will not call the plug-in's other + IPrintOemUni interface methods. + + Please refer to DDK documentation for more details. + +Arguments: + + pIUnknown - pointer to the IUnknown interface of the driver's + IPrintOemDriverUni COM interface. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + + +--*/ + +{ + // Need to store pointer to Driver Helper functions, if we already haven't. + if (this->m_pOEMHelp == NULL) + { + HRESULT hResult; + + // Get Interface to Helper Functions. + hResult = pIUnknown->QueryInterface(IID_IPrintOemDriverUni, (void** ) &(this->m_pOEMHelp)); + + if(!SUCCEEDED(hResult)) + { + // Make sure that interface pointer reflects interface query failure. + this->m_pOEMHelp = NULL; + + return E_FAIL; + } + } + + return S_OK; +} + +HRESULT __stdcall +COemUni2:: +ResetPDEV( + PDEVOBJ pdevobjOld, + PDEVOBJ pdevobjNew + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::ResetPDEV + + The IPrintOemUni::ResetPDEV method allows a rendering + plug-in for Unidrv to reset its PDEV structure. + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::ResetPDEV method. + + + A rendering plug-in's IPrintOemUni::ResetPDEV method performs + the same types of operations as the DrvResetPDEV function. During + the processing of an application's call to the Platform SDK ResetDC + function, the IPrintOemUni::ResetPDEV method is called by Unidrv's + DrvResetPDEV function. For more information about when DrvResetPDEV + is called, see its description in the DDK docs. + + The rendering plug-in's private PDEV structure's address is contained + in the pdevOEM member of the DEVOBJ structure pointed to by pdevobjOld. + The IPrintOemUni::ResetPDEV method should use relevant members of this + old structure to fill in the new structure, which is referenced through pdevobjNew. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobjOld - pointer to a DEVOBJ structure containing current PDEV information. + pdevobjNew - pointer to a DEVOBJ structure into which the method should place + new PDEV information. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + + +--*/ + +{ + UNREFERENCED_PARAMETER(pdevobjOld); + UNREFERENCED_PARAMETER(pdevobjNew); + + return S_OK; +} + +HRESULT __stdcall +COemUni2:: +SendFontCmd( + PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + PFINVOCATION pFInv + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::SendFontCmd + + The IPrintOemUni::SendFontCmd method enables a rendering + plug-in to modify a printer's font selection command and then + send it to the printer. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pUFObj - pointer to a UNIFONTOBJ structure. + pFInv - pointer to an FINVOCATION structure. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pUFObj); + UNREFERENCED_PARAMETER(pFInv); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +TextOutAsBitmap( + SURFOBJ *pso, + STROBJ *pstro, + FONTOBJ *pfo, + CLIPOBJ *pco, + RECTL *prclExtra, + RECTL *prclOpaque, + BRUSHOBJ *pboFore, + BRUSHOBJ *pboOpaque, + POINTL *pptlOrg, + MIX mix + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::TextOutAsBitmap + + The IPrintOemUni::TextOutAsBitmap method allows a rendering + plug-in to create a bitmap image of a text string, in case a + downloadable font is not available. + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Defines the surface on which to be written. + pstro - Defines the glyphs to be rendered and their positions + pfo - Specifies the font to be used + pco - Defines the clipping path + prclExtra - A NULL-terminated array of rectangles to be filled + prclOpaque - Specifies an opaque rectangle + pboFore - Defines the foreground brush + pboOpaque - Defines the opaque brush + pptlOrg - Pointer to POINT struct , defining th origin + mix - Specifies the foreground and background ROPs for pboFore + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + UNREFERENCED_PARAMETER(pso); + UNREFERENCED_PARAMETER(pstro); + UNREFERENCED_PARAMETER(pfo); + UNREFERENCED_PARAMETER(pco); + UNREFERENCED_PARAMETER(prclExtra); + UNREFERENCED_PARAMETER(prclOpaque); + UNREFERENCED_PARAMETER(pboFore); + UNREFERENCED_PARAMETER(pboOpaque); + UNREFERENCED_PARAMETER(pptlOrg); + UNREFERENCED_PARAMETER(mix); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +TTDownloadMethod( + PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + OUT DWORD *pdwResult + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::TTDownloadMethod + + The IPrintOemUni::TTDownloadMethod method enables a rendering + plug-in to indicate the format that Unidrv should use for a specified + TrueType soft font. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pUFObj - pointer to a UNIFONTOBJ structure. + pdwResult - Receives one of the following method-supplied constant values: + TTDOWNLOAD_BITMAP Unidrv should download the specified font as bitmaps. + TTDOWNLOAD_DONTCARE Unidrv can select the font format. + TTDOWNLOAD_GRAPHICS Unidrv should print TrueType fonts as graphics, + instead of downloading the font. + TTDOWNLOAD_TTOUTLINE Unidrv should download the specified font as outlines. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pUFObj); + UNREFERENCED_PARAMETER(pdwResult); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +TTYGetInfo( + PDEVOBJ pdevobj, + DWORD dwInfoIndex, + PVOID pOutputBuf, + DWORD dwSize, + DWORD *pcbcNeeded + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::TTYGetInfo + + The IPrintOemUni::TTYGetInfo method enables a rendering plug-in + to supply Unidrv with information relevant to text-only printers. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + dwInfoIndex - constant identifying the type of information being requested. + The following constant values are defined: + OEMTTY_INFO_CODEPAGE - The pOutputBuf parameter points to a + DWORD in which the method should return the number of the + code page to be used. + OEMTTY_INFO_MARGINS - The pOutputBuf parameter points to a + RECT structure in which the method should return page margin + widths, in tenths of millimeters (for example, 20 represents 2 mm). + If the entire page is printable, all margin values must be 0. + OEMTTY_INFO_NUM_UFMS - The pOutputBuf parameter points to a + DWORD in which the method should return the number of resource + IDs of the UFMs for 10, 12, and 17 CPI fonts. To actually obtain + these resource IDs, perform a query using OEMTTY_INFO_UFM_IDS. + OEMTTY_INFO_UFM_IDS - The pOutputBuf parameter points to an array + of DWORDs of sufficient size to hold the number of resource IDs of + the UFMs for 10, 12, and 17 CPI fonts. (This number is obtained by + using OEMTTY_INFO_NUM_UFMS in a query.) The method should + return the resource IDs of the UFMs for 10,12, and 17 CPI fonts. + pOutputBuf - pointer to a buffer to receive the requested information. + dwSize - size, in bytes, of the buffer pointed to by pOutputBuf. + pcbcNeeded - pointer to a location to receive the number of bytes written into + the buffer pointed to by pOutputBuf. If the number of bytes required is + smaller than the number specified by dwSize, the method should supply + the required size and return E_FAIL. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(dwInfoIndex); + UNREFERENCED_PARAMETER(pOutputBuf); + UNREFERENCED_PARAMETER(dwSize); + UNREFERENCED_PARAMETER(pcbcNeeded); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +WritePrinter( + PDEVOBJ pdevobj, + PVOID pBuf, + DWORD cbBuffer, + PDWORD pcbWritten + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni2::WritePrinter + + The IPrintOemUni2::WritePrinter method, if supported, enables a + rendering plug-in to capture all output data generated by a Unidrv + driver. If this method is not supported, the output data would + otherwise be sent to the spooler in a call to the spooler's WritePrinter API. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pBuf - pointer to the first byte of an array of bytes that contains + the output data generated by the Unidrv driver. + cbBuffer - size, in bytes, of the array pointed to by pBuf. + pcbWritten - pointer to a DWORD value that receives the number + of bytes of data that were successfully sent to the plug-in. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pBuf); + UNREFERENCED_PARAMETER(cbBuffer); + UNREFERENCED_PARAMETER(pcbWritten); + + return E_NOTIMPL; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// oem class factory +// +class COemCF : public IClassFactory +{ +public: + // *** IUnknown methods *** + STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef)(THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release)(THIS); + + // *** IClassFactory methods *** + STDMETHOD(CreateInstance)(THIS_ + LPUNKNOWN pUnkOuter, + REFIID riid, + LPVOID FAR* ppvObject); + + STDMETHOD(LockServer)(THIS_ BOOL bLock); + + + // Constructor + COemCF(): m_cRef(1) { }; + + // Destructor + ~COemCF() { }; + +protected: + LONG m_cRef; + +}; + +/////////////////////////////////////////////////////////// +// +// Class factory body +// +HRESULT __stdcall +COemCF:: +QueryInterface( + const IID& iid, + void** ppv) +{ + if ((iid == IID_IUnknown) || (iid == IID_IClassFactory)) + { + *ppv = static_cast<COemCF*>(this); + } + else + { + *ppv = NULL; + return E_NOINTERFACE; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef(); + return S_OK; +} + +ULONG __stdcall +COemCF:: +AddRef() +{ + return InterlockedIncrement(&m_cRef); +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall +COemCF:: +Release() +{ +// ASSERT( 0 != m_cRef); + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + } + return cRef; +} + +// IClassFactory implementation +HRESULT __stdcall +COemCF:: +CreateInstance( + IUnknown* pUnknownOuter, + const IID& iid, + void** ppv) +{ + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Cannot aggregate. + if (pUnknownOuter != NULL) + { + return CLASS_E_NOAGGREGATION; + } + + // Create component. + COemUni2* pOemCP = new COemUni2; + if (pOemCP == NULL) + { + return E_OUTOFMEMORY; + } + + // Get the requested interface. + HRESULT hr = pOemCP->QueryInterface(iid, ppv); + + // Release the IUnknown pointer. + // (If QueryInterface failed, component will delete itself.) + pOemCP->Release(); + return hr; +} + +// LockServer +HRESULT __stdcall +COemCF:: +LockServer( + BOOL bLock + ) +{ + if (bLock) + { + InterlockedIncrement(&g_cServerLocks); + } + else + { + InterlockedDecrement(&g_cServerLocks); + } + return S_OK; +} + + +// +// Registration functions +// + +// +// Can DLL unload now? +// +STDAPI DllCanUnloadNow(void) +{ + // + // To avoid leaving OEM DLL still in memory when Unidrv or Pscript drivers + // are unloaded, Unidrv and Pscript driver ignore the return value of + // DllCanUnloadNow of the OEM DLL, and always call FreeLibrary on the OEMDLL. + // + // If OEM DLL spins off a working thread that also uses the OEM DLL, the + // thread needs to call LoadLibrary and FreeLibraryAndExitThread, otherwise + // it may crash after Unidrv or Pscript calls FreeLibrary. + // + + if ((g_cComponents == 0) && (g_cServerLocks == 0)) + { + return S_OK; + } + else + { + return S_FALSE; + } +} + +// +// Get class factory +// +STDAPI DllGetClassObject( + _In_ REFCLSID clsid, + _In_ REFIID iid, + _Outptr_ LPVOID* ppv) +{ + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Can we create this component? + if (clsid != CLSID_OEMRENDER) + { + ERR("DllGetClassObject:\tClass not available!\r\n"); + return CLASS_E_CLASSNOTAVAILABLE; + } + + // Create class factory. + COemCF* pFontCF = new COemCF; // Reference count set to 1 in constructor + if (pFontCF == NULL) + { + ERR("DllGetClassObject:\tOut of Memory!\r\n"); + return E_OUTOFMEMORY; + } + + // Get requested interface. + HRESULT hrResult = pFontCF->QueryInterface(iid, ppv); + pFontCF->Release(); + + return hrResult; +} + +BOOL +bGrowBuffer( + POEMPDEV pOemPDEV, + DWORD dwBufInc + ) + +/*++ + +Routine Description: + + Enlarge the buffer for holding the bitmap data + +Arguments: + + pOemPDEV - Pointer to the private PDEV structure + dwBufInc - Amount to enlarge the buffer by + +Return Value: + + TRUE if successful, FALSE if memory allocation fails + +--*/ + +{ + DWORD dwOldBufferSize; + PBYTE pNewBuffer; + + // Allocate a new buffer whose size is the size of the previous buffer plus the increment + // + dwOldBufferSize = pOemPDEV->pBufStart ? pOemPDEV->dwBufSize : 0; + pOemPDEV->dwBufSize = dwOldBufferSize + dwBufInc; + + if (NULL == (pNewBuffer = (PBYTE)LocalAlloc(LPTR, pOemPDEV->dwBufSize))) + { + WARNING("LocalAlloc failed!\n"); + + vFreeBuffer(pOemPDEV); + + return FALSE; + } + + if (pOemPDEV->pBufStart) // Growing an existing buffer + { + CopyMemory(pNewBuffer, pOemPDEV->pBufStart, dwOldBufferSize); + + LocalFree(pOemPDEV->pBufStart); + pOemPDEV->pBufStart = pNewBuffer; + } + else // First time allocation + { + pOemPDEV->pBufStart = pNewBuffer; + } + + return TRUE; +} + +VOID +vFreeBuffer( + POEMPDEV pOemPDEV + ) + +/*++ + +Routine Description: + + Free the buffer for holding the bitmap data + +Arguments: + + pOemPDEV - Pointer to the private PDEV structure + +Return Value: + + None +--*/ + +{ + if (pOemPDEV->pBufStart) + { + LocalFree(pOemPDEV->pBufStart); + + pOemPDEV->pBufStart = NULL; + pOemPDEV->dwBufSize = 0; + } +} + +BOOL +bFillColorTable( + POEMPDEV pOemPDEV + ) + +/*++ + +Routine Description: + + Fill the color table for the bitmap data. This function + obtains the entries in the default palette and fills the + RGBQUAD structure that represents the color table. + +Arguments: + + pOemPDEV - Pointer to the private PDEV structure + +Return Value: + + TRUE if successful, FALSE if memory allocation for the color table fails + +--*/ + +{ + PALETTEENTRY * pPaletteEntry; + UINT uiPalEntries; + INT iLastPalIndex = pOemPDEV->cPalColors - 1; + DWORD cbMemAllocSize; + + pOemPDEV->prgbq = NULL; + + // Call intsafe.h function to ensure there's no integer overflow or underflow + if (!SUCCEEDED(DWordMult(pOemPDEV->cPalColors, sizeof(RGBQUAD), &cbMemAllocSize)) || + (NULL == (pOemPDEV->prgbq = (RGBQUAD *)LocalAlloc(LPTR, cbMemAllocSize)))) + { + return FALSE; + } + + // Call intsafe.h function to ensure there's no integer overflow or underflow + if (!SUCCEEDED(DWordMult(pOemPDEV->cPalColors, sizeof(PALETTEENTRY), &cbMemAllocSize)) || + (NULL == (pPaletteEntry = (PALETTEENTRY *)LocalAlloc(LPTR, cbMemAllocSize)))) + { + return FALSE; + } + + uiPalEntries = GetPaletteEntries(pOemPDEV->hpalDefault, 0, pOemPDEV->cPalColors, pPaletteEntry); + + if (uiPalEntries == 0) + { + LocalFree(pPaletteEntry); + return FALSE; + } + + for (int i = 0; i < pOemPDEV->cPalColors; i++) + { + pOemPDEV->prgbq[i].rgbBlue = pPaletteEntry[i].peBlue; + pOemPDEV->prgbq[i].rgbGreen = pPaletteEntry[i].peGreen; + pOemPDEV->prgbq[i].rgbRed = pPaletteEntry[i].peRed; + } + + // Set the last index in the color table to white + // + pOemPDEV->prgbq[iLastPalIndex].rgbBlue = 0xff; + pOemPDEV->prgbq[iLastPalIndex].rgbGreen = 0xff; + pOemPDEV->prgbq[iLastPalIndex].rgbRed = 0xff; + + return TRUE; + +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/bitmap/intrface.h b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/intrface.h new file mode 100644 index 00000000..7c992055 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/intrface.h @@ -0,0 +1,287 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Intrface.H +// +// +// PURPOSE: Define COM interface for User Mode Printer Customization DLL. +// + + +#pragma once + +///////////////////////////////////////////////////////// +// String Literals +///////////////////////////////////////////////////////// + + +CONST CHAR NAME_CommandCallback[] = "CommandCallback"; +CONST CHAR NAME_FilterGraphics[] = "FilterGraphics"; +CONST CHAR NAME_ImageProcessing[] = "ImageProcessing"; + + +//////////////////////////////////////////////////////////////////////////////// +// +// COemUni2 +// +// Interface for Unidrv OEM sample rendering module +// +class COemUni2 : public IPrintOemUni2 +{ +public: + // *** IUnknown methods *** + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release)(THIS); + + // + // Method for publishing Driver interface. + // + STDMETHOD(PublishDriverInterface)(THIS_ IUnknown *pIUnknown); + + // + // Method for getting the implemented methods. + // Returns S_OK if the given method is implemneted. + // Returns S_FALSE if the given method is notimplemneted. + // + + STDMETHOD(GetImplementedMethod)(THIS_ _In_ PSTR pMethodName); + + // + // Method for OEM to specify DDIs that have been hooked + // + + STDMETHOD(EnableDriver) (THIS_ DWORD DriverVersion, + DWORD cbSize, + PDRVENABLEDATA pded); + + // + // Method to notify OEM plugin that it is no longer required + // + + STDMETHOD(DisableDriver) (THIS); + + // + // Method for OEM plugin to contruct its own PDEV + // + + STDMETHOD(EnablePDEV)(THIS_ PDEVOBJ pdevobj, + _In_ PWSTR pPrinterName, + ULONG cPatterns, + HSURF *phsurfPatterns, + ULONG cjGdiInfo, + GDIINFO *pGdiInfo, + ULONG cjDevInfo, + DEVINFO *pDevInfo, + DRVENABLEDATA *pded, + OUT PDEVOEM *pDevOem); + + // + // Method for OEM to free any resource associated with its PDEV + // + + STDMETHOD(DisablePDEV)(THIS_ PDEVOBJ pdevobj); + + // + // Method for OEM to transfer from old PDEV to new PDEV + // + + STDMETHOD(ResetPDEV)(THIS_ PDEVOBJ pdevobjOld, + PDEVOBJ pdevobjNew); + + // + // Get OEM dll related information + // + + STDMETHOD(GetInfo)(THIS_ DWORD dwMode, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded); + + // + // OEMDriverDMS - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(DriverDMS)(THIS_ PVOID pDevObj, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded); + + // + // OEMDevMode + // + + STDMETHOD(DevMode)(THIS_ DWORD dwMode, + POEMDMPARAM pOemDMParam); + + // + // OEMCommandCallback - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(CommandCallback)(THIS_ PDEVOBJ pdevobj, + DWORD dwCallbackID, + DWORD dwCount, + PDWORD pdwParams, + OUT INT *piResult); + + // + // OEMImageProcessing - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(ImageProcessing)(THIS_ PDEVOBJ pdevobj, + PBYTE pSrcBitmap, + PBITMAPINFOHEADER pBitmapInfoHeader, + PBYTE pColorTable, + DWORD dwCallbackID, + PIPPARAMS pIPParams, + OUT PBYTE *ppbResult); + + // + // OEMFilterGraphics - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(FilterGraphics)(THIS_ PDEVOBJ pdevobj, + PBYTE pBuf, + DWORD dwLen); + // + // OEMCompression - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(Compression)(THIS_ PDEVOBJ pdevobj, + PBYTE pInBuf, + PBYTE pOutBuf, + DWORD dwInLen, + DWORD dwOutLen, + OUT INT *piResult); + + // + // OEMHalftone - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(HalftonePattern)(THIS_ PDEVOBJ pdevobj, + PBYTE pHTPattern, + DWORD dwHTPatternX, + DWORD dwHTPatternY, + DWORD dwHTNumPatterns, + DWORD dwCallbackID, + PBYTE pResource, + DWORD dwResourceSize); + + // + // OEMMemoryUsage - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(MemoryUsage)(THIS_ PDEVOBJ pdevobj, + POEMMEMORYUSAGE pMemoryUsage); + + // + // OEMTTYGetInfo - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(TTYGetInfo)(THIS_ PDEVOBJ pdevobj, + DWORD dwInfoIndex, + PVOID pOutputBuf, + DWORD dwSize, + DWORD *pcbcNeeded); + + // + // OEMDownloadFontheader - UNIDRV only + // + + STDMETHOD(DownloadFontHeader)(THIS_ PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + OUT DWORD *pdwResult); + + // + // OEMDownloadCharGlyph - UNIDRV only + // + + STDMETHOD(DownloadCharGlyph)(THIS_ PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + HGLYPH hGlyph, + PDWORD pdwWidth, + OUT DWORD *pdwResult); + + // + // OEMTTDownloadMethod - UNIDRV only + // + + STDMETHOD(TTDownloadMethod)(THIS_ PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + OUT DWORD *pdwResult); + + // + // OEMOutputCharStr - UNIDRV only + // + + STDMETHOD(OutputCharStr)(THIS_ PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + DWORD dwType, + DWORD dwCount, + PVOID pGlyph); + + // + // OEMSendFontCmd - UNIDRV only + // + + + STDMETHOD(SendFontCmd)(THIS_ PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + PFINVOCATION pFInv); + + // + // OEMTextOutAsBitmap - UNIDRV only + // + + STDMETHOD(TextOutAsBitmap)(THIS_ SURFOBJ *pso, + STROBJ *pstro, + FONTOBJ *pfo, + CLIPOBJ *pco, + RECTL *prclExtra, + RECTL *prclOpaque, + BRUSHOBJ *pboFore, + BRUSHOBJ *pboOpaque, + POINTL *pptlOrg, + MIX mix); + + // + // IPrintOemUni2 methods + // + + // + // Method for plugin to hook out spooler's WritePrinter API so it + // can get access to output data Universal driver is generating + // + // At DrvEnablePDEV time, Universal driver will call this function with + // pdevobj = NULL, pBuf = NULL, cbBuffer = 0 to detect if the plugin + // implements this function. Plugin should return S_OK to indicate it is + // implementing this function, or return E_NOTIMPL otherwise. + // + // In pcbWritten, plugins should return the number of bytes written to the + // spooler's WritePrinter function. Zero doesn't carry a special meaning, + // errors must be reported through the returned HRESULT. + // + + STDMETHOD(WritePrinter)(THIS_ PDEVOBJ pdevobj, + PVOID pBuf, + DWORD cbBuffer, + PDWORD pcbWritten); + + + COemUni2(); + ~COemUni2(); + +protected: + LONG m_cRef; + IPrintOemDriverUni* m_pOEMHelp; +}; + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/bitmap/precomp.h b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/precomp.h new file mode 100644 index 00000000..d26e300b --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/precomp.h @@ -0,0 +1,40 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: precomp.H +// +// +// PURPOSE: Required header files external to the current project +// that do not need to be recompiled frequently. +// + + +#pragma once + +#include <STDDEF.H> +#include <STDLIB.H> +#include <OBJBASE.H> +#include <STDARG.H> +#include <STDIO.H> +#include <WINDEF.H> +#include <WINERROR.H> +#include <WINBASE.H> +#include <WINGDI.H> +#include <WINDDI.H> +#include <TCHAR.H> +#include <EXCPT.H> +#include <ASSERT.H> +#include <PRINTOEM.H> +#include <INTSAFE.H> +#include <DRIVERSPECS.H> +#include <INITGUID.H> +#include <PRCOMOEM.H> + +// StrSafe.h needs to be included last +// to disallow unsafe string functions. +#include <STRSAFE.H> + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/bitmap/precompsrc.cpp b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/precompsrc.cpp new file mode 100644 index 00000000..5944cf51 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/precompsrc.cpp @@ -0,0 +1 @@ +#include "precomp.h"
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/bitmap/resource.h b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/resource.h new file mode 100644 index 00000000..8e941820 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/bitmap/resource.h @@ -0,0 +1,17 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by OEMUNI.rc +// + + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 103 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/custhlp.gpd b/print/OEM Printer Customization Plug-in Samples/C++/custhlp.gpd new file mode 100644 index 00000000..23c72bea --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/custhlp.gpd @@ -0,0 +1,563 @@ +*GPDSpecVersion: "1.0" +*Include: "StdNames.gpd" +*ModelName: "OEM Unidrv Customization Sample" +*MasterUnits: PAIR(1200, 1200) +*ResourceDLL: "unires.dll" +*PrinterType: PAGE +*MaxCopies: 99 + +*%------------------------------------- +*%This is your OEM Custom Help file. +*%------------------------------------- +*HelpFile: "CUSTOMDRV.HLP" + +*PrintRate: 8 +*PrintRateUnit: PPM +*PrintRatePPM: 8 + +*Feature: Orientation +{ + *HelpIndex: 15001 + *rcNameID: =ORIENTATION_DISPLAY + *DefaultOption: PORTRAIT + *Option: PORTRAIT + { + *rcNameID: =PORTRAIT_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.6 + *Cmd: "<1B>&l0O" + } + } + *Option: LANDSCAPE_CC90 + { + *rcNameID: =LANDSCAPE_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.6 + *Cmd: "<1B>&l1O" + } + } +} + +*%------------------------------------- +*%This Features std help is replaced with OEM help. +*%Note you need to have *HelpFile: def in the general section. +*%HelpIndex is OEM ref ID +*%------------------------------------- +*Feature: InputBin +{ + *HelpIndex: 15001 + *rcNameID: =PAPER_SOURCE_DISPLAY + *DefaultOption: UPPER + *Option: UPPER + { + *rcNameID: =UPPER_TRAY_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.9 + *Cmd: "<1B>&l1H" + } + } +} +*Feature: Resolution +{ + *HelpIndex: 15001 + *rcNameID: =RESOLUTION_DISPLAY + *DefaultOption: Option1 + *Option: Option1 + { + *Name: "300 x 300 " =DOTS_PER_INCH + *DPI: PAIR(300, 300) + *TextDPI: PAIR(300, 300) + *MinStripBlankPixels: 32 + EXTERN_GLOBAL: *StripBlanks: LIST(ENCLOSED,TRAILING) + *SpotDiameter: 100 + *Command: CmdBeginRaster { *Cmd : "<1B>*v7S<1B>*r1A" } + *Command: CmdEndRaster { *Cmd : "<1B>*rC" } + *Command: CmdSendBlockData { *Cmd : "<1B>*b" %d{NumOfDataBytes}"W" } + *Command: CmdSelect + { + *Order: DOC_SETUP.4 + *Cmd: "<1B>%%-12345X" ++ "@PJL COMMENT HP Color LaserJet 5/5M " ++ "Version 0.56<0A>" ++ "@PJL SET RESOLUTION=300<0A>" ++ "@PJL ENTER LANGUAGE=PCL<0A0D1B>E<1B>*t300R" + } + } + *Option: Option2 + { + *Name: "150 x 150 " =DOTS_PER_INCH + *DPI: PAIR(150, 150) + *TextDPI: PAIR(300, 300) + *MinStripBlankPixels: 32 + EXTERN_GLOBAL: *StripBlanks: LIST(ENCLOSED,TRAILING) + *SpotDiameter: 100 + *Command: CmdBeginRaster { *Cmd : "<1B>*v7S<1B>*r1A" } + *Command: CmdEndRaster { *Cmd : "<1B>*rC" } + *Command: CmdSendBlockData { *Cmd : "<1B>*b" %d{NumOfDataBytes}"W" } + *Command: CmdSelect + { + *Order: DOC_SETUP.4 + *Cmd: "<1B>%%-12345X" ++ "@PJL COMMENT HP Color LaserJet 5/5M " ++ "Version 0.56<0A>" ++ "@PJL SET RESOLUTION=150<0A>" ++ "@PJL ENTER LANGUAGE=PCL<0A0D1B>E<1B>*t300R" + } + } +} + +*Feature: PaperSize +{ + *HelpIndex: 15001 + *rcNameID: =PAPER_SIZE_DISPLAY + *DefaultOption: LETTER + *Option: LETTER + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *switch: Orientation + { + *case: PORTRAIT + { + *%(9600, 12648) +*% *PrintableArea: PAIR(9600, 12648) + *PrintableArea: PAIR(9564, 12600) +*% *PrintableArea: PAIR(5000,5000) + *PrintableOrigin: PAIR(300, 300) +*% *PrintableOrigin: PAIR(300, 500) + *switch: Resolution + { + *case: Option2 + { +*% Warning: the following printable width is adjusted (9600->9592) so it is divisible by the resolution X scale. +*% Warning: the following printable length is adjusted (12648->12640) so it is divisible by the resolution Y scale. + *PrintableArea: PAIR(9592, 12640) +*% Warning: the following printable origin X is adjusted (300->304) so it is divisible by the resolution X scale. +*% Warning: the following printable origin Y is adjusted (300->304) so it is divisible by the resolution Y scale. + *PrintableOrigin: PAIR(304, 304) + } + } + *CursorOrigin: PAIR(300, 180) + *Command: CmdSelect + { + *%5760 -- 7560 + *Order: DOC_SETUP.10 + *Cmd: "<1B>&l2a8c1E<1B>*p0x0Y<1B>*c0t5760x7604Y" + } + } + *case: LANDSCAPE_CC90 + { + *%(9720, 12648) + *PrintableArea: PAIR(9760, 12688) + *PrintableOrigin: PAIR(200, 272) + *CursorOrigin: PAIR(200, 12960) + *Command: CmdSelect + { + *Order: DOC_SETUP.10 + *Cmd: "<1B>&l2a8c1E<1B>*p0x0Y<1B>*c0t7632x5880Y" + } + } + } + } + *Option: LEGAL + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(9540, 16248) + *PrintableOrigin: PAIR(300, 300) + *switch: Resolution + { + *case: Option2 + { +*% Warning: the following printable width is adjusted (9600->9592) so it is divisible by the resolution X scale. +*% Warning: the following printable length is adjusted (16248->16240) so it is divisible by the resolution Y scale. + *PrintableArea: PAIR(9592, 16240) +*% Warning: the following printable origin X is adjusted (300->304) so it is divisible by the resolution X scale. +*% Warning: the following printable origin Y is adjusted (300->304) so it is divisible by the resolution Y scale. + *PrintableOrigin: PAIR(304, 304) + } + } + *CursorOrigin: PAIR(300, 180) + *Command: CmdSelect + { + *Order: DOC_SETUP.10 + *Cmd: "<1B>&l3a8c1E<1B>*p0x0Y<1B>*c0t5760x9864Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(9760, 16288) + *PrintableOrigin: PAIR(200, 272) + *CursorOrigin: PAIR(200, 16560) + *Command: CmdSelect + { + *Order: DOC_SETUP.10 + *Cmd: "<1B>&l3a8c1E<1B>*p0x0Y<1B>*c0t9792x5880Y" + } + } + } + } + *Option: EXECUTIVE + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(8100, 12000) + *PrintableOrigin: PAIR(300, 300) + *switch: Resolution + { + *case: Option2 + { +*% Warning: the following printable width is adjusted (8100->8096) so it is divisible by the resolution X scale. +*% Warning: the following printable length is adjusted (12000->11992) so it is divisible by the resolution Y scale. + *PrintableArea: PAIR(8096, 11992) +*% Warning: the following printable origin X is adjusted (300->304) so it is divisible by the resolution X scale. +*% Warning: the following printable origin Y is adjusted (300->304) so it is divisible by the resolution Y scale. + *PrintableOrigin: PAIR(304, 304) + } + } + *CursorOrigin: PAIR(300, 180) + *Command: CmdSelect + { + *Order: DOC_SETUP.10 + *Cmd: "<1B>&l1a8c1E<1B>*p0x0Y<1B>*c0t4860x7344Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(8200, 12080) + *PrintableOrigin: PAIR(240, 280) + *CursorOrigin: PAIR(200, 12360) + *Command: CmdSelect + { + *Order: DOC_SETUP.10 + *Cmd: "<1B>&l1a8c1E<1B>*p0x0Y<1B>*c0t7272x4980Y" + } + } + } + } + *Option: A4 + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(9324, 13476) + *PrintableOrigin: PAIR(300, 300) + *switch: Resolution + { + *case: Option2 + { +*% Warning: the following printable width is adjusted (9324->9320) so it is divisible by the resolution X scale. +*% Warning: the following printable length is adjusted (13476->13472) so it is divisible by the resolution Y scale. + *PrintableArea: PAIR(9320, 13472) +*% Warning: the following printable origin X is adjusted (300->304) so it is divisible by the resolution X scale. +*% Warning: the following printable origin Y is adjusted (300->304) so it is divisible by the resolution Y scale. + *PrintableOrigin: PAIR(304, 304) + } + } + *CursorOrigin: PAIR(300, 180) + *Command: CmdSelect + { + *Order: DOC_SETUP.10 + *Cmd: "<1B>&l26a8c1E<1B>*p0x0Y<1B>*c0t5594x8201Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(9464, 13516) + *PrintableOrigin: PAIR(220, 272) + *switch: Resolution + { + *case: Option2 + { +*% Warning: the following printable width is adjusted (9464->9456) so it is divisible by the resolution X scale. +*% Warning: the following printable length is adjusted (13516->13512) so it is divisible by the resolution Y scale. + *PrintableArea: PAIR(9456, 13512) +*% Warning: the following printable origin X is adjusted (220->224) so it is divisible by the resolution X scale. + *PrintableOrigin: PAIR(224, 272) + } + } + *CursorOrigin: PAIR(200, 13788) + *Command: CmdSelect + { + *Order: DOC_SETUP.10 + *Cmd: "<1B>&l26a8c1E<1B>*p0x0Y<1B>*c0t8129x5714Y" + } + } + } + } + *Option: A3 + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(13428, 19308) + *PrintableOrigin: PAIR(300, 300) + *switch: Resolution + { + *case: Option2 + { +*% Warning: the following printable width is adjusted (13428->13424) so it is divisible by the resolution X scale. +*% Warning: the following printable length is adjusted (19308->19304) so it is divisible by the resolution Y scale. + *PrintableArea: PAIR(13424, 19304) +*% Warning: the following printable origin X is adjusted (300->304) so it is divisible by the resolution X scale. +*% Warning: the following printable origin Y is adjusted (300->304) so it is divisible by the resolution Y scale. + *PrintableOrigin: PAIR(304, 304) + } + } + *CursorOrigin: PAIR(300, 180) + *Command: CmdSelect + { + *Order: DOC_SETUP.10 + *Cmd: "<1B>&l27a8c1E<1B>*p0x0Y<1B>*c0t8057x11693Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(13588, 19368) + *PrintableOrigin: PAIR(200, 240) + *switch: Resolution + { + *case: Option2 + { +*% Warning: the following printable width is adjusted (13588->13584) so it is divisible by the resolution X scale. + *PrintableArea: PAIR(13584, 19368) + } + } + *CursorOrigin: PAIR(200, 19608) + *Command: CmdSelect + { + *Order: DOC_SETUP.10 + *Cmd: "<1B>&l27a8c1E<1B>*p0x0Y<1B>*c0t11621x8177Y" + } + } + } + } + *Option: TABLOID + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *switch: Orientation + { + *case: PORTRAIT + { +*% *PrintableArea: PAIR(12600, 19800) + *PrintableArea: PAIR(12540, 19740) + *PrintableOrigin: PAIR(300, 300) + *switch: Resolution + { + *case: Option2 + { +*% Warning: the following printable width is adjusted (12600->12592) so it is divisible by the resolution X scale. +*% Warning: the following printable length is adjusted (19800->19792) so it is divisible by the resolution Y scale. + *PrintableArea: PAIR(12592, 19792) +*% Warning: the following printable origin X is adjusted (300->304) so it is divisible by the resolution X scale. +*% Warning: the following printable origin Y is adjusted (300->304) so it is divisible by the resolution Y scale. + *PrintableOrigin: PAIR(304, 304) + } + } + *CursorOrigin: PAIR(300, 200) + *Command: CmdSelect + { + *Order: DOC_SETUP.10 + *Cmd: "<1B>&l6a8c1E<1B>*p0x0Y<1B>*c0t7560x12000Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(12600, 19800) + *PrintableOrigin: PAIR(300, 300) + *switch: Resolution + { + *case: Option2 + { +*% Warning: the following printable width is adjusted (12600->12592) so it is divisible by the resolution X scale. +*% Warning: the following printable length is adjusted (19800->19792) so it is divisible by the resolution Y scale. + *PrintableArea: PAIR(12592, 19792) +*% Warning: the following printable origin X is adjusted (300->304) so it is divisible by the resolution X scale. +*% Warning: the following printable origin Y is adjusted (300->304) so it is divisible by the resolution Y scale. + *PrintableOrigin: PAIR(304, 304) + } + } + *CursorOrigin: PAIR(200, 20100) + *Command: CmdSelect + { + *Order: DOC_SETUP.10 + *Cmd: "<1B>&l6a8c1E<1B>*p0x0Y<1B>*c0t11880x7680Y" + } + } + } + } +} +*Feature: MediaType +{ + *HelpIndex: 15001 + *rcNameID: =MEDIA_TYPE_DISPLAY + *DefaultOption: STANDARD + *Option: STANDARD + { + *rcNameID: =PLAIN_PAPER_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.14 + *Cmd: "<1B>&l0M" + } + } + *Option: TRANSPARENCY + { + *rcNameID: =TRANSPARENCY_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.14 + *Cmd: "<1B>&l4M" + } + } +} +*Feature: ColorMode +{ + *rcNameID: =COLOR_PRINTING_MODE_DISPLAY + *HelpIndex: 12004 + *DefaultOption: 24bpp + *Option: 24bpp + { + *rcNameID: =24BPP_DISPLAY + *DevNumOfPlanes: 1 + *DevBPP: 24 + *DrvBPP: 24 + *Command: CmdEnableDRC { *Cmd : "<1B>*b3M" } + *PaletteSize: 256 + *PaletteProgrammable? : TRUE + *Command: CmdDefinePaletteEntry { *Cmd : "<1B>*v" %d{RedValue}"a" %d{GreenValue}"b" %d{BlueValue}"c" %d{PaletteIndexToProgram} ++ "I" } + *Command: CmdSelectPaletteEntry { *Cmd : "<1B>*v" %d{CurrentPaletteIndex}"S" } + *Command: CmdSetSrcBmpWidth { *Cmd : "<1B>*r" %d{RasterDataWidthInBytes / 3}"S" } + *Command: CmdSelect + { + *Order: PAGE_SETUP.16 + *Cmd: "<1B>*v1N<1B>*v1O<1B>*l184O<1B>*v6W<0003080808081B>*v0a0b0c7i255a255b255c0I<1B>*" ++ "o3W<060400>" + } + } +} +*Feature: Halftone +{ + *rcNameID: =HALFTONING_DISPLAY + *HelpIndex: 12005 + *DefaultOption: HT_PATSIZE_AUTO + *Option: HT_PATSIZE_AUTO + { + *rcNameID: =HT_AUTO_SELECT_DISPLAY + } + *Option: HT_PATSIZE_SUPERCELL_M + { + *rcNameID: =HT_SUPERCELL_DISPLAY + } + *Option: HT_PATSIZE_6x6_M + { + *rcNameID: =HT_DITHER6X6_DISPLAY + } + *Option: HT_PATSIZE_8x8_M + { + *rcNameID: =HT_DITHER8X8_DISPLAY + } +} +*Command: CmdStartDoc +{ + *Order: DOC_SETUP.5 + *Cmd: "<1B>&u300D<1B>*r0F" +} +*Command: CmdStartPage +{ + *Order: PAGE_SETUP.1 + *Cmd: "<1B>*b0M<0D>" +} +*Command: CmdEndJob +{ + *Order: JOB_FINISH.1 + *Cmd: "<1B>E<1B>%%-12345X" +} +*Command: CmdCopies +{ + *Order: DOC_SETUP.11 + *Cmd: "<1B>&l" %d{NumOfCopies}"X" +} +*RotateCoordinate?: TRUE +*RotateRaster?: TRUE +*RotateFont?: TRUE +*TextCaps: LIST(TC_CR_90,TC_UA_ABLE) +*MemoryUsage: LIST(FONT) +*CursorXAfterCR: AT_PRINTABLE_X_ORIGIN +*BadCursorMoveInGrxMode: LIST(X_PORTRAIT,Y_LANDSCAPE) +*XMoveThreshold: 0 +*YMoveThreshold: 0 +*XMoveUnit: 300 +*YMoveUnit: 300 +*Command: CmdXMoveAbsolute { *Cmd : "<1B>*p" %d{(DestX / 4) }"X" } +*Command: CmdXMoveRelRight { *Cmd : "<1B>*p+" %d[0,9600]{max_repeat((DestXRel / 4) )}"X" } +*Command: CmdXMoveRelLeft { *Cmd : "<1B>*p-" %d[0,9600]{max_repeat((DestXRel / 4) )}"X" } +*Command: CmdYMoveAbsolute { *Cmd : "<1B>*p" %d{(DestY / 4) }"Y" } +*Command: CmdYMoveRelDown { *Cmd : "<1B>*p+" %d[1,12600]{max_repeat((DestYRel / 4) )}"Y" } +*Command: CmdYMoveRelUp { *Cmd : "<1B>*p-" %d[1,12600]{max_repeat((DestYRel / 4) )}"Y" } +*Command: CmdCR { *Cmd : "<0D>" } +*Command: CmdLF { *Cmd : "<0A>" } +*Command: CmdFF { *Cmd : "<0C>" } +*Command: CmdDefinePaletteEntry { *Cmd : "<1B>*v" %d{RedValue}"a" %d{GreenValue}"b" %d{BlueValue}"c" %d{PaletteIndexToProgram} ++ "I" } +*Command: CmdSelectPaletteEntry { *Cmd : "<1B>*v" %d{CurrentPaletteIndex}"S" } +*Command: CmdBackSpace { *Cmd : "<08>" } +*Command: CmdUniDirectionOn { *Cmd : "<00>" } +*Command: CmdUniDirectionOff { *Cmd : "<00>" } +*Command: CmdPushCursor { *Cmd : "<1B>&f0S" } +*Command: CmdPopCursor { *Cmd : "<1B>&f1S" } +*Command: CmdSetSimpleRotation { *Cmd : "<1B>&a" %d{PrintDirInCCDegrees}"P" } +*EjectPageWithFF?: TRUE +*Command: CmdEnableTIFF4 { *Cmd : "<1B>*b2M" } +*Command: CmdDisableCompression { *Cmd : "<1B>*b0M" } +*OutputDataFormat: H_BYTE +*OptimizeLeftBound?: TRUE +*CursorXAfterSendBlockData: AT_GRXDATA_ORIGIN +*CursorYAfterSendBlockData: AUTO_INCREMENT + +*DefaultFont: 136 +*DefaultCTT: 0 +*CharPosition: BASELINE +*TTFSEnabled?: TRUE +*DeviceFonts: LIST(134,135,136,137,138,139,140,146,147,148,149,150,151,152,153,154, ++ 155,156,157,164,165,166,196,197,198,199,200,201,202,203,209,210, ++ 211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226, ++ 227,228,229,230) + +*MinFontID: 16534 +*MaxFontID: 32768 +*FontFormat: HPPCL_OUTLINE +*% When the %f format is implemented we can remove the /100 part of +*% CmdSelectFontHeight and CmdSelectFontWidth +*% NOTE: MasterUnits.x is hardcoded here! +*% NOTE: THIS dividing by 200 because I want to /100 and then /2 for now. +*% The number 60000 may look strange, but it's 1200/2 * 100. +*Command: CmdSelectFontHeight { *Cmd : "<1B>(s" %d{FontHeight}"V" } +*Command: CmdSelectFontWidth { *Cmd : "<1B>(s" %f{1200 / FontWidth}"H" } +*Command: CmdSetFontID { *Cmd : "<1B>*c" %d{NextFontID}"D" } +*Command: CmdSelectFontID { *Cmd : "<1B>(" %d{CurrentFontID}"X" } +*Command: CmdSetCharCode { *Cmd : "<1B>*c" %d{NextGlyph}"E" } +*Command: CmdUnderlineOn { *Cmd : "<1B>&dD" } +*Command: CmdUnderlineOff { *Cmd : "<1B>&d@" } +*Command: CmdWhiteTextOn { *Cmd : "<1B>*v1o1T" } +*Command: CmdWhiteTextOff { *Cmd : "<1B>*v0o0T" } +*MinGrayFill: 1 +*MaxGrayFill: 100 +*Command: CmdSetRectWidth { *Cmd : "<1B>*c" %d{(RectXSize / 4) }"A" } +*Command: CmdSetRectHeight { *Cmd : "<1B>*c" %d{(RectYSize / 4) }"B" } +*Command: CmdRectGrayFill { *Cmd : "<1B>*c" %d{GrayPercentage }"g2P" } +*Command: CmdRectWhiteFill { *Cmd : "<1B>*c1P" } +*Command: CmdRectBlackFill { *Cmd : "<1B>*c0P" } diff --git a/print/OEM Printer Customization Plug-in Samples/C++/custhlp.ini b/print/OEM Printer Customization Plug-in Samples/C++/custhlp.ini new file mode 100644 index 00000000..2e014201 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/custhlp.ini @@ -0,0 +1,3 @@ +[OEMFiles] +OEMConfigFile1=CUSTHLP.DLL + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/custhlp/CUSTHLP.def b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/CUSTHLP.def new file mode 100644 index 00000000..68bdffc0 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/CUSTHLP.def @@ -0,0 +1,3 @@ +LIBRARY OEMUI +EXPORTS DllGetClassObject PRIVATE + DllCanUnloadNow PRIVATE
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/custhlp/CUSTHLP.vcxproj b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/CUSTHLP.vcxproj new file mode 100644 index 00000000..60f17f4c --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/CUSTHLP.vcxproj @@ -0,0 +1,1060 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Win10 Debug|ARM64"> + <Configuration>Win10 Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|Win32"> + <Configuration>Win10 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|x64"> + <Configuration>Win10 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|ARM64"> + <Configuration>Win10 Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|Win32"> + <Configuration>Win10 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|x64"> + <Configuration>Win10 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|Win32"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|Win32"> + <Configuration>Win8 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|Win32"> + <Configuration>Win7 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|Win32"> + <Configuration>Win8.1 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|Win32"> + <Configuration>Win8 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|Win32"> + <Configuration>Win7 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|x64"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|x64"> + <Configuration>Win8 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|x64"> + <Configuration>Win7 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|x64"> + <Configuration>Win8.1 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|x64"> + <Configuration>Win8 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|x64"> + <Configuration>Win7 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{CA70C64A-75C8-48CD-9224-335C2ED689A6}</ProjectGuid> + <RootNamespace>$(MSBuildProjectName)</RootNamespace> + <Configuration Condition="'$(Configuration)' == ''">Win10 Debug</Configuration> + <Platform Condition="'$(Platform)' == ''">Win32</Platform> + <SampleGuid>{67281069-E045-4DCB-82BF-17B46979B788}</SampleGuid> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <PropertyGroup> + <OutDir>$(IntDir)</OutDir> + </PropertyGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ItemGroup Label="WrappedTaskItems" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetName>CUSTHLP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetName>CUSTHLP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetName>CUSTHLP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <TargetName>CUSTHLP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <TargetName>CUSTHLP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetName>CUSTHLP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetName>CUSTHLP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetName>CUSTHLP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <TargetName>CUSTHLP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <TargetName>CUSTHLP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetName>CUSTHLP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetName>CUSTHLP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetName>CUSTHLP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <TargetName>CUSTHLP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetName>CUSTHLP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetName>CUSTHLP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetName>CUSTHLP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <TargetName>CUSTHLP</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>CUSTHLP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>CUSTHLP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>CUSTHLP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>CUSTHLP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>CUSTHLP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>CUSTHLP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>CUSTHLP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>CUSTHLP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>CUSTHLP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>CUSTHLP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>CUSTHLP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>CUSTHLP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>CUSTHLP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>CUSTHLP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>CUSTHLP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>CUSTHLP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>CUSTHLP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>CUSTHLP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="devmode.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="dllentry.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="globals.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="oemui.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Create</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ResourceCompile Include="oemui.rc" /> + </ItemGroup> + <ItemGroup> + <Inf Exclude="@(Inf)" Include="*.inf" /> + <FilesToPackage Include="$(TargetPath)" Condition="'$(ConfigurationType)'=='Driver' or '$(ConfigurationType)'=='DynamicLibrary'" /> + </ItemGroup> + <ItemGroup> + <None Exclude="@(None)" Include="*.txt;*.htm;*.html" /> + <None Exclude="@(None)" Include="*.ico;*.cur;*.bmp;*.dlg;*.rct;*.gif;*.jpg;*.jpeg;*.wav;*.jpe;*.tiff;*.tif;*.png;*.rc2" /> + <None Exclude="@(None)" Include="*.def;*.bat;*.hpj;*.asmx" /> + </ItemGroup> + <ItemGroup> + <ClInclude Exclude="@(ClInclude)" Include="*.h;*.hpp;*.hxx;*.hm;*.inl;*.xsd" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/custhlp/CUSTHLP.vcxproj.Filters b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/CUSTHLP.vcxproj.Filters new file mode 100644 index 00000000..4c89a16e --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/CUSTHLP.vcxproj.Filters @@ -0,0 +1,220 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;*</Extensions> + <UniqueIdentifier>{C7019300-D308-4256-B5E7-2CF8880D9E37}</UniqueIdentifier> + </Filter> + <Filter Include="Header Files"> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + <UniqueIdentifier>{8C99BD7D-E931-4BC0-810B-E56E2CE71883}</UniqueIdentifier> + </Filter> + <Filter Include="Resource Files"> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms;man;xml</Extensions> + <UniqueIdentifier>{B8E59174-9E39-4E27-A90D-17A011B16729}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClCompile Include="devmode.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="dllentry.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="globals.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="oemui.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="oemui.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> + <ItemGroup> + <None Include="CUSTHLP.def"> + <Filter>Source Files</Filter> + </None> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/custhlp/customhelp/customdrv.cnt b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/customhelp/customdrv.cnt new file mode 100644 index 00000000..4713a3b5 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/customhelp/customdrv.cnt @@ -0,0 +1,3 @@ +:Base windows.HLP +1 Dialog Box Help +2 Information about this Help file=nocontent diff --git a/print/OEM Printer Customization Plug-in Samples/C++/custhlp/customhelp/customdrv.h b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/customhelp/customdrv.h new file mode 100644 index 00000000..f49cbd14 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/customhelp/customdrv.h @@ -0,0 +1,11 @@ +// +// +// +// +////////////////////////////////////////////////////////////////// + +#define CUSDRV_HELPTOPIC_1 = 15001 +#define CUSDRV_HELPTOPIC_2 = 15002 +#define CUSDRV_HELPTOPIC_3 = 15003 +#define CUSDRV_HELPTOPIC_4 = 15004 + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/custhlp/customhelp/customdrv.hpj b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/customhelp/customdrv.hpj new file mode 100644 index 00000000..2ccc18db --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/customhelp/customdrv.hpj @@ -0,0 +1,17 @@ +; This file is maintained by HCW. Do not modify this file directly. + +[OPTIONS] +COMPRESS=12 Hall Zeck +ERRORLOG=customdrv.err +LCID=0x409 0x0 0x0 ; English (United States) +REPORT=Yes +TITLE=Windows +CNT=customdrv.cnt +COPYRIGHT=%date +HLP=customdrv.hlp + +[FILES] +customdrv.rtf + +[MAP] +#include customdrv.h diff --git a/print/OEM Printer Customization Plug-in Samples/C++/custhlp/customhelp/customdrv.rtf b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/customhelp/customdrv.rtf new file mode 100644 index 00000000..5ddf4b0e --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/customhelp/customdrv.rtf @@ -0,0 +1,22 @@ +{\rtf1\ansi\ansicpg1252\uc1 \deff0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\f30\froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} +{\f31\froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\f33\froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\f34\froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\f35\froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\f36\froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\f37\froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}}{\colortbl;\red0\green0\blue0; +\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128; +\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 Normal;} +{\*\cs10 \additive Default Paragraph Font;}{\s15\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext15 endnote text;}{ +\s16\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext16 footnote text;}{\*\cs17 \additive \super \sbasedon10 footnote reference;}{\*\cs18 \additive \super +\sbasedon10 endnote reference;}{\*\cs19 \additive \fs16\cf0\up6 \sbasedon10 ExternalFN;}{\s20\ql \li0\ri0\widctlpar\tqc\tx4320\tqr\tx8640\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext20 header;}{\s21\ql \li0\ri0\widctlpar\tqc\tx4320\tqr\tx8640\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext21 footer;}}{\info{\author Craig Horsfield} +{\operator Craig Horsfield}{\creatim\yr2001\mo2\dy27\hr15\min6}{\revtim\yr2001\mo4\dy2\hr15\min7}{\version5}{\edmins3}{\nofpages3}{\nofwords17}{\nofchars100}{\*\company Microsoft}{\nofcharsws0}{\vern8269}} +\widowctrl\ftnbj\aendnotes\ftnnrlc\aftnnar\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\horzdoc\dghspace120\dgvspace120\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale144\viewzk2\nolnhtadjtbl \fet0\sectd +\linex0\sectdefaultcl {\header \pard\plain \s20\ql \li0\ri0\widctlpar\tqc\tx4320\tqr\tx8640\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 { +\par }}{\footer \pard\plain \s21\ql \li0\ri0\widctlpar\tqc\tx4320\tqr\tx8640\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 { +\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}} +{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8 +\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\cs19\fs16\up6 @{\footnote \pard\plain \s16\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\cs17\super @}{ + The following topics are for Custom options in the Custom Driver UI Plugin.}} #{\footnote \pard\plain \s16\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\cs17\super #}{ + CUSDRV_HELPTOPIC_1}}}{ Custom Topic 1 Help text contained in customdrv.rtf. +\par }\pard \ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 {\page }{\cs19\fs16\up6 #{\footnote \pard\plain \s16\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\cs17\super #}{ + CUSDRV_HELPTOPIC_2}}}{ Custom Topic 2 Help text contained in customdrv.rtf. }{\fs20 \page }{ +\par }}
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/custhlp/debug.h b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/debug.h new file mode 100644 index 00000000..0414569c --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/debug.h @@ -0,0 +1,82 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1996 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Debug.H +// +// PURPOSE: Define common data types, and external function prototypes +// for debugging functions. Also defines the various debug macros. +// +// + +#pragma once + +///////////////////////////////////////////////////////// +// Macros +///////////////////////////////////////////////////////// +// +// These macros are used for debugging purposes. They expand +// to white spaces on a free build. Here is a brief description +// of what they do and how they are used: +// +// giDebugLevel +// Global variable which set the current debug level to control +// the amount of debug messages emitted. +// +// WARNING(msg) +// Display a message if the current debug level is <= DBG_WARNING. +// The message format is: WRN filename (linenumber): message +// +// ERR(msg) +// Similiar to WARNING macro above - displays a message +// if the current debug level is <= DBG_ERROR. +// +// ASSERT(cond) +// Verify a condition is true. If not, force a breakpoint. +// +// RIP(msg) +// Display a message and force a breakpoint. +// +// Usage: +// WARNING("App passed NULL pointer, ignoring...\n"); +// + +#define DBG_VERBOSE 0 +#define DBG_WARNING 1 +#define DBG_ERROR 2 +#define DBG_NONE 3 + +// VC and Build use different debug defines. +#if defined (DBG) || defined (_DEBUG) + + // __declspec(selectany) ensures that even if this is defined in multiple compilation + // modules, they will all resolve to the same symbol in the linked DLL + __declspec(selectany) INT giDebugLevel = 2; + + #define STRINGIZE(x) #x + #define QUOTE(x) STRINGIZE(x) + #define FILE_AND_LINE __FILE__ "@" QUOTE(__LINE__) + + #define VERBOSE(msg) { if(giDebugLevel <= DBG_VERBOSE) OutputDebugStringA( FILE_AND_LINE ": " msg); } + #define WARNING(msg) { if(giDebugLevel <= DBG_WARNING) OutputDebugStringA( FILE_AND_LINE ": Warning: " msg); } + #define ERR(msg) { if(giDebugLevel <= DBG_ERROR) OutputDebugStringA(FILE_AND_LINE ": Error:" msg); } + #define ASSERT(cond) { if (!(cond)) RIP("\n"); } + #define RIP(msg) { OutputDebugStringA(FILE_AND_LINE ": Error (not recoverable): " msg); DebugBreak(); } + +#else // !DBG + + #define VERBOSE(msg) + #define WARNING(msg) + #define ERR(msg) + #define ASSERT(cond) + #define RIP(msg) + +#endif + + + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/custhlp/devmode.cpp b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/devmode.cpp new file mode 100644 index 00000000..8dae1ed3 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/devmode.cpp @@ -0,0 +1,182 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Devmode.cpp +// +// PURPOSE: Implementation of Devmode functions shared with OEM UI and OEM rendering modules. +// + + +#include "precomp.h" +#include "oemui.h" +#include "debug.h" +#include "devmode.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +// +//Performs operation on UI Plugins Private DevMode Members. +//Called via IOemUI::DevMode +// + +HRESULT hrOEMDevMode(DWORD dwMode, POEMDMPARAM pOemDMParam) +{ + POEMDEV pOEMDevIn; + POEMDEV pOEMDevOut; + + + // Verify parameters. + if( (NULL == pOemDMParam) + || + ( (OEMDM_SIZE != dwMode) + && + (OEMDM_DEFAULT != dwMode) + && + (OEMDM_CONVERT != dwMode) + && + (OEMDM_MERGE != dwMode) + ) + ) + { + ERR("DevMode() ERROR_INVALID_PARAMETER.\r\n"); + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Cast generic (i.e. PVOID) to OEM private devomode pointer type. + pOEMDevIn = (POEMDEV) pOemDMParam->pOEMDMIn; + pOEMDevOut = (POEMDEV) pOemDMParam->pOEMDMOut; + + switch(dwMode) + { + // + //The Method should return the size of the memory allocation needed to store the UI plugin Private DEVMODE. + // + case OEMDM_SIZE: + pOemDMParam->cbBufSize = sizeof(OEMDEV); + break; + + // + //Should fill the Private DEVMODE with the default values. + // + case OEMDM_DEFAULT: + // + //OEM_DMEXTRAHEADER Members + // + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + + // + //Private members + // + pOEMDevOut->dwDriverData = 0; + pOEMDevOut->dwAdvancedData = 0; + break; + + // + //The method should convert private DEVMODE members to the current version, if necessary. + // + case OEMDM_CONVERT: + ConvertOEMDevmode(pOEMDevIn, pOEMDevOut); + break; + + // + //The method should validate the information contained in private DEVMODE members and merge validated values into a private DEVMODE structure containing default values + // + case OEMDM_MERGE: + ConvertOEMDevmode(pOEMDevIn, pOEMDevOut); + MakeOEMDevmodeValid(pOEMDevOut); + break; + } + + return S_OK; +} + + +BOOL ConvertOEMDevmode(PCOEMDEV pOEMDevIn, POEMDEV pOEMDevOut) +{ + if( (NULL == pOEMDevIn) + || + (NULL == pOEMDevOut) + ) + { + ERR("ConvertOEMDevmode() invalid parameters.\r\n"); + return FALSE; + } + + // Check OEM Signature, if it doesn't match ours, + // then just assume DMIn is bad and use defaults. + if(pOEMDevIn->dmOEMExtra.dwSignature == pOEMDevOut->dmOEMExtra.dwSignature) + { + // Set the devmode defaults so that anything the isn't copied over will + // be set to the default value. + pOEMDevOut->dwDriverData = 0; + pOEMDevOut->dwAdvancedData = 0; + + // Copy the old structure in to the new using which ever size is the smaller. + // Devmode maybe from newer Devmode (not likely since there is only one), or + // Devmode maybe a newer Devmode, in which case it maybe larger, + // but the first part of the structure should be the same. + + // DESIGN ASSUMPTION: the private DEVMODE structure only gets added to; + // the fields that are in the DEVMODE never change only new fields get added to the end. + + memcpy(pOEMDevOut, pOEMDevIn, __min(pOEMDevOut->dmOEMExtra.dwSize, pOEMDevIn->dmOEMExtra.dwSize)); + + // Re-fill in the size and version fields to indicated + // that the DEVMODE is the current private DEVMODE version. + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + } + else + { + WARNING("Unknown DEVMODE signature, pOEMDMIn ignored.\r\n"); + + // Don't know what the input DEVMODE is, so just use defaults. + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + pOEMDevOut->dwDriverData = 0; + pOEMDevOut->dwAdvancedData = 0; + } + + return TRUE; +} + + +BOOL MakeOEMDevmodeValid(POEMDEV pOEMDevmode) +{ + if(NULL == pOEMDevmode) + { + return FALSE; + } + + // ASSUMPTION: pOEMDevmode is large enough to contain OEMDEV structure. + + // Make sure that dmOEMExtra indicates the current OEMDEV structure. + pOEMDevmode->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevmode->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevmode->dmOEMExtra.dwVersion = OEM_VERSION; + + // Set driver data, if not valid. + if(pOEMDevmode->dwDriverData > 100) + { + pOEMDevmode->dwDriverData = 0; + } + + // Set Advanced driver data, if not valid. + if(pOEMDevmode->dwAdvancedData > 100) + { + pOEMDevmode->dwAdvancedData = 0; + } + + return TRUE; +} + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/custhlp/devmode.h b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/devmode.h new file mode 100644 index 00000000..fe594658 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/devmode.h @@ -0,0 +1,46 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Devmode.h +// +// PURPOSE: The plug-in private devmode, common data types, and +// external function prototypes for devmode functions. +// + +#pragma once + + +// +//Can add info to the private devmode bellow here. +//Note : +// This structure must be prefixed by OEM_DMEXTRAHEADER +// Your plug-in must implement the IPrintOemUI::DevMode method +// +typedef struct tagOEMDEV +{ + OEM_DMEXTRAHEADER dmOEMExtra; + DWORD dwDriverData; + DWORD dwAdvancedData; + + // + //Private DevMode Members + // + +} OEMDEV, *POEMDEV; + +typedef const OEMDEV *PCOEMDEV; + + +///////////////////////////////////////////////////////// +// ProtoTypes +///////////////////////////////////////////////////////// + +HRESULT hrOEMDevMode(DWORD dwMode, POEMDMPARAM pOemDMParam); +BOOL ConvertOEMDevmode(PCOEMDEV pOEMDevIn, POEMDEV pOEMDevOut); +BOOL MakeOEMDevmodeValid(POEMDEV pOEMDevmode); + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/custhlp/dllentry.cpp b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/dllentry.cpp new file mode 100644 index 00000000..287c0617 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/dllentry.cpp @@ -0,0 +1,49 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: dllentry.cpp +// +// +// PURPOSE: Source module for DLL entry function(s). +// + +#include "precomp.h" +#include "oemui.h" +#include "debug.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +/////////////////////////////////////////////////////////// +// +// DLL entry point +// +BOOL WINAPI DllMain(HINSTANCE hInst, WORD wReason, LPVOID lpReserved) +{ + UNREFERENCED_PARAMETER(lpReserved); + + switch(wReason) + { + case DLL_PROCESS_ATTACH: + ghInstance = hInst; + break; + + case DLL_THREAD_ATTACH: + break; + + case DLL_PROCESS_DETACH: + break; + + case DLL_THREAD_DETACH: + break; + } + + return TRUE; +} + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/custhlp/globals.cpp b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/globals.cpp new file mode 100644 index 00000000..c41a27e4 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/globals.cpp @@ -0,0 +1,25 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Globals.cpp +// +// +// PURPOSE: File that contains all the globals. +// + +#include "precomp.h" +#include "oemui.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +/////////////////////////////////////// +// Globals +/////////////////////////////////////// + +// Module's Instance handle from DLLEntry of process. +HINSTANCE ghInstance = NULL; diff --git a/print/OEM Printer Customization Plug-in Samples/C++/custhlp/globals.h b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/globals.h new file mode 100644 index 00000000..b9d707a0 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/globals.h @@ -0,0 +1,22 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Globals.h +// +// PURPOSE: Lists of globals declared in Globals.cpp. +// + + +#pragma once + +/////////////////////////////////////// +// Globals +/////////////////////////////////////// + +// Module's Instance handle from DLLEntry of process. +extern HINSTANCE ghInstance; + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/custhlp/intrface.cpp b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/intrface.cpp new file mode 100644 index 00000000..2a1278cc --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/intrface.cpp @@ -0,0 +1,562 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: intrface.cpp +// +// PURPOSE: Implementation of OEMGetInfo and OEMDevMode. Shared by all Unidrv +// OEM test dll's. +// + +#include "precomp.h" + +#include "oemui.h" +#include "debug.h" +#include "intrface.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +//////////////////////////////////////////////////////// +// Internal Globals +//////////////////////////////////////////////////////// + +static long g_cComponents = 0; // Count of active components +static long g_cServerLocks = 0; // Count of locks + + +//////////////////////////////////////////////////////////////////////////////// +// +// IOemUI body +// +IOemUI::~IOemUI() +{ + // Make sure that helper interface is released. + if(NULL != m_pOEMHelp) + { + m_pOEMHelp->Release(); + m_pOEMHelp = NULL; + } + + // If this instance of the object is being deleted, then the reference + // count should be zero. + ASSERT(0 == m_cRef); +} + +HRESULT __stdcall IOemUI::QueryInterface(const IID& iid, void** ppv) +{ + if (iid == IID_IUnknown) + { + *ppv = static_cast<IUnknown*>(this); + } + else if (iid == IID_IPrintOemUI) + { + *ppv = static_cast<IPrintOemUI*>(this); + } + else + { + *ppv = NULL; + return E_NOINTERFACE; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef(); + return S_OK; +} + +ULONG __stdcall IOemUI::AddRef() +{ + return InterlockedIncrement(&m_cRef); +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall IOemUI::Release() +{ + ASSERT( 0 != m_cRef); + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + + } + return cRef; +} + +// +// (Implementation is required) Supplies a pointer to UNIDRIVE /PScript IPrintOemDriverUI +// +HRESULT __stdcall IOemUI::PublishDriverInterface( + IUnknown *pIUnknown) +{ + // Need to store pointer to Driver Helper functions, if we already haven't. + if (m_pOEMHelp == NULL) + { + HRESULT hResult; + + + // Get Interface to Helper Functions. + hResult = pIUnknown->QueryInterface(IID_IPrintOemDriverUI, (void** ) &(m_pOEMHelp)); + + if(!SUCCEEDED(hResult)) + { + // Make sure that interface pointer reflects interface query failure. + m_pOEMHelp = NULL; + + return E_FAIL; + } + } + + return S_OK; +} + +// +//(Implementation is required) Returns the UI Plugin's identification information +// +HRESULT __stdcall IOemUI::GetInfo( + DWORD dwMode, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded) +{ + // Validate parameters. + if( (NULL == pcbNeeded) + || + ( (OEMGI_GETSIGNATURE != dwMode) + && + (OEMGI_GETVERSION != dwMode) + && + (OEMGI_GETPUBLISHERINFO != dwMode) + ) + ) + { + WARNING("IOemUI::GetInfo() exit pcbNeeded is NULL! ERROR_INVALID_PARAMETER\r\r\n"); + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Set expected buffer size and number of bytes written. + *pcbNeeded = sizeof(DWORD); + + // Check buffer size is sufficient. + if((cbSize < *pcbNeeded) || (NULL == pBuffer)) + { + WARNING("IOemUI::GetInfo() exit insufficient buffer!\r\r\n"); + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return E_FAIL; + } + + switch(dwMode) + { + // OEM DLL Signature + case OEMGI_GETSIGNATURE: + *(PDWORD)pBuffer = OEM_SIGNATURE; + break; + + // OEM DLL version + case OEMGI_GETVERSION: + *(PDWORD)pBuffer = OEM_VERSION; + break; + + // dwMode not supported. + default: + // Set written bytes to zero since nothing was written. + WARNING("IOemUI::GetInfo() exit mode not supported.\r\r\n"); + *pcbNeeded = 0; + SetLastError(ERROR_NOT_SUPPORTED); + return E_FAIL; + } + + return S_OK; +} + + +// +//Performs operation on UI Plugins Private DevMode Members. +// +HRESULT __stdcall IOemUI::DevMode( + DWORD dwMode, + POEMDMPARAM pOemDMParam) +{ + return hrOEMDevMode(dwMode, pOemDMParam); +} + + +// +//Allows UI Plugin to Modifiy Existing printer porp sheet and document property sheet page.. +// +HRESULT __stdcall IOemUI::CommonUIProp( + DWORD dwMode, + POEMCUIPPARAM pOemCUIPParam) +{ + return hrOEMPropertyPage(dwMode, pOemCUIPParam); +} + + +// +//Adds a New page to the device Documment property sheet. +// + +HRESULT __stdcall IOemUI::DocumentPropertySheets( + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam) +{ + return hrOEMDocumentPropertySheets(pPSUIInfo, lParam, m_pOEMHelp); +} + +// +//Adds a New page to the device printer property page. +// +HRESULT __stdcall IOemUI::DevicePropertySheets( + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam) +{ + return hrOEMDevicePropertySheets(pPSUIInfo, lParam); +} + + +// +//Allows the UI plugin to spec Customized device capabilaties (TODO) +// +HRESULT __stdcall IOemUI::DeviceCapabilities( + POEMUIOBJ poemuiobj, + HANDLE hPrinter, + _In_ PWSTR pDeviceName, + WORD wCapability, + PVOID pOutput, + PDEVMODE pPublicDM, + PVOID pOEMDM, + DWORD dwOld, + DWORD *dwResult) +{ + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(pDeviceName); + UNREFERENCED_PARAMETER(wCapability); + UNREFERENCED_PARAMETER(pOutput); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + UNREFERENCED_PARAMETER(dwOld); + UNREFERENCED_PARAMETER(dwResult); + + return E_NOTIMPL; +} + + +// +//Allows the UI plugin to help determine if a print Job is printable. +// +HRESULT __stdcall IOemUI::DevQueryPrintEx( + POEMUIOBJ poemuiobj, + PDEVQUERYPRINT_INFO pDQPInfo, + PDEVMODE pPublicDM, + PVOID pOEMDM) +{ + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(pDQPInfo); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + + return E_NOTIMPL; +} + + +// +//Allows the UI Plugin to upgrade its dev options stored in the registry. +// +HRESULT __stdcall IOemUI::UpgradePrinter( + DWORD dwLevel, + PBYTE pDriverUpgradeInfo) +{ + UNREFERENCED_PARAMETER(dwLevel); + UNREFERENCED_PARAMETER(pDriverUpgradeInfo); + + return E_NOTIMPL; +} + +HRESULT __stdcall IOemUI::PrinterEvent( + _In_ PWSTR pPrinterName, + INT iDriverEvent, + DWORD dwFlags, + LPARAM lParam) +{ + UNREFERENCED_PARAMETER(pPrinterName); + UNREFERENCED_PARAMETER(iDriverEvent); + UNREFERENCED_PARAMETER(dwFlags); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +} + +HRESULT __stdcall IOemUI::DriverEvent( + DWORD dwDriverEvent, + DWORD dwLevel, + LPBYTE pDriverInfo, + LPARAM lParam) +{ + UNREFERENCED_PARAMETER(dwDriverEvent); + UNREFERENCED_PARAMETER(dwLevel); + UNREFERENCED_PARAMETER(pDriverInfo); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +}; + + +HRESULT __stdcall IOemUI::QueryColorProfile( + HANDLE hPrinter, + POEMUIOBJ poemuiobj, + PDEVMODE pPublicDM, + PVOID pOEMDM, + ULONG ulQueryMode, + VOID *pvProfileData, + ULONG *pcbProfileData, + FLONG *pflProfileData) +{ + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + + HRESULT Result = E_FAIL; + static const WCHAR PROFILE_NAME[] = L"OEMPROFILE.icm\0"; + + if(QCP_DEVICEPROFILE == ulQueryMode) + { + if(NULL == pvProfileData) + { + *pcbProfileData = sizeof(PROFILE_NAME); + SetLastError(ERROR_INSUFFICIENT_BUFFER); + } + else + { + if(*pcbProfileData < sizeof(PROFILE_NAME)) + { + *pcbProfileData = sizeof(PROFILE_NAME); + SetLastError(ERROR_INSUFFICIENT_BUFFER); + } + else + { + Result = StringCbCopy((LPWSTR)pvProfileData, *pcbProfileData, PROFILE_NAME); + *pcbProfileData = sizeof(PROFILE_NAME); + *pflProfileData = QCP_PROFILEDISK; + + if(FAILED(Result)) + { + SetLastError(Result); + } + } + } + } + + return Result; +}; + +HRESULT __stdcall IOemUI::FontInstallerDlgProc( + HWND hWnd, + UINT usMsg, + WPARAM wParam, + LPARAM lParam) +{ + UNREFERENCED_PARAMETER(hWnd); + UNREFERENCED_PARAMETER(usMsg); + UNREFERENCED_PARAMETER(wParam); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +}; + +HRESULT __stdcall IOemUI::UpdateExternalFonts( + HANDLE hPrinter, + HANDLE hHeap, + _In_ PWSTR pwstrCartridges) +{ + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(hHeap); + UNREFERENCED_PARAMETER(pwstrCartridges); + + return E_NOTIMPL; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// oem class factory +// +class IOemCF : public IClassFactory +{ +public: + // *** IUnknown methods *** + + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release) (THIS); + + // *** IClassFactory methods *** + STDMETHOD(CreateInstance) (THIS_ + LPUNKNOWN pUnkOuter, + REFIID riid, + LPVOID FAR* ppvObject); + STDMETHOD(LockServer) (THIS_ BOOL bLock); + + + // Constructor + IOemCF(): m_cRef(1) { }; + ~IOemCF() { }; + +protected: + LONG m_cRef; + +}; + +/////////////////////////////////////////////////////////// +// +// Class factory body +// +HRESULT __stdcall IOemCF::QueryInterface(const IID& iid, void** ppv) +{ + if ((iid == IID_IUnknown) || (iid == IID_IClassFactory)) + { + *ppv = static_cast<IOemCF*>(this); + } + else + { + *ppv = NULL; + return E_NOINTERFACE; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef(); + return S_OK; +} + +ULONG __stdcall IOemCF::AddRef() +{ + return InterlockedIncrement(&m_cRef); +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall IOemCF::Release() +{ + ASSERT( 0 != m_cRef); + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + + } + return cRef; +} + +// IClassFactory implementation +HRESULT __stdcall IOemCF::CreateInstance(IUnknown* pUnknownOuter, + const IID& iid, + void** ppv) +{ + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Cannot aggregate. + if (pUnknownOuter != NULL) + { + return CLASS_E_NOAGGREGATION; + } + + // Create component. + IOemUI* pOemCB = new IOemUI; + if (pOemCB == NULL) + { + return E_OUTOFMEMORY; + } + // Get the requested interface. + HRESULT hr = pOemCB->QueryInterface(iid, ppv); + + // Release the IUnknown pointer. + // (If QueryInterface failed, component will delete itself.) + pOemCB->Release(); + return hr; +} + +HRESULT __stdcall IOemCF::LockServer(BOOL bLock) +{ + if (bLock) + { + InterlockedIncrement(&g_cServerLocks); + } + else + { + InterlockedDecrement(&g_cServerLocks); + } + return S_OK; +} + +/////////////////////////////////////////////////////////// +// +// Exported functions +// + + +// Can DLL unload now? +// +STDAPI DllCanUnloadNow() +{ + // + // To avoid leaving OEM DLL still in memory when Unidrv or Pscript drivers + // are unloaded, Unidrv and Pscript driver ignore the return value of + // DllCanUnloadNow of the OEM DLL, and always call FreeLibrary on the OEMDLL. + // + // If OEM DLL spins off a working thread that also uses the OEM DLL, the + // thread needs to call LoadLibrary and FreeLibraryAndExitThread, otherwise + // it may crash after Unidrv or Pscript calls FreeLibrary. + // + + if ((g_cComponents == 0) && (g_cServerLocks == 0)) + { + return S_OK; + } + else + { + return S_FALSE; + } +} + +// +// Get class factory +// +STDAPI DllGetClassObject( + _In_ REFCLSID clsid, + _In_ REFIID iid, + _Outptr_ LPVOID* ppv) +{ + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Can we create this component? + if (clsid != CLSID_OEMUI) + { + return CLASS_E_CLASSNOTAVAILABLE; + } + + // Create class factory. + IOemCF* pFontCF = new IOemCF; // Reference count set to 1 + // in constructor + if (pFontCF == NULL) + { + return E_OUTOFMEMORY; + } + + // Get requested interface. + HRESULT hr = pFontCF->QueryInterface(iid, ppv); + pFontCF->Release(); + + return hr; +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/custhlp/intrface.h b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/intrface.h new file mode 100644 index 00000000..1cc44e3a --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/intrface.h @@ -0,0 +1,182 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: intrface.h +// +// PURPOSE: Declaration of class that implements the UI plug-in class +// + + +#pragma once + +//////////////////////////////////////////////////////////////////////////////// +// +// IOemUI +// +class IOemUI: public IPrintOemUI +{ +public: + // *** IUnknown methods *** + + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release) (THIS); + + // *** IPrintOemUI methods *** + + // + // Method for publishing Driver interface. + // + STDMETHOD(PublishDriverInterface)(THIS_ IUnknown *pIUnknown); + + // + // Get OEM dll related information + // + + STDMETHOD(GetInfo) (THIS_ DWORD dwMode, PVOID pBuffer, DWORD cbSize, + PDWORD pcbNeeded); + + // + // OEMDevMode + // + + STDMETHOD(DevMode) (THIS_ DWORD dwMode, POEMDMPARAM pOemDMParam) ; + + // + // OEMCommonUIProp + // + + STDMETHOD(CommonUIProp) (THIS_ + DWORD dwMode, + POEMCUIPPARAM pOemCUIPParam + ); + + // + // OEMDocumentPropertySheets + // + + STDMETHOD(DocumentPropertySheets) (THIS_ + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam + ); + + // + // OEMDevicePropertySheets + // + + STDMETHOD(DevicePropertySheets) (THIS_ + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam + ); + + + // + // OEMDevQueryPrintEx + // + + STDMETHOD(DevQueryPrintEx) (THIS_ + POEMUIOBJ poemuiobj, + PDEVQUERYPRINT_INFO pDQPInfo, + PDEVMODE pPublicDM, + PVOID pOEMDM + ); + + // + // OEMDeviceCapabilities + // + + STDMETHOD(DeviceCapabilities) (THIS_ + POEMUIOBJ poemuiobj, + HANDLE hPrinter, + _In_ PWSTR pDeviceName, + WORD wCapability, + PVOID pOutput, + PDEVMODE pPublicDM, + PVOID pOEMDM, + DWORD dwOld, + DWORD *dwResult + ); + + // + // OEMUpgradePrinter + // + + STDMETHOD(UpgradePrinter) (THIS_ + DWORD dwLevel, + PBYTE pDriverUpgradeInfo + ); + + // + // OEMPrinterEvent + // + + STDMETHOD(PrinterEvent) (THIS_ + _In_ PWSTR pPrinterName, + INT iDriverEvent, + DWORD dwFlags, + LPARAM lParam + ); + + // + // OEMDriverEvent + // + + STDMETHOD(DriverEvent)(THIS_ + DWORD dwDriverEvent, + DWORD dwLevel, + LPBYTE pDriverInfo, + LPARAM lParam + ); + + // + // OEMQueryColorProfile + // + + STDMETHOD(QueryColorProfile) (THIS_ + HANDLE hPrinter, + POEMUIOBJ poemuiobj, + PDEVMODE pPublicDM, + PVOID pOEMDM, + ULONG ulReserved, + VOID *pvProfileData, + ULONG *pcbProfileData, + FLONG *pflProfileData); + + // + // OEMFontInstallerDlgProc + // + + STDMETHOD(FontInstallerDlgProc) (THIS_ + HWND hWnd, + UINT usMsg, + WPARAM wParam, + LPARAM lParam + ); + // + // UpdateExternalFonts + // + + STDMETHOD(UpdateExternalFonts) (THIS_ + HANDLE hPrinter, + HANDLE hHeap, + _In_ PWSTR pwstrCartridges + ); + + + IOemUI() { m_cRef = 1; m_pOEMHelp = NULL; }; + ~IOemUI(); + +protected: + LONG m_cRef; + IPrintOemDriverUI* m_pOEMHelp; +}; + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/custhlp/oemui.cpp b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/oemui.cpp new file mode 100644 index 00000000..2bc8cc32 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/oemui.cpp @@ -0,0 +1,960 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: OEMUI.cpp +// +// +// PURPOSE: Main file for OEM UI test module. +// + +#include "precomp.h" +#include "resource.h" +#include "debug.h" +#include "oemui.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +//////////////////////////////////////////////////////// +// INTERNAL MACROS and DEFINES +//////////////////////////////////////////////////////// + +typedef struct _tagCBUserData +{ + HANDLE hComPropSheet; + HANDLE hPropPage; + POEMUIPSPARAM pOEMUIParam; + PFNCOMPROPSHEET pfnComPropSheet; + +} CBUSERDATA, *PCBUSERDATA; + + +//////////////////////////////////////////////////////// +// INTERNAL PROTOTYPES +//////////////////////////////////////////////////////// + +static HRESULT hrDocumentPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam); +static HRESULT hrPrinterPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam); +LONG APIENTRY OEMPrinterUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam); +LONG APIENTRY OEMDocUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam); +LONG APIENTRY OEMDocUICallBack2(PCPSUICBPARAM pCallbackParam); +INT_PTR CALLBACK DevicePropPageProc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam); +static BOOL AddCustomUIHelp (HANDLE hPrinter, HANDLE hHeap, HANDLE hModule, POPTITEM pOptItem, DWORD HelpIndex, DWORD HelpFile); +static POIEXT CreateOIExt(HANDLE hHeap); +static POPTITEM CreateOptItems(HANDLE hHeap, DWORD dwOptItems); +static void InitOptItems(POPTITEM pOptItems, DWORD dwOptItems); +static POPTTYPE CreateOptType(HANDLE hHeap, WORD wOptParams); +static PTSTR GetHelpFile (HANDLE hPrinter, HANDLE hHeap, HANDLE hModule, UINT uResource); +static PTSTR GetStringResource(HANDLE hHeap, HANDLE hModule, UINT uResource); +LPBYTE WrapGetPrinterDriver (HANDLE hHeap, HANDLE hPrinter, DWORD dwLevel); + + +//////////////////////////////////////////////////////////////////////////////// +// +// Initializes OptItems to display OEM device or document property UI. +// Called via IOemUI::CommonUIProp +// +HRESULT hrOEMPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam) +{ + HRESULT hResult = S_OK; + + // Validate parameters. + if( (OEMCUIP_DOCPROP != dwMode) + && + (OEMCUIP_PRNPROP != dwMode) + ) + { + ERR("hrOEMPropertyPage() ERROR_INVALID_PARAMETER.\r\n"); + + // Return invalid parameter error. + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + switch(dwMode) + { + case OEMCUIP_DOCPROP: + hResult = hrDocumentPropertyPage(dwMode, pOEMUIParam); + break; + + case OEMCUIP_PRNPROP: + hResult = hrPrinterPropertyPage(dwMode, pOEMUIParam); + break; + + default: + // Should never reach this! + ERR("hrOEMPropertyPage() Invalid dwMode"); + SetLastError(ERROR_INVALID_PARAMETER); + hResult = E_FAIL; + break; + } + + return hResult; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// Initializes OptItems to display OEM document property UI. +// +static HRESULT hrDocumentPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam) +{ + UNREFERENCED_PARAMETER(dwMode); + + if(NULL == pOEMUIParam->pOEMOptItems) + { + // Fill in the number of OptItems to create for OEM document property UI. + pOEMUIParam->cOEMOptItems = 1; + } + else + { + POEMDEV pOEMDev = (POEMDEV) pOEMUIParam->pOEMDM; + + // Init UI Callback reference. + pOEMUIParam->OEMCUIPCallback = OEMDocUICallBack; + + // Init OEMOptItmes. + InitOptItems(pOEMUIParam->pOEMOptItems, pOEMUIParam->cOEMOptItems); + + // Fill out tree view items. + + // New section. + pOEMUIParam->pOEMOptItems[0].Level = 1; + pOEMUIParam->pOEMOptItems[0].Flags = OPTIF_COLLAPSE; + pOEMUIParam->pOEMOptItems[0].pName = GetStringResource(pOEMUIParam->hOEMHeap, pOEMUIParam->hModule, IDS_ADV_SECTION); + pOEMUIParam->pOEMOptItems[0].Sel = pOEMDev->dwAdvancedData; + + pOEMUIParam->pOEMOptItems[0].pOptType= CreateOptType(pOEMUIParam->hOEMHeap, 2); + + // + //Setup the Optional Item + // + pOEMUIParam->pOEMOptItems[0].pOptType->Type = TVOT_UDARROW; + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].IconID = 0; + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].lParam = 100; + + + // + //Allows You to apply Customised help to this Control. + // + //Notes: + // You must use a fully qualified path for pHelpFile + // OPTITEM Flags member must have OPTIF_HAS_POIEXT flag set. This indicates that the data in OIEXT is valid. + // OPTITEM is allocated on the Heap see (AddCustomUIHelp, GetHelpFile, CreateOIExt) + // + AddCustomUIHelp (pOEMUIParam->hPrinter, + pOEMUIParam->hOEMHeap, + pOEMUIParam->hModule, + &(pOEMUIParam->pOEMOptItems[0]), + CUSDRV_HELPTOPIC_2, IDS_HELPFILE); + } + + return S_OK; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// Initializes OptItems to display OEM printer property UI. +// +static HRESULT hrPrinterPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam) +{ + UNREFERENCED_PARAMETER(dwMode); + + if(NULL == pOEMUIParam->pOEMOptItems) + { + // Fill in the number of OptItems to create for OEM printer property UI. + pOEMUIParam->cOEMOptItems = 1; + } + else + { + // + //This is the second time we are called Now setup the optional items. + // + DWORD dwError; + DWORD dwDeviceValue; + DWORD dwType; + DWORD dwNeeded; + + // Get device settings value from printer. + dwError = GetPrinterData(pOEMUIParam->hPrinter, OEMUI_VALUE, &dwType, (PBYTE) &dwDeviceValue, + sizeof(dwDeviceValue), &dwNeeded); + if( (ERROR_SUCCESS != dwError) + || + (dwDeviceValue > 100) + ) + { + // Failed to get the device value or value is invalid, just use the default. + dwDeviceValue = 0; + } + + // Init UI Callback reference. + pOEMUIParam->OEMCUIPCallback = OEMPrinterUICallBack; + + // Init OEMOptItmes. + InitOptItems(pOEMUIParam->pOEMOptItems, pOEMUIParam->cOEMOptItems); + + // Fill out tree view items. + + // New section. + pOEMUIParam->pOEMOptItems[0].Level = 1; + pOEMUIParam->pOEMOptItems[0].Flags = OPTIF_COLLAPSE; + pOEMUIParam->pOEMOptItems[0].pName = GetStringResource(pOEMUIParam->hOEMHeap, pOEMUIParam->hModule, IDS_DEV_SECTION); + pOEMUIParam->pOEMOptItems[0].Sel = dwDeviceValue; + + pOEMUIParam->pOEMOptItems[0].pOptType = CreateOptType(pOEMUIParam->hOEMHeap, 2); + + // + //Setup the Optional Item + // + pOEMUIParam->pOEMOptItems[0].pOptType->Type = TVOT_UDARROW; + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].IconID = 0; + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].lParam = 100; + + // + //Allows You to apply Customised help to this Control + // + AddCustomUIHelp (pOEMUIParam->hPrinter, + pOEMUIParam->hOEMHeap, + pOEMUIParam->hModule, + &(pOEMUIParam->pOEMOptItems[0]), + CUSDRV_HELPTOPIC_1, + IDS_HELPFILE); + } + return S_OK; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Adds property page to Document property sheet. Called via IOemUI::DocumentPropertySheets +// +HRESULT hrOEMDocumentPropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam, + IPrintOemDriverUI* pOEMHelp) +{ + UNREFERENCED_PARAMETER(pOEMHelp); + + LONG_PTR lResult = 0; + HRESULT hrResult = S_OK; + + // Validate parameters. + if( (NULL == pPSUIInfo) + || + (PROPSHEETUI_INFO_VERSION != pPSUIInfo->Version) + ) + { + ERR("hrOEMDocumentPropertySheets() ERROR_INVALID_PARAMETER.\r\n"); + + // Return invalid parameter error. + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Do action. + switch(pPSUIInfo->Reason) + { + case PROPSHEETUI_REASON_INIT: + { + DWORD dwSheets = 0; + PCBUSERDATA pUserData; + POEMUIPSPARAM pOEMUIParam = (POEMUIPSPARAM) pPSUIInfo->lParamInit; + HANDLE hHeap = pOEMUIParam->hOEMHeap; + HANDLE hModule = pOEMUIParam->hModule; + POEMDEV pOEMDev = (POEMDEV) pOEMUIParam->pOEMDM; + COMPROPSHEETUI Sheet; + + + // Init property page. + memset(&Sheet, 0, sizeof(COMPROPSHEETUI)); + Sheet.cbSize = sizeof(COMPROPSHEETUI); + Sheet.Flags = CPSUIF_UPDATE_PERMISSION; + Sheet.hInstCaller = ghInstance; + Sheet.pCallerName = GetStringResource(hHeap, ghInstance, IDS_NAME); + Sheet.pHelpFile = NULL; + Sheet.pfnCallBack = OEMDocUICallBack2; + Sheet.pDlgPage = CPSUI_PDLGPAGE_TREEVIEWONLY; + Sheet.cOptItem = 1; + Sheet.IconID = IDI_CPSUI_PRINTER; + Sheet.pOptItemName = GetStringResource(hHeap, ghInstance, IDS_SECTION); + Sheet.CallerVersion = 0x100; + Sheet.OptItemVersion = 0x100; + + // Init user data. + pUserData = (PCBUSERDATA) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(CBUSERDATA)); + if (NULL == pUserData) + { + ERR("hrOEMDocumentPropertySheets() failed to allocate user data.\r\n"); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + pUserData->hComPropSheet = pPSUIInfo->hComPropSheet; + pUserData->pfnComPropSheet = pPSUIInfo->pfnComPropSheet; + pUserData->pOEMUIParam = pOEMUIParam; + Sheet.UserData = (ULONG_PTR) pUserData; + + // Create OptItems for page. + Sheet.pOptItem = CreateOptItems(hHeap, Sheet.cOptItem); + if (NULL == Sheet.pOptItem) + { + ERR("hrOEMDocumentPropertySheets() failed to allocate OPTITEMs.\r\n"); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + // Initialize OptItems + Sheet.pOptItem[0].Level = 1; + Sheet.pOptItem[0].Flags = OPTIF_COLLAPSE; + Sheet.pOptItem[0].pName = GetStringResource(hHeap, ghInstance, IDS_SECTION); + Sheet.pOptItem[0].Sel = pOEMDev->dwDriverData; + + Sheet.pOptItem[0].pOptType = CreateOptType(hHeap, 2); + if (NULL == Sheet.pOptItem[0].pOptType) + { + ERR("hrOEMDocumentPropertySheets() failed to allocate OPTTYPE.\r\n"); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + // + //Set the UI prop of this OPTYPE item. + // + Sheet.pOptItem[0].pOptType->Type = TVOT_UDARROW; + Sheet.pOptItem[0].pOptType->pOptParam[1].IconID = 0; + Sheet.pOptItem[0].pOptType->pOptParam[1].lParam = 100; + + // + //Allows You to apply Customised help to this Control. + //See Function : AddCustomUIHelp, For more details on implamentation. + // + AddCustomUIHelp (pOEMUIParam->hPrinter, + hHeap, + hModule, + &(Sheet.pOptItem[0]), + CUSDRV_HELPTOPIC_1, + IDS_HELPFILE); + + // Adds the property sheets. + lResult = pPSUIInfo->pfnComPropSheet(pPSUIInfo->hComPropSheet, CPSFUNC_ADD_PCOMPROPSHEETUI, + (LPARAM)&Sheet, (LPARAM)&dwSheets); + } + break; + + case PROPSHEETUI_REASON_GET_INFO_HEADER: + { + PPROPSHEETUI_INFO_HEADER pHeader = (PPROPSHEETUI_INFO_HEADER) lParam; + + pHeader->pTitle = (LPTSTR)PROP_TITLE; + lResult = TRUE; + } + break; + + case PROPSHEETUI_REASON_GET_ICON: + // No icon + lResult = 0; + break; + + case PROPSHEETUI_REASON_SET_RESULT: + { + PSETRESULT_INFO pInfo = (PSETRESULT_INFO) lParam; + + lResult = pInfo->Result; + } + break; + + case PROPSHEETUI_REASON_DESTROY: + lResult = TRUE; + break; + } + +Exit: + + pPSUIInfo->Result = lResult; + return hrResult; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Adds property page to printer property sheet. Called via IOemUI::DevicePropertySheets +// +HRESULT hrOEMDevicePropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam) +{ + LONG_PTR lResult = 0; + + // Validate parameters. + if( (NULL == pPSUIInfo) + || + (PROPSHEETUI_INFO_VERSION != pPSUIInfo->Version) + ) + { + ERR("hrOEMDevicePropertySheets() ERROR_INVALID_PARAMETER.\r\n"); + + // Return invalid parameter error. + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Do action. + switch(pPSUIInfo->Reason) + { + case PROPSHEETUI_REASON_INIT: + { + PROPSHEETPAGE Page; + + // Init property page. + memset(&Page, 0, sizeof(PROPSHEETPAGE)); + Page.dwSize = sizeof(PROPSHEETPAGE); + Page.dwFlags = PSP_DEFAULT; + Page.hInstance = ghInstance; + Page.pszTemplate = MAKEINTRESOURCE(IDD_DEVICE_PROPPAGE); + Page.pfnDlgProc = DevicePropPageProc; + + // Add property sheets. + lResult = pPSUIInfo->pfnComPropSheet(pPSUIInfo->hComPropSheet, CPSFUNC_ADD_PROPSHEETPAGE, (LPARAM)&Page, 0); + } + break; + + case PROPSHEETUI_REASON_GET_INFO_HEADER: + { + PPROPSHEETUI_INFO_HEADER pHeader = (PPROPSHEETUI_INFO_HEADER) lParam; + + pHeader->pTitle = (LPTSTR)PROP_TITLE; + lResult = TRUE; + } + break; + + case PROPSHEETUI_REASON_GET_ICON: + // No icon + lResult = 0; + break; + + case PROPSHEETUI_REASON_SET_RESULT: + { + PSETRESULT_INFO pInfo = (PSETRESULT_INFO) lParam; + + lResult = pInfo->Result; + } + break; + + case PROPSHEETUI_REASON_DESTROY: + lResult = TRUE; + break; + } + + pPSUIInfo->Result = lResult; + return S_OK; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// OptItems call back for OEM printer property UI. +// +LONG APIENTRY OEMPrinterUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam) +{ + LONG lReturn = CPSUICB_ACTION_NONE; + + switch(pCallbackParam->Reason) + { + case CPSUICB_REASON_APPLYNOW: + { + DWORD dwDriverValue = pOEMUIParam->pOEMOptItems[0].Sel; + + // Store OptItems state in printer data. + SetPrinterData(pOEMUIParam->hPrinter, OEMUI_VALUE, REG_DWORD, (PBYTE) &dwDriverValue, sizeof(DWORD)); + } + break; + + default: + break; + } + + return lReturn; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Call back for OEM device property UI. +// +#pragma warning(push) +#pragma warning( disable : 6262 ) // 2 MAX_PATH strings exceeds the stack size by a few bytes. +INT_PTR CALLBACK DevicePropPageProc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uiMsg) + { + case WM_COMMAND: + switch(HIWORD(wParam)) + { + case BN_CLICKED: + switch(LOWORD(wParam)) + { + case IDC_CALIBRATE: + // Simulate printer calibration by displaying a message that the + // printer has been calibrated. + { + TCHAR szName[MAX_PATH]; + TCHAR szCalibrated[MAX_PATH]; + + LoadString(ghInstance, IDS_NAME, szName, sizeof(szName)/sizeof(szName[0])); + LoadString(ghInstance, IDS_CALIBRATED, szCalibrated, sizeof(szCalibrated)/sizeof(szCalibrated[0])); + MessageBox(hDlg, szCalibrated, szName, MB_OK); + } + break; + } + break; + + default: + return FALSE; + } + return TRUE; + + case WM_NOTIFY: + { + switch (((LPNMHDR)lParam)->code) // type of notification message + { + case PSN_SETACTIVE: + break; + + case PSN_KILLACTIVE: + break; + + case PSN_APPLY: + break; + + case PSN_RESET: + break; + } + } + break; + } + + return FALSE; +} +#pragma warning(pop) + + +//////////////////////////////////////////////////////////////////////////////// +// +// OptItems call back for OEM document property UI. +// +LONG APIENTRY OEMDocUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam) +{ + LONG lReturn = CPSUICB_ACTION_NONE; + POEMDEV pOEMDev = (POEMDEV) pOEMUIParam->pOEMDM; + + switch(pCallbackParam->Reason) + { + case CPSUICB_REASON_APPLYNOW: + // Store OptItems state in DEVMODE. + pOEMDev->dwAdvancedData = pOEMUIParam->pOEMOptItems[0].Sel; + break; + + case CPSUICB_REASON_KILLACTIVE: + pOEMDev->dwAdvancedData = pOEMUIParam->pOEMOptItems[0].Sel; + break; + + case CPSUICB_REASON_SETACTIVE: + if((DWORD)(pOEMUIParam->pOEMOptItems[0].Sel) != pOEMDev->dwAdvancedData) + { + pOEMUIParam->pOEMOptItems[0].Sel = pOEMDev->dwAdvancedData; + pOEMUIParam->pOEMOptItems[0].Flags |= OPTIF_CHANGED; + lReturn = CPSUICB_ACTION_OPTIF_CHANGED; + } + break; + + default: + break; + } + + return lReturn; +} + + +LONG APIENTRY OEMDocUICallBack2(PCPSUICBPARAM pCallbackParam) +{ + LONG lReturn = CPSUICB_ACTION_NONE; + PCBUSERDATA pUserData = (PCBUSERDATA) pCallbackParam->UserData; + POEMDEV pOEMDev = (POEMDEV) pUserData->pOEMUIParam->pOEMDM; + + switch(pCallbackParam->Reason) + { + case CPSUICB_REASON_APPLYNOW: + pOEMDev->dwDriverData = pCallbackParam->pOptItem[0].Sel; + pUserData->pfnComPropSheet(pUserData->hComPropSheet, CPSFUNC_SET_RESULT, + (LPARAM)pUserData->hPropPage, + (LPARAM)CPSUI_OK); + break; + + case CPSUICB_REASON_KILLACTIVE: + pOEMDev->dwDriverData = pCallbackParam->pOptItem[0].Sel; + break; + + case CPSUICB_REASON_SETACTIVE: + if((DWORD)(pCallbackParam->pOptItem[0].Sel) != pOEMDev->dwDriverData) + { + pCallbackParam->pOptItem[0].Sel = pOEMDev->dwDriverData; + pCallbackParam->pOptItem[0].Flags |= OPTIF_CHANGED; + lReturn = CPSUICB_ACTION_OPTIF_CHANGED; + } + break; + + default: + break; + } + + return lReturn; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Creates and Initializes OptItems. +// +static POPTITEM CreateOptItems(HANDLE hHeap, DWORD dwOptItems) +{ + POPTITEM pOptItems = NULL; + DWORD cbMemAllocSize; + + // Allocate memory for OptItems; + + // Call intsafe.h function to ensure there's no integer overflow or underflow + if (SUCCEEDED(DWordMult(sizeof(OPTITEM), dwOptItems, &cbMemAllocSize)) && + (NULL != (pOptItems = (POPTITEM) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, cbMemAllocSize)))) + { + InitOptItems(pOptItems, dwOptItems); + } + else + { + ERR("CreateOptItems() failed to allocate memory for OPTITEMs!\r\n"); + } + + return pOptItems; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Initializes OptItems. +// +static void InitOptItems(POPTITEM pOptItems, DWORD dwOptItems) +{ + // Zero out memory. + memset(pOptItems, 0, sizeof(OPTITEM) * dwOptItems); + + // Set each OptItem's size, and Public DM ID. + for(DWORD dwCount = 0; dwCount < dwOptItems; dwCount++) + { + pOptItems[dwCount].cbSize = sizeof(OPTITEM); + pOptItems[dwCount].DMPubID = DMPUB_NONE; + } +} + + + +//////////////////////////////////////////////////////////////////////////////// +// +// Adds Custom help top a OPTTYPE UI item. +// +// Note : +// The OPTITEM member HelpIndex must be set the the correct HELP ID number. +// HelpIndex is the index that you assigned in the hlp file to this item of help. +// The OPTITEM, pOIExt member must point to a valid OIEXT structure. +// The phelpfile is member of OIEXT must have the fully qualified path to the driver file. +// +// +// It is also possible to overide common help items in UNIDRIVE via the HelpIndex in the GPD. +// For further information on using HelpIndex in the GPD see the relavent section in the DDK +// It is not possible to custimse help however via the PPD. The OPTITEM must be modified in the OEM Plugin. +// +static BOOL AddCustomUIHelp (HANDLE hPrinter, HANDLE hHeap, HANDLE hModule, + POPTITEM pOptItem, DWORD HelpIndex, DWORD HelpFile) +{ + POIEXT pOIExt = NULL; + + // + //Allocate a new OIEXT structure on the heap + // + if (pOptItem->pOIExt == NULL) + { + pOptItem->pOIExt = CreateOIExt(hHeap); + } + + if ( pOptItem->pOIExt == NULL ) + { + ERR("AddCustomUIHelp() Error Allocation Failed.\r\n"); + return FALSE; + } + + pOIExt = pOptItem->pOIExt; + + // + //Set to the full absolute path of the driver file. + //(It should be in the Printer Driver Directrory in most cases) + //This String needs to be allocated on the heap (The Driver will clean it up). + // + pOIExt->pHelpFile = GetHelpFile (hPrinter, hHeap, hModule, HelpFile); + + // + //Set to show tha there is a valid OIEXT structure and data + // + pOptItem->Flags |= OPTIF_HAS_POIEXT; + + // + //This needs to be set if you have ansi strings in your help file. (NOTE!) + // + //pOiExt->Flags |= OIEXTF_ANSI_STRING; + + // + //Add the help this the index in the .hlp file. + // + pOptItem->HelpIndex = HelpIndex; + + return TRUE; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// Allocates and initializes OIEXT for OptItem. +// +static POIEXT CreateOIExt(HANDLE hHeap) +{ + + POIEXT pOiExt = NULL; + + // Allocate memory from the heap for the OPTTYPE; the driver will take care of clean up. + pOiExt = (POIEXT) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(OIEXT)); + if(NULL != pOiExt) + { + // + // Initialize OPTTYPE. (These members are setup by AddCustomUIHelp) + // + pOiExt->cbSize = sizeof(OIEXT); + pOiExt->Flags = 0; + pOiExt->hInstCaller = NULL; + pOiExt->pHelpFile = NULL; + } + + return pOiExt; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// Allocates and initializes OptType for OptItem. +// +static POPTTYPE CreateOptType(HANDLE hHeap, WORD wOptParams) +{ + POPTTYPE pOptType = NULL; + + // Allocate memory from the heap for the OPTTYPE; the driver will take care of clean up. + pOptType = (POPTTYPE) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(OPTTYPE)); + if(NULL != pOptType) + { + DWORD cbMemAllocSize; + + // Initialize OPTTYPE. + pOptType->cbSize = sizeof(OPTTYPE); + pOptType->Count = wOptParams; + + // Allocate memory from the heap for the OPTPARAMs for the OPTTYPE. + + // Call intsafe.h function to ensure there's no integer overflow or underflow + if (SUCCEEDED(DWordMult(wOptParams, sizeof(OPTPARAM), &cbMemAllocSize)) && + (NULL != (pOptType->pOptParam = (POPTPARAM) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, cbMemAllocSize)))) + { + // Initialize the OPTPARAMs. + for(WORD wCount = 0; wCount < wOptParams; wCount++) + { + pOptType->pOptParam[wCount].cbSize = sizeof(OPTPARAM); + } + } + else + { + ERR("CreateOptType() failed to allocated memory for OPTPARAMs!\r\n"); + + // Free allocated memory and return NULL. + HeapFree(hHeap, 0, pOptType); + pOptType = NULL; + } + } + else + { + ERR("CreateOptType() failed to allocated memory for OPTTYPE!\r\n"); + } + + return pOptType; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Allocates space on the heap and gets the help file name from the resource file. +// Note you need to allocate this on the heap so that it stays allocated as long as the driver UI is loaded. +// The OPTITEM->pOIExt ref this data. +// +static PTSTR GetHelpFile (HANDLE hPrinter, HANDLE hHeap, HANDLE hModule, UINT uResource) +{ + + DWORD nResult = 0; + DWORD dwSize = MAX_PATH; + PTSTR pszString = NULL; + PTSTR pszTemp = NULL; + PDRIVER_INFO_2 pDriverInfo = NULL; + + // + // Allocate buffer for string resource from heap; + // + pszTemp = (PTSTR) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwSize * sizeof(TCHAR)); + pDriverInfo = (PDRIVER_INFO_2)WrapGetPrinterDriver (hHeap, hPrinter, 2); + + // + //Get the Full Driver Dir from pDriverPath it must include the \version\ + // + if(NULL != pszTemp && pDriverInfo && pDriverInfo->pDriverPath) + { + HRESULT hCopy; + + hCopy = StringCchCopy(pszTemp, dwSize, pDriverInfo->pDriverPath); + if(FAILED(hCopy)) + { + ERR("StringCchCopy() failed to copy driver path to temp buffer!\r\n"); + } + pszString = _tcsrchr (pszTemp, _T('\\') ) + 1; + } + + // + //The Help file is installed with the driver in the version drictory. + // + if(NULL != pszString) + { + // + //The Buffer size is in characters for the unicode version of LoadString + // + nResult = LoadString((HMODULE)hModule, uResource, pszString, (int)(dwSize - _tcslen(pszTemp)) ); + } + else + { + ERR("GetStringResource() failed to allocate string buffer!\r\n"); + } + + if(nResult > 0) + { + // + //Reallocate this so that we don't waist space on the heap (free any non used heap in MAX_PATH) + // + pszString = (PTSTR) HeapReAlloc(hHeap, HEAP_ZERO_MEMORY, pszTemp, (_tcslen(pszTemp) + 1) * sizeof(TCHAR)); + if(NULL == pszString) + { + pszTemp = pszString; + ERR("GetStringResource() HeapReAlloc() of string retrieved failed!\r\n"); + } + } + else + { + ERR("LoadString() failed!"); + pszString = NULL; + } + + // + //Clean up the Driverinfo that was allocated. It is not needed. (Always free this it is only temp data) + // + if (pDriverInfo) + { + HeapFree(hHeap, 0, pDriverInfo); + } + + return pszString; +} + +//////////////////////////////////////////////////////////////////////////////////// +// +// Retrieves pointer to a String resource. +// +static PTSTR GetStringResource(HANDLE hHeap, HANDLE hModule, UINT uResource) +{ + int nResult; + DWORD dwSize = MAX_PATH; + PTSTR pszString = NULL; + + // Allocate buffer for string resource from heap; let the driver clean it up. + pszString = (PTSTR) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwSize * sizeof(TCHAR)); + if(NULL != pszString) + { + // Load string resource; resize after loading so as not to waste memory. + nResult = LoadString((HMODULE)hModule, uResource, pszString, dwSize); + if(nResult > 0) + { + PTSTR pszTemp; + + pszTemp = (PTSTR) HeapReAlloc(hHeap, HEAP_ZERO_MEMORY, pszString, (nResult + 1) * sizeof(TCHAR)); + if(NULL != pszTemp) + { + pszString = pszTemp; + } + else + { + ERR("GetStringResource() HeapReAlloc() of string retrieved failed!\r\n"); + } + } + else + { + ERR("LoadString() failed!\r\n"); + pszString = NULL; + } + } + else + { + ERR("GetStringResource() failed to allocate string buffer!\r\n"); + } + + return pszString; +} + + +//////////////////////////////////////////////////////////////////////////////////// +// +// Wrapper to help retrive the PrinterDriverInfo, +// Note the MEM is orphaned by this call on success +// + +LPBYTE WrapGetPrinterDriver (HANDLE hHeap, HANDLE hPrinter, DWORD dwLevel) +{ + // + //Get the PrinterINFO so that we know where the driver help file is. + // + BOOL bGet = TRUE; + DWORD dwNeeded = 0; + LPBYTE pBuffer = NULL; + + bGet = GetPrinterDriver(hPrinter, NULL, dwLevel, pBuffer, 0, &dwNeeded); + + if(!bGet && GetLastError() == ERROR_INSUFFICIENT_BUFFER ) + { + SetLastError(ERROR_SUCCESS); // clear the previous result to prevent noise + pBuffer = (LPBYTE)HeapAlloc (hHeap, HEAP_ZERO_MEMORY, dwNeeded); + } + + if (pBuffer) + { + bGet = GetPrinterDriver(hPrinter, NULL, dwLevel, pBuffer, dwNeeded, &dwNeeded); + } + + if(!bGet || !pBuffer) + { + if (pBuffer) + { + HeapFree(hHeap, 0, pBuffer); + pBuffer = NULL; + } + + ERR("GetPrinterDriver() failed."); + } + + return pBuffer; +} diff --git a/print/OEM Printer Customization Plug-in Samples/C++/custhlp/oemui.h b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/oemui.h new file mode 100644 index 00000000..2fc12cba --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/oemui.h @@ -0,0 +1,47 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: OEMUI.H +// +// PURPOSE: Define common data types, and external function prototypes +// for property sheet handling. +// + + +#pragma once + +#include "DEVMODE.H" +#include "globals.h" + +//////////////////////////////////////////////////////// +// Custom Help Defines +//////////////////////////////////////////////////////// + +#define CUSDRV_HELPTOPIC_1 15001 +#define CUSDRV_HELPTOPIC_2 15002 + +//////////////////////////////////////////////////////// +// OEM UI Defines +//////////////////////////////////////////////////////// + +// OEM Signature and version. +#define PROP_TITLE L"OEM UI Page" +#define OEM_SIGNATURE 'MSFT' +#define OEM_VERSION 0x00000001L + +// Printer registry keys where OEM data is stored. +#define OEMUI_VALUE TEXT("OEMUI_VALUE") +#define OEMUI_DEVICE_VALUE TEXT("OEMUI_DEVICE_VALUE") + +//////////////////////////////////////////////////////// +// Prototypes +//////////////////////////////////////////////////////// + +HRESULT hrOEMPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam); +HRESULT hrOEMDocumentPropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam, IPrintOemDriverUI* pOEMHelp); +HRESULT hrOEMDevicePropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam); + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/custhlp/oemui.rc b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/oemui.rc new file mode 100644 index 00000000..e4d28716 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/oemui.rc @@ -0,0 +1,170 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "Written by Windows Printing & Imaging Team" + VALUE "CompanyName", "Microsoft Corp." + VALUE "FileDescription", "OEM UI Test Module." + VALUE "FileVersion", "1, 0, 0, 1" + VALUE "InternalName", "OEMUI" + VALUE "LegalCopyright", "Copyright � 1998 - 2003 Microsoft Corp." + VALUE "LegalTrademarks", "Microsoft� is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation" + VALUE "OriginalFilename", "OEMUI.dll" + VALUE "ProductName", "Microsoft OEMUI" + VALUE "ProductVersion", "1.1" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_DEVICE_PROPPAGE DIALOG 0, 0, 179, 113 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Device Property Page" +FONT 8, "MS Shell Dialog" +BEGIN + LTEXT "OEM UI Added Page",IDC_STATIC,55,14,68,11 + PUSHBUTTON "Calibrate",IDC_CALIBRATE,61,34,50,14 +END + +IDD_DOC_PROPPAGE DIALOG 0, 0, 210, 154 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Document Property Page" +FONT 8, "MS Shell Dialog" +BEGIN + LTEXT "OEM UI Document Property Page",IDC_STATIC,60,73,108,8 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_DEVICE_PROPPAGE, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 172 + TOPMARGIN, 8 + BOTTOMMARGIN, 106 + END + + IDD_DOC_PROPPAGE, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 203 + TOPMARGIN, 7 + BOTTOMMARGIN, 147 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDS_SECTION "OEM UI Added Item" + IDS_CALIBRATED "Printer has been calibrated." + IDS_NAME "OEM UI Customization DLL" + IDS_HELPFILE "CUSTOMDRV.HLP" + IDS_DEV_SECTION "Device Settings OEM UI Added Item" + IDS_ADV_SECTION "Advanced OEM UI Added Item" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/custhlp/precomp.h b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/precomp.h new file mode 100644 index 00000000..ef4615ad --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/precomp.h @@ -0,0 +1,54 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: PRECOMP.H +// +// PURPOSE: Optimize compilation of headers that do not change frequently +// + +#pragma once + +// Necessary for compiling under VC. +#if(!defined(WINVER) || (WINVER < 0x0500)) + #undef WINVER + #define WINVER 0x0500 +#endif +#if(!defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500)) + #undef _WIN32_WINNT + #define _WIN32_WINNT 0x0500 +#endif + + +// Required header files that shouldn't change often. + + +#include <STDDEF.H> +#include <STDLIB.H> +#include <OBJBASE.H> +#include <STDARG.H> +#include <STDIO.H> +#include <WINDEF.H> +#include <WINERROR.H> +#include <WINBASE.H> +#include <WINGDI.H> +#include <WINDDI.H> +#include <WINSPOOL.H> +#include <TCHAR.H> +#include <EXCPT.H> +#include <ASSERT.H> +#include <PRSHT.H> +#include <COMPSTUI.H> +#include <WINDDIUI.H> +#include <PRINTOEM.H> +#include <INTSAFE.H> +#include <INITGUID.H> +#include <PRCOMOEM.H> + +// StrSafe.h needs to be included last +// to disallow unsafe string functions. +#include <STRSAFE.H> + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/custhlp/precompsrc.cpp b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/precompsrc.cpp new file mode 100644 index 00000000..5944cf51 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/precompsrc.cpp @@ -0,0 +1 @@ +#include "precomp.h"
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/custhlp/resource.h b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/resource.h new file mode 100644 index 00000000..9c7732fe --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/custhlp/resource.h @@ -0,0 +1,23 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: resource.h +// +// PURPOSE: Defines resources IDs for localizable resources. +// + + +#define IDS_SECTION 1 +#define IDS_CALIBRATED 2 +#define IDS_NAME 3 +#define IDS_HELPFILE 4 +#define IDS_DEV_SECTION 5 +#define IDS_ADV_SECTION 10 +#define IDD_DEVICE_PROPPAGE 106 +#define IDD_DOC_PROPPAGE 107 +#define IDC_CALIBRATE 1001 + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/gdl/res/gdlsmpl.gpd b/print/OEM Printer Customization Plug-in Samples/C++/gdl/res/gdlsmpl.gpd new file mode 100644 index 00000000..20e4d472 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/gdl/res/gdlsmpl.gpd @@ -0,0 +1,520 @@ +*GPDFileName: "gdlsmpl.gpd" +*GPDFileVersion: "1.0" +*GPDSpecVersion: "1.0" +*Include: "StdNames.gpd" +*ModelName: "OEM Unidrv GDL Sample" +*MasterUnits: PAIR(1200, 1200) +*ResourceDLL: "unires.dll" +*PrinterType: PAGE +*MaxCopies: 99 +*PrintRate: 16 +*PrintRateUnit: PPM +*PrintRatePPM: 16 + +*% +*% This line indicates which file the GDL parser should use to find Bidi information. +*% This is also the same file that will be parser when querying the GDL via +*% IPrintCoreHelperUni. GDL is compatible with GPD syntax, and this can be the driver's +*% GPD file, whis is what this sample does. +*% +*BidiQueryFile: "gdlsmpl.gpd" + + +*%****************************************************************************************** +*% Orientation +*%****************************************************************************************** +*Feature: Orientation +{ + *rcNameID: =ORIENTATION_DISPLAY + *DefaultOption: PORTRAIT + *Option: PORTRAIT + { + *rcNameID: =PORTRAIT_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.6 + *Cmd: "<1B>&l0O" + } + } + *Option: LANDSCAPE_CC90 + { + *rcNameID: =LANDSCAPE_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.8 + *Cmd: "<1B>&l1O" + } + } +} + +*%****************************************************************************************** +*% Input Bin +*%****************************************************************************************** +*Feature: InputBin +{ + *rcNameID: =PAPER_SOURCE_DISPLAY + *DefaultOption: AUTO + *Option: AUTO + { + *rcNameID: =AUTO_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.11 + *Cmd: "<1B>&l0H" + } + } + *Option: UPPER + { + *rcNameID: =UPPER_TRAY_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.11 + *Cmd: "<1B>&l1H" + } + } +} + +*%****************************************************************************************** +*% Resolution +*%****************************************************************************************** +*Feature: Resolution +{ + *rcNameID: =RESOLUTION_DISPLAY + *DefaultOption: 300dpi + *Option: 300dpi + { + *Name: "300 x 300" =DOTS_PER_INCH + *DPI: PAIR(300, 300) + *TextDPI: PAIR(300, 300) + *MinStripBlankPixels: 32 + EXTERN_GLOBAL: *StripBlanks: LIST(ENCLOSED, TRAILING) + *SpotDiameter: 100 + *Command: CmdBeginRaster { *Cmd : "<1B>*v7S<1B>*r1A" } + *Command: CmdEndRaster { *Cmd : "<1B>*rC" } + *Command: CmdSendBlockData { *Cmd : "<1B>*b" %d{NumOfDataBytes}"W" } + *Command: CmdSelect + { + *Order: DOC_SETUP.7 + *Cmd: "@PJL SET RESOLUTION=300<0A>@PJL ENTER LANGUAGE=PCL<0A0D1B>E<1B>*t300R" + } + } +} + +*%****************************************************************************************** +*% HP-GL/2 Graphics Support +*%****************************************************************************************** +*Ifdef: WINNT_51 +*Personality: =PERSONALITY_HPGL2 +*Feature: GraphicsMode +{ + *rcNameID: =GRAPHICSMODE_DISPLAY + *DefaultOption: HPGL2MODE + *Option: HPGL2MODE + { + *rcNameID: =GRAPHICSMODE_HPGL2_DISPLAY + } + *Option: RASTERMODE + { + *rcNameID: =GRAPHICSMODE_RASTER_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.5 + *Cmd: "@PJL SET LIMAGEENHANCE=OFF<0A>" + } + } +} +*Endif: + +*%****************************************************************************************** +*% Paper Size +*%****************************************************************************************** +*Feature: PaperSize +{ + *rcNameID: =PAPER_SIZE_DISPLAY + *DefaultOption: LETTER + *Option: LETTER + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *PageProtectMem: 1028 + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(9500, 12500) + *PrintableOrigin: PAIR(400, 400) + *CursorOrigin: PAIR(300, 300) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l2a8c1E<1B>*p0x0Y<1B>*c0t5260x7704Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(9500, 12200) + *PrintableOrigin: PAIR(450, 300) + *CursorOrigin: PAIR(200, 12900) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l2a8c1E<1B>*p0x0Y<1B>*c0t7332x5880Y" + } + } + } + } + *Option: LEGAL + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *PageProtectMem: 1692 + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(9000, 15500) + *PrintableOrigin: PAIR(400, 600) + *CursorOrigin: PAIR(180, 300) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l3a8c1E<1B>*p0x0Y<1B>*c0t5880x8900Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(9000, 15500) + *PrintableOrigin: PAIR(400, 900) + *CursorOrigin: PAIR(180, 16500) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l3a8c1E<1B>*p0x0Y<1B>*c0t8900x5880Y" + } + } + } + } + *Option: EXECUTIVE + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *PageProtectMem: 4109 + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(8100, 11500) + *PrintableOrigin: PAIR(300, 300) + *CursorOrigin: PAIR(300, 200) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l1a8c1E<1B>*p0x0Y<1B>*c0t4860x7344Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(8300, 11500) + *PrintableOrigin: PAIR(200, 300) + *CursorOrigin: PAIR(200, 12300) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l1a8c1E<1B>*p0x0Y<1B>*c0t7272x4980Y" + } + } + } + } + *Option: A4 + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *PageProtectMem: 4249 + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(9100, 13200) + *PrintableOrigin: PAIR(400, 300) + *CursorOrigin: PAIR(288, 180) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l26a8c1E<1B>*p0x0Y<1B>*c0t5594x8201Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(9100, 13200) + *PrintableOrigin: PAIR(400, 300) + *CursorOrigin: PAIR(204, 13824) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l26a8c1E<1B>*p0x0Y<1B>*c0t8129x5714Y" + } + } + } + } + *Option: B5 + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *PageProtectMem: 3198 + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(7900, 11140) + *PrintableOrigin: PAIR(352, 300) + *CursorOrigin: PAIR(300, 100) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l12a8c1E<1B>*p0x0Y<1B>*c0t4970x7040Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(7760, 11140) + *PrintableOrigin: PAIR(300, 400) + *CursorOrigin: PAIR(100, 11940) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l12a8c1E<1B>*p0x0Y<1B>*c0t6780x4970Y" + } + } + } + } +} + +*%****************************************************************************************** +*% Outputbin +*%****************************************************************************************** + + +*Feature: OutputBin +{ + *rcNameID: =OUTPUTBIN_DISPLAY + *HelpIndex: 12006 + *DefaultOption: Option1 + *Option: Option1 + { + *% Auto Select + *Name: "default" + *Command: CmdSelect + { + *Order: DOC_SETUP.4 + *Cmd: "@PJL SET OUTBIN=OPTIONALOUTBIN2<0A>@PJL SET FINISH=NONE<0A>" + } + } + *Option: Option14 + { + *% Stacker + *Name: "stacker" *% Stacker + *Command: CmdSelect + { + *Order: DOC_SETUP.4 + *Cmd: "@PJL SET OUTBIN=OPTIONALOUTBIN2<0A>@PJL SET FINISH=NONE<0A>" + } + } +} + + +*%****************************************************************************************** +*% Media Type +*%****************************************************************************************** +*Feature: MediaType +{ + *rcNameID: =MEDIA_TYPE_DISPLAY + *DefaultOption: PLAIN + *Option: PLAIN + { + *rcNameID: =PLAIN_PAPER_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.15 + *Cmd: "<1B>&n6WdPlain" + } + } + *Option: TRANSPARENCY + { + *rcNameID: =TRANSPARENCY_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.15 + *Cmd: "<1B>&n13WdTransparency" + } + } +} + + + +*%****************************************************************************************** +*% HalfTone +*%****************************************************************************************** +*Feature: Halftone +{ + *rcNameID: =HALFTONING_DISPLAY + *DefaultOption: HT_PATSIZE_AUTO + *Option: HT_PATSIZE_AUTO + { + *rcNameID: =HT_AUTO_SELECT_DISPLAY + } + *Option: HT_PATSIZE_SUPERCELL_M + { + *rcNameID: =HT_SUPERCELL_DISPLAY + } + *Option: HT_PATSIZE_6x6_M + { + *rcNameID: =HT_DITHER6X6_DISPLAY + } + *Option: HT_PATSIZE_8x8_M + { + *rcNameID: =HT_DITHER8X8_DISPLAY + } +} + +*%****************************************************************************************** +*% Memory +*% +*% Note: Unidrv uses the font memory information to estimate when it needs to stop +*% downloading fonts for a page, and thus driver writers should err on the conservative +*% side. Otherwise, printers will generate "out of memory" device errors for pages with +*% a large number of fonts / unique glyphs. +*%****************************************************************************************** +*Feature: Memory +{ + *rcNameID: =PRINTER_MEMORY_DISPLAY + *DefaultOption: 32768KB + *Option: 16384KB + { + *Name: "16MB" + *MemoryConfigKB: PAIR(16384, 13950) + } + *Option: 32768KB + { + *Name: "32MB" + *MemoryConfigKB: PAIR(32768, 28350) + } +} + +*%****************************************************************************************** +*% Page Protect +*%****************************************************************************************** +*Feature: PageProtect +{ + *rcNameID: =PAGE_PROTECTION_DISPLAY + *DefaultOption: OFF + *Option: ON + { + *rcNameID: =ON_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.1 + *Cmd: "<1B>%%-12345X@PJL SET PAGEPROTECT=LETTER<0A>" + } + } + *Option: OFF + { + *rcNameID: =OFF_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.1 + *Cmd: "<1B>%%-12345X@PJL SET PAGEPROTECT=OFF<0A>" + } + } +} + +*%****************************************************************************************** +*% Doc setup commands +*%****************************************************************************************** +*Command: CmdStartDoc +{ + *Order: DOC_SETUP.7 + *Cmd: "<1B>&u1200D<1B>*r0F" +} +*Command: CmdStartPage +{ + *Order: PAGE_SETUP.1 + *Cmd: "<1B>*b0M<0D>" +} +*Command: CmdEndJob +{ + *Order: JOB_FINISH.1 + *Cmd: "<1B>E<1B>%%-12345X@PJL<20>LPORTROTATE<0A><1B>%%-12345X" +} +*Command: CmdCopies +{ + *Order: DOC_SETUP.13 + *Cmd: "<1B>&l" %d{NumOfCopies}"X" +} + +*%****************************************************************************************** +*% Cursor, Page and Color Commands +*%****************************************************************************************** +*RotateCoordinate?: TRUE +*RotateRaster?: TRUE +*RotateFont?: TRUE +*TextCaps: LIST(TC_CR_90,TC_UA_ABLE) +*MemoryUsage: LIST(FONT, RASTER, VECTOR) +*CursorXAfterCR: AT_PRINTABLE_X_ORIGIN +*BadCursorMoveInGrxMode: LIST(X_PORTRAIT,Y_LANDSCAPE) +*XMoveThreshold: 0 +*YMoveThreshold: 0 +*XMoveUnit: 300 +*YMoveUnit: 300 +*Command: CmdXMoveAbsolute { *Cmd : "<1B>*p" %d{(DestX) }"X" } +*Command: CmdXMoveRelRight { *Cmd : "<1B>*p+" %d[0,9600]{max_repeat((DestXRel) )}"X" } +*Command: CmdXMoveRelLeft { *Cmd : "<1B>*p-" %d[0,9600]{max_repeat((DestXRel) )}"X" } +*Command: CmdYMoveAbsolute { *Cmd : "<1B>*p" %d{(DestY) }"Y" } +*Command: CmdYMoveRelDown { *Cmd : "<1B>*p+" %d{(DestYRel) }"Y" } +*Command: CmdYMoveRelUp { *Cmd : "<1B>*p-" %d{(DestYRel) }"Y" } +*Command: CmdDefinePaletteEntry { *Cmd : "<1B>*v" %d{RedValue}"a" %d{GreenValue}"b" %d{BlueValue}"c" ++ %d{PaletteIndexToProgram} "I" } +*Command: CmdSelectPaletteEntry { *Cmd : "<1B>*v" %d{CurrentPaletteIndex}"S" } +*Command: CmdCR { *Cmd : "<0D>" } +*Command: CmdLF { *Cmd : "<0A>" } +*Command: CmdFF { *Cmd : "<0C>" } +*Command: CmdBackSpace { *Cmd : "<08>" } +*Command: CmdUniDirectionOn { *Cmd : "<00>" } +*Command: CmdUniDirectionOff { *Cmd : "<00>" } +*Command: CmdPushCursor { *Cmd : "<1B>&f0S" } +*Command: CmdPopCursor { *Cmd : "<1B>&f1S" } +*Command: CmdSetSimpleRotation { *Cmd : "<1B>&a" %d{PrintDirInCCDegrees}"P" } +*EjectPageWithFF?: TRUE +*Command: CmdEnableTIFF4 { *Cmd : "<1B>*b2M" } +*Command: CmdDisableCompression { *Cmd : "<1B>*b0M" } +*OutputDataFormat: H_BYTE +*OptimizeLeftBound?: TRUE +*CursorXAfterSendBlockData: AT_GRXDATA_ORIGIN +*CursorYAfterSendBlockData: AUTO_INCREMENT + +*%****************************************************************************************** +*% Font Descriptions and Commands +*%****************************************************************************************** +*DefaultFont: 136 +*DefaultCTT: 0 +*CharPosition: BASELINE +*DeviceFonts: LIST(136,138,146,147,148,149,150,151,152,153,154,155,156,157, ++ 163,164,165,166,196,197,198,199,200,201,202,203,209,210, ++ 211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226, ++ 227,228,229,230) +*MinFontID: 16534 +*MaxFontID: 32768 +*FontFormat: HPPCL_OUTLINE +*Command: CmdSetFontID { *Cmd : "<1B>*c" %d{NextFontID}"D" } +*Command: CmdSelectFontID { *Cmd : "<1B>(" %d{CurrentFontID}"X" } +*Command: CmdSetCharCode { *Cmd : "<1B>*c" %d{NextGlyph}"E" } +*Command: CmdUnderlineOn { *Cmd : "<1B>&dD" } +*Command: CmdUnderlineOff { *Cmd : "<1B>&d@" } +*Command: CmdWhiteTextOn { *Cmd : "<1B>*v1o1T" } +*Command: CmdWhiteTextOff { *Cmd : "<1B>*v0o0T" } + + +*%******************************************************************************************** +*%* Vector Commands. +*%******************************************************************************************** +*MinGrayFill: 1 +*MaxGrayFill: 100 +*Command: CmdSetRectWidth { *Cmd : "<1B>*c" %d{(RectXSize) }"A" } +*Command: CmdSetRectHeight { *Cmd : "<1B>*c" %d{(RectYSize) }"B" } +*Command: CmdRectGrayFill { *Cmd : "<1B>*c" %d{GrayPercentage }"g2P" } +*Command: CmdRectWhiteFill { *Cmd : "<1B>*c1P" } +*Command: CmdRectBlackFill { *Cmd : "<1B>*c0P" } diff --git a/print/OEM Printer Customization Plug-in Samples/C++/gdl/res/gdlsmpl.inf b/print/OEM Printer Customization Plug-in Samples/C++/gdl/res/gdlsmpl.inf new file mode 100644 index 00000000..c57b08b1 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/gdl/res/gdlsmpl.inf @@ -0,0 +1,99 @@ + +; GDLSMPL.INF +; +; INF file for the GDL sample +; +; Copyright 1999 - 2006 Microsoft Corporation + + +[Version] +Signature="$Windows NT$" +Provider=%FABRIKAM% +LayoutFile=ntprint.inf +ClassGUID={4D36E979-E325-11CE-BFC1-08002BE10318} +Class=Printer +DriverVer=01/01/2006,1.0.0.1 + +; +; Manufacturer section. +; +; This section lists all of the manufacturers +; that we will display in the Dialog box +; +[Manufacturer] +"Fabrikam"=Fabrikam,NTx86,NTamd64,NTia64 + +; +; Model sections. +; +; Each section here corresponds with an entry listed in the +; [Manufacturer] section, above. The models will be displayed in the order +; that they appear in the INF file. +; + +[Fabrikam.NTx86] +"GDL Sample" = GDLSMPL + +[Fabrikam.NTamd64] +"GDL Sample" = GDLSMPL + +[Fabrikam.NTia64] +"GDL Sample" = GDLSMPL + + +; +; Installer Sections +; +; These sections control file installation, and reference all files that +; need to be copied. The section name will be assumed to be the driver +; file, unless there is an explicit DriverFile section listed. +; + +[GDLSMPL] +DataFile=GDLSMPL.GPD +DataSection=UNIDRV_DATA +Include=NTPRINT.INF +Needs=UNIDRV.OEM,UNIDRV_DATA + + +; +; Location of source files not in Layout.inf. +; + +[SourceDisksNames] +100 = %OEMSample% + +[SourceDisksFiles.X86] +GDLSMPL.dll = 100,x86 + +[SourceDisksFiles.amd64] +GDLSMPL.dll = 100,amd64 + +[SourceDisksFiles.IA64] +GDLSMPL.dll = 100,ia64 + +[SourceDisksFiles] +GDLSMPL.GPD = 100 +GDLSMPL.INI = 100 + +; +; Call SetupSetDirectoryId with 66000 to set the target directory at runtime +; (depending on which environment drivers are getting installed) +; + +[DestinationDirs] +DefaultDestDir=66000 + +; +; Localizable Strings +; +[Strings] +FABRIKAM="Fabrikam Print Driver (Microsoft DDK Sample)" +OEMSample="GDL Sample" + + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/gdl/res/gdlsmpl.ini b/print/OEM Printer Customization Plug-in Samples/C++/gdl/res/gdlsmpl.ini new file mode 100644 index 00000000..dd46570f --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/gdl/res/gdlsmpl.ini @@ -0,0 +1,3 @@ +[OEMFiles] +OEMConfigFile1=GDLSMPL.DLL + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/GDLSMPL.vcxproj b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/GDLSMPL.vcxproj new file mode 100644 index 00000000..8b4e5189 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/GDLSMPL.vcxproj @@ -0,0 +1,1084 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Win10 Debug|ARM64"> + <Configuration>Win10 Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|Win32"> + <Configuration>Win10 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|x64"> + <Configuration>Win10 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|ARM64"> + <Configuration>Win10 Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|Win32"> + <Configuration>Win10 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|x64"> + <Configuration>Win10 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|Win32"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|Win32"> + <Configuration>Win8 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|Win32"> + <Configuration>Win7 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|Win32"> + <Configuration>Win8.1 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|Win32"> + <Configuration>Win8 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|Win32"> + <Configuration>Win7 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|x64"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|x64"> + <Configuration>Win8 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|x64"> + <Configuration>Win7 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|x64"> + <Configuration>Win8.1 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|x64"> + <Configuration>Win8 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|x64"> + <Configuration>Win7 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{F0118F7B-9DF5-49FC-B4FF-951C54033F3D}</ProjectGuid> + <RootNamespace>$(MSBuildProjectName)</RootNamespace> + <Configuration Condition="'$(Configuration)' == ''">Win10 Debug</Configuration> + <Platform Condition="'$(Platform)' == ''">Win32</Platform> + <SampleGuid>{54379D65-81DC-4846-87B8-91904DFAD95D}</SampleGuid> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <PropertyGroup> + <OutDir>$(IntDir)</OutDir> + </PropertyGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ItemGroup Label="WrappedTaskItems" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetName>GDLSMPL</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetName>GDLSMPL</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetName>GDLSMPL</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <TargetName>GDLSMPL</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <TargetName>GDLSMPL</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetName>GDLSMPL</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetName>GDLSMPL</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetName>GDLSMPL</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <TargetName>GDLSMPL</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <TargetName>GDLSMPL</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetName>GDLSMPL</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetName>GDLSMPL</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetName>GDLSMPL</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <TargetName>GDLSMPL</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetName>GDLSMPL</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetName>GDLSMPL</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetName>GDLSMPL</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <TargetName>GDLSMPL</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ResourceCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ResourceCompile> + <ClCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Midl> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </Midl> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ResourceCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ResourceCompile> + <ClCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Midl> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </Midl> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ResourceCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ResourceCompile> + <ClCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Midl> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </Midl> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ResourceCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ResourceCompile> + <ClCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Midl> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </Midl> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ResourceCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ResourceCompile> + <ClCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Midl> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </Midl> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ResourceCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ResourceCompile> + <ClCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Midl> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </Midl> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ResourceCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ResourceCompile> + <ClCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Midl> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </Midl> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ResourceCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ResourceCompile> + <ClCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Midl> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </Midl> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ResourceCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ResourceCompile> + <ClCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Midl> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </Midl> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ResourceCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ResourceCompile> + <ClCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Midl> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </Midl> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ResourceCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ResourceCompile> + <ClCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Midl> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </Midl> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ResourceCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ResourceCompile> + <ClCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Midl> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </Midl> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ResourceCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ResourceCompile> + <ClCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Midl> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </Midl> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ResourceCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ResourceCompile> + <ClCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Midl> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </Midl> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ResourceCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ResourceCompile> + <ClCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Midl> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </Midl> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ResourceCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ResourceCompile> + <ClCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Midl> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </Midl> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ResourceCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ResourceCompile> + <ClCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Midl> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </Midl> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ResourceCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ResourceCompile> + <ClCompile> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> + <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Midl> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </Midl> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib;msxml6.lib</AdditionalDependencies> + <ModuleDefinitionFile>GDLSMPL.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib;msxml6.lib</AdditionalDependencies> + <ModuleDefinitionFile>GDLSMPL.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib;msxml6.lib</AdditionalDependencies> + <ModuleDefinitionFile>GDLSMPL.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib;msxml6.lib</AdditionalDependencies> + <ModuleDefinitionFile>GDLSMPL.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib;msxml6.lib</AdditionalDependencies> + <ModuleDefinitionFile>GDLSMPL.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib;msxml6.lib</AdditionalDependencies> + <ModuleDefinitionFile>GDLSMPL.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib;msxml6.lib</AdditionalDependencies> + <ModuleDefinitionFile>GDLSMPL.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib;msxml6.lib</AdditionalDependencies> + <ModuleDefinitionFile>GDLSMPL.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib;msxml6.lib</AdditionalDependencies> + <ModuleDefinitionFile>GDLSMPL.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib;msxml6.lib</AdditionalDependencies> + <ModuleDefinitionFile>GDLSMPL.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib;msxml6.lib</AdditionalDependencies> + <ModuleDefinitionFile>GDLSMPL.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib;msxml6.lib</AdditionalDependencies> + <ModuleDefinitionFile>GDLSMPL.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib;msxml6.lib</AdditionalDependencies> + <ModuleDefinitionFile>GDLSMPL.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib;msxml6.lib</AdditionalDependencies> + <ModuleDefinitionFile>GDLSMPL.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib;msxml6.lib</AdditionalDependencies> + <ModuleDefinitionFile>GDLSMPL.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib;msxml6.lib</AdditionalDependencies> + <ModuleDefinitionFile>GDLSMPL.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib;msxml6.lib</AdditionalDependencies> + <ModuleDefinitionFile>GDLSMPL.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib;msxml6.lib</AdditionalDependencies> + <ModuleDefinitionFile>GDLSMPL.def</ModuleDefinitionFile> + </Link> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="devmode.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="gdlsmpl.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Create</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ResourceCompile Include="gdlsmpl.rc" /> + </ItemGroup> + <ItemGroup> + <Inf Exclude="@(Inf)" Include="*.inf" /> + <FilesToPackage Include="$(TargetPath)" Condition="'$(ConfigurationType)'=='Driver' or '$(ConfigurationType)'=='DynamicLibrary'" /> + </ItemGroup> + <ItemGroup> + <None Exclude="@(None)" Include="*.txt;*.htm;*.html" /> + <None Exclude="@(None)" Include="*.ico;*.cur;*.bmp;*.dlg;*.rct;*.gif;*.jpg;*.jpeg;*.wav;*.jpe;*.tiff;*.tif;*.png;*.rc2" /> + <None Exclude="@(None)" Include="*.def;*.bat;*.hpj;*.asmx" /> + </ItemGroup> + <ItemGroup> + <ClInclude Exclude="@(ClInclude)" Include="*.h;*.hpp;*.hxx;*.hm;*.inl;*.xsd" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/GDLSMPL.vcxproj.Filters b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/GDLSMPL.vcxproj.Filters new file mode 100644 index 00000000..6031427f --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/GDLSMPL.vcxproj.Filters @@ -0,0 +1,134 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;*</Extensions> + <UniqueIdentifier>{AA9642FD-4376-4AA6-BEBD-F068AD5C8036}</UniqueIdentifier> + </Filter> + <Filter Include="Header Files"> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + <UniqueIdentifier>{C5C6C5CD-8656-4525-B00D-B1F5AEFAA986}</UniqueIdentifier> + </Filter> + <Filter Include="Resource Files"> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms;man;xml</Extensions> + <UniqueIdentifier>{7600E0E1-C09C-435F-9EE5-6AE7AF0E62AA}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClCompile Include="devmode.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="gdlsmpl.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="gdlsmpl.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="gdlsmpl.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="gdlsmpl.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="gdlsmpl.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="gdlsmpl.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="gdlsmpl.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="gdlsmpl.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="gdlsmpl.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="gdlsmpl.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="gdlsmpl.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="gdlsmpl.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="gdlsmpl.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="gdlsmpl.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="gdlsmpl.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> + <ItemGroup> + <None Include="gdlsmpl.def"> + <Filter>Source Files</Filter> + </None> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/debug.h b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/debug.h new file mode 100644 index 00000000..0414569c --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/debug.h @@ -0,0 +1,82 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1996 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Debug.H +// +// PURPOSE: Define common data types, and external function prototypes +// for debugging functions. Also defines the various debug macros. +// +// + +#pragma once + +///////////////////////////////////////////////////////// +// Macros +///////////////////////////////////////////////////////// +// +// These macros are used for debugging purposes. They expand +// to white spaces on a free build. Here is a brief description +// of what they do and how they are used: +// +// giDebugLevel +// Global variable which set the current debug level to control +// the amount of debug messages emitted. +// +// WARNING(msg) +// Display a message if the current debug level is <= DBG_WARNING. +// The message format is: WRN filename (linenumber): message +// +// ERR(msg) +// Similiar to WARNING macro above - displays a message +// if the current debug level is <= DBG_ERROR. +// +// ASSERT(cond) +// Verify a condition is true. If not, force a breakpoint. +// +// RIP(msg) +// Display a message and force a breakpoint. +// +// Usage: +// WARNING("App passed NULL pointer, ignoring...\n"); +// + +#define DBG_VERBOSE 0 +#define DBG_WARNING 1 +#define DBG_ERROR 2 +#define DBG_NONE 3 + +// VC and Build use different debug defines. +#if defined (DBG) || defined (_DEBUG) + + // __declspec(selectany) ensures that even if this is defined in multiple compilation + // modules, they will all resolve to the same symbol in the linked DLL + __declspec(selectany) INT giDebugLevel = 2; + + #define STRINGIZE(x) #x + #define QUOTE(x) STRINGIZE(x) + #define FILE_AND_LINE __FILE__ "@" QUOTE(__LINE__) + + #define VERBOSE(msg) { if(giDebugLevel <= DBG_VERBOSE) OutputDebugStringA( FILE_AND_LINE ": " msg); } + #define WARNING(msg) { if(giDebugLevel <= DBG_WARNING) OutputDebugStringA( FILE_AND_LINE ": Warning: " msg); } + #define ERR(msg) { if(giDebugLevel <= DBG_ERROR) OutputDebugStringA(FILE_AND_LINE ": Error:" msg); } + #define ASSERT(cond) { if (!(cond)) RIP("\n"); } + #define RIP(msg) { OutputDebugStringA(FILE_AND_LINE ": Error (not recoverable): " msg); DebugBreak(); } + +#else // !DBG + + #define VERBOSE(msg) + #define WARNING(msg) + #define ERR(msg) + #define ASSERT(cond) + #define RIP(msg) + +#endif + + + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/devmode.cpp b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/devmode.cpp new file mode 100644 index 00000000..0654e1b5 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/devmode.cpp @@ -0,0 +1,251 @@ +//+-------------------------------------------------------------------------- +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2006 Microsoft Corporation. All Rights Reserved. +// +// FILE: devmode.cpp +// +// PURPOSE: Implementation of Devmode functions shared with OEM UI and OEM rendering modules. +// +//-------------------------------------------------------------------------- + +#include "precomp.h" + +#include "debug.h" +#include "devmode.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +BOOL +ConvertOEMDevmode( + _In_ PCOEMDEV pOEMDevIn, + _Inout_ POEMDEV pOEMDevOut + ); + +BOOL +MakeOEMDevmodeValid( + _Out_ POEMDEV pOEMDevmode + ); + +//+--------------------------------------------------------------------------- +// +// Member: +// ::hrOEMDevMode +// +// Synopsis: +// Performs operation on UI Plugins Private DevMode Members. +// Called via IOemUI::DevMode +// +// Returns: +// S_OK or E_FAIL. For more detailed failure info, +// check GetLastError +// +// Last error: +// ERROR_INVALID_PARAMETER +// +// +//---------------------------------------------------------------------------- +HRESULT +hrOEMDevMode( + DWORD dwMode, + // Indicates which operation should be performed + _Inout_ POEMDMPARAM pOemDMParam + // contains various data structures needed by this + // routine. The usage of this struct is determined by + // the dwMode flag. + ) +{ + HRESULT hr = S_OK; + // Return value. + + // + // Verify parameters. + // + if ((NULL == pOemDMParam) || + ((OEMDM_SIZE != dwMode) && + (OEMDM_DEFAULT != dwMode) && + (OEMDM_CONVERT != dwMode) && + (OEMDM_MERGE != dwMode))) + { + ERR("DevMode() ERROR_INVALID_PARAMETER.\r\n"); + + SetLastError(ERROR_INVALID_PARAMETER); + hr = E_FAIL; + } + else + { + POEMDEV pOEMDevIn = (POEMDEV) pOemDMParam->pOEMDMIn;; + // Pointer to the supplied OEM devmode data, if applicable + // based on dwMode. + + POEMDEV pOEMDevOut = (POEMDEV) pOemDMParam->pOEMDMOut;; + // Pointer to the DEVMODE data that this routine is + // expected to configure, if applicable based on dwMode. + + switch (dwMode) + { + // + // The Method should return the size of the memory allocation + // needed to store the UI plugin Private DEVMODE. + // + case OEMDM_SIZE: + pOemDMParam->cbBufSize = sizeof(OEMDEV); + break; + + // + //Should fill the Private DEVMODE with the default values. + // + case OEMDM_DEFAULT: + // + //OEM_DMEXTRAHEADER Members + // + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + break; + + // + // The method should convert private DEVMODE members to + // the current version, if necessary. + // + case OEMDM_CONVERT: + ConvertOEMDevmode(pOEMDevIn, pOEMDevOut); + break; + + // + // The method should validate the information contained in private + // DEVMODE members and merge validated values into a private + // DEVMODE structure containing default values + // + case OEMDM_MERGE: + ConvertOEMDevmode(pOEMDevIn, pOEMDevOut); + MakeOEMDevmodeValid(pOEMDevOut); + break; + } + } + + return hr; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// ::ConvertOEMDevmode +// +// Synopsis: +// confirm that the private DEVMODE being passed in is data that +// this driver recognizes, read the settings from the input +// OEM DEVMODE data, and write them to pOEMDevOut. +// +// Returns: +// True unless the routine was called with null pointers +// +// +//---------------------------------------------------------------------------- +BOOL +ConvertOEMDevmode( + _In_ PCOEMDEV pOEMDevIn, + // Caller supplied DEVMODE that we are attempting to read + _Inout_ POEMDEV pOEMDevOut + // OEM private DEVMODE configured by this routine based on the settings + // in pOEMDevIn + ) +{ + if ((NULL == pOEMDevIn) || + (NULL == pOEMDevOut)) + { + ERR("ConvertOEMDevmode() invalid parameters.\r\n"); + return FALSE; + } + + // + // Check OEM Signature, if it doesn't match ours, + // then just assume DMIn is bad and use defaults. + // + if(pOEMDevIn->dmOEMExtra.dwSignature == pOEMDevOut->dmOEMExtra.dwSignature) + { + // + // Copy the old structure in to the new using which ever size is the + // smaller. Devmode maybe from newer Devmode (not likely since there + // is only one), or Devmode maybe a newer Devmode, in which case it + // maybe larger, but the first part of the structure should be the same. + // + // DESIGN ASSUMPTION: the private DEVMODE structure only gets added to; + // the fields that are in the DEVMODE never change only new fields get + // added to the end. + // + memcpy(pOEMDevOut, + pOEMDevIn, + __min(pOEMDevOut->dmOEMExtra.dwSize, pOEMDevIn->dmOEMExtra.dwSize)); + + // + // Re-fill in the size and version fields to indicated + // that the DEVMODE is the current private DEVMODE version. + // + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + + // + // If the plug-in is capable of recognizing multiple versions of it's + // private DEVMODE data add custom handling here to support it. + // + } + else + { + WARNING("Unknown DEVMODE signature, pOEMDMIn ignored.\r\n"); + + // + // The private DEVMODE data is not something that this plug-in understands, + // so use defaults. + // + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + } + + return TRUE; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// ::MakeOEMDevmodeValid +// +// Synopsis: +// Force the OEM devmode settings to valid values. +// +// Returns: +// True if the OEMDEV was configured, else FALSE. Only return false if +// the parameter is NULL. +// +// +//---------------------------------------------------------------------------- +BOOL +MakeOEMDevmodeValid( + _Out_ POEMDEV pOEMDevmode + // OEM DEVMODE data to modify + ) +{ + if(NULL == pOEMDevmode) + { + return FALSE; + } + + // + // Assumption: pOEMDevmode is large enough to contain OEMDEV structure. + // + pOEMDevmode->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevmode->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevmode->dmOEMExtra.dwVersion = OEM_VERSION; + + return TRUE; +} + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/devmode.h b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/devmode.h new file mode 100644 index 00000000..791b1a20 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/devmode.h @@ -0,0 +1,52 @@ +//+-------------------------------------------------------------------------- +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2006 Microsoft Corporation. All Rights Reserved. +// +// FILE: devmode.h +// +// PURPOSE: Define common data types, and external function prototypes +// for devmode functions. +// +//-------------------------------------------------------------------------- + +#pragma once + +#define OEM_SIGNATURE 'GDLS' +#define OEM_VERSION 0x00000001L + +// +// OEM private DEVMODE data structure. This gets included in the DEVMODE +// used by Unidrv. +// +typedef struct tagOEMDEV +{ + OEM_DMEXTRAHEADER dmOEMExtra; + // This structure MUST be prefixed by OEM_DMEXTRAHEADER + + // + // Add private DevMode members here, after the standard header + // information. + // + +} OEMDEV, *POEMDEV; + +typedef const OEMDEV *PCOEMDEV; + + +// +// Prototypes +// + +HRESULT +hrOEMDevMode( + DWORD dwMode, + _Inout_ POEMDMPARAM pOemDMParam + ); + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/gdlsmpl.cpp b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/gdlsmpl.cpp new file mode 100644 index 00000000..6d8fd195 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/gdlsmpl.cpp @@ -0,0 +1,856 @@ +//+-------------------------------------------------------------------------- +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2006 Microsoft Corporation. All Rights Reserved. +// +// FILE: gdlsmpl.cpp +// +// PURPOSE: Implementation of interface for Unidrv5 UI plug-ins. +// +//-------------------------------------------------------------------------- + +#include "precomp.h" + +#include "debug.h" +#include "devmode.h" +#include "intrface.h" +#include "gdlsmpl.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +//-------------------------------------------------------------------------- +// Globals +//-------------------------------------------------------------------------- + +HINSTANCE ghInstance = NULL; + // Module's Instance handle from DLLEntry of process. + + +//-------------------------------------------------------------------------- +// Internal Globals +//-------------------------------------------------------------------------- + +static long g_cComponents = 0; + // Count of active components + +static long g_cServerLocks = 0; + // Count of locks + + +//-------------------------------------------------------------------------- +// Local helper functions +//-------------------------------------------------------------------------- +BOOL __stdcall +DebugPrint( + LPCWSTR pszMessage, + // Format string for the error message + ... + // args specified in the format string. + ) +{ + va_list arglist; + // varargs list for processing the '...' parameter. + + WCHAR szMsgBuf[MAX_PATH] = {0}; + // Use a stack error buffer so that we don't need to + // allocate in the failure path. + + HRESULT hResult; + // Result from formatting the string. + + if (NULL == pszMessage) + { + return FALSE; + } + + // Pass the variable parameters to wvsprintf to be formated. + va_start(arglist, pszMessage); + hResult = StringCbVPrintfW(szMsgBuf, MAX_PATH*sizeof(szMsgBuf[0]), pszMessage, arglist); + va_end(arglist); + + // Dump string to debug output. + OutputDebugStringW(szMsgBuf); + + return SUCCEEDED(hResult); +} + + +//-------------------------------------------------------------------------- +// Class factory for the Plug-In object +//-------------------------------------------------------------------------- +class COemCF : public IClassFactory +{ +public: + + // IUnknown methods + STDMETHOD(QueryInterface) (THIS_ + REFIID riid, + LPVOID FAR* ppvObj + ); + + STDMETHOD_(ULONG,AddRef) (THIS); + + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release) (THIS); + + // IClassFactory methods + STDMETHOD(CreateInstance) (THIS_ + _In_opt_ LPUNKNOWN pUnkOuter, + _In_ REFIID riid, + _Outptr_ LPVOID FAR* ppvObject + ); + + STDMETHOD(LockServer) (THIS_ + BOOL bLock + ); + + // Class-specific methods. + COemCF(): m_cRef(1) { }; + + ~COemCF() { }; + +protected: + LONG m_cRef; + +}; + + +//+--------------------------------------------------------------------------- +// +// Member: +// ::DllMain +// +// Synopsis: +// Dll's main routine, called when new +// threads or processes reference the module +// +// Returns: +// TRUE. Currently has no failure paths. Return false if the module +// cannot be properly initialized. +// +// Notes: +// the caller of this routine holds a process-wide lock preventing more +// than one module from being initialized at a time. In general, +// plug-ins should do as little as possible in this routine to avoid +// stalling other threads that may need to load modules. Also, calling +// any function that would, in-turn, cause another module to be loaded +// could result in a deadlock. +// +// +//---------------------------------------------------------------------------- +extern "C" BOOL +WINAPI DllMain( + HINSTANCE hInst, + WORD wReason, + LPVOID lpReserved + ) +{ + UNREFERENCED_PARAMETER(hInst); + UNREFERENCED_PARAMETER(lpReserved); + + switch(wReason) + { + case DLL_PROCESS_ATTACH: + ghInstance = hInst; + break; + + case DLL_THREAD_ATTACH: + break; + + case DLL_PROCESS_DETACH: + break; + + case DLL_THREAD_DETACH: + break; + } + + return TRUE; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// ::DllCanUnloadNow +// +// Synopsis: +// Can the DLL be unloaded from memory? Answers no if any objects are +// still allocated, or if the server has been locked. +// +// To avoid leaving OEM DLL still in memory when Unidrv or Pscript +// drivers are unloaded, Unidrv and Pscript driver ignore the return +// value of DllCanUnloadNow of the OEM DLL, and always call FreeLibrary +// on the OEMDLL. +// +// If the plug-in spins off a working thread that also uses this DLL, +// the thread needs to call LoadLibrary and FreeLibraryAndExitThread, +// otherwise it may crash after Unidrv or Pscript calls FreeLibrary. +// +// Returns: +// S_OK if the DLL can be unloaded safely, otherwise S_FALSE +// +// +//---------------------------------------------------------------------------- +STDAPI DllCanUnloadNow() +{ + if ((g_cComponents == 0) && (g_cServerLocks == 0)) + { + return S_OK; + } + else + { + return S_FALSE; + } +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// ::DllGetClassObject +// +// Synopsis: +// Retrieve the class factory object for the indicated class. +// +// Returns: +// CLASS_E_CLASSNOTAVAILABLE, E_OUTOFMEMORY, or S_OK. +// +// Notes: +// +// +//---------------------------------------------------------------------------- +STDAPI +DllGetClassObject( + _In_ CONST CLSID& clsid, + // GUID of the class object that the caller wants a class factory for + _In_ CONST IID& iid, + // Interface ID to provide in ppv + _Outptr_ VOID** ppv + // out pointer to the interface requested. + ) +{ + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // + // Can we create this component? + // + if (clsid != CLSID_OEMUI) + { + return CLASS_E_CLASSNOTAVAILABLE; + } + + // + // Create class factory. + // Reference count set to 1 in Constructor + // + COemCF* pGDLSampleClassFactory = new COemCF; + if (pGDLSampleClassFactory == NULL) + { + return E_OUTOFMEMORY; + } + + // + // Get requested interface. + // + HRESULT hr = pGDLSampleClassFactory->QueryInterface(iid, ppv); + pGDLSampleClassFactory->Release(); + + return hr; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// COemCF::QueryInterface +// +// Synopsis: +// Standard COM IUnknown implementation. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemCF::QueryInterface( + CONST IID& iid, + VOID** ppv + ) +{ + if ((iid == IID_IUnknown) || (iid == IID_IClassFactory)) + { + *ppv = static_cast<COemCF*>(this); + } + else + { + *ppv = NULL; + return E_NOINTERFACE; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef(); + return S_OK; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// COemCF::AddRef +// +// Synopsis: +// Standard COM IUnknown implementation. +// +// +//---------------------------------------------------------------------------- +ULONG __stdcall +COemCF::AddRef() +{ + return InterlockedIncrement(&m_cRef); +} + +//+--------------------------------------------------------------------------- +// +// Member: +// COemCF::Release +// +// Synopsis: +// Standard COM IUnknown implementation. +// +// +//---------------------------------------------------------------------------- +_At_(this, __drv_freesMem(object)) +ULONG __stdcall +COemCF::Release() +{ + assert(0 != m_cRef); + + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + } + return cRef; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// COemCF::CreateInstance +// +// Synopsis: +// Attempt to create an object that implements the specified interface. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemCF::CreateInstance( + _In_opt_ IUnknown* pUnknownOuter, + _In_ CONST IID& iid, + _Outptr_ VOID** ppv + ) +{ + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // + // Cannot aggregate. + // + if (pUnknownOuter != NULL) + { + return CLASS_E_NOAGGREGATION; + } + + HRESULT hr = S_OK; + + if (iid == IID_IUnknown || + iid == IID_IPrintOemUI2) + { + // + // Create component. + // + COemUI2* pOemCB = new COemUI2; + if (pOemCB == NULL) + { + hr = E_OUTOFMEMORY; + } + else + { + // + // Get the requested interface. + // + hr = pOemCB->QueryInterface(iid, ppv); + + // + // Release the IUnknown pointer. + // (If QueryInterface failed, component will delete itself.) + // + pOemCB->Release(); + } + } + else + { + hr = E_NOINTERFACE; + } + + return hr; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// COemCF::LockServer +// +// Synopsis: +// Locking the server holds the objects server in memory, so that new +// instances of objects can be created more quickly. +// +// Returns: +// S_OK +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemCF::LockServer( + BOOL bLock + // If true, increment the lock count, otherwise decrement the lock + // count. + ) +{ + if (bLock) + { + InterlockedIncrement(&g_cServerLocks); + } + else + { + InterlockedDecrement(&g_cServerLocks); + } + + return S_OK; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2 (destructor) +// +// Synopsis: +// Release the helper interface, as well as any other resources that +// the plug-in is holding onto. +// +// Returns: +// +// Notes: +// +// +//---------------------------------------------------------------------------- +COemUI2::~COemUI2() +{ + // + // Make sure that helper interface is released. + // + if(NULL != m_pCoreHelper) + { + m_pCoreHelper->Release(); + m_pCoreHelper = NULL; + } + + // + // If this instance of the object is being deleted, then the reference + // count should be zero. + // + assert(0 == m_cRef); +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2::PublishDriverInterface +// +// Synopsis: +// This routine is called by the core driver to supply objects to the +// plug-in which the plug-in can use to implement various features. +// +// This implementation requires an object that IPrintCoreHelper interface +// from the core driver to implement full UI replacement. If the object +// passed in is the one desired, this routine will return S_OK, otherwise +// it will return E_FAIL. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemUI2::PublishDriverInterface( + IUnknown *pIUnknown + ) +{ + HRESULT hr = S_OK; + + // + // Save a pointer to the IPrintCoreHelperUni interface. This will allow + // the plug-in to access it's GDL file (which can be it's GPD file as well) + // + if (m_pCoreHelper == NULL) + { + hr = pIUnknown->QueryInterface(IID_IPrintCoreHelperUni, (VOID**) &(m_pCoreHelper)); + + if (!SUCCEEDED(hr)) + { + m_pCoreHelper = NULL; + hr = E_FAIL; + } + } + + return hr; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2::GetInfo +// +// Synopsis: +// Most of this routine is a standard implementation common to most +// plug-ins. Of particular note in this sample is that to get a handle +// the IPrintCoreHelper plug-in in the PublishDriverInterface callback, +// this routine must return OEMPUBLISH_IPRINTCOREHELPER in the out +// parameter when the mode is OEMGI_GETREQUESTEDHELPERINTERFACES. +// +// Returns: +// S_OK for supported modes, E_FAIL for everything else. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemUI2::GetInfo( + DWORD dwMode, + // The mode indicates what information is being requested by the + // core driver. + _Out_writes_bytes_(cbSize) PVOID pBuffer, + // The output buffer is the location into which the requested info + // should be written + DWORD cbSize, + // The size of the output buffer. + PDWORD pcbNeeded + // If the size of the buffer is insufficient, use this parameter + // to indicate to the core driver how much space is required. + ) +{ + HRESULT hrResult = S_OK; + + // + // Validate parameters. OEMGI_GETPUBLISHERINFO is excluded from this + // list because that GetInfo mode applies only to PScript rendering plug-ins. + // + if ((NULL == pcbNeeded) || + ((OEMGI_GETSIGNATURE != dwMode) && + (OEMGI_GETVERSION != dwMode) && + (OEMGI_GETREQUESTEDHELPERINTERFACES != dwMode))) + { + WARNING("COemUI2::GetInfo() exit pcbNeeded is NULL or mode is not supported\r\n"); + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // + // Set expected buffer size and number of bytes written. + // + *pcbNeeded = sizeof(DWORD); + + // + // Check buffer size is sufficient. + // + if((cbSize < *pcbNeeded) || (NULL == pBuffer)) + { + WARNING("COemUI2::GetInfo() exit insufficient buffer!\r\n"); + SetLastError(ERROR_INSUFFICIENT_BUFFER); + hrResult = E_FAIL; + } + else + { + switch(dwMode) + { + // + // OEM DLL Signature + // + case OEMGI_GETSIGNATURE: + *(PDWORD)pBuffer = OEM_SIGNATURE; + break; + + // + // OEM DLL version + // + case OEMGI_GETVERSION: + *(PDWORD)pBuffer = OEM_VERSION; + break; + + // + // The UI is asking whether the plug-in uses the IPrintCoreHelper based + // helper object. Indicate that the plug-in does need this object. + // + case OEMGI_GETREQUESTEDHELPERINTERFACES: + *(PDWORD)pBuffer = 0; + *(PDWORD)pBuffer |= OEMPUBLISH_IPRINTCOREHELPER; + break; + + // + // dwMode not supported. + // + default: + // + // Set written bytes to zero since nothing was written. + // + WARNING("COemUI2::GetInfo() exit mode not supported.\r\n"); + *pcbNeeded = 0; + SetLastError(ERROR_NOT_SUPPORTED); + hrResult = E_FAIL; + } + } + + return hrResult; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2::DevMode +// +// Synopsis: +// This routine operates in various modes to manage the private DEVMODE. +// This sample does not provide much by way of illustration of how to +// handle OEM settings in the private DEVMODE. See the sample OEMUI for +// a more in-depth look at this routine. The function hrOEMDevMode in +// devmode.cpp also provides more information on how to handle the various +// modes. +// +// Returns: +// S_OK on success, else E_* +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemUI2::DevMode( + DWORD dwMode, + // The operation that should be performed + POEMDMPARAM pOemDMParam + // The input & output DEVMODEs, including pointers to the public & + // private DEVMODE data. + ) +{ + return hrOEMDevMode(dwMode, pOemDMParam); +} + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2::DocumentPropertySheets +// +// Synopsis: +// Show the GPD version in the debugger whenever the +// printing preferences UI is shown. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemUI2::DocumentPropertySheets( + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam + ) +{ + UNREFERENCED_PARAMETER(pPSUIInfo); + UNREFERENCED_PARAMETER(lParam); + + this->DbgShowGPDVersion(); + + return S_OK; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2::DbgShowGPDVersion +// +// Synopsis: +// Display the GPD version in the debugger using a GDL snapshot & MSXML 6 +// To make this work on versions of Windows prior to Windows Vista, change +// references to MSXML 6 with MSXML 3. +// +// +//---------------------------------------------------------------------------- +HRESULT +COemUI2::DbgShowGPDVersion() +{ + HRESULT hr; + IXMLDOMDocument2 *pDOMSnapshot = NULL; + IXMLDOMNode *pVersionNode = NULL; + + // + // Get a DOM representation of the snapshot using MSXML 3 + // + hr = LoadGDLSnapshot(&pDOMSnapshot); + + if (hr == REGDB_E_CLASSNOTREG) + { + DebugPrint(L"COemUI2::PublishHelperInterface: MSXML 6.0 not registered, GDL version lookup disabled\r\n"); + } + + // + // Find the GDL node that contains the GPDFileVersion. This should return a single XML DOM Element. + // + if (SUCCEEDED(hr)) + { + hr = pDOMSnapshot->selectSingleNode((BSTR)TEXT("//gdl:SnapshotRoot/gdl:GDL_ATTRIBUTE[@Name=\"*GPDFileVersion\"]"), &pVersionNode); + } + + // + // If the node was found, write the version information to the debugger. + // It's content is represented as CDATA in the XML, but MSXML will + // normalize that to a regular string when it parses the XML. + // + if (SUCCEEDED(hr) && pVersionNode) + { + VARIANT varVersionString; + + // + // Get DefaultOption name + // + hr = pVersionNode->get_nodeTypedValue(&varVersionString); + + if (SUCCEEDED(hr)) + { + DebugPrint(L"COemUI2::PublishHelperInterface: GDL Version: %s\r\n", varVersionString.bstrVal); + } + + VariantClear(&varVersionString); + } + + if (pDOMSnapshot) + { + pDOMSnapshot->Release(); + pDOMSnapshot = NULL; + } + + return hr; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2::LoadGDLSnapshot +// +// Synopsis: +// Load the GDL snapshot from IPrintCoreHelperUni into a DOM object, +// and set appropriate properties on the DOM to prepare it for use +// with xpath queries. +// +// +//---------------------------------------------------------------------------- +HRESULT +COemUI2::LoadGDLSnapshot( + _Out_ IXMLDOMDocument2 **ppDOMSnapshot + ) +{ + HRESULT hr = S_OK; + IStream *pSnapshotStream = NULL; + VARIANT_BOOL loadResult = 0; + + if (!ppDOMSnapshot) + { + return E_INVALIDARG; + } + + (*ppDOMSnapshot) = NULL; + + hr = m_pCoreHelper->CreateDefaultGDLSnapshot(0, &pSnapshotStream); + + if (SUCCEEDED(hr)) + { + // + // Create DOM document + // + hr = m_pCoreHelper->CreateInstanceOfMSXMLObject(CLSID_DOMDocument60, + NULL, + CLSCTX_INPROC_SERVER, + IID_IXMLDOMDocument2, + (LPVOID *)ppDOMSnapshot); + } + + if (SUCCEEDED(hr)) + { + VARIANT streamVar; + + VariantInit(&streamVar); + V_VT(&streamVar) = VT_UNKNOWN; + V_UNKNOWN(&streamVar) = pSnapshotStream; + pSnapshotStream->AddRef(); + + // + // Load the snapshot into the DOM document + // + (*ppDOMSnapshot)->put_async(VARIANT_FALSE); + (*ppDOMSnapshot)->put_validateOnParse(VARIANT_FALSE); + (*ppDOMSnapshot)->put_resolveExternals(VARIANT_FALSE); + + hr = (*ppDOMSnapshot)->load(streamVar, &loadResult); + + VariantClear(&streamVar); + } + + // + // If the DOM fails to load, the HRESULT will be S_FALSE, so explicitly + // look for S_OK. + // + if (hr == S_OK) + { + // + // Set the namespaces that should be available for xpath queries later. + // + BSTR bstrDefNameSpace = SysAllocString(TEXT("xmlns:gdl=\"http://schemas.microsoft.com/2002/print/gdl/1.0\"")); + + if (!bstrDefNameSpace) + { + hr = E_OUTOFMEMORY; + } + + if (SUCCEEDED(hr)) + { + VARIANT varDefNameSpace; + + VariantInit(&varDefNameSpace); + varDefNameSpace.vt = VT_BSTR; + varDefNameSpace.bstrVal = bstrDefNameSpace; + + hr = (*ppDOMSnapshot)->setProperty((BSTR)TEXT("SelectionNamespaces"), varDefNameSpace); + SysFreeString(bstrDefNameSpace); + } + } + else + { + hr = E_FAIL; + } + + if (FAILED(hr) && *ppDOMSnapshot) + { + (*ppDOMSnapshot)->Release(); + (*ppDOMSnapshot) = NULL; + } + + if (pSnapshotStream) + { + pSnapshotStream->Release(); + pSnapshotStream = NULL; + } + + return hr; +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/gdlsmpl.def b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/gdlsmpl.def new file mode 100644 index 00000000..d9534de1 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/gdlsmpl.def @@ -0,0 +1,18 @@ +; +; THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +; ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +; THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +; PARTICULAR PURPOSE. +; +; Copyright 1997 - 2006 Microsoft Corporation. All Rights Reserved. +; +; Abstract: +; +; This file contains a listing of all of the methods to be exported +; from the DLL, as well as rules for how to name the exports. +; + +LIBRARY GDLSMPL + +EXPORTS DllGetClassObject PRIVATE + DllCanUnloadNow PRIVATE diff --git a/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/gdlsmpl.h b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/gdlsmpl.h new file mode 100644 index 00000000..77ba7647 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/gdlsmpl.h @@ -0,0 +1,79 @@ +//+-------------------------------------------------------------------------- +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2006 Microsoft Corporation. All Rights Reserved. +// +// FILE: gdlsmpl.h +// +// PURPOSE: COM implementation of a UI module that uses GDL. CAbstractOemUI2 +// is defined in intrface.h, and contains a default implementation of +// all optional interface methods. +// +//-------------------------------------------------------------------------- + +#pragma once + +/////////////////////////////////////// +// Globals +/////////////////////////////////////// + +extern HINSTANCE ghInstance; + // Module's Instance handle from DLLEntry of process. + +class COemUI2: public CAbstractOemUI2 +{ +public: + + COemUI2() : + m_pCoreHelper(NULL) + {} + + // + // Method for publishing Driver interface. + // + STDMETHOD(PublishDriverInterface)(THIS_ IUnknown *pIUnknown); + + // + // Get OEM dll related information + // + STDMETHOD(GetInfo) (THIS_ + DWORD dwMode, + _Out_writes_bytes_(cbSize) PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded); + + // + // OEMDevMode + // + STDMETHOD(DevMode) (THIS_ DWORD dwMode, POEMDMPARAM pOemDMParam); + + // + // OEMDocumentPropertySheets + // + STDMETHOD(DocumentPropertySheets) (THIS_ + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam + ); + + virtual ~COemUI2(); + +protected: + + HRESULT + DbgShowGPDVersion(); + + HRESULT + LoadGDLSnapshot( + _Out_ IXMLDOMDocument2 **ppDOMSnapshot + ); + + IPrintCoreHelperUni* m_pCoreHelper; + // Pointer to the helper interface introduced in Windows Vista. +}; + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/gdlsmpl.rc b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/gdlsmpl.rc new file mode 100644 index 00000000..5cd078df --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/gdlsmpl.rc @@ -0,0 +1,106 @@ +//+-------------------------------------------------------------------------- +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2006 Microsoft Corporation. All Rights Reserved. +// +// FILE: gdlsmpl.rc +// +// PURPOSE: Resource script containing all localizable strings for this +// module +// +//-------------------------------------------------------------------------- + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "Developed by Microsoft Corp." + VALUE "CompanyName", "Microsoft Corp." + VALUE "FileDescription", "GDL Sample Printer UI Module" + VALUE "FileVersion", "1, 0, 0, 1" + VALUE "InternalName", "GDLSMPL" + VALUE "LegalCopyright", "Copyright � 1998 - 2006 Microsoft Corp." + VALUE "LegalTrademarks", "Microsoft� is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation" + VALUE "OriginalFilename", "GDLSMPL.dll" + VALUE "ProductName", "Microsoft GDL Sample Driver" + VALUE "ProductVersion", "1.1" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/intrface.cpp b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/intrface.cpp new file mode 100644 index 00000000..d399712d --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/intrface.cpp @@ -0,0 +1,559 @@ +//+-------------------------------------------------------------------------- +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2006 Microsoft Corporation. All Rights Reserved. +// +// FILE: Intrface.cpp +// +// PURPOSE: Generic abstract base class useful for creating implementation +// of interface for Unidrv5 UI plug-ins. This base class +// implements all methods which have a standard implementation +// and / or are optional. Non-optional mathods are pure virtual +// in this base class. +// +//-------------------------------------------------------------------------- + +#include "precomp.h" + +#include "debug.h" +#include "devmode.h" +#include "intrface.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +//+--------------------------------------------------------------------------- +// +// Member: +// CAbstractOemUI2::QueryInterface +// +// Synopsis: +// Standard COM IUnknown implementation. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +CAbstractOemUI2::QueryInterface( + CONST IID& iid, + VOID** ppv + ) +{ + if (iid == IID_IUnknown) + { + *ppv = static_cast<IUnknown*>(this); + } + else if (iid == IID_IPrintOemUI2) + { + *ppv = static_cast<IPrintOemUI2*>(this); + } + else + { + *ppv = NULL; + return E_NOINTERFACE; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef(); + return S_OK; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// CAbstractOemUI2::AddRef +// +// Synopsis: +// Standard COM IUnknown implementation. +// +// +//---------------------------------------------------------------------------- +ULONG __stdcall +CAbstractOemUI2::AddRef() +{ + return InterlockedIncrement(&m_cRef); +} + +//+--------------------------------------------------------------------------- +// +// Member: +// CAbstractOemUI2::Release +// +// Synopsis: +// Standard COM IUnknown implementation. +// +// +//---------------------------------------------------------------------------- +_At_(this, __drv_freesMem(object)) +ULONG __stdcall +CAbstractOemUI2::Release() +{ + ASSERT(0 != m_cRef); + + ULONG cRef = InterlockedDecrement(&m_cRef); + + if (0 == cRef) + { + delete this; + return 0; + + } + + return cRef; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// CAbstractOemUI2::HideStandardUI +// +// Synopsis: +// This routine is critical to supporting full UI replacement. This +// routine allows the plug-in to disable Unidrv's (or PScript's) standard +// UI panels. If this returns E_NOTIMPL, the panel isn't hidden. If +// this routine returns S_OK, Unidrv will not display any UI for the +// specified mode. If this returns E_NOTIMPL, Unidrv will display it's +// standard UI. +// +// Returns: +// S_OK to hide the indicated UI if desired, otherwise E_NOTIMPL. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +CAbstractOemUI2::HideStandardUI( + DWORD dwMode + // document property sheets, printer property sheets, or possibly + // something not yet defined. + ) +{ + UNREFERENCED_PARAMETER(dwMode); + + return E_NOTIMPL; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// CAbstractOemUI2::DocumentPropertySheets +// +// Synopsis: +// A plug-in may optionally add property sheets. If the plug-in has +// chosen to hide the standard UI, then it would instead provide +// replacements for the standard property sheets. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +CAbstractOemUI2::DocumentPropertySheets( + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam + ) +{ + UNREFERENCED_PARAMETER(pPSUIInfo); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// CAbstractOemUI2::DevicePropertySheets +// +// Synopsis: +// A plug-in may optionally add property sheets. If the plug-in has +// chosen to hide the standard UI, then it would instead provide +// replacements for the standard property sheets. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +CAbstractOemUI2::DevicePropertySheets( + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam + ) +{ + UNREFERENCED_PARAMETER(pPSUIInfo); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// CAbstractOemUI2::CommonUIProp +// +// Synopsis: +// This routine is used to interact with the Unidrv-supplied +// property sheet pages. Since this plug-in implements full-UI +// replacement, those property sheet pages are disabled, and this +// routine does not need to do anything. +// +// Returns: +// S_OK +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +CAbstractOemUI2::CommonUIProp( + DWORD dwMode, + POEMCUIPPARAM pOemCUIPParam + ) +{ + UNREFERENCED_PARAMETER(dwMode); + UNREFERENCED_PARAMETER(pOemCUIPParam); + + return E_NOTIMPL; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// CAbstractOemUI2::DeviceCapabilities +// +// Synopsis: +// This routine can be used to replace the Unidrv's device capabilities +// handling. In this implementation, no custom capabilities handling is +// provided. +// +// Returns: +// E_FAIL +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +CAbstractOemUI2::DeviceCapabilities( + _Inout_ POEMUIOBJ poemuiobj, + // OEM settings & information + _In_ HANDLE hPrinter, + // Handle to the printer that the capabilities are being requested for + _In_ PWSTR pDeviceName, + // Name of the device / driver + WORD wCapability, + // The DC_ ID indicating which capability was requested. + _Out_ PVOID pOutput, + // Buffer to write requested information to. + _In_ PDEVMODE pPublicDM, + // Pointer to the public DEVMODE representing the settings to get + // capabilities with respect to. + _In_ PVOID pOEMDM, + // OEM private DEVMODE settings. + DWORD dwOld, + // Result from previous plug-in call to this routine. + _Out_ DWORD *dwResult + // Result of this call. If there are multiple UI plug-ins, this + // result is passed to the next one as dwOld + ) +{ + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(pDeviceName); + UNREFERENCED_PARAMETER(wCapability); + UNREFERENCED_PARAMETER(pOutput); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + UNREFERENCED_PARAMETER(dwOld); + UNREFERENCED_PARAMETER(dwResult); + + // + // Do nothing. Let Unidrv handle the device capabilities processing. + // + + return E_NOTIMPL; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// CAbstractOemUI2::DevQueryPrintEx +// +// Synopsis: +// This routine is used to determine print job compatibility with the +// current driver. The plug-in can supplement Unidrv's handling of this +// routine. If Unidrv determines that a job can be printed on the current +// printer it will call this routine to ask the plug-in whether it can +// also handle the current job. If Unidrv determines that the job cannot +// be printed, it will not call the plug-in. Additionally, XPS drivers +// built on the Unidrv and PScript UI modules may not recieve this call- +// back. +// +// Implementation of this routine is optional. To indicate that the +// plug-in does not support this call, return E_NOTIMPL. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +CAbstractOemUI2::DevQueryPrintEx( + POEMUIOBJ poemuiobj, + PDEVQUERYPRINT_INFO pDQPInfo, + PDEVMODE pPublicDM, + PVOID pOEMDM + ) +{ + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(pDQPInfo); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + + return E_NOTIMPL; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// CAbstractOemUI2::UpgradePrinter +// +// Synopsis: +// Use this callback to upgrade any settings from previous versions +// that are stored in the registry by the plug-in Not applicabe to +// this sample. +// +// Implementation of this routine is optional. To indicate that the +// plug-in does not support this call, return E_NOTIMPL. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +CAbstractOemUI2::UpgradePrinter( + DWORD dwLevel, + PBYTE pDriverUpgradeInfo + ) +{ + UNREFERENCED_PARAMETER(dwLevel); + UNREFERENCED_PARAMETER(pDriverUpgradeInfo); + + return E_NOTIMPL; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// CAbstractOemUI2::PrinterEvent +// +// Synopsis: +// Perform any special processing needed when various events occur to the +// print queue. +// +// Implementation of this routine is optional. To indicate that the +// plug-in does not support this call, return E_NOTIMPL. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +CAbstractOemUI2::PrinterEvent( + _In_ PWSTR pPrinterName, + INT iDriverEvent, + DWORD dwFlags, + LPARAM lParam + ) +{ + UNREFERENCED_PARAMETER(pPrinterName); + UNREFERENCED_PARAMETER(iDriverEvent); + UNREFERENCED_PARAMETER(dwFlags); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// CAbstractOemUI2::DriverEvent +// +// Synopsis: +// Notifies the plug-in of changes or events relevant to the driver, +// such as installing and upgrading. +// +// Implementation of this routine is optional. To indicate that the +// plug-in does not support this call, return E_NOTIMPL. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +CAbstractOemUI2::DriverEvent( + DWORD dwDriverEvent, + DWORD dwLevel, + LPBYTE pDriverInfo, + LPARAM lParam + ) +{ + UNREFERENCED_PARAMETER(dwDriverEvent); + UNREFERENCED_PARAMETER(dwLevel); + UNREFERENCED_PARAMETER(pDriverInfo); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +}; + + +//+--------------------------------------------------------------------------- +// +// Member: +// CAbstractOemUI2::QueryColorProfile +// +// Synopsis: +// This routine can be implemented to provide a color profile from the +// driver. +// +// Implementation of this routine is optional. To indicate that the +// plug-in does not support this call, return E_NOTIMPL. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +CAbstractOemUI2::QueryColorProfile( + HANDLE hPrinter, + POEMUIOBJ poemuiobj, + PDEVMODE pPublicDM, + PVOID pOEMDM, + ULONG ulQueryMode, + VOID *pvProfileData, + ULONG *pcbProfileData, + FLONG *pflProfileData + ) +{ + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + UNREFERENCED_PARAMETER(ulQueryMode); + UNREFERENCED_PARAMETER(pvProfileData); + UNREFERENCED_PARAMETER(pcbProfileData); + UNREFERENCED_PARAMETER(pflProfileData); + + return E_NOTIMPL; +}; + +//+--------------------------------------------------------------------------- +// +// Member: +// CAbstractOemUI2::FontInstallerDlgProc +// +// Synopsis: +// Plug-ins can use this method to replace Unidrv's provided soft-font +// installer dialog. +// +// Implementation of this routine is optional. To indicate that the +// plug-in does not support this call, return E_NOTIMPL. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +CAbstractOemUI2::FontInstallerDlgProc( + HWND hWnd, + UINT usMsg, + WPARAM wParam, + LPARAM lParam + ) +{ + UNREFERENCED_PARAMETER(hWnd); + UNREFERENCED_PARAMETER(usMsg); + UNREFERENCED_PARAMETER(wParam); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +}; + +//+--------------------------------------------------------------------------- +// +// Member: +// CAbstractOemUI2::UpdateExternalFonts +// +// Synopsis: +// This routine is used to notify the UI of any changes to installed +// font cartridges, primarily for supporting soft-font UI replacement. +// +// Implementation of this routine is optional. To indicate that the +// plug-in does not support this call, return E_NOTIMPL. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +CAbstractOemUI2::UpdateExternalFonts( + _In_ HANDLE hPrinter, + _In_ HANDLE hHeap, + _In_ PWSTR pwstrCartridges + ) +{ + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(hHeap); + UNREFERENCED_PARAMETER(pwstrCartridges); + + return E_NOTIMPL; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// CAbstractOemUI2::QueryJobAttributes +// +// Synopsis: +// +// Implementation of this routine is optional. To indicate that the +// plug-in does not support this call, return E_NOTIMPL. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +CAbstractOemUI2::QueryJobAttributes( + HANDLE hPrinter, + PDEVMODE pDevmode, + DWORD dwLevel, + LPBYTE lpAttributeInfo + ) +{ + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(pDevmode); + UNREFERENCED_PARAMETER(dwLevel); + UNREFERENCED_PARAMETER(lpAttributeInfo); + + return E_NOTIMPL; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// CAbstractOemUI2::DocumentEvent +// +// Synopsis: +// Perform any special processing needed at various points in time while +// a job is printing. +// +// Implementation of this routine is optional. To indicate that the +// plug-in does not support this call, return E_NOTIMPL. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +CAbstractOemUI2::DocumentEvent( + HANDLE hPrinter, + HDC hdc, + INT iEsc, + ULONG cbIn, + PVOID pbIn, + ULONG cbOut, + PVOID pbOut, + PINT piResult + ) +{ + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(hdc); + UNREFERENCED_PARAMETER(iEsc); + UNREFERENCED_PARAMETER(cbIn); + UNREFERENCED_PARAMETER(pbIn); + UNREFERENCED_PARAMETER(cbOut); + UNREFERENCED_PARAMETER(pbOut); + UNREFERENCED_PARAMETER(piResult); + + return E_NOTIMPL; +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/intrface.h b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/intrface.h new file mode 100644 index 00000000..07e1175c --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/intrface.h @@ -0,0 +1,212 @@ +//+-------------------------------------------------------------------------- +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2006 Microsoft Corporation. All Rights Reserved. +// +// FILE: Intrface.h +// +// PURPOSE: Defines a class with default implementations of the UI +// interface plug=-in methods that are optional. +// +//-------------------------------------------------------------------------- + +#pragma once + +class CAbstractOemUI2: public IPrintOemUI2 +{ +public: + // + // *** IUnknown methods *** + // + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release) (THIS); + + // + // Method for publishing Driver interface. + // + STDMETHOD(PublishDriverInterface)(THIS_ IUnknown *pIUnknown) = 0; + + // + // Get OEM dll related information + // + STDMETHOD(GetInfo) (THIS_ + DWORD dwMode, + _Out_writes_bytes_(cbSize) PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded) = 0; + + // + // OEMDevMode + // + STDMETHOD(DevMode) (THIS_ DWORD dwMode, POEMDMPARAM pOemDMParam) = 0; + + // + // OEMCommonUIProp + // + STDMETHOD(CommonUIProp) (THIS_ + DWORD dwMode, + POEMCUIPPARAM pOemCUIPParam + ); + + // + // OEMDocumentPropertySheets + // + STDMETHOD(DocumentPropertySheets) (THIS_ + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam + ); + + // + // OEMDevicePropertySheets + // + STDMETHOD(DevicePropertySheets) (THIS_ + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam + ); + + + // + // OEMDevQueryPrintEx + // + STDMETHOD(DevQueryPrintEx) (THIS_ + POEMUIOBJ poemuiobj, + PDEVQUERYPRINT_INFO pDQPInfo, + PDEVMODE pPublicDM, + PVOID pOEMDM + ); + + // + // OEMDeviceCapabilities + // + STDMETHOD(DeviceCapabilities) (THIS_ + _Inout_ POEMUIOBJ poemuiobj, + _In_ HANDLE hPrinter, + _In_ PWSTR pDeviceName, + WORD wCapability, + _Out_ PVOID pOutput, + _In_ PDEVMODE pPublicDM, + _In_ PVOID pOEMDM, + DWORD dwOld, + _Out_ DWORD *dwResult + ); + + // + // OEMUpgradePrinter + // + STDMETHOD(UpgradePrinter) (THIS_ + DWORD dwLevel, + PBYTE pDriverUpgradeInfo + ); + + // + // OEMPrinterEvent + // + STDMETHOD(PrinterEvent) (THIS_ + _In_ PWSTR pPrinterName, + INT iDriverEvent, + DWORD dwFlags, + LPARAM lParam + ); + + // + // OEMDriverEvent + // + STDMETHOD(DriverEvent)(THIS_ + DWORD dwDriverEvent, + DWORD dwLevel, + LPBYTE pDriverInfo, + LPARAM lParam + ); + + // + // OEMQueryColorProfile + // + STDMETHOD( QueryColorProfile) (THIS_ + HANDLE hPrinter, + POEMUIOBJ poemuiobj, + PDEVMODE pPublicDM, + PVOID pOEMDM, + ULONG ulReserved, + VOID *pvProfileData, + ULONG *pcbProfileData, + FLONG *pflProfileData); + + // + // OEMFontInstallerDlgProc + // + STDMETHOD(FontInstallerDlgProc) (THIS_ + HWND hWnd, + UINT usMsg, + WPARAM wParam, + LPARAM lParam + ); + // + // UpdateExternalFonts + // + STDMETHOD(UpdateExternalFonts) (THIS_ + _In_ HANDLE hPrinter, + _In_ HANDLE hHeap, + _In_ PWSTR pwstrCartridges + ); + + // + // IPrintOemUI2 methods + // + + // + // QueryJobAttributes + // + STDMETHOD(QueryJobAttributes) (THIS_ + HANDLE hPrinter, + PDEVMODE pDevmode, + DWORD dwLevel, + LPBYTE lpAttributeInfo + ); + + // + // Hide Standard UI + // + STDMETHOD(HideStandardUI) (THIS_ + DWORD dwMode + ); + + // + // DocumentEvent + // + STDMETHOD(DocumentEvent) (THIS_ + HANDLE hPrinter, + HDC hdc, + INT iEsc, + ULONG cbIn, + PVOID pbIn, + ULONG cbOut, + PVOID pbOut, + PINT piResult + ); + + CAbstractOemUI2() + { + m_cRef = 1; + }; + + virtual ~CAbstractOemUI2() {}; + +protected: + + LONG m_cRef; + // reference count of this object + +}; + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/precomp.h b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/precomp.h new file mode 100644 index 00000000..0533325f --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/precomp.h @@ -0,0 +1,62 @@ +//+-------------------------------------------------------------------------- +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2006 Microsoft Corporation. All Rights Reserved. +// +// FILE: precomp.h +// +// PURPOSE: Header files that should be in the precompiled header. +// +//-------------------------------------------------------------------------- + +#pragma once + +// Necessary for compiling under VC. +#if(!defined(WINVER) || (WINVER < 0x0500)) + #undef WINVER + #define WINVER 0x0500 +#endif +#if(!defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500)) + #undef _WIN32_WINNT + #define _WIN32_WINNT 0x0500 +#endif + + +// Required header files that shouldn't change often. + + +#include <STDDEF.H> +#include <STDLIB.H> +#include <OBJBASE.H> +#include <STDARG.H> +#include <STDIO.H> +#include <INITGUID.H> +#include <WINDOWS.H> + +#include <WINDEF.H> +#include <WINERROR.H> +#include <WINBASE.H> +#include <WINGDI.H> +#include <commctrl.h> +#include <WINDDI.H> +#include <WINSPOOL.H> +#include <TCHAR.H> +#include <EXCPT.H> +#include <ASSERT.H> +#include <PRSHT.H> +#include <COMPSTUI.H> +#include <WINDDIUI.H> +#include <PRINTOEM.H> +#include <prcomoem.h> +#include <msxml6.h> + +// +// These files should always be last in your include list. +// +#include <STRSAFE.H> +#include <intsafe.h> + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/precompsrc.cpp b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/precompsrc.cpp new file mode 100644 index 00000000..5944cf51 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/precompsrc.cpp @@ -0,0 +1 @@ +#include "precomp.h"
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oem.gpd b/print/OEM Printer Customization Plug-in Samples/C++/oem.gpd new file mode 100644 index 00000000..2621cbb1 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oem.gpd @@ -0,0 +1,704 @@ +*GPDFileName: "oem.gpd" +*GPDFileVersion: "1.0" +*GPDSpecVersion: "1.0" +*Include: "StdNames.gpd" +*Include: "ttfsub.gpd" +*ModelName: "OEM Unidrv Customization Sample" +*MasterUnits: PAIR(1200, 1200) +*ResourceDLL: "unires.dll" +*PrinterType: PAGE +*MaxCopies: 99 +*PrintRate: 16 +*PrintRateUnit: PPM +*PrintRatePPM: 16 + +*%****************************************************************************************** +*% Orientation +*%****************************************************************************************** +*Feature: Orientation +{ + *rcNameID: =ORIENTATION_DISPLAY + *DefaultOption: PORTRAIT + *Option: PORTRAIT + { + *rcNameID: =PORTRAIT_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.6 + *Cmd: "<1B>&l0O" + } + } + *Option: LANDSCAPE_CC90 + { + *rcNameID: =LANDSCAPE_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.8 + *Cmd: "<1B>&l1O" + } + } +} + +*%****************************************************************************************** +*% Input Bin +*%****************************************************************************************** +*Feature: InputBin +{ + *rcNameID: =PAPER_SOURCE_DISPLAY + *DefaultOption: AUTO + *Option: AUTO + { + *rcNameID: =AUTO_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.11 + *Cmd: "<1B>&l0H" + } + } + *Option: UPPER + { + *rcNameID: =UPPER_TRAY_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.11 + *Cmd: "<1B>&l1H" + } + } +} + +*%****************************************************************************************** +*% Resolution +*%****************************************************************************************** +*Feature: Resolution +{ + *rcNameID: =RESOLUTION_DISPLAY + *DefaultOption: Option2 + *Option: Option1 + { + *Name: "600 x 600" =DOTS_PER_INCH + *DPI: PAIR(600, 600) + *TextDPI: PAIR(600, 600) + *MinStripBlankPixels: 32 + EXTERN_GLOBAL: *StripBlanks: LIST(ENCLOSED,TRAILING) + *SpotDiameter: 100 + *Command: CmdBeginRaster { *Cmd : "<1B>*v7S<1B>*r1A" } + *Command: CmdEndRaster { *Cmd : "<1B>*rC" } + *Command: CmdSendBlockData { *Cmd : "<1B>*b" %d{NumOfDataBytes}"W" } + *Command: CmdSelect + { + *Order: DOC_SETUP.7 + *Cmd: "@PJL SET RESOLUTION=600<0A>@PJL ENTER LANGUAGE=PCL<0A0D1B>E<1B>*t600R" + } + } + *Option: Option2 + { + *Name: "300 x 300" =DOTS_PER_INCH + *DPI: PAIR(300, 300) + *TextDPI: PAIR(300, 300) + *MinStripBlankPixels: 32 + EXTERN_GLOBAL: *StripBlanks: LIST(ENCLOSED, TRAILING) + *SpotDiameter: 100 + *Command: CmdBeginRaster { *Cmd : "<1B>*v7S<1B>*r1A" } + *Command: CmdEndRaster { *Cmd : "<1B>*rC" } + *Command: CmdSendBlockData { *Cmd : "<1B>*b" %d{NumOfDataBytes}"W" } + *Command: CmdSelect + { + *Order: DOC_SETUP.7 + *Cmd: "@PJL SET RESOLUTION=300<0A>@PJL ENTER LANGUAGE=PCL<0A0D1B>E<1B>*t300R" + } + } + *Option: Option3 + { + *Name: "150 x 150" =DOTS_PER_INCH + *DPI: PAIR(150, 150) + *TextDPI: PAIR(150, 150) + *MinStripBlankPixels: 32 + EXTERN_GLOBAL: *StripBlanks: LIST(ENCLOSED, TRAILING) + *SpotDiameter: 100 + *Command: CmdBeginRaster { *Cmd : "<1B>*v7S<1B>*r1A" } + *Command: CmdEndRaster { *Cmd : "<1B>*rC" } + *Command: CmdSendBlockData { *Cmd : "<1B>*b" %d{NumOfDataBytes}"W" } + *Command: CmdSelect + { + *Order: DOC_SETUP.7 + *Cmd: "@PJL SET RESOLUTION=150<0A>@PJL ENTER LANGUAGE=PCL<0A0D1B>E<1B>*t150R" + } + } +} + +*%****************************************************************************************** +*% HP-GL/2 Graphics Support +*%****************************************************************************************** +*Ifdef: WINNT_51 +*Personality: =PERSONALITY_HPGL2 +*Feature: GraphicsMode +{ + *rcNameID: =GRAPHICSMODE_DISPLAY + *DefaultOption: RASTERMODE + *Option: HPGL2MODE + { + *rcNameID: =GRAPHICSMODE_HPGL2_DISPLAY + } + *Option: RASTERMODE + { + *rcNameID: =GRAPHICSMODE_RASTER_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.6 + *Cmd: "@PJL SET LIMAGEENHANCE=OFF<0A>" + } + } +} +*Endif: + +*%****************************************************************************************** +*% Paper Size +*%****************************************************************************************** +*Feature: PaperSize +{ + *rcNameID: =PAPER_SIZE_DISPLAY + *DefaultOption: LETTER + *Option: LETTER + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *PageProtectMem: 1028 + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(9500, 12500) + *PrintableOrigin: PAIR(400, 400) + *CursorOrigin: PAIR(300, 300) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l2a8c1E<1B>*p0x0Y<1B>*c0t5260x7704Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(9500, 12200) + *PrintableOrigin: PAIR(450, 300) + *CursorOrigin: PAIR(200, 12900) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l2a8c1E<1B>*p0x0Y<1B>*c0t7332x5880Y" + } + } + } + } + *Option: LEGAL + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *PageProtectMem: 1692 + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(9000, 15500) + *PrintableOrigin: PAIR(400, 600) + *CursorOrigin: PAIR(180, 300) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l3a8c1E<1B>*p0x0Y<1B>*c0t5880x8900Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(9000, 15500) + *PrintableOrigin: PAIR(400, 900) + *CursorOrigin: PAIR(180, 16500) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l3a8c1E<1B>*p0x0Y<1B>*c0t8900x5880Y" + } + } + } + } + *Option: EXECUTIVE + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *PageProtectMem: 4109 + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(8100, 11500) + *PrintableOrigin: PAIR(300, 300) + *CursorOrigin: PAIR(300, 200) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l1a8c1E<1B>*p0x0Y<1B>*c0t4860x7344Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(8300, 11500) + *PrintableOrigin: PAIR(200, 300) + *CursorOrigin: PAIR(200, 12300) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l1a8c1E<1B>*p0x0Y<1B>*c0t7272x4980Y" + } + } + } + } + *Option: A4 + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *PageProtectMem: 4249 + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(9100, 13200) + *PrintableOrigin: PAIR(400, 300) + *CursorOrigin: PAIR(288, 180) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l26a8c1E<1B>*p0x0Y<1B>*c0t5594x8201Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(9100, 13200) + *PrintableOrigin: PAIR(400, 300) + *CursorOrigin: PAIR(204, 13824) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l26a8c1E<1B>*p0x0Y<1B>*c0t8129x5714Y" + } + } + } + } + *Option: B5 + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *PageProtectMem: 3198 + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(7900, 11140) + *PrintableOrigin: PAIR(352, 300) + *CursorOrigin: PAIR(300, 100) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l12a8c1E<1B>*p0x0Y<1B>*c0t4970x7040Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(7760, 11140) + *PrintableOrigin: PAIR(300, 400) + *CursorOrigin: PAIR(100, 11940) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l12a8c1E<1B>*p0x0Y<1B>*c0t6780x4970Y" + } + } + } + } +} + +*%****************************************************************************************** +*% Media Type +*%****************************************************************************************** +*Feature: MediaType +{ + *rcNameID: =MEDIA_TYPE_DISPLAY + *DefaultOption: PLAIN + *Option: PLAIN + { + *rcNameID: =PLAIN_PAPER_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.15 + *Cmd: "<1B>&n6WdPlain" + } + } + *Option: TRANSPARENCY + { + *rcNameID: =TRANSPARENCY_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.15 + *Cmd: "<1B>&n13WdTransparency" + } + } +} + +*%****************************************************************************************** +*% Color Mode +*%****************************************************************************************** +*Feature: ColorMode +{ + *rcNameID: =COLOR_PRINTING_MODE_DISPLAY + *DefaultOption: 24bpp + *Option: Mono + { + *rcNameID: =MONO_DISPLAY + *DevNumOfPlanes: 1 + *DevBPP: 1 + *Color?: FALSE + } + *Option: Color + { + *rcNameID: =COLOR_DISPLAY + *DevNumOfPlanes: 3 + *DevBPP: 1 + *DrvBPP: 4 + EXTERN_GLOBAL: *RasterSendAllData?: TRUE + *ColorPlaneOrder: LIST(CYAN, MAGENTA, YELLOW) + *Command: CmdSendCyanData { *Cmd : "<1B>*b" %d{NumOfDataBytes}"V" } + *Command: CmdSendMagentaData { *Cmd : "<1B>*b" %d{NumOfDataBytes}"V" } + *Command: CmdSendYellowData { *Cmd : "<1B>*b" %d{NumOfDataBytes}"W" } + *Command: CmdSelectBlackColor { *Cmd : "<1B>*v7S" } + *Command: CmdSelectRedColor { *Cmd : "<1B>*v6S" } + *Command: CmdSelectGreenColor { *Cmd : "<1B>*v5S" } + *Command: CmdSelectYellowColor { *Cmd : "<1B>*v4S" } + *Command: CmdSelectBlueColor { *Cmd : "<1B>*v3S" } + *Command: CmdSelectMagentaColor { *Cmd : "<1B>*v2S" } + *Command: CmdSelectCyanColor { *Cmd : "<1B>*v1S" } + *Command: CmdSelectWhiteColor { *Cmd : "<1B>*v0S" } + *Command: CmdSelect + { + *Order: PAGE_SETUP.16 + *Cmd: "<1B>*r-3U" + } + } + *Option: 8bpp + { + *rcNameID: =8BPP_DISPLAY + *DevNumOfPlanes: 1 + *DevBPP: 8 + *DrvBPP: 8 + *PaletteSize: 256 + *PaletteProgrammable? : TRUE + *Command: CmdDefinePaletteEntry { *Cmd : "<1B>*v" %d{RedValue}"a" %d{GreenValue}"b" %d{BlueValue}"c" ++ %d{PaletteIndexToProgram} "I" } + *Command: CmdSelectPaletteEntry { *Cmd : "<1B>*v" %d{CurrentPaletteIndex}"S" } + *Command: CmdSelect + { + *Order: PAGE_SETUP.16 + *Cmd: "<1B>*v1N<1B>*v1O<1B>*t0I<1B>*l184O<1B>*v6W<000108080808>" + } + } + *Option: 24bpp + { + *rcNameID: =24BPP_DISPLAY + *DevNumOfPlanes: 1 + *DevBPP: 24 + *DrvBPP: 24 + *Command: CmdEnableDRC { *Cmd : "<1B>*b3M" } + *PaletteSize: 256 + *PaletteProgrammable? : TRUE + *Command: CmdDefinePaletteEntry { *Cmd : "<1B>*v" %d{RedValue}"a" %d{GreenValue}"b" %d{BlueValue}"c" ++ %d{PaletteIndexToProgram} "I" } + *Command: CmdSelectPaletteEntry { *Cmd : "<1B>*v" %d{CurrentPaletteIndex}"S" } + *Command: CmdSetSrcBmpWidth { *Cmd : "<1B>*r" %d{RasterDataWidthInBytes / 3}"S" } + *Command: CmdSelect + { + *Order: PAGE_SETUP.16 + *Cmd: "<1B>*v1N<1B>*v1O<1B>*l184O<1B>*v6W<0003080808081B>*v0a0b0c7i255a255b255c0I<1B>*" ++ "o3W<060400>" + } + } +} + +*%****************************************************************************************** +*% HalfTone +*%****************************************************************************************** +*Feature: Halftone +{ + *rcNameID: =HALFTONING_DISPLAY + *DefaultOption: HT_PATSIZE_AUTO + *Option: HT_PATSIZE_AUTO + { + *rcNameID: =HT_AUTO_SELECT_DISPLAY + } + *Option: HT_PATSIZE_SUPERCELL_M + { + *rcNameID: =HT_SUPERCELL_DISPLAY + } + *Option: HT_PATSIZE_6x6_M + { + *rcNameID: =HT_DITHER6X6_DISPLAY + } + *Option: HT_PATSIZE_8x8_M + { + *rcNameID: =HT_DITHER8X8_DISPLAY + } +} + +*%****************************************************************************************** +*% Memory +*% +*% Note: Unidrv uses the font memory information to estimate when it needs to stop +*% downloading fonts for a page, and thus driver writers should err on the conservative +*% side. Otherwise, printers will generate "out of memory" device errors for pages with +*% a large number of fonts / unique glyphs. +*%****************************************************************************************** +*Feature: Memory +{ + *rcNameID: =PRINTER_MEMORY_DISPLAY + *DefaultOption: 32768KB + *Option: 4096KB + { + *Name: "4MB" + *MemoryConfigKB: PAIR(4096, 6750) + } + *Option: 8192KB + { + *Name: "8MB" + *MemoryConfigKB: PAIR(8192, 10350) + } + *Option: 16384KB + { + *Name: "16MB" + *MemoryConfigKB: PAIR(16384, 13950) + } + *Option: 24576KB + { + *Name: "24MB" + *MemoryConfigKB: PAIR(24576, 21150) + } + *Option: 32768KB + { + *Name: "32MB" + *MemoryConfigKB: PAIR(32768, 28350) + } + *Option: 49152KB + { + *Name: "48MB" + *MemoryConfigKB: PAIR(49152, 43050) + } + *Option: 65536KB + { + *Name: "64MB" + *MemoryConfigKB: PAIR(65536, 57150) + } + *Option: 98304KB + { + *Name: "96MB" + *MemoryConfigKB: PAIR(98304, 85950) + } + *Option: 102400KB + { + *Name: "100MB" + *MemoryConfigKB: PAIR(102400, 89700) + } + *Option: 114688KB + { + *Name: "112MB" + *MemoryConfigKB: PAIR(114688, 100550) + } + *Option: 131072KB + { + *Name: "128MB" + *MemoryConfigKB: PAIR(131072, 116250) + } +} + +*%****************************************************************************************** +*% Duplex Unit +*%****************************************************************************************** +*Feature: DuplexUnit +{ + *rcNameID: 429 + *FeatureType: PRINTER_PROPERTY + *DefaultOption: FALSE + *Option: FALSE + { + *rcNameID: 444 + *DisabledFeatures: LIST(Duplex.VERTICAL, Duplex.HORIZONTAL) + } + *Option: TRUE + { + *rcNameID: 443 + } +} + +*%****************************************************************************************** +*% Duplex Type +*%****************************************************************************************** +*Feature: Duplex +{ + *rcNameID: =TWO_SIDED_PRINTING_DISPLAY + *DefaultOption: NONE + *Option: NONE + { + *rcNameID: =NONE_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.9 + *Cmd: "<1B>&l0S" + } + } + *Option: VERTICAL + { + *rcNameID: =FLIP_ON_LONG_EDGE_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.9 + *Cmd: "<1B>&l1S" + } + } + *Option: HORIZONTAL + { + *rcNameID: =FLIP_ON_SHORT_EDGE_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.9 + *Cmd: "<1B>&l2S" + } + } +} + +*%****************************************************************************************** +*% Page Protect +*%****************************************************************************************** +*Feature: PageProtect +{ + *rcNameID: =PAGE_PROTECTION_DISPLAY + *DefaultOption: OFF + *Option: ON + { + *rcNameID: =ON_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.1 + *Cmd: "<1B>%%-12345X@PJL SET PAGEPROTECT=LETTER<0A>" + } + } + *Option: OFF + { + *rcNameID: =OFF_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.1 + *Cmd: "<1B>%%-12345X@PJL SET PAGEPROTECT=OFF<0A>" + } + } +} + +*%****************************************************************************************** +*% Doc setup commands +*%****************************************************************************************** +*Command: CmdStartDoc +{ + *Order: DOC_SETUP.7 + *Cmd: "<1B>&u1200D<1B>*r0F" +} +*Command: CmdStartPage +{ + *Order: PAGE_SETUP.1 + *Cmd: "<1B>*b0M<0D>" +} +*Command: CmdEndJob +{ + *Order: JOB_FINISH.1 + *Cmd: "<1B>E<1B>%%-12345X@PJL<20>LPORTROTATE<0A><1B>%%-12345X" +} +*Command: CmdCopies +{ + *Order: DOC_SETUP.13 + *Cmd: "<1B>&l" %d{NumOfCopies}"X" +} + +*%****************************************************************************************** +*% Cursor, Page and Color Commands +*%****************************************************************************************** +*RotateCoordinate?: TRUE +*RotateRaster?: TRUE +*RotateFont?: TRUE +*TextCaps: LIST(TC_CR_90,TC_UA_ABLE) +*MemoryUsage: LIST(FONT, RASTER, VECTOR) +*CursorXAfterCR: AT_PRINTABLE_X_ORIGIN +*BadCursorMoveInGrxMode: LIST(X_PORTRAIT,Y_LANDSCAPE) +*XMoveThreshold: 0 +*YMoveThreshold: 0 +*XMoveUnit: 300 +*YMoveUnit: 300 +*Command: CmdXMoveAbsolute { *Cmd : "<1B>*p" %d{(DestX) }"X" } +*Command: CmdXMoveRelRight { *Cmd : "<1B>*p+" %d[0,9600]{max_repeat((DestXRel) )}"X" } +*Command: CmdXMoveRelLeft { *Cmd : "<1B>*p-" %d[0,9600]{max_repeat((DestXRel) )}"X" } +*Command: CmdYMoveAbsolute { *Cmd : "<1B>*p" %d{(DestY) }"Y" } +*Command: CmdYMoveRelDown { *Cmd : "<1B>*p+" %d{(DestYRel) }"Y" } +*Command: CmdYMoveRelUp { *Cmd : "<1B>*p-" %d{(DestYRel) }"Y" } +*Command: CmdDefinePaletteEntry { *Cmd : "<1B>*v" %d{RedValue}"a" %d{GreenValue}"b" %d{BlueValue}"c" ++ %d{PaletteIndexToProgram} "I" } +*Command: CmdSelectPaletteEntry { *Cmd : "<1B>*v" %d{CurrentPaletteIndex}"S" } +*Command: CmdCR { *Cmd : "<0D>" } +*Command: CmdLF { *Cmd : "<0A>" } +*Command: CmdFF { *Cmd : "<0C>" } +*Command: CmdBackSpace { *Cmd : "<08>" } +*Command: CmdUniDirectionOn { *Cmd : "<00>" } +*Command: CmdUniDirectionOff { *Cmd : "<00>" } +*Command: CmdPushCursor { *Cmd : "<1B>&f0S" } +*Command: CmdPopCursor { *Cmd : "<1B>&f1S" } +*Command: CmdSetSimpleRotation { *Cmd : "<1B>&a" %d{PrintDirInCCDegrees}"P" } +*EjectPageWithFF?: TRUE +*Command: CmdEnableTIFF4 { *Cmd : "<1B>*b2M" } +*Command: CmdDisableCompression { *Cmd : "<1B>*b0M" } +*OutputDataFormat: H_BYTE +*OptimizeLeftBound?: TRUE +*CursorXAfterSendBlockData: AT_GRXDATA_ORIGIN +*CursorYAfterSendBlockData: AUTO_INCREMENT + +*%****************************************************************************************** +*% Font Descriptions and Commands +*%****************************************************************************************** +*TTFSEnabled?: TRUE +*DefaultFont: 136 +*DefaultCTT: 0 +*CharPosition: BASELINE +*DeviceFonts: LIST(136,138,146,147,148,149,150,151,152,153,154,155,156,157, ++ 163,164,165,166,196,197,198,199,200,201,202,203,209,210, ++ 211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226, ++ 227,228,229,230) +*MinFontID: 16534 +*MaxFontID: 32768 +*switch: Resolution +{ + *case: Option1 + { + *FontFormat: HPPCL_OUTLINE + } + *case: Option2 + { + *FontFormat: HPPCL_OUTLINE + } + *case: Option3 + { + *FontFormat: HPPCL_RES + } +} +*Command: CmdSetFontID { *Cmd : "<1B>*c" %d{NextFontID}"D" } +*Command: CmdSelectFontID { *Cmd : "<1B>(" %d{CurrentFontID}"X" } +*Command: CmdSetCharCode { *Cmd : "<1B>*c" %d{NextGlyph}"E" } +*Command: CmdUnderlineOn { *Cmd : "<1B>&dD" } +*Command: CmdUnderlineOff { *Cmd : "<1B>&d@" } +*Command: CmdWhiteTextOn { *Cmd : "<1B>*v1o1T" } +*Command: CmdWhiteTextOff { *Cmd : "<1B>*v0o0T" } + + +*%******************************************************************************************** +*%* Vector Commands. +*%******************************************************************************************** +*MinGrayFill: 1 +*MaxGrayFill: 100 +*Command: CmdSetRectWidth { *Cmd : "<1B>*c" %d{(RectXSize) }"A" } +*Command: CmdSetRectHeight { *Cmd : "<1B>*c" %d{(RectYSize) }"B" } +*Command: CmdRectGrayFill { *Cmd : "<1B>*c" %d{GrayPercentage }"g2P" } +*Command: CmdRectWhiteFill { *Cmd : "<1B>*c1P" } +*Command: CmdRectBlackFill { *Cmd : "<1B>*c0P" } diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oem.ppd b/print/OEM Printer Customization Plug-in Samples/C++/oem.ppd new file mode 100644 index 00000000..bbc93432 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oem.ppd @@ -0,0 +1,431 @@ +*PPD-Adobe: "4.3" +*% Adobe Systems PostScript(R) Printer Description File +*% Copyright (c) 2003 Microsoft Corp. All rights reserved. + +*FormatVersion: "4.3" +*FileVersion: "2.0" +*LanguageEncoding: ISOLatin1 +*LanguageVersion: English +*Product: "(MS OEM Customization)" +*PSVersion: "(2015.105) 9" +*Manufacturer: "Microsoft" +*ModelName: "Microsoft PS5 OEM Customization" +*ShortNickName: "MS PS5 Oem Customization" +*NickName: "MS PS5 Oem Customization" +*PCFileName: "PS5OEM.PPD" + +*% === Installable Options =========== +*OpenGroup: InstallableOptions/Options Installed + +*OpenUI *InstalledMemory/Memory Configuration: PickOne +*DefaultInstalledMemory: 24Meg +*InstalledMemory 24Meg/Standard 24 MB RAM: "" +*InstalledMemory 28Meg/28 MB Total RAM: "" +*InstalledMemory 40Meg/40 MB Total RAM: "" +*InstalledMemory 44Meg/44 MB Total RAM: "" +*InstalledMemory 56Meg/56 MB Total RAM: "" +*InstalledMemory 72Meg/72 MB Total RAM: "" +*CloseUI: *InstalledMemory + +*CloseGroup: InstallableOptions + +*% === Constraints =================== + + +*% === Basic Device Capabilities ============ + +*LanguageLevel: "2" +*Protocols: BCP + +*FreeVM: "5500000" +*VMOption 24Meg/Standard 24 MB RAM: "5500000" +*VMOption 28Meg/28 MB Total RAM: "8000000" +*VMOption 40Meg/40 MB Total RAM: "5400000" +*VMOption 44Meg/44 MB Total RAM: "8000000" +*VMOption 56Meg/56 MB Total RAM: "17400000" +*VMOption 72Meg/72 MB Total RAM: "3800000" + +*ColorDevice: True +*DefaultColorSpace: CMYK +*AccurateScreensSupport: True +*SuggestedJobTimeout: "0" +*SuggestedWaitTimeout: "300" +*SuggestedManualFeedTimeout: "60" +*End +*TTRasterizer: Type42 +*?TTRasterizer: " + save + 42 /FontType resourcestatus + { pop pop (Type42)} {pop pop (None)} ifelse = flush + restore" +*End + +*Emulators: hpgl +*StartEmulator_hpgl: "currentfile /hpgl statusdict /emulate get exec " +*StopEmulator_hpgl: "<1B7F>0" + +*FileSystem: True +*?FileSystem: " + save false + (%disk?%) + { currentdevparams dup /Writeable known + { /Writeable get {pop true} if } {pop} ifelse + } 10 string /IODevice resourceforall + {(True)}{(False)} ifelse = flush + restore" +*End +*Throughput: "14" +*Password: "(0)" +*ExitServer: " + count 0 eq + { false } { true exch startjob } ifelse + not + { (WARNING: Cannot modify initial VM.) = + (Missing or invalid password.) = + (Please contact the author of this software.) = flush quit + } if" +*End +*Reset: " + count 0 eq + { false } { true exch startjob } ifelse + not + { (WARNING: Cannot reset printer.) = + (Missing or invalid password.) = + (Please contact the author of this software.) = flush quit + } if + systemdict /quit get exec + (WARNING : Printer Reset Failed.) = flush" +*End + +*DefaultResolution: 600x600dpi +*?Resolution: " + save currentpagedevice + /HWResolution get + aload pop exch ( ) cvs print (x) print ( ) cvs print (dpi) + = flush + restore" +*End + +*% Halftone Information ================= + +*DefaultHalftoneType: 9 +*ScreenFreq: "60.0" +*ScreenAngle: "0.0" +*DefaultScreenProc: Null +*ScreenProc Null: "{}" + +*DefaultTransfer: Null +*Transfer Null: "{ }" +*Transfer Null.Inverse: "{ 1 exch sub }" + + +*% Tray Selection ============ + +*OpenUI *InputSlot: PickOne +*OrderDependency: 10 AnySetup *InputSlot +*DefaultInputSlot: Paper +*InputSlot Upper: " + (<<) cvx exec + /MediaPosition 0 + /MediaType null + /TraySwitch false + /ManualFeed false + (>>) cvx exec setpagedevice" +*End +*InputSlot Middle: " + (<<) cvx exec + /MediaPosition 1 + /MediaType null + /TraySwitch false + /ManualFeed false + (>>) cvx exec setpagedevice" +*End +*InputSlot Lower: " + (<<) cvx exec + /MediaPosition 2 + /MediaType null + /TraySwitch false + /ManualFeed false + (>>) cvx exec setpagedevice" +*End +*InputSlot Paper: " + (<<) cvx exec + /MediaPosition null + /MediaType (Paper) + /TraySwitch true + /ManualFeed false + (>>) cvx exec setpagedevice" +*End +*InputSlot Transparency: " + (<<) cvx exec + /MediaPosition null + /MediaType (Transparency) + /TraySwitch true + /ManualFeed false + (>>) cvx exec setpagedevice" +*End +*InputSlot ManualPaper/Manual Paper: " + (<<) cvx exec + /MediaPosition null + /MediaType (Paper) + /TraySwitch false + /ManualFeed true + (>>) cvx exec setpagedevice" +*End +*InputSlot ManualTransparency/Manual Transparency: " + (<<) cvx exec + /MediaPosition null + /MediaType (Transparency) + /TraySwitch false + /ManualFeed true + (>>) cvx exec setpagedevice" +*End +*?InputSlot: " + save + currentpagedevice /MediaPosition get + dup null eq + { pop currentpagedevice /MediaType get + dup null eq + { pop (Upper) } + { dup (Paper) eq + { pop currentpagedevice /ManualFeed get + { (ManualPaper) } + { (Paper) } ifelse + } + { + (Transparency) eq + { currentpagedevice /ManualFeed get + { (ManualTransparency) } + { (Transparency) } ifelse + } + { (Unknown) } ifelse + } ifelse + } ifelse + } + { + dup 0 eq + { pop (Upper) } + { dup 1 eq + { pop (Middle) } + { 2 eq + { (Lower) } + { (Unknown) } ifelse + } ifelse + } ifelse + } ifelse + = flush restore" +*End +*CloseUI: *InputSlot + +*% Paper Handling =================== + +*% Use these entries to set paper size most of the time, unless there is +*% specific reason to use PageRegion. +*OpenUI *PageSize: PickOne +*OrderDependency: 20 AnySetup *PageSize +*DefaultPageSize: Letter +*PageSize Letter: "(<<) cvx exec /PageSize [612 792] /ImagingBBox null + (>>) cvx exec setpagedevice" +*End +*PageSize Legal: "(<<) cvx exec /PageSize [612 1008] /ImagingBBox null + (>>) cvx exec setpagedevice" +*End +*PageSize A4: "(<<) cvx exec /PageSize [595 842] /ImagingBBox null + (>>) cvx exec setpagedevice" +*End +*?PageSize: " + save currentpagedevice /PageSize get aload pop + 2 copy gt {exch} if (Unknown) + (<<) cvx exec + [612 792] (Letter) + [612 1008] (Legal) + [595 842] (A4) (>>) cvx exec + { exch aload pop 4 index sub abs 5 le exch 5 index sub abs 5 le and + { exch pop exit } { pop } ifelse + } bind forall = flush pop pop + restore" +*End +*CloseUI: *PageSize + +*% These entries will set up the frame buffer. Usually used with manual feed. +*OpenUI *PageRegion: PickOne +*OrderDependency: 30 AnySetup *PageRegion +*DefaultPageRegion: Letter +*PageRegion Letter: "(<<) cvx exec /PageSize [612 792] /ImagingBBox null + (>>) cvx exec setpagedevice" +*End +*PageRegion Legal: "(<<) cvx exec /PageSize [612 1008] /ImagingBBox null + (>>) cvx exec setpagedevice" +*End +*PageRegion A4: "(<<) cvx exec /PageSize [595 842] /ImagingBBox null + (>>) cvx exec setpagedevice" +*End +*CloseUI: *PageRegion + +*% The following entries provide information about specific paper keywords. +*DefaultImageableArea: Letter +*ImageableArea Letter: "10.32 15.9 601.68 776.22" +*ImageableArea Legal: "10.32 16.3801 601.68 991.74" +*ImageableArea A4: "13.44 14.46 581.76 828.54" +*?ImageableArea: " + save + /cvp { ( ) cvs print ( ) print } bind def + /upperright {10000 mul floor 10000 div} bind def + /lowerleft {10000 mul ceiling 10000 div} bind def + newpath clippath pathbbox + 4 -2 roll exch 2 {lowerleft cvp} repeat + exch 2 {upperright cvp} repeat flush + restore" +*End + +*% These provide the physical dimensions of the paper (by keyword) +*DefaultPaperDimension: Letter +*PaperDimension Letter: "612 792" +*PaperDimension Legal: "612 1008" +*PaperDimension A4: "595 842" + +*RequiresPageRegion All: True + +*% Print Quality Selection =================== + +*OpenUI *OutputMode/Print Quality: PickOne +*OrderDependency: 50 AnySetup *OutputMode +*DefaultOutputMode: Standard +*OutputMode Fast/Fast Color 600x600 dpi: " + (<<) cvx exec + /HWResolution [600 600] + /ProcessColorModel /DeviceCMY + (>>) cvx exec setpagedevice" +*End +*OutputMode Standard/Standard 600x600 dpi: " + (<<) cvx exec + /HWResolution [600 600] + /ProcessColorModel /DeviceCMYK + (>>) cvx exec setpagedevice" +*End +*OutputMode Enhanced/Enhanced 1200x600 dpi: " + (<<) cvx exec + /HWResolution [1200 600] + /ProcessColorModel /DeviceCMYK + (>>) cvx exec setpagedevice" +*End +*OutputMode Premium/Premium 1200x1200 dpi: " + (<<) cvx exec + /HWResolution [1200 1200] + /ProcessColorModel /DeviceCMYK + (>>) cvx exec setpagedevice" +*End +*?OutputMode: " + save + currentpagedevice /ProcessColorModel get /DeviceCMY eq + { (Fast) } + { currentpagedevice /HWResolution get + aload pop 1200 eq + { pop (Premium) } + { 1200 eq + { (Enhanced) } + { (Standard) } ifelse + } ifelse + } ifelse + = flush restore" +*End +*CloseUI: *OutputMode + +*OpenUI *OutputOrder/Output Order: PickOne +*OrderDependency: 60 AnySetup *OutputOrder +*DefaultOutputOrder: Reverse +*OutputOrder Normal/Face Down: " + (<<) cvx exec + /OutputFaceUp false + (>>) cvx exec setpagedevice" +*End +*OutputOrder Reverse/Face Up: " + (<<) cvx exec + /OutputFaceUp true + (>>) cvx exec setpagedevice" +*End +*?OutputOrder: " + save + currentpagedevice /OutputFaceUp get {(Reverse)}{(Normal)}ifelse + = flush restore" +*End +*CloseUI: *OutputOrder + +*OpenUI *Collate/Quick Collate: Boolean +*OrderDependency: 70 AnySetup *Collate +*DefaultCollate: False +*Collate False: " + (<<) cvx exec + /Collate false + (>>) cvx exec setpagedevice" +*End +*Collate True: " + (<<) cvx exec + /Collate true + (>>) cvx exec setpagedevice" +*End +*?Collate: " + save + currentpagedevice /Collate get {(True)}{(False)}ifelse + = flush restore" +*End +*CloseUI: *Collate + + +*% Font Information ===================== +*DefaultFont: Courier +*Font Courier: Standard "(002.003)" Standard ROM +*Font Courier-Bold: Standard "(002.003)" Standard ROM +*Font Courier-BoldOblique: Standard "(002.003)" Standard ROM +*Font Courier-Oblique: Standard "(002.003)" Standard ROM +*Font Helvetica: Standard "(001.006)" Standard ROM +*Font Helvetica-Bold: Standard "(001.007)" Standard ROM +*Font Helvetica-BoldOblique: Standard "(001.007)" Standard ROM +*Font Helvetica-Condensed: Standard "(001.001)" Standard ROM +*Font Helvetica-Condensed-Bold: Standard "(001.002)" Standard ROM +*Font Helvetica-Condensed-BoldObl: Standard "(001.002)" Standard ROM +*Font Helvetica-Condensed-Oblique: Standard "(001.001)" Standard ROM +*Font Helvetica-Narrow: Standard "(001.006)" Standard ROM +*Font Helvetica-Narrow-Bold: Standard "(001.007)" Standard ROM +*Font Helvetica-Narrow-BoldOblique: Standard "(001.007)" Standard ROM +*Font Helvetica-Narrow-Oblique: Standard "(001.006)" Standard ROM +*Font Helvetica-Oblique: Standard "(001.006)" Standard ROM +*Font Symbol: Special "(001.007)" Special ROM +*Font Times-Bold: Standard "(001.007)" Standard ROM +*Font Times-BoldItalic: Standard "(001.009)" Standard ROM +*Font Times-Italic: Standard "(001.007)" Standard ROM +*Font Times-Roman: Standard "(001.007)" Standard ROM +*Font ZapfChancery-MediumItalic: Standard "(001.006)" Standard ROM +*Font ZapfDingbats: Special "(001.004)" Special ROM +*?FontQuery: " + save + { count 1 gt + { exch dup 127 string cvs (/) print print (:) print + /Font resourcestatus {pop pop (Yes)} {(No)} ifelse = + } { exit } ifelse + } bind loop + (*) = flush restore" +*End + +*?FontList: " + save (*) {cvn ==} 128 string /Font resourceforall + (*) = flush restore" +*End + +*DefaultColorSep: ProcessBlack.60lpi.600x600dpi/60 lpi / 600x600 dpi + +*% For 60 lpi / 600x600dpi ================================ + +*ColorSepScreenAngle ProcessBlack.60lpi.600x600dpi/60 lpi / 600x600 dpi: "0.0" +*ColorSepScreenAngle CustomColor.60lpi.600x600dpi/60 lpi / 600x600 dpi: "0.0" +*ColorSepScreenAngle ProcessCyan.60lpi.600x600dpi/60 lpi / 600x600 dpi: "0.0" +*ColorSepScreenAngle ProcessMagenta.60lpi.600x600dpi/60 lpi / 600x600 dpi: "0.0" +*ColorSepScreenAngle ProcessYellow.60lpi.600x600dpi/60 lpi / 600x600 dpi: "0.0" + +*ColorSepScreenFreq ProcessBlack.60lpi.600x600dpi/60 lpi / 600x600 dpi: "60.0" +*ColorSepScreenFreq CustomColor.60lpi.600x600dpi/60 lpi / 600x600 dpi: "60.0" +*ColorSepScreenFreq ProcessCyan.60lpi.600x600dpi/60 lpi / 600x600 dpi: "60.0" +*ColorSepScreenFreq ProcessMagenta.60lpi.600x600dpi/60 lpi / 600x600 dpi: "60.0" +*ColorSepScreenFreq ProcessYellow.60lpi.600x600dpi/60 lpi / 600x600 dpi: "60.0" + +*% end of PPD file for MS PS5 OEM Custimization diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemdll.inf b/print/OEM Printer Customization Plug-in Samples/C++/oemdll.inf new file mode 100644 index 00000000..28bf2207 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemdll.inf @@ -0,0 +1,219 @@ + +; OEMDLL.INF +; +; INF file for OEM DLL Customization samples +; +; Copyright 1999-2003 Microsoft Corporation + + +[Version] +Signature="$Windows NT$" +Provider=%MS% +LayoutFile=ntprint.inf +ClassGUID={4D36E979-E325-11CE-BFC1-08002BE10318} +Class=Printer +DriverVer=6/07/2001,1.0.0.1 + +; +; Manufacturer section. +; +; This section lists all of the manufacturers +; that we will display in the Dialog box +; +[Manufacturer] +"Microsoft"=Microsoft, NTamd64, NTia64 + +; +; Model sections. +; +; Each section here corresponds with an entry listed in the +; [Manufacturer] section, above. The models will be displayed in the order +; that they appear in the INF file. +; + +[Microsoft] +"PostScript WaterMark Sample" = INSTALL_WATERMARK.PS +"Unidrv WaterMark Sample" = INSTALL_WATERMARK.UNI +"OEM PostScript Customization Sample" = INSTALL_OEMPS +"OEM Unidrv Customization Sample" = INSTALL_OEMUNI +"OEM UI Customization Sample (PS)" = INSTALL_OEMUI.PS +"OEM UI Customization Sample (Unidrv)" = INSTALL_OEMUI.UNI + +[Microsoft.NTamd64] +"PostScript WaterMark Sample" = INSTALL_WATERMARK.PS +"Unidrv WaterMark Sample" = INSTALL_WATERMARK.UNI +"OEM PostScript Customization Sample" = INSTALL_OEMPS +"OEM Unidrv Customization Sample" = INSTALL_OEMUNI +"OEM UI Customization Sample (PS)" = INSTALL_OEMUI.PS +"OEM UI Customization Sample (Unidrv)" = INSTALL_OEMUI.UNI + +[Microsoft.NTia64] +"PostScript WaterMark Sample" = INSTALL_WATERMARK.PS +"Unidrv WaterMark Sample" = INSTALL_WATERMARK.UNI +"OEM PostScript Customization Sample" = INSTALL_OEMPS +"OEM Unidrv Customization Sample" = INSTALL_OEMUNI +"OEM UI Customization Sample (PS)" = INSTALL_OEMUI.PS +"OEM UI Customization Sample (Unidrv)" = INSTALL_OEMUI.UNI + +; +; Installer Sections +; +; These sections control file installation, and reference all files that +; need to be copied. The section name will be assumed to be the driver +; file, unless there is an explicit DriverFile section listed. +; + +[INSTALL_WATERMARK.PS] +CopyFiles=WMARKPS +DataFile=OEM.PPD +DataSection=PSCRIPT_DATA +Include=NTPRINT.INF +Needs=PSCRIPT.OEM,PSCRIPT_DATA + + +[INSTALL_WATERMARK.UNI] +CopyFiles=WMARKUNI +DataFile=OEM.GPD +DataSection=UNIDRV_DATA +Include=NTPRINT.INF +Needs=UNIDRV.OEM,TTFSUB.OEM,UNIDRV_DATA + +[INSTALL_OEMPS] +CopyFiles=OEMPS +DataFile=OEM.PPD +DataSection=PSCRIPT_DATA +Include=NTPRINT.INF +Needs=PSCRIPT.OEM,PSCRIPT_DATA + +[INSTALL_OEMUNI] +CopyFiles=OEMUNI +DataFile=OEM.GPD +DataSection=UNIDRV_DATA +Include=NTPRINT.INF +Needs=UNIDRV.OEM,TTFSUB.OEM,UNIDRV_DATA + +[INSTALL_OEMUI.PS] +CopyFiles=OEMUI +DataFile=OEM.PPD +DataSection=PSCRIPT_DATA +Include=NTPRINT.INF +Needs=PSCRIPT.OEM,PSCRIPT_DATA + +[INSTALL_OEMUI.UNI] +CopyFiles=OEMUI +DataFile=OEM.GPD +DataSection=UNIDRV_DATA +Include=NTPRINT.INF +Needs=UNIDRV.OEM,TTFSUB.OEM,UNIDRV_DATA + + + +; Copy Sections +; +; Lists of files that are actually copied. These sections are referenced +; from the installer sections, above. Only create a section if it contains +; two or more files (if we only copy a single file, identify it in the +; installer section, using the @filename notation) or if it's a color +; profile (since the DestinationDirs can only handle sections, and not +; individual files). +; + +[WMARKPS] +WMARKPS.DLL +WMARKUI.DLL + +[WMARKUNI] +WMARKUNI.DLL +WMARKUNIUI.DLL + +[OEMPS] +OEMPS.DLL + +[OEMUI] +OEMUI.DLL + +[OEMUNI] +OEMUNI.DLL + + +; +; Data Sections +; + +; These sections contain data that is shared between devices. +; + + + +; +; Location of source files not in Layout.inf. +; + +[SourceDisksNames] +100 = %OEMSample% + +[SourceDisksFiles.x86] +oemps.dll = 100,OEMPS\x86 +oemui.dll = 100,OEMUI\x86 +oemuni.dll = 100,OEMUNI\x86 +wmarkps.dll = 100,WaterMark\x86 +wmarkuni.dll = 100,WaterMarkUni\x86 +wmarkuniui.dll = 100,WaterMarkUni\x86 +wmarkui.dll = 100,WaterMark\x86 + +[SourceDisksFiles.amd64] +oemps.dll = 100,OEMPS\amd64 +oemui.dll = 100,OEMUI\amd64 +oemuni.dll = 100,OEMUNI\amd64 +wmarkps.dll = 100,WaterMark\amd64 +wmarkuni.dll = 100,WaterMarkUni\amd64 +wmarkuniui.dll = 100,WaterMarkUni\amd64 +wmarkui.dll = 100,WaterMark\amd64 + +[SourceDisksFiles.ia64] +oemps.dll = 100,OEMPS\ia64 +oemui.dll = 100,OEMUI\ia64 +oemuni.dll = 100,OEMUNI\ia64 +wmarkps.dll = 100,WaterMark\ia64 +wmarkuni.dll = 100,WaterMarkUni\ia64 +wmarkuniui.dll = 100,WaterMarkUni\ia64 +wmarkui.dll = 100,WaterMark\ia64 + +[SourceDisksFiles] +OEM.PPD = 100 +OEM.GPD = 100 +WMARKPS.INI = 100 +WMARKUNI.INI = 100 +OEMPS.INI = 100 +OEMUNI.INI = 100 +OEMUI.INI = 100 + +; +; Call SetupSetDirectoryId with 66000 to set the target directory at runtime +; (depending on which environment drivers are getting installed) +; + +[DestinationDirs] +DefaultDestDir=66000 + +; +; Localizable Strings +; +[Strings] +MS="Microsoft DDK Sample" +OEMSample="OEM DLL Print samples" + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemdll.sln b/print/OEM Printer Customization Plug-in Samples/C++/oemdll.sln new file mode 100644 index 00000000..2d0d56ed --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemdll.sln @@ -0,0 +1,809 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26430.16 +MinimumVisualStudioVersion = 12.0 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Bitmap", "Bitmap", "{EFB5E861-A892-49B4-BA05-38F6F5F42D48}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Custhlp", "Custhlp", "{F3DB5340-C664-40EB-986F-2A48790AEDC5}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Src", "Src", "{EC75B371-D09D-4D95-9816-3429B6D3806B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Gdl", "Gdl", "{A6BA54B0-ADB8-4032-8C4B-770474042B09}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Oemprean", "Oemprean", "{E7B7C6C6-5396-42D3-9BDE-DFAC86D0AFE3}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Oemps", "Oemps", "{80510096-C37F-488D-A426-E3BA4B1A1600}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Oemui", "Oemui", "{35933BA0-56E6-4DD4-84E9-C8AADAA19AFA}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Oemuni", "Oemuni", "{7AC217E4-4DB5-414C-A39F-B783020E43AA}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PSUIRep", "PSUIRep", "{03A523F4-091A-416B-97B5-A84FA1B1D3EE}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Src", "Src", "{CCF8F861-A2C2-4C28-AB19-29CC47C6D560}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PTPCPlPr", "PTPCPlPr", "{F8AB36BA-6C96-42BA-90F5-378D3B73634C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SyncSet", "SyncSet", "{C52A574A-6122-48EB-875C-07CE190B0808}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ThemeUI", "ThemeUI", "{F3C654B9-A286-494E-8558-3A2526D52A37}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Src", "Src", "{C4BCC65A-6423-4569-A1D6-AAA82CE821A9}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Uniuirep", "Uniuirep", "{1BA35560-35CD-4E6E-8B67-AD7ED043874A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Wmarkps", "Wmarkps", "{9F8B052F-1649-4F54-ABE9-42E51AFB32AA}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Watermark", "Watermark", "{575FCB22-ADB3-4025-8F23-040500F6C11A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Wmarkui", "Wmarkui", "{2A597978-AD6A-41D0-9B97-CC1B69CE054A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Wmarkui", "Wmarkui", "{D0C95EA5-D23F-44E6-91C3-2BA65CE3991E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Watermarkuni", "Watermarkuni", "{5A8A1EF7-4454-43F3-8A69-484AF81D0771}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Wmarkuni", "Wmarkuni", "{90BABB1D-0FDD-4A9A-BA18-3319FF12363B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bitmap", "bitmap\bitmap.vcxproj", "{EDCCC34A-50DF-4894-B7B9-FC156F899947}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CUSTHLP", "custhlp\CUSTHLP.vcxproj", "{CA70C64A-75C8-48CD-9224-335C2ED689A6}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GDLSMPL", "gdl\src\GDLSMPL.vcxproj", "{F0118F7B-9DF5-49FC-B4FF-951C54033F3D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "oemprean", "oemprean\oemprean.vcxproj", "{D5E225D5-EEEA-45FD-AD07-E4678C542E1A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OEMPS", "oemps\OEMPS.vcxproj", "{9F374241-B8F9-45D3-B163-7E84E8E22C1F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OEMUI", "oemui\OEMUI.vcxproj", "{452209BF-AEB7-457D-956B-90CDE70CED7D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OEMUNI", "oemuni\OEMUNI.vcxproj", "{B0F13767-2056-47FC-B37B-41D7E339900B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PSUIREP", "PSUIRep\PSUIREP.vcxproj", "{5D63CD51-110C-41B7-B8B0-6AB27398690B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PTPCPLPR", "PTPCPlPr\src\PTPCPLPR.vcxproj", "{CED613CF-6666-43FC-9414-02AFBDA83A34}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SYNCSET", "SyncSet\SYNCSET.vcxproj", "{60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ThemeUISmpl", "ThemeUI\ThemeUISmpl.vcxproj", "{EA206DEA-26E6-4FD4-BF68-23F222C5E211}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UNIUIREP", "uniuirep\src\UNIUIREP.vcxproj", "{7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WMARKPS", "watermark\wmarkps\WMARKPS.vcxproj", "{4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WMARKUI", "watermark\wmarkui\WMARKUI.vcxproj", "{BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WMARKUNIUI", "watermarkuni\wmarkui\WMARKUNIUI.vcxproj", "{1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WMARKUNI", "watermarkuni\wmarkuni\WMARKUNI.vcxproj", "{866141A6-4989-41D7-9409-4A5A73B535B0}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Win10 Debug|ARM64 = Win10 Debug|ARM64 + Win10 Debug|Win32 = Win10 Debug|Win32 + Win10 Debug|x64 = Win10 Debug|x64 + Win10 Release|ARM64 = Win10 Release|ARM64 + Win10 Release|Win32 = Win10 Release|Win32 + Win10 Release|x64 = Win10 Release|x64 + Win7 Debug|ARM64 = Win7 Debug|ARM64 + Win7 Debug|Win32 = Win7 Debug|Win32 + Win7 Debug|x64 = Win7 Debug|x64 + Win7 Release|ARM64 = Win7 Release|ARM64 + Win7 Release|Win32 = Win7 Release|Win32 + Win7 Release|x64 = Win7 Release|x64 + Win8 Debug|ARM64 = Win8 Debug|ARM64 + Win8 Debug|Win32 = Win8 Debug|Win32 + Win8 Debug|x64 = Win8 Debug|x64 + Win8 Release|ARM64 = Win8 Release|ARM64 + Win8 Release|Win32 = Win8 Release|Win32 + Win8 Release|x64 = Win8 Release|x64 + Win8.1 Debug|ARM64 = Win8.1 Debug|ARM64 + Win8.1 Debug|Win32 = Win8.1 Debug|Win32 + Win8.1 Debug|x64 = Win8.1 Debug|x64 + Win8.1 Release|ARM64 = Win8.1 Release|ARM64 + Win8.1 Release|Win32 = Win8.1 Release|Win32 + Win8.1 Release|x64 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win10 Debug|ARM64.ActiveCfg = Win10 Debug|ARM64 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win10 Debug|ARM64.Build.0 = Win10 Debug|ARM64 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win10 Debug|Win32.ActiveCfg = Win10 Debug|Win32 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win10 Debug|Win32.Build.0 = Win10 Debug|Win32 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win10 Debug|x64.ActiveCfg = Win10 Debug|x64 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win10 Debug|x64.Build.0 = Win10 Debug|x64 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win10 Release|ARM64.ActiveCfg = Win10 Release|ARM64 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win10 Release|ARM64.Build.0 = Win10 Release|ARM64 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win10 Release|Win32.ActiveCfg = Win10 Release|Win32 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win10 Release|Win32.Build.0 = Win10 Release|Win32 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win10 Release|x64.ActiveCfg = Win10 Release|x64 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win10 Release|x64.Build.0 = Win10 Release|x64 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win7 Debug|ARM64.ActiveCfg = Win7 Debug|Win32 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win7 Release|ARM64.ActiveCfg = Win7 Release|Win32 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win8 Debug|ARM64.ActiveCfg = Win8 Debug|Win32 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win8 Release|ARM64.ActiveCfg = Win8 Release|Win32 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win8.1 Debug|ARM64.ActiveCfg = Win8.1 Debug|Win32 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win8.1 Release|ARM64.ActiveCfg = Win8.1 Release|Win32 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {EDCCC34A-50DF-4894-B7B9-FC156F899947}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win10 Debug|ARM64.ActiveCfg = Win10 Debug|ARM64 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win10 Debug|ARM64.Build.0 = Win10 Debug|ARM64 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win10 Debug|Win32.ActiveCfg = Win10 Debug|Win32 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win10 Debug|Win32.Build.0 = Win10 Debug|Win32 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win10 Debug|x64.ActiveCfg = Win10 Debug|x64 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win10 Debug|x64.Build.0 = Win10 Debug|x64 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win10 Release|ARM64.ActiveCfg = Win10 Release|ARM64 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win10 Release|ARM64.Build.0 = Win10 Release|ARM64 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win10 Release|Win32.ActiveCfg = Win10 Release|Win32 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win10 Release|Win32.Build.0 = Win10 Release|Win32 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win10 Release|x64.ActiveCfg = Win10 Release|x64 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win10 Release|x64.Build.0 = Win10 Release|x64 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win7 Debug|ARM64.ActiveCfg = Win7 Debug|Win32 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win7 Release|ARM64.ActiveCfg = Win7 Release|Win32 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win8 Debug|ARM64.ActiveCfg = Win8 Debug|Win32 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win8 Release|ARM64.ActiveCfg = Win8 Release|Win32 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win8.1 Debug|ARM64.ActiveCfg = Win8.1 Debug|Win32 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win8.1 Release|ARM64.ActiveCfg = Win8.1 Release|Win32 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {CA70C64A-75C8-48CD-9224-335C2ED689A6}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win10 Debug|ARM64.ActiveCfg = Win10 Debug|ARM64 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win10 Debug|ARM64.Build.0 = Win10 Debug|ARM64 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win10 Debug|Win32.ActiveCfg = Win10 Debug|Win32 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win10 Debug|Win32.Build.0 = Win10 Debug|Win32 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win10 Debug|x64.ActiveCfg = Win10 Debug|x64 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win10 Debug|x64.Build.0 = Win10 Debug|x64 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win10 Release|ARM64.ActiveCfg = Win10 Release|ARM64 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win10 Release|ARM64.Build.0 = Win10 Release|ARM64 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win10 Release|Win32.ActiveCfg = Win10 Release|Win32 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win10 Release|Win32.Build.0 = Win10 Release|Win32 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win10 Release|x64.ActiveCfg = Win10 Release|x64 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win10 Release|x64.Build.0 = Win10 Release|x64 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win7 Debug|ARM64.ActiveCfg = Win7 Debug|Win32 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win7 Release|ARM64.ActiveCfg = Win7 Release|Win32 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win8 Debug|ARM64.ActiveCfg = Win8 Debug|Win32 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win8 Release|ARM64.ActiveCfg = Win8 Release|Win32 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win8.1 Debug|ARM64.ActiveCfg = Win8.1 Debug|Win32 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win8.1 Release|ARM64.ActiveCfg = Win8.1 Release|Win32 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win10 Debug|ARM64.ActiveCfg = Win10 Debug|ARM64 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win10 Debug|ARM64.Build.0 = Win10 Debug|ARM64 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win10 Debug|Win32.ActiveCfg = Win10 Debug|Win32 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win10 Debug|Win32.Build.0 = Win10 Debug|Win32 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win10 Debug|x64.ActiveCfg = Win10 Debug|x64 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win10 Debug|x64.Build.0 = Win10 Debug|x64 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win10 Release|ARM64.ActiveCfg = Win10 Release|ARM64 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win10 Release|ARM64.Build.0 = Win10 Release|ARM64 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win10 Release|Win32.ActiveCfg = Win10 Release|Win32 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win10 Release|Win32.Build.0 = Win10 Release|Win32 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win10 Release|x64.ActiveCfg = Win10 Release|x64 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win10 Release|x64.Build.0 = Win10 Release|x64 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win7 Debug|ARM64.ActiveCfg = Win7 Debug|Win32 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win7 Release|ARM64.ActiveCfg = Win7 Release|Win32 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win8 Debug|ARM64.ActiveCfg = Win8 Debug|Win32 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win8 Release|ARM64.ActiveCfg = Win8 Release|Win32 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win8.1 Debug|ARM64.ActiveCfg = Win8.1 Debug|Win32 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win8.1 Release|ARM64.ActiveCfg = Win8.1 Release|Win32 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win10 Debug|ARM64.ActiveCfg = Win10 Debug|ARM64 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win10 Debug|ARM64.Build.0 = Win10 Debug|ARM64 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win10 Debug|Win32.ActiveCfg = Win10 Debug|Win32 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win10 Debug|Win32.Build.0 = Win10 Debug|Win32 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win10 Debug|x64.ActiveCfg = Win10 Debug|x64 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win10 Debug|x64.Build.0 = Win10 Debug|x64 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win10 Release|ARM64.ActiveCfg = Win10 Release|ARM64 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win10 Release|ARM64.Build.0 = Win10 Release|ARM64 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win10 Release|Win32.ActiveCfg = Win10 Release|Win32 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win10 Release|Win32.Build.0 = Win10 Release|Win32 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win10 Release|x64.ActiveCfg = Win10 Release|x64 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win10 Release|x64.Build.0 = Win10 Release|x64 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win7 Debug|ARM64.ActiveCfg = Win7 Debug|Win32 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win7 Release|ARM64.ActiveCfg = Win7 Release|Win32 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win8 Debug|ARM64.ActiveCfg = Win8 Debug|Win32 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win8 Release|ARM64.ActiveCfg = Win8 Release|Win32 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win8.1 Debug|ARM64.ActiveCfg = Win8.1 Debug|Win32 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win8.1 Release|ARM64.ActiveCfg = Win8.1 Release|Win32 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {9F374241-B8F9-45D3-B163-7E84E8E22C1F}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win10 Debug|ARM64.ActiveCfg = Win10 Debug|ARM64 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win10 Debug|ARM64.Build.0 = Win10 Debug|ARM64 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win10 Debug|Win32.ActiveCfg = Win10 Debug|Win32 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win10 Debug|Win32.Build.0 = Win10 Debug|Win32 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win10 Debug|x64.ActiveCfg = Win10 Debug|x64 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win10 Debug|x64.Build.0 = Win10 Debug|x64 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win10 Release|ARM64.ActiveCfg = Win10 Release|ARM64 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win10 Release|ARM64.Build.0 = Win10 Release|ARM64 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win10 Release|Win32.ActiveCfg = Win10 Release|Win32 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win10 Release|Win32.Build.0 = Win10 Release|Win32 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win10 Release|x64.ActiveCfg = Win10 Release|x64 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win10 Release|x64.Build.0 = Win10 Release|x64 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win7 Debug|ARM64.ActiveCfg = Win7 Debug|Win32 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win7 Release|ARM64.ActiveCfg = Win7 Release|Win32 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win8 Debug|ARM64.ActiveCfg = Win8 Debug|Win32 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win8 Release|ARM64.ActiveCfg = Win8 Release|Win32 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win8.1 Debug|ARM64.ActiveCfg = Win8.1 Debug|Win32 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win8.1 Release|ARM64.ActiveCfg = Win8.1 Release|Win32 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {452209BF-AEB7-457D-956B-90CDE70CED7D}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win10 Debug|ARM64.ActiveCfg = Win10 Debug|ARM64 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win10 Debug|ARM64.Build.0 = Win10 Debug|ARM64 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win10 Debug|Win32.ActiveCfg = Win10 Debug|Win32 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win10 Debug|Win32.Build.0 = Win10 Debug|Win32 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win10 Debug|x64.ActiveCfg = Win10 Debug|x64 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win10 Debug|x64.Build.0 = Win10 Debug|x64 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win10 Release|ARM64.ActiveCfg = Win10 Release|ARM64 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win10 Release|ARM64.Build.0 = Win10 Release|ARM64 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win10 Release|Win32.ActiveCfg = Win10 Release|Win32 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win10 Release|Win32.Build.0 = Win10 Release|Win32 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win10 Release|x64.ActiveCfg = Win10 Release|x64 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win10 Release|x64.Build.0 = Win10 Release|x64 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win7 Debug|ARM64.ActiveCfg = Win7 Debug|Win32 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win7 Release|ARM64.ActiveCfg = Win7 Release|Win32 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win8 Debug|ARM64.ActiveCfg = Win8 Debug|Win32 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win8 Release|ARM64.ActiveCfg = Win8 Release|Win32 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win8.1 Debug|ARM64.ActiveCfg = Win8.1 Debug|Win32 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win8.1 Release|ARM64.ActiveCfg = Win8.1 Release|Win32 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {B0F13767-2056-47FC-B37B-41D7E339900B}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win10 Debug|ARM64.ActiveCfg = Win10 Debug|ARM64 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win10 Debug|ARM64.Build.0 = Win10 Debug|ARM64 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win10 Debug|Win32.ActiveCfg = Win10 Debug|Win32 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win10 Debug|Win32.Build.0 = Win10 Debug|Win32 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win10 Debug|x64.ActiveCfg = Win10 Debug|x64 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win10 Debug|x64.Build.0 = Win10 Debug|x64 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win10 Release|ARM64.ActiveCfg = Win10 Release|ARM64 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win10 Release|ARM64.Build.0 = Win10 Release|ARM64 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win10 Release|Win32.ActiveCfg = Win10 Release|Win32 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win10 Release|Win32.Build.0 = Win10 Release|Win32 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win10 Release|x64.ActiveCfg = Win10 Release|x64 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win10 Release|x64.Build.0 = Win10 Release|x64 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win7 Debug|ARM64.ActiveCfg = Win7 Debug|Win32 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win7 Release|ARM64.ActiveCfg = Win7 Release|Win32 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win8 Debug|ARM64.ActiveCfg = Win8 Debug|Win32 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win8 Release|ARM64.ActiveCfg = Win8 Release|Win32 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win8.1 Debug|ARM64.ActiveCfg = Win8.1 Debug|Win32 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win8.1 Release|ARM64.ActiveCfg = Win8.1 Release|Win32 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {5D63CD51-110C-41B7-B8B0-6AB27398690B}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win10 Debug|ARM64.ActiveCfg = Win10 Debug|ARM64 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win10 Debug|ARM64.Build.0 = Win10 Debug|ARM64 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win10 Debug|Win32.ActiveCfg = Win10 Debug|Win32 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win10 Debug|Win32.Build.0 = Win10 Debug|Win32 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win10 Debug|x64.ActiveCfg = Win10 Debug|x64 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win10 Debug|x64.Build.0 = Win10 Debug|x64 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win10 Release|ARM64.ActiveCfg = Win10 Release|ARM64 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win10 Release|ARM64.Build.0 = Win10 Release|ARM64 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win10 Release|Win32.ActiveCfg = Win10 Release|Win32 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win10 Release|Win32.Build.0 = Win10 Release|Win32 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win10 Release|x64.ActiveCfg = Win10 Release|x64 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win10 Release|x64.Build.0 = Win10 Release|x64 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win7 Debug|ARM64.ActiveCfg = Win7 Debug|Win32 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win7 Release|ARM64.ActiveCfg = Win7 Release|Win32 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win8 Debug|ARM64.ActiveCfg = Win8 Debug|Win32 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win8 Release|ARM64.ActiveCfg = Win8 Release|Win32 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win8.1 Debug|ARM64.ActiveCfg = Win8.1 Debug|Win32 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win8.1 Release|ARM64.ActiveCfg = Win8.1 Release|Win32 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {CED613CF-6666-43FC-9414-02AFBDA83A34}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win10 Debug|ARM64.ActiveCfg = Win10 Debug|ARM64 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win10 Debug|ARM64.Build.0 = Win10 Debug|ARM64 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win10 Debug|Win32.ActiveCfg = Win10 Debug|Win32 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win10 Debug|Win32.Build.0 = Win10 Debug|Win32 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win10 Debug|x64.ActiveCfg = Win10 Debug|x64 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win10 Debug|x64.Build.0 = Win10 Debug|x64 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win10 Release|ARM64.ActiveCfg = Win10 Release|ARM64 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win10 Release|ARM64.Build.0 = Win10 Release|ARM64 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win10 Release|Win32.ActiveCfg = Win10 Release|Win32 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win10 Release|Win32.Build.0 = Win10 Release|Win32 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win10 Release|x64.ActiveCfg = Win10 Release|x64 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win10 Release|x64.Build.0 = Win10 Release|x64 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win7 Debug|ARM64.ActiveCfg = Win7 Debug|Win32 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win7 Release|ARM64.ActiveCfg = Win7 Release|Win32 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win8 Debug|ARM64.ActiveCfg = Win8 Debug|Win32 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win8 Release|ARM64.ActiveCfg = Win8 Release|Win32 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win8.1 Debug|ARM64.ActiveCfg = Win8.1 Debug|Win32 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win8.1 Release|ARM64.ActiveCfg = Win8.1 Release|Win32 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win10 Debug|ARM64.ActiveCfg = Win10 Debug|ARM64 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win10 Debug|ARM64.Build.0 = Win10 Debug|ARM64 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win10 Debug|Win32.ActiveCfg = Win10 Debug|Win32 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win10 Debug|Win32.Build.0 = Win10 Debug|Win32 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win10 Debug|x64.ActiveCfg = Win10 Debug|x64 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win10 Debug|x64.Build.0 = Win10 Debug|x64 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win10 Release|ARM64.ActiveCfg = Win10 Release|ARM64 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win10 Release|ARM64.Build.0 = Win10 Release|ARM64 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win10 Release|Win32.ActiveCfg = Win10 Release|Win32 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win10 Release|Win32.Build.0 = Win10 Release|Win32 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win10 Release|x64.ActiveCfg = Win10 Release|x64 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win10 Release|x64.Build.0 = Win10 Release|x64 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win7 Debug|ARM64.ActiveCfg = Win7 Debug|Win32 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win7 Release|ARM64.ActiveCfg = Win7 Release|Win32 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win8 Debug|ARM64.ActiveCfg = Win8 Debug|Win32 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win8 Release|ARM64.ActiveCfg = Win8 Release|Win32 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win8.1 Debug|ARM64.ActiveCfg = Win8.1 Debug|Win32 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win8.1 Release|ARM64.ActiveCfg = Win8.1 Release|Win32 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {EA206DEA-26E6-4FD4-BF68-23F222C5E211}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win10 Debug|ARM64.ActiveCfg = Win10 Debug|ARM64 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win10 Debug|ARM64.Build.0 = Win10 Debug|ARM64 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win10 Debug|Win32.ActiveCfg = Win10 Debug|Win32 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win10 Debug|Win32.Build.0 = Win10 Debug|Win32 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win10 Debug|x64.ActiveCfg = Win10 Debug|x64 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win10 Debug|x64.Build.0 = Win10 Debug|x64 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win10 Release|ARM64.ActiveCfg = Win10 Release|ARM64 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win10 Release|ARM64.Build.0 = Win10 Release|ARM64 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win10 Release|Win32.ActiveCfg = Win10 Release|Win32 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win10 Release|Win32.Build.0 = Win10 Release|Win32 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win10 Release|x64.ActiveCfg = Win10 Release|x64 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win10 Release|x64.Build.0 = Win10 Release|x64 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win7 Debug|ARM64.ActiveCfg = Win7 Debug|Win32 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win7 Release|ARM64.ActiveCfg = Win7 Release|Win32 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win8 Debug|ARM64.ActiveCfg = Win8 Debug|Win32 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win8 Release|ARM64.ActiveCfg = Win8 Release|Win32 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win8.1 Debug|ARM64.ActiveCfg = Win8.1 Debug|Win32 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win8.1 Release|ARM64.ActiveCfg = Win8.1 Release|Win32 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win10 Debug|ARM64.ActiveCfg = Win10 Debug|ARM64 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win10 Debug|ARM64.Build.0 = Win10 Debug|ARM64 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win10 Debug|Win32.ActiveCfg = Win10 Debug|Win32 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win10 Debug|Win32.Build.0 = Win10 Debug|Win32 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win10 Debug|x64.ActiveCfg = Win10 Debug|x64 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win10 Debug|x64.Build.0 = Win10 Debug|x64 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win10 Release|ARM64.ActiveCfg = Win10 Release|ARM64 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win10 Release|ARM64.Build.0 = Win10 Release|ARM64 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win10 Release|Win32.ActiveCfg = Win10 Release|Win32 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win10 Release|Win32.Build.0 = Win10 Release|Win32 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win10 Release|x64.ActiveCfg = Win10 Release|x64 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win10 Release|x64.Build.0 = Win10 Release|x64 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win7 Debug|ARM64.ActiveCfg = Win7 Debug|Win32 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win7 Release|ARM64.ActiveCfg = Win7 Release|Win32 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win8 Debug|ARM64.ActiveCfg = Win8 Debug|Win32 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win8 Release|ARM64.ActiveCfg = Win8 Release|Win32 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win8.1 Debug|ARM64.ActiveCfg = Win8.1 Debug|Win32 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win8.1 Release|ARM64.ActiveCfg = Win8.1 Release|Win32 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win10 Debug|ARM64.ActiveCfg = Win10 Debug|ARM64 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win10 Debug|ARM64.Build.0 = Win10 Debug|ARM64 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win10 Debug|Win32.ActiveCfg = Win10 Debug|Win32 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win10 Debug|Win32.Build.0 = Win10 Debug|Win32 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win10 Debug|x64.ActiveCfg = Win10 Debug|x64 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win10 Debug|x64.Build.0 = Win10 Debug|x64 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win10 Release|ARM64.ActiveCfg = Win10 Release|ARM64 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win10 Release|ARM64.Build.0 = Win10 Release|ARM64 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win10 Release|Win32.ActiveCfg = Win10 Release|Win32 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win10 Release|Win32.Build.0 = Win10 Release|Win32 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win10 Release|x64.ActiveCfg = Win10 Release|x64 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win10 Release|x64.Build.0 = Win10 Release|x64 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win7 Debug|ARM64.ActiveCfg = Win7 Debug|Win32 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win7 Release|ARM64.ActiveCfg = Win7 Release|Win32 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win8 Debug|ARM64.ActiveCfg = Win8 Debug|Win32 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win8 Release|ARM64.ActiveCfg = Win8 Release|Win32 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win8.1 Debug|ARM64.ActiveCfg = Win8.1 Debug|Win32 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win8.1 Release|ARM64.ActiveCfg = Win8.1 Release|Win32 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win10 Debug|ARM64.ActiveCfg = Win10 Debug|ARM64 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win10 Debug|ARM64.Build.0 = Win10 Debug|ARM64 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win10 Debug|Win32.ActiveCfg = Win10 Debug|Win32 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win10 Debug|Win32.Build.0 = Win10 Debug|Win32 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win10 Debug|x64.ActiveCfg = Win10 Debug|x64 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win10 Debug|x64.Build.0 = Win10 Debug|x64 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win10 Release|ARM64.ActiveCfg = Win10 Release|ARM64 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win10 Release|ARM64.Build.0 = Win10 Release|ARM64 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win10 Release|Win32.ActiveCfg = Win10 Release|Win32 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win10 Release|Win32.Build.0 = Win10 Release|Win32 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win10 Release|x64.ActiveCfg = Win10 Release|x64 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win10 Release|x64.Build.0 = Win10 Release|x64 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win7 Debug|ARM64.ActiveCfg = Win7 Debug|Win32 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win7 Release|ARM64.ActiveCfg = Win7 Release|Win32 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win8 Debug|ARM64.ActiveCfg = Win8 Debug|Win32 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win8 Release|ARM64.ActiveCfg = Win8 Release|Win32 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win8.1 Debug|ARM64.ActiveCfg = Win8.1 Debug|Win32 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win8.1 Release|ARM64.ActiveCfg = Win8.1 Release|Win32 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win10 Debug|ARM64.ActiveCfg = Win10 Debug|ARM64 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win10 Debug|ARM64.Build.0 = Win10 Debug|ARM64 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win10 Debug|Win32.ActiveCfg = Win10 Debug|Win32 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win10 Debug|Win32.Build.0 = Win10 Debug|Win32 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win10 Debug|x64.ActiveCfg = Win10 Debug|x64 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win10 Debug|x64.Build.0 = Win10 Debug|x64 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win10 Release|ARM64.ActiveCfg = Win10 Release|ARM64 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win10 Release|ARM64.Build.0 = Win10 Release|ARM64 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win10 Release|Win32.ActiveCfg = Win10 Release|Win32 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win10 Release|Win32.Build.0 = Win10 Release|Win32 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win10 Release|x64.ActiveCfg = Win10 Release|x64 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win10 Release|x64.Build.0 = Win10 Release|x64 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win7 Debug|ARM64.ActiveCfg = Win7 Debug|Win32 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win7 Release|ARM64.ActiveCfg = Win7 Release|Win32 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win8 Debug|ARM64.ActiveCfg = Win8 Debug|Win32 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win8 Release|ARM64.ActiveCfg = Win8 Release|Win32 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win8.1 Debug|ARM64.ActiveCfg = Win8.1 Debug|Win32 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win8.1 Release|ARM64.ActiveCfg = Win8.1 Release|Win32 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {866141A6-4989-41D7-9409-4A5A73B535B0}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {EC75B371-D09D-4D95-9816-3429B6D3806B} = {A6BA54B0-ADB8-4032-8C4B-770474042B09} + {CCF8F861-A2C2-4C28-AB19-29CC47C6D560} = {F8AB36BA-6C96-42BA-90F5-378D3B73634C} + {C4BCC65A-6423-4569-A1D6-AAA82CE821A9} = {1BA35560-35CD-4E6E-8B67-AD7ED043874A} + {9F8B052F-1649-4F54-ABE9-42E51AFB32AA} = {575FCB22-ADB3-4025-8F23-040500F6C11A} + {2A597978-AD6A-41D0-9B97-CC1B69CE054A} = {575FCB22-ADB3-4025-8F23-040500F6C11A} + {D0C95EA5-D23F-44E6-91C3-2BA65CE3991E} = {5A8A1EF7-4454-43F3-8A69-484AF81D0771} + {90BABB1D-0FDD-4A9A-BA18-3319FF12363B} = {5A8A1EF7-4454-43F3-8A69-484AF81D0771} + {EDCCC34A-50DF-4894-B7B9-FC156F899947} = {EFB5E861-A892-49B4-BA05-38F6F5F42D48} + {CA70C64A-75C8-48CD-9224-335C2ED689A6} = {F3DB5340-C664-40EB-986F-2A48790AEDC5} + {F0118F7B-9DF5-49FC-B4FF-951C54033F3D} = {EC75B371-D09D-4D95-9816-3429B6D3806B} + {D5E225D5-EEEA-45FD-AD07-E4678C542E1A} = {E7B7C6C6-5396-42D3-9BDE-DFAC86D0AFE3} + {9F374241-B8F9-45D3-B163-7E84E8E22C1F} = {80510096-C37F-488D-A426-E3BA4B1A1600} + {452209BF-AEB7-457D-956B-90CDE70CED7D} = {35933BA0-56E6-4DD4-84E9-C8AADAA19AFA} + {B0F13767-2056-47FC-B37B-41D7E339900B} = {7AC217E4-4DB5-414C-A39F-B783020E43AA} + {5D63CD51-110C-41B7-B8B0-6AB27398690B} = {03A523F4-091A-416B-97B5-A84FA1B1D3EE} + {CED613CF-6666-43FC-9414-02AFBDA83A34} = {CCF8F861-A2C2-4C28-AB19-29CC47C6D560} + {60E61442-4E2A-41A1-BC70-EDC0B8DC4EB8} = {C52A574A-6122-48EB-875C-07CE190B0808} + {EA206DEA-26E6-4FD4-BF68-23F222C5E211} = {F3C654B9-A286-494E-8558-3A2526D52A37} + {7C66BD86-A7CA-4F53-A5B2-9361A6B80E16} = {C4BCC65A-6423-4569-A1D6-AAA82CE821A9} + {4B90E6E4-34B2-460F-9BF7-D75B5334F2E5} = {9F8B052F-1649-4F54-ABE9-42E51AFB32AA} + {BE3E261C-4EF8-4BC2-AAD2-49F1292512CE} = {2A597978-AD6A-41D0-9B97-CC1B69CE054A} + {1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62} = {D0C95EA5-D23F-44E6-91C3-2BA65CE3991E} + {866141A6-4989-41D7-9409-4A5A73B535B0} = {90BABB1D-0FDD-4A9A-BA18-3319FF12363B} + EndGlobalSection +EndGlobal diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemprean.gpd b/print/OEM Printer Customization Plug-in Samples/C++/oemprean.gpd new file mode 100644 index 00000000..3328de18 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemprean.gpd @@ -0,0 +1,706 @@ +*GPDFileName: "oemprean.gpd" +*GPDFileVersion: "1.0" +*GPDSpecVersion: "1.0" +*Include: "StdNames.gpd" +*Include: "ttfsub.gpd" +*ModelName: "OEM Pre-Analysis sample" +*MasterUnits: PAIR(1200, 1200) +*ResourceDLL: "unires.dll" +*PrinterType: PAGE +*MaxCopies: 99 +*PrintRate: 16 +*PrintRateUnit: PPM +*PrintRatePPM: 16 + +*PreAnalysisOptions: 8 + +*%****************************************************************************************** +*% Orientation +*%****************************************************************************************** +*Feature: Orientation +{ + *rcNameID: =ORIENTATION_DISPLAY + *DefaultOption: PORTRAIT + *Option: PORTRAIT + { + *rcNameID: =PORTRAIT_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.6 + *Cmd: "<1B>&l0O" + } + } + *Option: LANDSCAPE_CC90 + { + *rcNameID: =LANDSCAPE_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.8 + *Cmd: "<1B>&l1O" + } + } +} + +*%****************************************************************************************** +*% Input Bin +*%****************************************************************************************** +*Feature: InputBin +{ + *rcNameID: =PAPER_SOURCE_DISPLAY + *DefaultOption: AUTO + *Option: AUTO + { + *rcNameID: =AUTO_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.11 + *Cmd: "<1B>&l0H" + } + } + *Option: UPPER + { + *rcNameID: =UPPER_TRAY_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.11 + *Cmd: "<1B>&l1H" + } + } +} + +*%****************************************************************************************** +*% Resolution +*%****************************************************************************************** +*Feature: Resolution +{ + *rcNameID: =RESOLUTION_DISPLAY + *DefaultOption: Option2 + *Option: Option1 + { + *Name: "600 x 600" =DOTS_PER_INCH + *DPI: PAIR(600, 600) + *TextDPI: PAIR(600, 600) + *MinStripBlankPixels: 32 + EXTERN_GLOBAL: *StripBlanks: LIST(ENCLOSED,TRAILING) + *SpotDiameter: 100 + *Command: CmdBeginRaster { *Cmd : "<1B>*v7S<1B>*r1A" } + *Command: CmdEndRaster { *Cmd : "<1B>*rC" } + *Command: CmdSendBlockData { *Cmd : "<1B>*b" %d{NumOfDataBytes}"W" } + *Command: CmdSelect + { + *Order: DOC_SETUP.7 + *Cmd: "@PJL SET RESOLUTION=600<0A>@PJL ENTER LANGUAGE=PCL<0A0D1B>E<1B>*t600R" + } + } + *Option: Option2 + { + *Name: "300 x 300" =DOTS_PER_INCH + *DPI: PAIR(300, 300) + *TextDPI: PAIR(300, 300) + *MinStripBlankPixels: 32 + EXTERN_GLOBAL: *StripBlanks: LIST(ENCLOSED, TRAILING) + *SpotDiameter: 100 + *Command: CmdBeginRaster { *Cmd : "<1B>*v7S<1B>*r1A" } + *Command: CmdEndRaster { *Cmd : "<1B>*rC" } + *Command: CmdSendBlockData { *Cmd : "<1B>*b" %d{NumOfDataBytes}"W" } + *Command: CmdSelect + { + *Order: DOC_SETUP.7 + *Cmd: "@PJL SET RESOLUTION=300<0A>@PJL ENTER LANGUAGE=PCL<0A0D1B>E<1B>*t300R" + } + } + *Option: Option3 + { + *Name: "150 x 150" =DOTS_PER_INCH + *DPI: PAIR(150, 150) + *TextDPI: PAIR(150, 150) + *MinStripBlankPixels: 32 + EXTERN_GLOBAL: *StripBlanks: LIST(ENCLOSED, TRAILING) + *SpotDiameter: 100 + *Command: CmdBeginRaster { *Cmd : "<1B>*v7S<1B>*r1A" } + *Command: CmdEndRaster { *Cmd : "<1B>*rC" } + *Command: CmdSendBlockData { *Cmd : "<1B>*b" %d{NumOfDataBytes}"W" } + *Command: CmdSelect + { + *Order: DOC_SETUP.7 + *Cmd: "@PJL SET RESOLUTION=150<0A>@PJL ENTER LANGUAGE=PCL<0A0D1B>E<1B>*t150R" + } + } +} + +*%****************************************************************************************** +*% HP-GL/2 Graphics Support +*%****************************************************************************************** +*Ifdef: WINNT_51 +*Personality: =PERSONALITY_HPGL2 +*Feature: GraphicsMode +{ + *rcNameID: =GRAPHICSMODE_DISPLAY + *DefaultOption: RASTERMODE + *Option: HPGL2MODE + { + *rcNameID: =GRAPHICSMODE_HPGL2_DISPLAY + } + *Option: RASTERMODE + { + *rcNameID: =GRAPHICSMODE_RASTER_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.6 + *Cmd: "@PJL SET LIMAGEENHANCE=OFF<0A>" + } + } +} +*Endif: + +*%****************************************************************************************** +*% Paper Size +*%****************************************************************************************** +*Feature: PaperSize +{ + *rcNameID: =PAPER_SIZE_DISPLAY + *DefaultOption: LETTER + *Option: LETTER + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *PageProtectMem: 1028 + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(9500, 12500) + *PrintableOrigin: PAIR(400, 400) + *CursorOrigin: PAIR(300, 300) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l2a8c1E<1B>*p0x0Y<1B>*c0t5260x7704Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(9500, 12200) + *PrintableOrigin: PAIR(450, 300) + *CursorOrigin: PAIR(200, 12900) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l2a8c1E<1B>*p0x0Y<1B>*c0t7332x5880Y" + } + } + } + } + *Option: LEGAL + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *PageProtectMem: 1692 + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(9000, 15500) + *PrintableOrigin: PAIR(400, 600) + *CursorOrigin: PAIR(180, 300) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l3a8c1E<1B>*p0x0Y<1B>*c0t5880x8900Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(9000, 15500) + *PrintableOrigin: PAIR(400, 900) + *CursorOrigin: PAIR(180, 16500) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l3a8c1E<1B>*p0x0Y<1B>*c0t8900x5880Y" + } + } + } + } + *Option: EXECUTIVE + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *PageProtectMem: 4109 + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(8100, 11500) + *PrintableOrigin: PAIR(300, 300) + *CursorOrigin: PAIR(300, 200) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l1a8c1E<1B>*p0x0Y<1B>*c0t4860x7344Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(8300, 11500) + *PrintableOrigin: PAIR(200, 300) + *CursorOrigin: PAIR(200, 12300) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l1a8c1E<1B>*p0x0Y<1B>*c0t7272x4980Y" + } + } + } + } + *Option: A4 + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *PageProtectMem: 4249 + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(9100, 13200) + *PrintableOrigin: PAIR(400, 300) + *CursorOrigin: PAIR(288, 180) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l26a8c1E<1B>*p0x0Y<1B>*c0t5594x8201Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(9100, 13200) + *PrintableOrigin: PAIR(400, 300) + *CursorOrigin: PAIR(204, 13824) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l26a8c1E<1B>*p0x0Y<1B>*c0t8129x5714Y" + } + } + } + } + *Option: B5 + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *PageProtectMem: 3198 + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(7900, 11140) + *PrintableOrigin: PAIR(352, 300) + *CursorOrigin: PAIR(300, 100) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l12a8c1E<1B>*p0x0Y<1B>*c0t4970x7040Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(7760, 11140) + *PrintableOrigin: PAIR(300, 400) + *CursorOrigin: PAIR(100, 11940) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l12a8c1E<1B>*p0x0Y<1B>*c0t6780x4970Y" + } + } + } + } +} + +*%****************************************************************************************** +*% Media Type +*%****************************************************************************************** +*Feature: MediaType +{ + *rcNameID: =MEDIA_TYPE_DISPLAY + *DefaultOption: PLAIN + *Option: PLAIN + { + *rcNameID: =PLAIN_PAPER_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.15 + *Cmd: "<1B>&n6WdPlain" + } + } + *Option: TRANSPARENCY + { + *rcNameID: =TRANSPARENCY_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.15 + *Cmd: "<1B>&n13WdTransparency" + } + } +} + +*%****************************************************************************************** +*% Color Mode +*%****************************************************************************************** +*Feature: ColorMode +{ + *rcNameID: =COLOR_PRINTING_MODE_DISPLAY + *DefaultOption: 24bpp + *Option: Mono + { + *rcNameID: =MONO_DISPLAY + *DevNumOfPlanes: 1 + *DevBPP: 1 + *Color?: FALSE + } + *Option: Color + { + *rcNameID: =COLOR_DISPLAY + *DevNumOfPlanes: 3 + *DevBPP: 1 + *DrvBPP: 4 + EXTERN_GLOBAL: *RasterSendAllData?: TRUE + *ColorPlaneOrder: LIST(CYAN, MAGENTA, YELLOW) + *Command: CmdSendCyanData { *Cmd : "<1B>*b" %d{NumOfDataBytes}"V" } + *Command: CmdSendMagentaData { *Cmd : "<1B>*b" %d{NumOfDataBytes}"V" } + *Command: CmdSendYellowData { *Cmd : "<1B>*b" %d{NumOfDataBytes}"W" } + *Command: CmdSelectBlackColor { *Cmd : "<1B>*v7S" } + *Command: CmdSelectRedColor { *Cmd : "<1B>*v6S" } + *Command: CmdSelectGreenColor { *Cmd : "<1B>*v5S" } + *Command: CmdSelectYellowColor { *Cmd : "<1B>*v4S" } + *Command: CmdSelectBlueColor { *Cmd : "<1B>*v3S" } + *Command: CmdSelectMagentaColor { *Cmd : "<1B>*v2S" } + *Command: CmdSelectCyanColor { *Cmd : "<1B>*v1S" } + *Command: CmdSelectWhiteColor { *Cmd : "<1B>*v0S" } + *Command: CmdSelect + { + *Order: PAGE_SETUP.16 + *Cmd: "<1B>*r-3U" + } + } + *Option: 8bpp + { + *rcNameID: =8BPP_DISPLAY + *DevNumOfPlanes: 1 + *DevBPP: 8 + *DrvBPP: 8 + *PaletteSize: 256 + *PaletteProgrammable? : TRUE + *Command: CmdDefinePaletteEntry { *Cmd : "<1B>*v" %d{RedValue}"a" %d{GreenValue}"b" %d{BlueValue}"c" ++ %d{PaletteIndexToProgram} "I" } + *Command: CmdSelectPaletteEntry { *Cmd : "<1B>*v" %d{CurrentPaletteIndex}"S" } + *Command: CmdSelect + { + *Order: PAGE_SETUP.16 + *Cmd: "<1B>*v1N<1B>*v1O<1B>*t0I<1B>*l184O<1B>*v6W<000108080808>" + } + } + *Option: 24bpp + { + *rcNameID: =24BPP_DISPLAY + *DevNumOfPlanes: 1 + *DevBPP: 24 + *DrvBPP: 24 + *Command: CmdEnableDRC { *Cmd : "<1B>*b3M" } + *PaletteSize: 256 + *PaletteProgrammable? : TRUE + *Command: CmdDefinePaletteEntry { *Cmd : "<1B>*v" %d{RedValue}"a" %d{GreenValue}"b" %d{BlueValue}"c" ++ %d{PaletteIndexToProgram} "I" } + *Command: CmdSelectPaletteEntry { *Cmd : "<1B>*v" %d{CurrentPaletteIndex}"S" } + *Command: CmdSetSrcBmpWidth { *Cmd : "<1B>*r" %d{RasterDataWidthInBytes / 3}"S" } + *Command: CmdSelect + { + *Order: PAGE_SETUP.16 + *Cmd: "<1B>*v1N<1B>*v1O<1B>*l184O<1B>*v6W<0003080808081B>*v0a0b0c7i255a255b255c0I<1B>*" ++ "o3W<060400>" + } + } +} + +*%****************************************************************************************** +*% HalfTone +*%****************************************************************************************** +*Feature: Halftone +{ + *rcNameID: =HALFTONING_DISPLAY + *DefaultOption: HT_PATSIZE_AUTO + *Option: HT_PATSIZE_AUTO + { + *rcNameID: =HT_AUTO_SELECT_DISPLAY + } + *Option: HT_PATSIZE_SUPERCELL_M + { + *rcNameID: =HT_SUPERCELL_DISPLAY + } + *Option: HT_PATSIZE_6x6_M + { + *rcNameID: =HT_DITHER6X6_DISPLAY + } + *Option: HT_PATSIZE_8x8_M + { + *rcNameID: =HT_DITHER8X8_DISPLAY + } +} + +*%****************************************************************************************** +*% Memory +*% +*% Note: Unidrv uses the font memory information to estimate when it needs to stop +*% downloading fonts for a page, and thus driver writers should err on the conservative +*% side. Otherwise, printers will generate "out of memory" device errors for pages with +*% a large number of fonts / unique glyphs. +*%****************************************************************************************** +*Feature: Memory +{ + *rcNameID: =PRINTER_MEMORY_DISPLAY + *DefaultOption: 32768KB + *Option: 4096KB + { + *Name: "4MB" + *MemoryConfigKB: PAIR(4096, 6750) + } + *Option: 8192KB + { + *Name: "8MB" + *MemoryConfigKB: PAIR(8192, 10350) + } + *Option: 16384KB + { + *Name: "16MB" + *MemoryConfigKB: PAIR(16384, 13950) + } + *Option: 24576KB + { + *Name: "24MB" + *MemoryConfigKB: PAIR(24576, 21150) + } + *Option: 32768KB + { + *Name: "32MB" + *MemoryConfigKB: PAIR(32768, 28350) + } + *Option: 49152KB + { + *Name: "48MB" + *MemoryConfigKB: PAIR(49152, 43050) + } + *Option: 65536KB + { + *Name: "64MB" + *MemoryConfigKB: PAIR(65536, 57150) + } + *Option: 98304KB + { + *Name: "96MB" + *MemoryConfigKB: PAIR(98304, 85950) + } + *Option: 102400KB + { + *Name: "100MB" + *MemoryConfigKB: PAIR(102400, 89700) + } + *Option: 114688KB + { + *Name: "112MB" + *MemoryConfigKB: PAIR(114688, 100550) + } + *Option: 131072KB + { + *Name: "128MB" + *MemoryConfigKB: PAIR(131072, 116250) + } +} + +*%****************************************************************************************** +*% Duplex Unit +*%****************************************************************************************** +*Feature: DuplexUnit +{ + *rcNameID: 429 + *FeatureType: PRINTER_PROPERTY + *DefaultOption: FALSE + *Option: FALSE + { + *rcNameID: 444 + *DisabledFeatures: LIST(Duplex.VERTICAL, Duplex.HORIZONTAL) + } + *Option: TRUE + { + *rcNameID: 443 + } +} + +*%****************************************************************************************** +*% Duplex Type +*%****************************************************************************************** +*Feature: Duplex +{ + *rcNameID: =TWO_SIDED_PRINTING_DISPLAY + *DefaultOption: NONE + *Option: NONE + { + *rcNameID: =NONE_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.9 + *Cmd: "<1B>&l0S" + } + } + *Option: VERTICAL + { + *rcNameID: =FLIP_ON_LONG_EDGE_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.9 + *Cmd: "<1B>&l1S" + } + } + *Option: HORIZONTAL + { + *rcNameID: =FLIP_ON_SHORT_EDGE_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.9 + *Cmd: "<1B>&l2S" + } + } +} + +*%****************************************************************************************** +*% Page Protect +*%****************************************************************************************** +*Feature: PageProtect +{ + *rcNameID: =PAGE_PROTECTION_DISPLAY + *DefaultOption: OFF + *Option: ON + { + *rcNameID: =ON_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.1 + *Cmd: "<1B>%%-12345X@PJL SET PAGEPROTECT=LETTER<0A>" + } + } + *Option: OFF + { + *rcNameID: =OFF_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.1 + *Cmd: "<1B>%%-12345X@PJL SET PAGEPROTECT=OFF<0A>" + } + } +} + +*%****************************************************************************************** +*% Doc setup commands +*%****************************************************************************************** +*Command: CmdStartDoc +{ + *Order: DOC_SETUP.7 + *Cmd: "<1B>&u1200D<1B>*r0F" +} +*Command: CmdStartPage +{ + *Order: PAGE_SETUP.1 + *Cmd: "<1B>*b0M<0D>" +} +*Command: CmdEndJob +{ + *Order: JOB_FINISH.1 + *Cmd: "<1B>E<1B>%%-12345X@PJL<20>LPORTROTATE<0A><1B>%%-12345X" +} +*Command: CmdCopies +{ + *Order: DOC_SETUP.13 + *Cmd: "<1B>&l" %d{NumOfCopies}"X" +} + +*%****************************************************************************************** +*% Cursor, Page and Color Commands +*%****************************************************************************************** +*RotateCoordinate?: TRUE +*RotateRaster?: TRUE +*RotateFont?: TRUE +*TextCaps: LIST(TC_CR_90,TC_UA_ABLE) +*MemoryUsage: LIST(FONT, RASTER, VECTOR) +*CursorXAfterCR: AT_PRINTABLE_X_ORIGIN +*BadCursorMoveInGrxMode: LIST(X_PORTRAIT,Y_LANDSCAPE) +*XMoveThreshold: 0 +*YMoveThreshold: 0 +*XMoveUnit: 300 +*YMoveUnit: 300 +*Command: CmdXMoveAbsolute { *Cmd : "<1B>*p" %d{(DestX) }"X" } +*Command: CmdXMoveRelRight { *Cmd : "<1B>*p+" %d[0,9600]{max_repeat((DestXRel) )}"X" } +*Command: CmdXMoveRelLeft { *Cmd : "<1B>*p-" %d[0,9600]{max_repeat((DestXRel) )}"X" } +*Command: CmdYMoveAbsolute { *Cmd : "<1B>*p" %d{(DestY) }"Y" } +*Command: CmdYMoveRelDown { *Cmd : "<1B>*p+" %d{(DestYRel) }"Y" } +*Command: CmdYMoveRelUp { *Cmd : "<1B>*p-" %d{(DestYRel) }"Y" } +*Command: CmdDefinePaletteEntry { *Cmd : "<1B>*v" %d{RedValue}"a" %d{GreenValue}"b" %d{BlueValue}"c" ++ %d{PaletteIndexToProgram} "I" } +*Command: CmdSelectPaletteEntry { *Cmd : "<1B>*v" %d{CurrentPaletteIndex}"S" } +*Command: CmdCR { *Cmd : "<0D>" } +*Command: CmdLF { *Cmd : "<0A>" } +*Command: CmdFF { *Cmd : "<0C>" } +*Command: CmdBackSpace { *Cmd : "<08>" } +*Command: CmdUniDirectionOn { *Cmd : "<00>" } +*Command: CmdUniDirectionOff { *Cmd : "<00>" } +*Command: CmdPushCursor { *Cmd : "<1B>&f0S" } +*Command: CmdPopCursor { *Cmd : "<1B>&f1S" } +*Command: CmdSetSimpleRotation { *Cmd : "<1B>&a" %d{PrintDirInCCDegrees}"P" } +*EjectPageWithFF?: TRUE +*Command: CmdEnableTIFF4 { *Cmd : "<1B>*b2M" } +*Command: CmdDisableCompression { *Cmd : "<1B>*b0M" } +*OutputDataFormat: H_BYTE +*OptimizeLeftBound?: TRUE +*CursorXAfterSendBlockData: AT_GRXDATA_ORIGIN +*CursorYAfterSendBlockData: AUTO_INCREMENT + +*%****************************************************************************************** +*% Font Descriptions and Commands +*%****************************************************************************************** +*TTFSEnabled?: TRUE +*DefaultFont: 136 +*DefaultCTT: 0 +*CharPosition: BASELINE +*DeviceFonts: LIST(136,138,146,147,148,149,150,151,152,153,154,155,156,157, ++ 163,164,165,166,196,197,198,199,200,201,202,203,209,210, ++ 211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226, ++ 227,228,229,230) +*MinFontID: 16534 +*MaxFontID: 32768 +*switch: Resolution +{ + *case: Option1 + { + *FontFormat: HPPCL_OUTLINE + } + *case: Option2 + { + *FontFormat: HPPCL_OUTLINE + } + *case: Option3 + { + *FontFormat: HPPCL_RES + } +} +*Command: CmdSetFontID { *Cmd : "<1B>*c" %d{NextFontID}"D" } +*Command: CmdSelectFontID { *Cmd : "<1B>(" %d{CurrentFontID}"X" } +*Command: CmdSetCharCode { *Cmd : "<1B>*c" %d{NextGlyph}"E" } +*Command: CmdUnderlineOn { *Cmd : "<1B>&dD" } +*Command: CmdUnderlineOff { *Cmd : "<1B>&d@" } +*Command: CmdWhiteTextOn { *Cmd : "<1B>*v1o1T" } +*Command: CmdWhiteTextOff { *Cmd : "<1B>*v0o0T" } + + +*%******************************************************************************************** +*%* Vector Commands. +*%******************************************************************************************** +*MinGrayFill: 1 +*MaxGrayFill: 100 +*Command: CmdSetRectWidth { *Cmd : "<1B>*c" %d{(RectXSize) }"A" } +*Command: CmdSetRectHeight { *Cmd : "<1B>*c" %d{(RectYSize) }"B" } +*Command: CmdRectGrayFill { *Cmd : "<1B>*c" %d{GrayPercentage }"g2P" } +*Command: CmdRectWhiteFill { *Cmd : "<1B>*c1P" } +*Command: CmdRectBlackFill { *Cmd : "<1B>*c0P" } diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemprean.htm b/print/OEM Printer Customization Plug-in Samples/C++/oemprean.htm new file mode 100644 index 00000000..87662eb5 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemprean.htm @@ -0,0 +1,514 @@ +<html xmlns:v="urn:schemas-microsoft-com:vml" +xmlns:o="urn:schemas-microsoft-com:office:office" +xmlns:w="urn:schemas-microsoft-com:office:word" +xmlns="http://www.w3.org/TR/REC-html40"> + +<head> +<meta http-equiv=Content-Type content="text/html; charset=windows-1252"> +<meta name=ProgId content=Word.Document> +<meta name=Generator content="Microsoft Word 10"> +<meta name=Originator content="Microsoft Word 10"> +<link rel=File-List href="oemprean_files/filelist.xml"> +<title>OEMPREAN SAMPLE</title> +<!--[if gte mso 9]><xml> + <o:DocumentProperties> + <o:Author></o:Author> + <o:LastAuthor></o:LastAuthor> + <o:Revision>18</o:Revision> + <o:TotalTime>38</o:TotalTime> + <o:Created>2003-05-28T23:09:00Z</o:Created> + <o:LastSaved>2003-08-14T01:02:00Z</o:LastSaved> + <o:Pages>1</o:Pages> + <o:Words>1074</o:Words> + <o:Characters>6125</o:Characters> + <o:Company>Microsoft Corporation</o:Company> + <o:Lines>51</o:Lines> + <o:Paragraphs>14</o:Paragraphs> + <o:CharactersWithSpaces>7185</o:CharactersWithSpaces> + <o:Version>10.4219</o:Version> + </o:DocumentProperties> +</xml><![endif]--><!--[if gte mso 9]><xml> + <w:WordDocument> + <w:GrammarState>Clean</w:GrammarState> + <w:Compatibility> + <w:BreakWrappedTables/> + <w:SnapToGridInCell/> + <w:WrapTextWithPunct/> + <w:UseAsianBreakRules/> + </w:Compatibility> + <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> + </w:WordDocument> +</xml><![endif]--> +<style> +<!-- + /* Font Definitions */ + @font-face + {font-family:Verdana; + panose-1:2 11 6 4 3 5 4 4 2 4; + mso-font-charset:0; + mso-generic-font-family:swiss; + mso-font-pitch:variable; + mso-font-signature:536871559 0 0 0 415 0;} + /* Style Definitions */ + p.MsoNormal, li.MsoNormal, div.MsoNormal + {mso-style-parent:""; + margin:0in; + margin-bottom:.0001pt; + mso-pagination:widow-orphan; + font-size:12.0pt; + font-family:"Times New Roman"; + mso-fareast-font-family:"Times New Roman";} +h1 + {mso-style-next:Normal; + margin-top:12.0pt; + margin-right:0in; + margin-bottom:3.0pt; + margin-left:0in; + mso-pagination:widow-orphan; + page-break-after:avoid; + mso-outline-level:1; + font-size:16.0pt; + font-family:Arial; + mso-font-kerning:16.0pt;} +h3 + {mso-style-next:Normal; + margin-top:12.0pt; + margin-right:0in; + margin-bottom:3.0pt; + margin-left:0in; + mso-pagination:widow-orphan; + page-break-after:avoid; + mso-outline-level:3; + font-size:13.0pt; + font-family:Arial;} +a:link, span.MsoHyperlink + {color:blue; + text-decoration:underline; + text-underline:single;} +a:visited, span.MsoHyperlinkFollowed + {color:purple; + text-decoration:underline; + text-underline:single;} +pre + {margin:0in; + margin-bottom:.0001pt; + mso-pagination:widow-orphan; + font-size:10.0pt; + font-family:"Courier New"; + mso-fareast-font-family:"Times New Roman"; + color:black;} +@page Section1 + {size:8.5in 11.0in; + margin:1.0in 1.25in 1.0in 1.25in; + mso-header-margin:.5in; + mso-footer-margin:.5in; + mso-paper-source:0;} +div.Section1 + {page:Section1;} +--> +</style> +<!--[if gte mso 10]> +<style> + /* Style Definitions */ + table.MsoNormalTable + {mso-style-name:"Table Normal"; + mso-tstyle-rowband-size:0; + mso-tstyle-colband-size:0; + mso-style-noshow:yes; + mso-style-parent:""; + mso-padding-alt:0in 5.4pt 0in 5.4pt; + mso-para-margin:0in; + mso-para-margin-bottom:.0001pt; + mso-pagination:widow-orphan; + font-size:10.0pt; + font-family:"Times New Roman";} +</style> +<![endif]--> +</head> + +<body lang=EN-US link=blue vlink=purple style='tab-interval:.5in'> + +<div class=Section1> + +<h1>OEMPREAN SAMPLE</h1> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'><o:p> </o:p></span></p> + +<h3>Summary</h3> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>This +sample illustrates how you can leverage the preanalysis feature in Unidrv. This +sample is built upon the redesigned version of the oemuni sample. <o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'><o:p> </o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>When +preanalysis is enabled in the GPD, Unidrv defines the surface as a banding +surface but causes the first playback to be of the entire page. Unidrv does +this by setting the GDI clip window to the entire page. Unidrv allows all +drawing commands to be hooked but returns before any drawing can be done. On +the following passes Unidrv resets the clip window back to the original band +size and bands normally. In order to enable this feature in the GPD, specify +the following GPD parameter: �*PreAnalysisOptions: 8�.<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'><o:p> </o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>The OEM +rendering plug-in is required to hook both DrvStartBanding and DrvNextBand when +this mode is enabled in the GPD. The OEM rendering plug-in must test the pptl +parameter of the DrvStartBanding call to determine whether preanalysis has been +enabled on this page. If the pptl parameter is NULL, then preanalysis has been +enabled. The pptl parameter can be used by Unidrv since it has no meaning at +this point. This parameter has not been updated with the band position and for +preanalysis the band position is always be set to 0, 0. If the pptl parameter +is NULL, then the OEM rendering plug-in should consider all drawing calls up to +the first call to DrvNextBand to be part of preanalysis. During this phase no +drawing onto the surface is allowed. You should be aware that after +preanalysis, you might get more calls than you saw in the normal rendering, +because primitives that cross band boundaries yield two or more DDI calls after +the preanalysis pass.<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'><o:p> </o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>The +sample uses the bPreAnalysis flag in the OEMPDEV structure to denote whether a +particular pass is the preanalysis pass or the actual rendering pass. If the +bPreAnalysis flag is set, it indicates that the current pass is the preanalysis +pass. The sample implements all of the drawing function hooks in ddihook.cpp. +The sample uses the OEMStartBanding and OEMNextBand functions, to respectively +set and reset the bPreAnalysis flag. The sample also uses the DBG_CLIPOBJ debug +macro function to dump the bounds of the clipping rectangle available for +preanalysis in each of the drawing functions during the preanalysis pass. To +view all of the debug output in the debugger, you must set the debug level to +VERBOSE. The rest of the sample is identical to the oemuni sample that +illustrates a basic OEM rendering plug-in.<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'><o:p> </o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>Note that +the surface used during preanalysis might differ from the surface passed in +during the rendering pass. Also note that during the preanalysis pass, although +Unidrv calls the hooked drawing functions, it returns before any drawing is +done. For this reason you should not perform any drawing on the surface during +the preanalysis pass. All other preanalysis tasks should be performed during +this pass. For example, certain printers need to handle black objects that +intersect with color objects differently from black objects that appear by +themselves. Other printers might need to halftone StretchBlt objects +differently from BitBlt objects. Basically, the plug-in can analyze the objects +on the page. A final point to note is that during the preanalysis pass, drawing +functions should not call back into Unidrv. When the bPreAnalysis flag is set, +the sample returns without calling back into Unidrv.<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'><o:p> </o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>Note that +this sample will not build with the Windows 2000 build environment. This +version of the sample implements the IPrintOemUni2 interface which is available +only on Windows XP and later. The table shown below will help identify which +operating systems this sample will build/work on. <o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'><o:p> </o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'><o:p> </o:p></span></p> + +<table class=MsoNormalTable border=1 cellpadding=0 width="100%" + style='width:100.0%;mso-cellspacing:1.5pt;mso-padding-alt:0in 5.4pt 0in 5.4pt'> + <tr style='mso-yfti-irow:0'> + <td width="19%" style='width:19.84%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='mso-margin-top-alt:auto;mso-margin-bottom-alt: + auto;text-align:center'><b style='mso-bidi-font-weight:normal'><span + style='font-size:10.0pt;font-family:Verdana'>Operating System</span><o:p></o:p></b></p> + </td> + <td width="26%" style='width:26.78%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='text-align:center'><b + style='mso-bidi-font-weight:normal'><span style='font-size:10.0pt;font-family: + Verdana'>Can sample be built in the OS?</span></b><b style='mso-bidi-font-weight: + normal'><span style='font-family:Verdana'><o:p></o:p></span></b></p> + </td> + <td width="26%" style='width:26.78%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='text-align:center'><b + style='mso-bidi-font-weight:normal'><span style='font-size:10.0pt;font-family: + Verdana'>Does sample work in the OS?</span><o:p></o:p></b></p> + </td> + <td width="25%" style='width:25.8%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='text-align:center'><b + style='mso-bidi-font-weight:normal'><span style='font-size:10.0pt;font-family: + Verdana;letter-spacing:-1.0pt'>Can sample be used in a production environment + for the OS?</span><o:p></o:p></b></p> + </td> + </tr> + <tr style='mso-yfti-irow:1'> + <td width="19%" style='width:19.84%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>Windows + codenamed Longhorn<o:p></o:p></span></p> + </td> + <td width="26%" style='width:26.78%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='text-align:center'><span + style='font-size:10.0pt;font-family:Verdana'>Yes<o:p></o:p></span></p> + </td> + <td width="26%" style='width:26.78%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='text-align:center'><span + style='font-size:10.0pt;font-family:Verdana'>Yes<o:p></o:p></span></p> + </td> + <td width="25%" style='width:25.8%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='text-align:center'><span + style='font-size:10.0pt;font-family:Verdana'>No<o:p></o:p></span></p> + </td> + </tr> + <tr style='mso-yfti-irow:2'> + <td width="19%" style='width:19.84%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>Windows + Server 2003</span></p> + </td> + <td width="26%" style='width:26.78%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='text-align:center'><span + style='font-size:10.0pt;font-family:Verdana'>Yes</span></p> + </td> + <td width="26%" style='width:26.78%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='text-align:center'><span + style='font-size:10.0pt;font-family:Verdana'>No</span></p> + </td> + <td width="25%" style='width:25.8%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='text-align:center'><span + style='font-size:10.0pt;font-family:Verdana'>No</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:3'> + <td width="19%" style='width:19.84%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>Windows + XP</span></p> + </td> + <td width="26%" style='width:26.78%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='text-align:center'><span + style='font-size:10.0pt;font-family:Verdana'>Yes</span></p> + </td> + <td width="26%" style='width:26.78%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='text-align:center'><span + style='font-size:10.0pt;font-family:Verdana'>No</span></p> + </td> + <td width="25%" style='width:25.8%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='text-align:center'><span + style='font-size:10.0pt;font-family:Verdana'>No</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:4'> + <td width="19%" style='width:19.84%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>Windows + 2000</span></p> + </td> + <td width="26%" style='width:26.78%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='text-align:center'><span + style='font-size:10.0pt;font-family:Verdana'>No</span></p> + </td> + <td width="26%" style='width:26.78%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='text-align:center'><span + style='font-size:10.0pt;font-family:Verdana'>No</span></p> + </td> + <td width="25%" style='width:25.8%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='text-align:center'><span + style='font-size:10.0pt;font-family:Verdana'>No</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:5'> + <td width="19%" style='width:19.84%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>Windows + Me</span></p> + </td> + <td width="26%" style='width:26.78%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='text-align:center'><span + style='font-size:10.0pt;font-family:Verdana'>No</span></p> + </td> + <td width="26%" style='width:26.78%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='text-align:center'><span + style='font-size:10.0pt;font-family:Verdana'>No</span></p> + </td> + <td width="25%" style='width:25.8%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='text-align:center'><span + style='font-size:10.0pt;font-family:Verdana'>No</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:6;mso-yfti-lastrow:yes'> + <td width="19%" style='width:19.84%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>Windows + 98 SE<o:p></o:p></span></p> + </td> + <td width="26%" style='width:26.78%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='text-align:center'><span + style='font-size:10.0pt;font-family:Verdana'>No<o:p></o:p></span></p> + </td> + <td width="26%" style='width:26.78%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='text-align:center'><span + style='font-size:10.0pt;font-family:Verdana'>No<o:p></o:p></span></p> + </td> + <td width="25%" style='width:25.8%;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='text-align:center'><span + style='font-size:10.0pt;font-family:Verdana'>No<o:p></o:p></span></p> + </td> + </tr> +</table> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'><o:p> </o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'><o:p> </o:p></span></p> + +<h3>Building the sample</h3> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>To build +the samples, run �<b style='mso-bidi-font-weight:normal'>build �cZ</b>� from +the directory. The resulting DLL will be placed in the appropriate platform directory +(i.e. i386 or Alpha). To create a version with verbose debug output, add _DEBUG +to the compile defines in the sources file.<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'><o:p> </o:p></span></p> + +<h3>Installing the sample</h3> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>After +building the sample, you can install it using the Add Printer Wizard and +supplying the INF that is part of the sample when you are prompted for an INF +in the wizard. The Unidrv binaries required for this driver need not be copied +to the local directory containing oemdll.inf. <o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'><o:p> </o:p></span></p> + +<h3>Resources</h3> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>For the +latest release of the Windows Device Driver Development Kit, see <a +href="http://www.microsoft.com/whdc/ddk/winddk.mspx">http://www.microsoft.com/whdc/ddk/winddk.mspx</a>.<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'><o:p> </o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>If you +have questions on using or adapting this sample for your project, you can +either contact <a href="http://support.microsoft.com/">Microsoft Technical +Support</a> or post your questions in the <a +href="http://msdn.microsoft.com/newsgroups/default.asp?url=/newsgroups/loadframes.asp?icp=msdn&slcid=us&newsgroup=microsoft.public.development.device.drivers">Microsoft +driver development newsgroup</a>.</span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'><o:p> </o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'><o:p> </o:p></span></p> + +<h3>File Manifest</h3> + +<p class=MsoNormal><o:p> </o:p></p> + +<p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span +style='font-size:10.0pt;font-family:Verdana'>Root:<o:p></o:p></span></b></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'><o:p> </o:p></span></p> + +<p class=MsoNormal><u><span style='font-size:10.0pt;font-family:Verdana'>Files</span></u><span +style='font-size:10.0pt;font-family:Verdana'><span style='mso-tab-count:3'>���������������������� </span><u>Description</u><o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>readme.htm<span +style='mso-tab-count:2'>������������ </span>The documentation for this sample +(this file).<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>oemprean.gpd<span +style='mso-tab-count:2'>��������� </span>The generic GPD file for this sample.<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>oemprean.inf<span +style='mso-tab-count:2'>����������� </span>The printer INF that will install +this sample once it is built.<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>oemprean.ini<span +style='mso-tab-count:2'>����������� </span>The printer ini file that specifies +the OEM customization DLLs for this sample.<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'><o:p> </o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'><o:p> </o:p></span></p> + +<p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span +style='font-size:10.0pt;font-family:Verdana'>OEMPREAN directory:</span></b><span +style='font-size:10.0pt;font-family:Verdana'><o:p></o:p></span></p> + +<p class=MsoNormal><u><span style='font-size:10.0pt;font-family:Verdana'><o:p><span + style='text-decoration:none'> </span></o:p></span></u></p> + +<p class=MsoNormal><u><span style='font-size:10.0pt;font-family:Verdana'>Files</span></u><span +style='font-size:10.0pt;font-family:Verdana'><span style='mso-tab-count:3'>���������������������� </span><u>Description<o:p></o:p></u></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>ddihook.cpp<span +style='mso-tab-count:2'>������������ </span>Source module for DDI Hook routines +for the rendering plug-in. (OEMBitBlt, OEMStrokePath, OEMTextOut, OEMNextBand +etc.)<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>ddihook.h<span +style='mso-tab-count:2'>��������������� </span>Source module that defines the +constants used to control DDI hooking. (IMPL_ALPHABLEND, IMPL_BITBLT, +IMPL_NEXTBAND etc.)<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>debug.cpp<span +style='mso-tab-count:2'>�������������� </span>Source module that contains the +debugging functions. (COemUniDbg::vDumpSURFOBJ, COemUniDbg::vDumpSTROBJ etc.)<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>debug.h<span +style='mso-tab-count:2'>����������������� </span>The header file for the debug +module defined in debug.cpp. (Definition of the COemUniDbg class)<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>devmode.cpp<span +style='mso-tab-count:2'>���������� </span>Source module that contains +implementation of the OEM Devmode functions. (hrOEMDevmode, bConvertOEMDevmode +etc.)<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>devmode.h<span +style='mso-tab-count:2'>������������� </span>The header for devmode.cpp.<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>dllentry.cpp<span +style='mso-tab-count:2'>������������ </span>Source module for DLL entry +functions. (DllMain)<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>enable.cpp<span +style='mso-tab-count:2'>������������� </span>Source module that contains the +enable routines for the rendering plug-in. (OEMEnableDriver, OEMEnablePDEV, +OEMDisableDriver etc.)<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>intrface.cpp<span +style='mso-tab-count:2'>������������ </span>Source module that implements the +OEM COM printer customization rendering plug-in interface. +(COemUni2::ImageProcessing, COemUni2::FilterGraphics etc.)<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>intrface.h<span +style='mso-tab-count:2'>��������������� </span>The header for intrface.cpp that +defines the COM interface for the rendering plug-in. (Definition of the +COemUni2 class)<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>makefile<span +style='mso-tab-count:2'>����������������� </span>The generic makefile for +building the code sample.<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>oemprean.def<span +style='mso-tab-count:2'>���������� </span>The file that lists the exported +functions for the sample.<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>oemprean.h<span +style='mso-tab-count:2'>������������ </span>The header file that defines the +PDEV class for the sample. (Definition and implementation of the COemPDEV +class)<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>oemprean.rc<span +style='mso-tab-count:2'>����������� </span>The resources file for the rendering +plugin�s resources.<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>precomp.h<span +style='mso-tab-count:2'>�������������� </span>The header that includes the +headers to precompile.<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>resource.h<span +style='mso-tab-count:2'>�������������� </span>The header file the resources +file.<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'>sources<span +style='mso-tab-count:2'>������������������ </span>The generic sources file for building +the code sample.<o:p></o:p></span></p> + +<p class=MsoNormal><span style='font-size:10.0pt;font-family:Verdana'><o:p> </o:p></span></p> + +</div> + +</body> + +</html> diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemprean.inf b/print/OEM Printer Customization Plug-in Samples/C++/oemprean.inf new file mode 100644 index 00000000..a7c90e24 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemprean.inf @@ -0,0 +1,117 @@ +; OEMPREAN.INF +; +; INF file for the OEM pre-analysis WDK sample +; +; Copyright 1999 - 2001 Microsoft Corporation + + +[Version] +Signature="$Windows NT$" +Provider=%MS% +LayoutFile=ntprint.inf +ClassGUID={4D36E979-E325-11CE-BFC1-08002BE10318} +Class=Printer +DriverVer=6/07/2001,1.0.0.1 + +; +; Manufacturer section. +; +; This section lists all of the manufacturers +; that we will display in the Dialog box +; +[Manufacturer] +"Microsoft"=Microsoft, NTx86, NTamd64, NTia64 + +; +; Model sections. +; +; Each section here corresponds with an entry listed in the +; [Manufacturer] section, above. The models will be displayed in the order +; that they appear in the INF file. +; + +[Microsoft] +"OEM Pre-Analysis sample" = OEM_PREAN + +[Microsoft.NTx86] +"OEM Pre-Analysis sample" = OEM_PREAN + +[Microsoft.NTamd64] +"OEM Pre-Analysis sample" = OEM_PREAN + +[Microsoft.NTia64] +"OEM Pre-Analysis sample" = OEM_PREAN + +; +; Installer Sections +; +; These sections control file installation, and reference all files that +; need to be copied. The section name will be assumed to be the driver +; file, unless there is an explicit DriverFile section listed. +; + +[OEM_PREAN] +CopyFiles=OEMPREAN +DataFile=OEMPREAN.GPD +DataSection=UNIDRV_DATA +Include=NTPRINT.INF +Needs=UNIDRV.OEM,TTFSUB.OEM,UNIDRV_DATA + + +; Copy Sections +; +; Lists of files that are actually copied. These sections are referenced +; from the installer sections, above. Only create a section if it contains +; two or more files (if we only copy a single file, identify it in the +; installer section, using the @filename notation) or if it's a color +; profile (since the DestinationDirs can only handle sections, and not +; individual files). +; + +[OEMPREAN] +OEMPREAN.DLL + +; +; Data Sections +; + +; These sections contain data that is shared between devices. +; + + + +; +; Location of source files not in Layout.inf. +; + +[SourceDisksNames] +100 = %OEMSample% + +[SourceDisksFiles.x86] +oemprean.dll = 100,oemprean\x86 + +[SourceDisksFiles.amd64] +oemprean.dll = 100,oemprean\amd64 + +[SourceDisksFiles.ia64] +oemprean.dll = 100,oemprean\ia64 + +[SourceDisksFiles] +OEMPREAN.GPD = 100 +OEMPREAN.INI = 100 + +; +; Call SetupSetDirectoryId with 66000 to set the target directory at runtime +; (depending on which environment drivers are getting installed) +; + +[DestinationDirs] +DefaultDestDir=66000 + +; +; Localizable Strings +; +[Strings] +MS="Microsoft WDK Sample" diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemprean.ini b/print/OEM Printer Customization Plug-in Samples/C++/oemprean.ini new file mode 100644 index 00000000..ad5eed92 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemprean.ini @@ -0,0 +1,4 @@ +[OEMFiles] +OEMDriverFile1=OEMPREAN.DLL + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemprean/ddihook.cpp b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/ddihook.cpp new file mode 100644 index 00000000..b3843090 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/ddihook.cpp @@ -0,0 +1,2069 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: DDIHook.cpp +// +// +// PURPOSE: DDI Hook routines for User Mode COM Customization DLL. +// +// This module implements the following functions defined in printoem.h: +// OEMCopyBits +// OEMBitBlt +// OEMStretchBlt +// OEMDitherColor +// OEMStretchBltROP +// OEMPlgBlt +// OEMPaint +// OEMRealizeBrush +// OEMStrokePath +// OEMFillPath +// OEMStrokeAndFillPath +// OEMLineTo +// OEMAlphaBlend +// OEMGradientFill +// OEMTransparentBlt +// OEMTextOut +// OEMQueryFont +// OEMQueryFontTree +// OEMQueryFontData +// OEMFontManagement +// OEMQueryAdvanceWidths +// OEMGetGlyphMode +// OEMStartDoc +// OEMEndDoc +// OEMStartPage +// OEMSendPage +// OEMStartBanding +// OEMNextBand +// OEMEscape +// +// History: +// 06/24/03 xxx created. +// +// + +#include "precomp.h" +#include "oemprean.h" +#include "debug.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +BOOL APIENTRY +OEMCopyBits( + SURFOBJ *psoDst, + SURFOBJ *psoSrc, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + RECTL *prclDst, + POINTL *pptlSrc + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvCopyBits. + + DrvCopyBits translates between device-managed + raster surfaces and GDI standard-format bitmaps. + GDI will call DrvCopyBits when it needs to copy from + one surface to another and at least one of the + surfaces is device-managed. + + Please refer to DDK documentation for more details. + +Arguments: + + psoDst - Points to the Dstination surface + psoSrc - Points to the source surface + pxlo - XLATEOBJ provided by the engine + pco - Defines a clipping region on the Dstination surface + pxlo - Defines the translation of color indices + between the source and target surfaces + prclDst - Defines the area to be modified + pptlSrc - Defines the upper-left corner of the source rectangle + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE(L"OEMCopyBits entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)psoDst->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + if (pOemPDEV->bPreAnalysis) + { + VERBOSE(TEXT("OEMCopyBits: Begin pre-analysis...\r\n")); + + // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass. + // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might + // differ from the surface passed in during the rendering pass. + + // Dump the bounds of the clip window available for pre-analysis. + DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco); + + // Although unidrv calls the hooked drawing functions, it will return before any drawing is done. + // So we should not perform any drawing on the surface. But all other pre-analysis tasks should + // be performed here. For example, certain printers need to handle black objects differently if + // they intersect with any color objects versus being stand alone. Another task could be to halftone + // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page. + + // During the pre-analysis pass, drawing functions should not call back into Unidrv. + // So we return here. + VERBOSE(TEXT("OEMCopyBits: End pre-analysis...\r\n")); + + return TRUE; + } + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvCopyBits)(psoDst, + psoSrc, + pco, + pxlo, + prclDst, + pptlSrc); +} + +BOOL APIENTRY +OEMBitBlt( + SURFOBJ *psoDst, + SURFOBJ *psoSrc, + SURFOBJ *psoMask, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + RECTL *prclDst, + POINTL *pptlSrc, + POINTL *pptlMask, + BRUSHOBJ *pbo, + POINTL *pptlBrush, + ROP4 rop4 + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvBitBlt. + + DrvBitBlt provides general bit-block transfer capabilities + between device-managed surfaces, between GDI-managed + standard-format bitmaps, or between a device-managed + surface and a GDI-managed standard-format bitmap. + + Please refer to DDK documentation for more details. + +Arguments: + + psoDst - Describes the target surface + psoSrc - Describes the source surface + psoMask - Describes the mask for rop4 + pco - Limits the area to be modified + pxlo - Specifies how color indices are translated + between the source and target surfaces + prclDst - Defines the area to be modified + pptlSrc - Defines the upper left corner of the source rectangle + pptlMask - Defines which pixel in the mask corresponds to + the upper left corner of the source rectangle + pbo - Defines the pattern for bitblt + pptlBrush - Defines the origin of the brush in the Dstination surface + rop4 - ROP code that defines how the mask, pattern, source, and + Dstination pixels are combined to write to the Dstination surface + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE(L"OEMBitBlt entry."); + + DBG_SURFOBJ(DBG_VERBOSE, L"psoDst", psoDst); + DBG_SURFOBJ(DBG_VERBOSE, L"psoSrc", psoSrc); + DBG_SURFOBJ(DBG_VERBOSE, L"psoMask", psoMask); + DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco); + DBG_XLATEOBJ(DBG_VERBOSE, L"pxlo", pxlo); + DBG_RECTL(DBG_VERBOSE, L"prclDst", prclDst); + DBG_POINTL(DBG_VERBOSE, L"pptlSrc", pptlSrc); + DBG_POINTL(DBG_VERBOSE, L"pptlMask", pptlMask); + DBG_BRUSHOBJ(DBG_VERBOSE, L"pbo", pbo); + DBG_POINTL(DBG_VERBOSE, L"pptlBrush", pptlBrush); + VERBOSE(TEXT("\nrop4: %#x\r\n\n"), rop4); + + PDEVOBJ pDevObj = (PDEVOBJ)psoDst->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + if (pOemPDEV->bPreAnalysis) + { + VERBOSE(TEXT("OEMBitBlt: Begin pre-analysis...\r\n")); + + // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass. + // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might + // differ from the surface passed in during the rendering pass. + + // Dump the bounds of the clip window available for pre-analysis. + DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco); + + // Although unidrv calls the hooked drawing functions, it will return before any drawing is done. + // So we should not perform any drawing on the surface. But all other pre-analysis tasks should + // be performed here. For example, certain printers need to handle black objects differently if + // they intersect with any color objects versus being stand alone. Another task could be to halftone + // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page. + + // During the pre-analysis pass, drawing functions should not call back into Unidrv. + // So we return here. + VERBOSE(TEXT("OEMBitBlt: End pre-analysis...\r\n")); + + return TRUE; + } + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvBitBlt)(psoDst, + psoSrc, + psoMask, + pco, + pxlo, + prclDst, + pptlSrc, + pptlMask, + pbo, + pptlBrush, + rop4); +} + +BOOL APIENTRY +OEMStretchBlt( + SURFOBJ *psoDst, + SURFOBJ *psoSrc, + SURFOBJ *psoMask, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + COLORADJUSTMENT *pca, + POINTL *pptlHTOrg, + RECTL *prclDst, + RECTL *prclSrc, + POINTL *pptlMask, + ULONG iMode + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvStretchBlt. + + DrvStretchBlt provides stretching bit-block transfer + capabilities between any combination of device-managed + and GDI-managed surfaces. DrvStretchBlt enables the + device driver to write to GDI bitmaps, especially when the + driver can do halftoning. This function allows the same + halftoning algorithm to be applied to GDI bitmaps and + device surfaces. This function can be provided to handle + only certain forms of stretching, such as by integer multiples. + + Please refer to DDK documentation for more details. + +Arguments: + + psoDst - Defines the surface on which to draw + psoSrc - Defines the source for blt operation + psoMask - Defines a surface that provides a mask for the source + pco - Limits the area to be modified on the Dstination + pxlo - Specifies how color dwIndexes are to be translated + between the source and target surfaces + pca - Defines color adjustment values to be applied to the source bitmap + pptlHTOrg - Specifies the origin of the halftone brush + prclDst - Defines the area to be modified on the Dstination surface + prclSrc - Defines the area to be copied from the source surface + pptlMask - Specifies which pixel in the given mask corresponds to + the upper left pixel in the source rectangle + iMode - Specifies how source pixels are combined to get output pixels + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE(L"OEMStretchBlt entry."); + + DBG_SURFOBJ(DBG_VERBOSE, L"psoDst", psoDst); + DBG_SURFOBJ(DBG_VERBOSE, L"psoSrc", psoSrc); + DBG_SURFOBJ(DBG_VERBOSE, L"psoMask", psoMask); + DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco); + DBG_XLATEOBJ(DBG_VERBOSE, L"pxlo", pxlo); + DBG_COLORADJUSTMENT(DBG_VERBOSE, L"pca", pca); + DBG_POINTL(DBG_VERBOSE, L"pptlHTOrg", pptlHTOrg); + DBG_RECTL(DBG_VERBOSE, L"prclDst", prclDst); + DBG_RECTL(DBG_VERBOSE, L"prclSrc", prclSrc); + DBG_POINTL(DBG_VERBOSE, L"pptlMask", pptlMask); + VERBOSE(TEXT("\niMode: %#x\r\n\n"), iMode); + + PDEVOBJ pDevObj = (PDEVOBJ)psoDst->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + if (pOemPDEV->bPreAnalysis) + { + VERBOSE(TEXT("OEMStretchBlt: Begin pre-analysis...\r\n")); + + // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass. + // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might + // differ from the surface passed in during the rendering pass. + + // Dump the bounds of the clip window available for pre-analysis. + DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco); + + // Although unidrv calls the hooked drawing functions, it will return before any drawing is done. + // So we should not perform any drawing on the surface. But all other pre-analysis tasks should + // be performed here. For example, certain printers need to handle black objects differently if + // they intersect with any color objects versus being stand alone. Another task could be to halftone + // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page. + + // During the pre-analysis pass, drawing functions should not call back into Unidrv. + // So we return here. + VERBOSE(TEXT("OEMStretchBlt: End pre-analysis...\r\n")); + + return TRUE; + } + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvStretchBlt)(psoDst, + psoSrc, + psoMask, + pco, + pxlo, + pca, + pptlHTOrg, + prclDst, + prclSrc, + pptlMask, + iMode); +} + +ULONG APIENTRY +OEMDitherColor( + DHPDEV dhpdev, + ULONG iMode, + ULONG rgbColor, + ULONG *pulDither + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvDitherColor. + + DrvDitherColor requests the device to create a + brush dithered against a device palette. + + Please refer to DDK documentation for more details. + +Arguments: + + dhpdev - DHPDEV passed, it is our pDEV + iMode - Not used + rgbColor - Solid rgb color to be used + pulDither - buffer to put the halftone brush. + +Return Value: + + Returns halftone method. + + DCR_DRIVER if the dither values have been calculated by the driver. + DCR_SOLID if the engine should use the best solid color approximation of the color. + DCR_HALFTONE if the engine should create a halftone approximation for the driver. + +--*/ + +{ + VERBOSE(L"OEMDitherColor entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvDitherColor)(dhpdev, + iMode, + rgbColor, + pulDither); +} + +BOOL APIENTRY +OEMStretchBltROP( + SURFOBJ *psoDst, + SURFOBJ *psoSrc, + SURFOBJ *psoMask, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + COLORADJUSTMENT *pca, + POINTL *pptlHTOrg, + RECTL *prclDst, + RECTL *prclSrc, + POINTL *pptlMask, + ULONG iMode, + BRUSHOBJ *pbo, + ROP4 rop4 + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvStretchBltROP. + + DrvStretchBltROP performs a stretching bit-block transfer + using a ROP. + + Please refer to DDK documentation for more details. + +Arguments: + + psoDst - Specifies the target surface + psoSrc - Specifies the source surface + psoMask - Specifies the mask surface + pco - Limits the area to be modified + pxlo - Specifies how color indices are translated + between the source and target surfaces + pca - Defines color adjustment values to be applied to the source bitmap + pptlHTOrg - Specifies the halftone origin + prclDst - Area to be modified on the destination surface + prclSrc - Rectangle area on the source surface + pptlMask - Defines which pixel in the mask corresponds to + the upper left corner of the source rectangle + iMode - Specifies how source pixels are combined to get output pixels + pbo - Defines the pattern for bitblt + rop4 - ROP code that defines how the mask, pattern, source, and + destination pixels are combined on the destination surface + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE(L"OEMStretchBltROP entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)psoDst->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + if (pOemPDEV->bPreAnalysis) + { + VERBOSE(TEXT("OEMStretchBltROP: Begin pre-analysis...\r\n")); + + // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass. + // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might + // differ from the surface passed in during the rendering pass. + + // Dump the bounds of the clip window available for pre-analysis. + DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco); + + // Although unidrv calls the hooked drawing functions, it will return before any drawing is done. + // So we should not perform any drawing on the surface. But all other pre-analysis tasks should + // be performed here. For example, certain printers need to handle black objects differently if + // they intersect with any color objects versus being stand alone. Another task could be to halftone + // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page. + + // During the pre-analysis pass, drawing functions should not call back into Unidrv. + // So we return here. + VERBOSE(TEXT("OEMStretchBltROP: End pre-analysis...\r\n")); + + return TRUE; + } + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvStretchBltROP)(psoDst, + psoSrc, + psoMask, + pco, + pxlo, + pca, + pptlHTOrg, + prclDst, + prclSrc, + pptlMask, + iMode, + pbo, + rop4); +} + +BOOL APIENTRY +OEMPlgBlt( + SURFOBJ *psoDst, + SURFOBJ *psoSrc, + SURFOBJ *psoMask, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + COLORADJUSTMENT *pca, + POINTL *pptlBrushOrg, + POINTFIX *pptfixDest, + RECTL *prclSrc, + POINTL *pptlMask, + ULONG iMode + ) +/*++ + +Routine Description: + + Implementation of DDI hook for DrvPlgBlt. + + DrvPlgBlt provides rotate bit-block transfer capabilities between + combinations of device-managed and GDI-managed surfaces. + + Please refer to DDK documentation for more details. + +Arguments: + + psoDst - Defines the surface on which to draw + psoSrc - Defines the source for blt operation + psoMask - Defines a surface that provides a mask for the source + pco - Limits the area to be modified on the Dstination + pxlo - Specifies how color dwIndexes are to be translated + between the source and target surfaces + pca - Defines color adjustment values to be applied to the source bitmap + pptlBrushOrg - Specifies the origin of the halftone brush + pptfixDest - Defines the area to be modified on the Dstination surface + prclSrc - Defines the area to be copied from the source surface + pptlMask - Specifies which pixel in the given mask corresponds to + the upper left pixel in the source rectangle + iMode - Specifies how source pixels are combined to get output pixels + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE(L"OEMPlgBlt entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)psoDst->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + if (pOemPDEV->bPreAnalysis) + { + VERBOSE(TEXT("OEMPlgBlt: Begin pre-analysis...\r\n")); + + // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass. + // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might + // differ from the surface passed in during the rendering pass. + + // Dump the bounds of the clip window available for pre-analysis. + DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco); + + // Although unidrv calls the hooked drawing functions, it will return before any drawing is done. + // So we should not perform any drawing on the surface. But all other pre-analysis tasks should + // be performed here. For example, certain printers need to handle black objects differently if + // they intersect with any color objects versus being stand alone. Another task could be to halftone + // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page. + + // During the pre-analysis pass, drawing functions should not call back into Unidrv. + // So we return here. + VERBOSE(TEXT("OEMPlgBlt: End pre-analysis...\r\n")); + + return TRUE; + } + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvPlgBlt)(psoDst, + psoSrc, + psoMask, + pco, + pxlo, + pca, + pptlBrushOrg, + pptfixDest, + prclSrc, + pptlMask, + iMode); +} + +BOOL APIENTRY +OEMPaint( + SURFOBJ *pso, + CLIPOBJ *pco, + BRUSHOBJ *pbo, + POINTL *pptlBrushOrg, + MIX mix + ) +/*++ + +Routine Description: + + Implementation of DDI hook for DrvPaint. + + DrvPaint is an obsolete function. + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Defines the surface on which to draw + pco - Limits the area to be modified on the Dstination + pbo - Points to a BRUSHOBJ which defined the pattern and colors to fill with + pptlBrushOrg - Specifies the origin of the halftone brush + mix - Defines the foreground and background raster operations to use for + the brush + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE(L"OEMPaint entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + if (pOemPDEV->bPreAnalysis) + { + VERBOSE(TEXT("OEMPaint: Begin pre-analysis...\r\n")); + + // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass. + // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might + // differ from the surface passed in during the rendering pass. + + // Dump the bounds of the clip window available for pre-analysis. + DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco); + + // Although unidrv calls the hooked drawing functions, it will return before any drawing is done. + // So we should not perform any drawing on the surface. But all other pre-analysis tasks should + // be performed here. For example, certain printers need to handle black objects differently if + // they intersect with any color objects versus being stand alone. Another task could be to halftone + // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page. + + // During the pre-analysis pass, drawing functions should not call back into Unidrv. + // So we return here. + VERBOSE(TEXT("OEMPaint: End pre-analysis...\r\n")); + + return TRUE; + } + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvPaint)(pso, + pco, + pbo, + pptlBrushOrg, + mix); +} + +BOOL APIENTRY +OEMRealizeBrush( + BRUSHOBJ *pbo, + SURFOBJ *psoTarget, + SURFOBJ *psoPattern, + SURFOBJ *psoMask, + XLATEOBJ *pxlo, + ULONG iHatch + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvRealizeBrush. + + DrvRealizeBrush requests that the driver realize a specified brush + for a specified surface. To realize a brush, the driver converts a + GDI brush into a form that can be used internally. A realized brush + contains device-specific information needed by the device to + accelerate drawing using the brush. The driver's realization of a brush + is written into the buffer allocated by a call to BRUSHOBJ_pvAllocRBrush. + + Please refer to DDK documentation for more details. + +Arguments: + + pbo - BRUSHOBJ to be realized + psoTarget - Defines the surface for which the brush is to be realized + psoPattern - Defines the pattern for the brush + psoMask - Transparency mask for the brush + pxlo - Defines the interpretration of colors in the pattern + iHatch - Specifies whether psoPattern is one of the hatch brushes + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE(L"OEMRealizeBrush entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)psoTarget->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvRealizeBrush)(pbo, + psoTarget, + psoPattern, + psoMask, + pxlo, + iHatch); +} + +BOOL APIENTRY +OEMStrokePath( + SURFOBJ *pso, + PATHOBJ *ppo, + CLIPOBJ *pco, + XFORMOBJ *pxo, + BRUSHOBJ *pbo, + POINTL *pptlBrushOrg, + LINEATTRS *plineattrs, + MIX mix + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvStrokePath. + + DrvStrokePath strokes a path when called by GDI. + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Identifies the surface on which to draw + ppo - Defines the path to be stroked + pco - Defines the clipping path + pxo - Specifies the world to device coordinate transformation + pbo - Specifies the brush to be used when drawing the path + pptlBrushOrg - Defines the brush origin + plineattrs - Defines the line attributes + mix - Specifies how to combine the brush with the destination + +Return Value: + + TRUE if successful + FALSE if driver cannot handle the path + DDI_ERROR if there is an error + +--*/ + +{ + VERBOSE(L"OEMStrokePath entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + if (pOemPDEV->bPreAnalysis) + { + VERBOSE(TEXT("OEMStrokePath: Begin pre-analysis...\r\n")); + + // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass. + // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might + // differ from the surface passed in during the rendering pass. + + // Dump the bounds of the clip window available for pre-analysis. + DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco); + + // Although unidrv calls the hooked drawing functions, it will return before any drawing is done. + // So we should not perform any drawing on the surface. But all other pre-analysis tasks should + // be performed here. For example, certain printers need to handle black objects differently if + // they intersect with any color objects versus being stand alone. Another task could be to halftone + // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page. + + // During the pre-analysis pass, drawing functions should not call back into Unidrv. + // So we return here. + VERBOSE(TEXT("OEMStrokePath: End pre-analysis...\r\n")); + + return TRUE; + } + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvStrokePath)(pso, + ppo, + pco, + pxo, + pbo, + pptlBrushOrg, + plineattrs, + mix); +} + +BOOL APIENTRY +OEMFillPath( + SURFOBJ *pso, + PATHOBJ *ppo, + CLIPOBJ *pco, + BRUSHOBJ *pbo, + POINTL *pptlBrushOrg, + MIX mix, + FLONG flOptions + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvFillPath. + + DrvFillPath is an optional entry point to handle the filling of closed paths. + GDI can call DrvFillPath to fill a path on a device-managed surface. + When deciding whether to call this function, GDI compares the fill + requirements with the following flags in the flGraphicsCaps member of + the DEVINFO structure: GCAPS_BEZIERS, GCAPS_ALTERNATEFILL, + and GCAPS_WINDINGFILL. + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Defines the surface on which to draw. + ppo - Defines the path to be filled + pco - Defines the clipping path + pbo - Defines the pattern and colors to fill with + pptlBrushOrg - Defines the brush origin + mix - Defines the foreground and background ROPs to use for the brush + flOptions - Whether to use zero-winding or odd-even rule + +Return Value: + + TRUE if successful + FALSE if driver cannot handle the path + DDI_ERROR if there is an error + +--*/ + +{ + VERBOSE(L"OEMFillPath entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + if (pOemPDEV->bPreAnalysis) + { + VERBOSE(TEXT("OEMFillPath: Begin pre-analysis...\r\n")); + + // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass. + // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might + // differ from the surface passed in during the rendering pass. + + // Dump the bounds of the clip window available for pre-analysis. + DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco); + + // Although unidrv calls the hooked drawing functions, it will return before any drawing is done. + // So we should not perform any drawing on the surface. But all other pre-analysis tasks should + // be performed here. For example, certain printers need to handle black objects differently if + // they intersect with any color objects versus being stand alone. Another task could be to halftone + // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page. + + // During the pre-analysis pass, drawing functions should not call back into Unidrv. + // So we return here. + VERBOSE(TEXT("OEMFillPath: End pre-analysis...\r\n")); + + return TRUE; + } + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvFillPath)(pso, + ppo, + pco, + pbo, + pptlBrushOrg, + mix, + flOptions); +} + +BOOL APIENTRY +OEMStrokeAndFillPath( + SURFOBJ *pso, + PATHOBJ *ppo, + CLIPOBJ *pco, + XFORMOBJ *pxo, + BRUSHOBJ *pboStroke, + LINEATTRS *plineattrs, + BRUSHOBJ *pboFill, + POINTL *pptlBrushOrg, + MIX mixFill, + FLONG flOptions + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvStrokeAndFillPath. + + DrvStrokeAndFillPath strokes and fills a path concurrently. + The driver can return FALSE if the path or the clipping is too + complex for the device to handle; in that case, GDI converts + to a simpler call. For example, if the device driver has set the + GCAPS_BEZIERS flag in the flGraphicsCaps member of the + DEVINFO structure and then receives a path with Bezier curves, + it can return FALSE; GDI will then convert the Bezier curves to + lines and call DrvStrokeAndFillPath again. If the device driver + returns FALSE again, GDI will further simplify the call, making + calls to DrvStrokePath and DrvFillPath, or to DrvBitBlt, depending + on the mix and width of the lines making up the path. + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Describes the surface on which to draw + ppo - Describes the path to be filled + pco - Defines the clipping path + pxo - Specifies the world to device coordinate transformation + pboStroke - Specifies the brush to use when stroking the path + plineattrs - Specifies the line attributes + pboFill - Specifies the brush to use when filling the path + pptlBrushOrg - Specifies the brush origin for both brushes + mixFill - Specifies the foreground and background ROPs to use + for the fill brush + flOptions - Whether to use zero-winding or odd-even rule + +Return Value: + + TRUE if successful + FALSE if driver cannot handle the path + DDI_ERROR if there is an error + +--*/ + +{ + VERBOSE(L"OEMStrokeAndFillPath entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + if (pOemPDEV->bPreAnalysis) + { + VERBOSE(TEXT("OEMStrokeAndFillPath: Begin pre-analysis...\r\n")); + + // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass. + // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might + // differ from the surface passed in during the rendering pass. + + // Dump the bounds of the clip window available for pre-analysis. + DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco); + + // Although unidrv calls the hooked drawing functions, it will return before any drawing is done. + // So we should not perform any drawing on the surface. But all other pre-analysis tasks should + // be performed here. For example, certain printers need to handle black objects differently if + // they intersect with any color objects versus being stand alone. Another task could be to halftone + // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page. + + // During the pre-analysis pass, drawing functions should not call back into Unidrv. + // So we return here. + VERBOSE(TEXT("OEMStrokeAndFillPath: End pre-analysis...\r\n")); + + return TRUE; + } + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvStrokeAndFillPath)(pso, + ppo, + pco, + pxo, + pboStroke, + plineattrs, + pboFill, + pptlBrushOrg, + mixFill, + flOptions); +} + +BOOL APIENTRY +OEMLineTo( + SURFOBJ *pso, + CLIPOBJ *pco, + BRUSHOBJ *pbo, + LONG x1, + LONG y1, + LONG x2, + LONG y2, + RECTL *prclBounds, + MIX mix + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvLineTo. + + DrvLineTo draws a single, solid, integer-only cosmetic line. + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Describes the surface on which to draw + pco - Defines the clipping path + pbo - Defines the brush used to draw the line + x1,y1 - Specifies the line's starting point + x2,y2 - Specifies the line's ending point + prclBounds - Defines a rectangle that bounds the unclipped line. + mix - Specifies the foreground and background ROP + +Return Value: + + TRUE if successful + FALSE if driver cannot handle the path + DDI_ERROR if there is an error + +--*/ + +{ + VERBOSE(L"OEMLineTo entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + if (pOemPDEV->bPreAnalysis) + { + VERBOSE(TEXT("OEMLineTo: Begin pre-analysis...\r\n")); + + // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass. + // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might + // differ from the surface passed in during the rendering pass. + + // Dump the bounds of the clip window available for pre-analysis. + DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco); + + // Although unidrv calls the hooked drawing functions, it will return before any drawing is done. + // So we should not perform any drawing on the surface. But all other pre-analysis tasks should + // be performed here. For example, certain printers need to handle black objects differently if + // they intersect with any color objects versus being stand alone. Another task could be to halftone + // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page. + + // During the pre-analysis pass, drawing functions should not call back into Unidrv. + // So we return here. + VERBOSE(TEXT("OEMLineTo: End pre-analysis...\r\n")); + + return TRUE; + } + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvLineTo)(pso, + pco, + pbo, + x1, + y1, + x2, + y2, + prclBounds, + mix); +} + +BOOL APIENTRY +OEMAlphaBlend( + SURFOBJ *psoDest, + SURFOBJ *psoSrc, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + RECTL *prclDest, + RECTL *prclSrc, + BLENDOBJ *pBlendObj + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvAlphaBlend. + + DrvAlphaBlend provides bit-block transfer capabilities with alpha blending. + + Please refer to DDK documentation for more details. + +Arguments: + + psoDest - Defines the surface on which to draw + psoSrc - Defines the source + pco - Limits the area to be modified on the Destination + pxlo - Specifies how color dwIndexes are to be translated + between the source and target surfaces + prclDest - Defines the area to be modified on the Destination surface + prclSrc - Defines the area to be copied from the source surface + BlendFunction - Specifies the blend function to be used + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE(L"OEMAlphaBlend entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)psoDest->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + if (pOemPDEV->bPreAnalysis) + { + VERBOSE(TEXT("OEMAlphaBlend: Begin pre-analysis...\r\n")); + + // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass. + // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might + // differ from the surface passed in during the rendering pass. + + // Dump the bounds of the clip window available for pre-analysis. + DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco); + + // Although unidrv calls the hooked drawing functions, it will return before any drawing is done. + // So we should not perform any drawing on the surface. But all other pre-analysis tasks should + // be performed here. For example, certain printers need to handle black objects differently if + // they intersect with any color objects versus being stand alone. Another task could be to halftone + // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page. + + // During the pre-analysis pass, drawing functions should not call back into Unidrv. + // So we return here. + VERBOSE(TEXT("OEMAlphaBlend: End pre-analysis...\r\n")); + + return TRUE; + } + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvAlphaBlend)(psoDest, + psoSrc, + pco, + pxlo, + prclDest, + prclSrc, + pBlendObj); +} + +BOOL APIENTRY +OEMGradientFill( + SURFOBJ *psoDest, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + TRIVERTEX *pVertex, + ULONG nVertex, + PVOID pMesh, + ULONG nMesh, + RECTL *prclExtents, + POINTL *pptlDitherOrg, + ULONG ulMode + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvGradientFill. + + DrvGradientFill shades the specified primitives. + + Please refer to DDK documentation for more details. + +Arguments: + + psoDest - Defines the surface on which to draw + pco - Limits the area to be modified on the Destination + pxlo - Should be ignored by the driver + pVertex - Pointer to an array of TRIVERTEX structures, + with each entry containing position and color information + nVertex - Specifies the number of TRIVERTEX structures in the + array to which pVertex points + pMesh - Pointer to an array of structures that define the connectivity + of the TRIVERTEX elements to which pVertex points + nMesh - Specifies the number of elements in the array to which + pMesh points + prclExtents - Pointer to a RECTL structure that defines the area in + which the gradient drawing is to occur + pptlDitherOrg - Pointer to a POINTL structure that defines the origin + on the surface for dithering + ulMode - Specifies the current drawing mode and how to interpret + the array to which pMesh points + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE(L"OEMGradientFill entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)psoDest->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + if (pOemPDEV->bPreAnalysis) + { + VERBOSE(TEXT("OEMGradientFill: Begin pre-analysis...\r\n")); + + // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass. + // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might + // differ from the surface passed in during the rendering pass. + + // Dump the bounds of the clip window available for pre-analysis. + DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco); + + // Although unidrv calls the hooked drawing functions, it will return before any drawing is done. + // So we should not perform any drawing on the surface. But all other pre-analysis tasks should + // be performed here. For example, certain printers need to handle black objects differently if + // they intersect with any color objects versus being stand alone. Another task could be to halftone + // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page. + + // During the pre-analysis pass, drawing functions should not call back into Unidrv. + // So we return here. + VERBOSE(TEXT("OEMGradientFill: End pre-analysis...\r\n")); + + return TRUE; + } + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvGradientFill)(psoDest, + pco, + pxlo, + pVertex, + nVertex, + pMesh, + nMesh, + prclExtents, + pptlDitherOrg, + ulMode); +} + +BOOL APIENTRY +OEMTransparentBlt( + SURFOBJ *psoDst, + SURFOBJ *psoSrc, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + RECTL *prclDst, + RECTL *prclSrc, + ULONG iTransColor, + ULONG ulReserved + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvTransparentBlt. + + DrvTransparentBlt provides bit-block transfer capabilities with + transparency. + + Please refer to DDK documentation for more details. + +Arguments: + + psoDst - Defines the surface on which to draw + psoSrc - Defines the source + pco - Limits the area to be modified on the Destination + pxlo - Specifies how color dwIndexes are to be translated + between the source and target surfaces + prclDst - Defines the area to be modified on the Destination surface + prclSrc - Defines the area to be copied from the source surface + iTransColor - Specifies the transparent color + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE(L"OEMTransparentBlt entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)psoDst->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + if (pOemPDEV->bPreAnalysis) + { + VERBOSE(TEXT("OEMTransparentBlt: Begin pre-analysis...\r\n")); + + // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass. + // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might + // differ from the surface passed in during the rendering pass. + + // Dump the bounds of the clip window available for pre-analysis. + DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco); + + // Although unidrv calls the hooked drawing functions, it will return before any drawing is done. + // So we should not perform any drawing on the surface. But all other pre-analysis tasks should + // be performed here. For example, certain printers need to handle black objects differently if + // they intersect with any color objects versus being stand alone. Another task could be to halftone + // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page. + + // During the pre-analysis pass, drawing functions should not call back into Unidrv. + // So we return here. + VERBOSE(TEXT("OEMTransparentBlt: End pre-analysis...\r\n")); + + return TRUE; + } + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvTransparentBlt)(psoDst, + psoSrc, + pco, + pxlo, + prclDst, + prclSrc, + iTransColor, + ulReserved); +} + +BOOL APIENTRY +OEMTextOut( + SURFOBJ *pso, + STROBJ *pstro, + FONTOBJ *pfo, + CLIPOBJ *pco, + RECTL *prclExtra, + RECTL *prclOpaque, + BRUSHOBJ *pboFore, + BRUSHOBJ *pboOpaque, + POINTL *pptlOrg, + MIX mix + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvTextOut. + + DrvTextOut is the entry point from GDI that calls for the + driver to render a set of glyphs at specified positions. + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Defines the surface on which to be written. + pstro - Defines the glyphs to be rendered and their positions + pfo - Specifies the font to be used + pco - Defines the clipping path + prclExtra - A NULL-terminated array of rectangles to be filled + prclOpaque - Specifies an opaque rectangle + pboFore - Defines the foreground brush + pboOpaque - Defines the opaque brush + pptlOrg - Pointer to POINT struct , defining th origin + mix - Specifies the foreground and background ROPs for pboFore + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE(L"OEMTextOut entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + DBG_SURFOBJ(DBG_VERBOSE, L"pso", pso); + DBG_STROBJ(DBG_VERBOSE, L"pstro", pstro); + DBG_FONTOBJ(DBG_VERBOSE, L"pfo", pfo); + DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco); + DBG_BRUSHOBJ(DBG_VERBOSE, L"pboFore", pboFore); + DBG_BRUSHOBJ(DBG_VERBOSE, L"pboOpaque", pboOpaque); + + if (pOemPDEV->bPreAnalysis) + { + VERBOSE(TEXT("OEMTextOut: Begin pre-analysis...\r\n")); + + // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass. + // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might + // differ from the surface passed in during the rendering pass. + + // Dump the bounds of the clip window available for pre-analysis. + DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco); + + // Although unidrv calls the hooked drawing functions, it will return before any drawing is done. + // So we should not perform any drawing on the surface. But all other pre-analysis tasks should + // be performed here. For example, certain printers need to handle black objects differently if + // they intersect with any color objects versus being stand alone. Another task could be to halftone + // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page. + + // During the pre-analysis pass, drawing functions should not call back into Unidrv. + // So we return here. + VERBOSE(TEXT("OEMTextOut: End pre-analysis...\r\n")); + + return TRUE; + } + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvTextOut)(pso, + pstro, + pfo, + pco, + prclExtra, + prclOpaque, + pboFore, + pboOpaque, + pptlOrg, + mix); +} + +PIFIMETRICS APIENTRY +OEMQueryFont( + DHPDEV dhpdev, + ULONG_PTR iFile, + ULONG iFace, + ULONG_PTR *pid + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvQueryFont. + + DrvQueryFont is used by GDI to get the IFIMETRICS structure + for a given font. + + Please refer to DDK documentation for more details. + +Arguments: + + dhpdev - Driver device handle + iFile - Identifies the driver font file + iFace - One-based index of the driver font + pid - Points to a LONG variable for returning an identifier + which GDI will pass to DrvFree + +Return Value: + + Pointer to an IFIMETRICS structure for the given font. + NULL if there is an error + +--*/ + +{ + VERBOSE(L"OEMQueryFont entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvQueryFont)(dhpdev, + iFile, + iFace, + pid); +} + +PVOID APIENTRY +OEMQueryFontTree( + DHPDEV dhpdev, + ULONG_PTR iFile, + ULONG iFace, + ULONG iMode, + ULONG_PTR *pid + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvQueryFontTree. + + DrvQueryFontTree provides GDI with a pointer to a structure that + defines one of the following: + - A mapping from Unicode to glyph handles, including glyph variants + - A mapping of kerning pairs to kerning handles + + Please refer to DDK documentation for more details. + +Arguments: + + dhpdev - Driver device handle + iFile - Identifies the driver font file + iFace - One-based index of the driver font + iMode - Specifies the type of information to be provided + pid - Points to a LONG variable for returning an identifier + which GDI will pass to DrvFree + +Return Value: + + Pointer to the structure requested based on iMode. + NULL if there is an error + +--*/ + +{ + VERBOSE(L"OEMQueryFontTree entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvQueryFontTree)(dhpdev, + iFile, + iFace, + iMode, + pid); +} + +LONG APIENTRY +OEMQueryFontData( + DHPDEV dhpdev, + FONTOBJ *pfo, + ULONG iMode, + HGLYPH hg, + GLYPHDATA *pgd, + _Out_writes_bytes_(cjSize) PVOID pv, + ULONG cjSize + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvQueryFontData. + + DrvQueryFontData retrieves information about a realized font. + GDI provides a pointer to an array of glyph or kerning handles, + and the driver returns information about the glyphs or kerning + pairs. The driver can assume that all handles in the array are valid. + + Please refer to DDK documentation for more details. + +Arguments: + + dhpdev - Driver device handle + pfo - Points to a FONTOBJ structure + iMode - Type of information requested + hg - A glyph handle + pgd - Points to a GLYPHDATA structure + pv - Points to output buffer + cjSize - Size of output buffer + +Return Value: + + Depends on iMode. FD_ERROR if there is an error + +--*/ + +{ + VERBOSE(L"OEMQueryFontData entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvQueryFontData)(dhpdev, + pfo, + iMode, + hg, + pgd, + pv, + cjSize); +} + +ULONG APIENTRY +OEMFontManagement( + SURFOBJ *pso, + FONTOBJ *pfo, + ULONG iMode, + ULONG cjIn, + _In_reads_bytes_(cjIn) PVOID pvIn, + ULONG cjOut, + _Out_writes_bytes_(cjOut) PVOID pvOut + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvFontManagement. + + Is this function valid for Unidrv drivers? + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Points to a SURFOBJ structure + pfo - Points to a FONTOBJ structure + iMode - Escape number + cjIn - Size of input buffer + pvIn - Points to input buffer + cjOut - Size of output buffer + pvOut - Points to output buffer + +Return Value: + + 0x00000001 to 0x7fffffff for success + 0x80000000 to 0xffffffff for failure + 0 if the specified escape number if not supported + +--*/ + +{ + VERBOSE(L"OEMFontManagement entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvFontManagement)(pso, + pfo, + iMode, + cjIn, + pvIn, + cjOut, + pvOut); +} + +BOOL APIENTRY +OEMQueryAdvanceWidths( + DHPDEV dhpdev, + FONTOBJ *pfo, + ULONG iMode, + _In_reads_(cGlyphs) HGLYPH *phg, + _Out_writes_bytes_(cGlyphs*sizeof(USHORT)) PVOID pvWidths, + ULONG cGlyphs + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvQueryAdvanceWidths. + + DrvQueryAdvanceWidths returns character advance widths + for a specified set of glyphs. + + Please refer to DDK documentation for more details. + +Arguments: + + dhpdev - Driver device handle + pfo - Points to a FONTOBJ structure + iMode - Type of information to be provided + phg - Points to an array of HGLYPHs for which the driver will + provide character advance widths + pvWidths - Points to a buffer for returning width data + cGlyphs - Number of glyphs in the phg array + +Return Value: + + Depends on iMode + +--*/ + +{ + VERBOSE(L"OEMQueryAdvanceWidths entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvQueryAdvanceWidths)(dhpdev, + pfo, + iMode, + phg, + pvWidths, + cGlyphs); +} + +ULONG APIENTRY +OEMGetGlyphMode( + DHPDEV dhpdev, + FONTOBJ *pfo + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvGetGlyphMode. + + DrvGetGlyphMode tells GDI how to cache glyph information. + GDI calls a driver's DrvGetGlyphMode routine to determine the + range of font information that should be cached for a particular + font; that is, DrvGetGlyphMode determines what GDI stores in + its font cache. A device that caches fonts on its own should return + FO_HGLYPHS to minimize the storage requirements for the font. + GDI calls DrvGetGlyphMode for each font realization. For example, + a driver might want to download outlines for point sizes larger than + 12 point, but raster images for smaller fonts. However, GDI reserves + the right to refuse this request. + + Please refer to DDK documentation for more details. + +Arguments: + + dhpdev - Driver device handle + pfo - Points to a FONTOBJ structure + +Return Value: + + The glyph mode or FO_GLYPHMODE, which is the default. + +--*/ + +{ + VERBOSE(L"OEMGetGlyphMode entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvGetGlyphMode)(dhpdev, + pfo); +} + +BOOL APIENTRY +OEMStartDoc( + SURFOBJ *pso, + _In_ PWSTR pwszDocName, + DWORD dwJobId + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvStartDoc. + + DrvStartDoc is called by GDI when it is ready to + start sending a document to the driver for rendering. + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Defines the surface object + pDocName - Specifies a Unicode document name + jobId - Identifies the print job + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE(L"OEMStartDoc entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvStartDoc)(pso, + pwszDocName, + dwJobId); +} + +BOOL APIENTRY +OEMEndDoc( + SURFOBJ *pso, + FLONG fl + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvEndDoc. + + DrvEndDoc is called by GDI when it has finished + sending a document to the driver for rendering. + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Defines the surface object + flags - A set of flag bits + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE(L"OEMEndDoc entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvEndDoc)(pso, + fl); +} + +BOOL APIENTRY +OEMStartPage( + SURFOBJ *pso + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvStartPage. + + DrvStartPage is called by GDI when it is ready to + start sending the contents of a physical page to the + driver for rendering. + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Defines the surface object + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE(L"OEMStartPage entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvStartPage)(pso); +} + +BOOL APIENTRY +OEMSendPage( + SURFOBJ *pso + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvSendPage. + + DrvSendPage is called by GDI when it has finished + drawing a physical page, so the driver can send + the page to the printer. + + Please refer to DDK documentation for more details. + + NOTE: OEMSendPage will not be called in any driver that enables + pre-analysis. But the reason we implement this is that the driver + might be pushed to a down-level client and thereby have to run + without pre-analysis support. In this case, it might have to support + OEMSendPage. + +Arguments: + + pso - Defines the surface object + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE(L"OEMSendPage entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvSendPage)(pso); +} + +BOOL APIENTRY +OEMStartBanding( + SURFOBJ *pso, + POINTL *pptl + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvStartBanding. + + DrvStartBanding is called by GDI when it is ready to start + sending bands of a physical page to the driver for rendering. + Note: DrvStartBanding is called to prepare the driver + for banding, call only once per page (not at everyband!!) + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Defines the surface object + pptl - Pointer to origin of next band (to return to GDI) + +Return Value: + + Fill out pptl to contain the origin of the first band + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE(L"OEMStartBanding entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + DBG_POINTL(DBG_VERBOSE, L"pptl", pptl); + + if (pptl == NULL) + { + VERBOSE(TEXT("OEMStartBanding: Start of OEM Pre-analysis pass...\r\n")); + VERBOSE(TEXT("\tOEM Pre-analysis pass...no drawing on surface in this pass.\r\n")); + pOemPDEV->bPreAnalysis = TRUE; + } + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvStartBanding)(pso, + pptl); +} + +BOOL APIENTRY +OEMNextBand( + SURFOBJ *pso, + POINTL *pptl + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvNextBand. + + DrvNextBand is called by GDI when it has finished + drawing a band for a physical page, so the driver + can send the band to the printer. + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Defines the surface object + pptl - Pointer to origin of next band (to return to GDI) + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE(L"OEMNextBand entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + DBG_POINTL(DBG_VERBOSE, L"pptl", pptl); + + if (pOemPDEV->bPreAnalysis) + { + // + // First call into OEMNextBand indicates end of pre-analysis path. + // + VERBOSE(TEXT("OEMNextBand: End of OEM Pre-analysis pass...\r\n")); + pOemPDEV->bPreAnalysis = FALSE; + } + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvNextBand)(pso, + pptl); +} + +ULONG APIENTRY +OEMEscape( + SURFOBJ *pso, + ULONG iEsc, + ULONG cjIn, + _In_reads_bytes_(cjIn) PVOID pvIn, + ULONG cjOut, + _Out_writes_bytes_(cjOut) PVOID pvOut + ) + +/*++ + +Routine Description: + + Implementation of DDI entry point DrvEscape. + + DrvEscape is used for retrieving information from a device + that is not available in a device-independent device driver + interface; the particular query depends on the value of the + iEsc parameter. + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Describes the surface the call is directed to + iEsc - Specifies a query + cjIn - Specifies the size in bytes of the buffer pointed to by pvIn + pvIn - Points to input data buffer + cjOut - Specifies the size in bytes of the buffer pointed to by pvOut + pvOut - Points to the output buffer + +Return Value: + + Depends on the query specified by iEsc parameter. + + Zero if the function specified by the query is not supported. + +--*/ + +{ + VERBOSE(L"OEMEscape entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvEscape)(pso, + iEsc, + cjIn, + pvIn, + cjOut, + pvOut); +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemprean/debug.cpp b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/debug.cpp new file mode 100644 index 00000000..f1807066 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/debug.cpp @@ -0,0 +1,1503 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1996 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Debug.cpp +// +// PURPOSE: Implementation of the debug functions. +// +// +// History: +// 06/28/03 xxx created. +// +// + +#include "precomp.h" +#include "debug.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +//////////////////////////////////////////////////////// +// INTERNAL DEFINES +//////////////////////////////////////////////////////// + +#define DEBUG_BUFFER_SIZE 1024 +#define PATH_SEPARATOR '\\' + +//////////////////////////////////////////////////////// +// EXTERNAL GLOBALS +//////////////////////////////////////////////////////// + +#ifdef DBG + +INT giDebugLevel = DEBUG_LEVEL; + + +PCWSTR +EnsureLabel( + _In_opt_ PCWSTR pszInLabel, + _In_ PCWSTR pszDefLabel + ) + +/*++ + +Routine Description: + + This function checks if pszInLabel is valid. If not, it returns + pszDefLabel else pszInLabel is returned. + +Arguments: + + pszInLabel - custom label string passed in with the call to the dump function + pszDefLabel - default label string in case custom label string is not valid + +Return Value: + + pszInLabel if it is valid, else pszDefLabel + +--*/ + +{ + // By design, pszDefLabel is assumed to be a valid, non-empty + // string (since it is supplied internally). + // + if (!pszInLabel || !*pszInLabel) + { + // The caller supplied a NULL string or empty string; + // supply the internal default. + // + return pszDefLabel; + } + + return pszInLabel; +} + +BOOL OEMDebugMessage( + LPCWSTR lpszMessage, + ... + ) + +/*++ + +Routine Description: + + Outputs variable argument debug string. + +Arguments: + + dwSize - size of temp buffer to hold formatted string + lpszMessage - format string + arglist - Variable argument list... + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + va_list VAList; + HRESULT hResult; + + // Parameter checking. + if( NULL == lpszMessage) + { + return FALSE; + } + + LPWSTR lpszMsgBuf = new WCHAR[DEBUG_BUFFER_SIZE]; + if(NULL == lpszMsgBuf) + return FALSE; + + va_start(VAList, lpszMessage); + // Pass the variable parameters to wvsprintf to be formatted. + hResult = StringCchVPrintfW(lpszMsgBuf, DEBUG_BUFFER_SIZE, lpszMessage, VAList); + va_end(VAList); + + // Dump string to debug output. + OutputDebugStringW(lpszMsgBuf); + + // Clean up. + delete[] lpszMsgBuf; + + return SUCCEEDED(hResult); +} + +PCSTR +StripDirPrefixA( + IN PCSTR pstrFilename + ) + +/*++ + +Routine Description: + + Strip the directory prefix off a filename (ANSI version) + +Arguments: + + pstrFilename - Pointer to filename string + +Return Value: + + Pointer to the last component of a filename (without directory prefix) + +--*/ + +{ + PCSTR pstr; + + pstr = strrchr(pstrFilename, PATH_SEPARATOR); + if (pstr) + return pstr + 1; + + return pstrFilename; +} + +void +vDumpFlags( + DWORD dwFlags, + PDBG_FLAGS pDebugFlags + ) + +/*++ + +Routine Description: + + Dumps the combination of flags in members such as + pso->fjBitmap, pstro->flAccel, pfo->flFontType etc. + +Arguments: + + dwFlags - combined value of the relevant member + Example values are pso->fjBitmap, pstro->flAccel + pDebugFlags - structure containing the different possible values + that can be combined in dwFlags + +Return Value: + + NONE + +--*/ + +{ + DWORD dwFound = 0; + BOOL bFirstFlag = FALSE; + + OEMDebugMessage(L"%#x [", dwFlags); + + // Traverse through the list of flags to see if any match + // + for ( ; pDebugFlags->dwFlag; ++pDebugFlags) + { + if(dwFlags & pDebugFlags->dwFlag) + { + if (!bFirstFlag) + { + OEMDebugMessage(L"%s", pDebugFlags->pszFlag); + bFirstFlag = TRUE; + } + else + { + OEMDebugMessage(L" | %s", pDebugFlags->pszFlag); + } + dwFound |= pDebugFlags->dwFlag; + } + } + + OEMDebugMessage(L"]"); + + // + // Check if there are extra bits set that we don't understand. + // + if(dwFound != dwFlags) + { + OEMDebugMessage(L" <ExtraBits: %x>", dwFlags & ~dwFound); + } + + OEMDebugMessage(L"\r\n"); +} + +void +vDumpOemDMParam( + INT iDebugLevel, + _In_ PWSTR pszInLabel, + POEMDMPARAM pOemDMParam + ) + +/*++ + +Routine Description: + + Dumps the members of a OEMDMPARAM structure. + +Arguments: + + iDebugLevel - desired output debug level + pszInLabel - output label string + pOemDMParam - pointer to the OEMDMPARAM strct to be dumped + +Return Value: + + NONE + +--*/ + +{ + // Check if the debug level is appropriate + // + if (iDebugLevel < giDebugLevel) + { + // Nothing to output here + // + return; + } + + // Prepare the label string + // + PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pOemDMParam"); + + // Return if strct to be dumped is invalid + // + if (!pOemDMParam) + { + OEMDebugMessage(L"\npOemDMParam [%s]: NULL\r\n", pszLabel); + + // Nothing else to output + // + return; + } + + // Format the data + // + OEMDebugMessage(L"\npOemDMParam [%s]: %#x\r\n", pszLabel, pOemDMParam); + OEMDebugMessage(L"\tcbSize = %d\r\n", pOemDMParam->cbSize); + OEMDebugMessage(L"\tpdriverobj = %#x\r\n", pOemDMParam->pdriverobj); + OEMDebugMessage(L"\thPrinter = %#x\r\n", pOemDMParam->hPrinter); + OEMDebugMessage(L"\thModule = %#x\r\n", pOemDMParam->hModule); + OEMDebugMessage(L"\tpPublicDMIn = %#x\r\n", pOemDMParam->pPublicDMIn); + OEMDebugMessage(L"\tpPublicDMOut = %#x\r\n", pOemDMParam->pPublicDMOut); + OEMDebugMessage(L"\tpOEMDMIn = %#x\r\n", pOemDMParam->pOEMDMIn); + OEMDebugMessage(L"\tpOEMDMOut = %#x\r\n", pOemDMParam->pOEMDMOut); + OEMDebugMessage(L"\tcbBufSize = %d\r\n", pOemDMParam->cbBufSize); + + OEMDebugMessage(L"\n"); + +} + +#if DBG + DBG_FLAGS gafdSURFOBJ_fjBitmap[] = { + { L"BMF_TOPDOWN", BMF_TOPDOWN}, + { L"BMF_NOZEROINIT", BMF_NOZEROINIT}, + { L"BMF_DONTCACHE", BMF_DONTCACHE}, + { L"BMF_USERMEM", BMF_USERMEM}, + { L"BMF_KMSECTION", BMF_KMSECTION}, + { L"BMF_NOTSYSMEM", BMF_NOTSYSMEM}, + { L"BMF_WINDOW_BLT", BMF_WINDOW_BLT}, + {NULL, 0} // The NULL entry is important +// { L"BMF_UMPDMEM", BMF_UMPDMEM}, +// { L"BMF_RESERVED", BMF_RESERVED}, + }; +#else + DBG_FLAGS gafdSURFOBJ_fjBitmap[] = { + {NULL, 0} + }; +#endif + +void +vDumpSURFOBJ( + INT iDebugLevel, + _In_ PWSTR pszInLabel, + SURFOBJ *pso + ) + +/*++ + +Routine Description: + + Dumps the members of a SURFOBJ structure. + +Arguments: + + iDebugLevel - desired output debug level + pszInLabel - output label string + pso - pointer to the SURFOBJ strct to be dumped + +Return Value: + + NONE + +--*/ + +{ + // Check if the debug level is appropriate + // + if (iDebugLevel < giDebugLevel) + { + // Nothing to output here + // + return; + } + + // Prepare the label string + // + PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pso"); + + // Return if strct to be dumped is invalid + // + if (!pso) + { + OEMDebugMessage(L"\nSURFOBJ [%s]: NULL\r\n", pszLabel); + + // Nothing else to output + // + return; + } + + // Format the data + // + OEMDebugMessage(L"\nSURFOBJ [%s]: %#x\r\n", pszLabel, pso); + OEMDebugMessage(L"\tdhSurf: %#x\r\n", pso->dhsurf); + OEMDebugMessage(L"\thSurf: %#x\r\n", pso->hsurf); + OEMDebugMessage(L"\tdhpdev: %#x\r\n", pso->dhpdev); + OEMDebugMessage(L"\thdev: %#x\r\n", pso->hdev); + OEMDebugMessage(L"\tsizlBitmap: [%ld x %ld]\r\n", pso->sizlBitmap.cx, pso->sizlBitmap.cy); + OEMDebugMessage(L"\tcjBits: %ld\r\n", pso->cjBits); + OEMDebugMessage(L"\tpvBits: %#x\r\n", pso->pvBits); + OEMDebugMessage(L"\tpvScan0: %#x\r\n", pso->pvScan0); + OEMDebugMessage(L"\tlDelta: %ld\r\n", pso->lDelta); + OEMDebugMessage(L"\tiUniq: %ld\r\n", pso->iUniq); + + PWSTR psziBitmapFormat = L"0"; + switch (pso->iBitmapFormat) + { + case BMF_1BPP : psziBitmapFormat = L"BMF_1BPP" ; break; + case BMF_4BPP : psziBitmapFormat = L"BMF_4BPP" ; break; + case BMF_8BPP : psziBitmapFormat = L"BMF_8BPP" ; break; + case BMF_16BPP: psziBitmapFormat = L"BMF_16BPP"; break; + case BMF_24BPP: psziBitmapFormat = L"BMF_24BPP"; break; + case BMF_32BPP: psziBitmapFormat = L"BMF_32BPP"; break; + case BMF_4RLE : psziBitmapFormat = L"BMF_4RLE" ; break; + case BMF_8RLE : psziBitmapFormat = L"BMF_8RLE" ; break; + case BMF_JPEG : psziBitmapFormat = L"BMF_JPEG" ; break; + case BMF_PNG : psziBitmapFormat = L"BMF_PNG " ; break; + } + OEMDebugMessage(L"\tiBitmapFormat: %s\r\n", psziBitmapFormat); + + PWSTR psziType = L"0"; + switch (pso->iType) + { + case STYPE_BITMAP : psziType = L"STYPE_BITMAP" ; break; + case STYPE_DEVBITMAP: psziType = L"STYPE_DEVBITMAP"; break; + case STYPE_DEVICE : psziType = L"STYPE_DEVICE" ; break; + } + OEMDebugMessage(L"\tiType: %s\r\n", psziType); + + OEMDebugMessage(L"\tfjBitmap: "); + if (STYPE_BITMAP == pso->iType) + vDumpFlags(pso->fjBitmap, gafdSURFOBJ_fjBitmap); + else + OEMDebugMessage(L"IGNORE\r\n"); + + OEMDebugMessage(L"\n"); + +} + +#if DBG + DBG_FLAGS gafdSTROBJ_flAccel[] = { + { L"SO_FLAG_DEFAULT_PLACEMENT", SO_FLAG_DEFAULT_PLACEMENT}, + { L"SO_HORIZONTAL", SO_HORIZONTAL}, + { L"SO_VERTICAL", SO_VERTICAL}, + { L"SO_REVERSED", SO_REVERSED}, + { L"SO_ZERO_BEARINGS", SO_ZERO_BEARINGS}, + { L"SO_CHAR_INC_EQUAL_BM_BASE", SO_CHAR_INC_EQUAL_BM_BASE}, + { L"SO_MAXEXT_EQUAL_BM_SIDE", SO_MAXEXT_EQUAL_BM_SIDE}, + { L"SO_DO_NOT_SUBSTITUTE_DEVICE_FONT", SO_DO_NOT_SUBSTITUTE_DEVICE_FONT}, + { L"SO_GLYPHINDEX_TEXTOUT", SO_GLYPHINDEX_TEXTOUT}, + { L"SO_ESC_NOT_ORIENT", SO_ESC_NOT_ORIENT}, + { L"SO_DXDY", SO_DXDY}, + { L"SO_CHARACTER_EXTRA", SO_CHARACTER_EXTRA}, + { L"SO_BREAK_EXTRA", SO_BREAK_EXTRA}, + {NULL, 0} // The NULL entry is important + }; +#else + DBG_FLAGS gafdSTROBJ_flAccel[] = { + {NULL, 0} + }; +#endif + +void +vDumpSTROBJ( + INT iDebugLevel, + _In_ PWSTR pszInLabel, + STROBJ *pstro + ) + +/*++ + +Routine Description: + + Dumps the members of a STROBJ structure. + +Arguments: + + iDebugLevel - desired output debug level + pszInLabel - output label string + pstro - pointer to the STROBJ strct to be dumped + +Return Value: + + NONE + +--*/ + +{ + // Check if the debug level is appropriate + // + if (iDebugLevel < giDebugLevel) + { + // Nothing to output here + // + return; + } + + // Prepare the label string + // + PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pstro"); + + // Return if strct to be dumped is invalid + // + if (!pstro) + { + OEMDebugMessage(L"\nSTROBJ [%s]: NULL\r\n", pszLabel); + + // Nothing else to output + // + return; + } + + // Format the data + // + OEMDebugMessage(L"\nSTROBJ [%s]: %#x\r\n", pszLabel, pstro); + OEMDebugMessage(L"\tcGlyphs: %ld\r\n", pstro->cGlyphs); + OEMDebugMessage(L"\tflAccel: "); + vDumpFlags(pstro->flAccel, gafdSTROBJ_flAccel); + OEMDebugMessage(L"\tulCharInc: %ld\r\n", pstro->ulCharInc); + OEMDebugMessage(L"\trclBkGround: (%ld, %ld) (%ld, %ld)\r\n", pstro->rclBkGround.left, pstro->rclBkGround.top, pstro->rclBkGround.right, pstro->rclBkGround.bottom); + if (!pstro->pgp) + OEMDebugMessage(L"\tpgp: NULL\r\n"); + else + OEMDebugMessage(L"\tpgp: %#x\r\n", pstro->pgp); + OEMDebugMessage(L"\tpwszOrg: \"%s\"\r\n", pstro->pwszOrg); + + OEMDebugMessage(L"\n"); + +} + +#if DBG + DBG_FLAGS gafdFONTOBJ_flFontType[] = { + { L"FO_TYPE_RASTER", FO_TYPE_RASTER}, + { L"FO_TYPE_DEVICE", FO_TYPE_DEVICE}, + { L"FO_TYPE_TRUETYPE", FO_TYPE_TRUETYPE}, + { L"FO_TYPE_OPENTYPE", 0x8}, + { L"FO_SIM_BOLD", FO_SIM_BOLD}, + { L"FO_SIM_ITALIC", FO_SIM_ITALIC}, + { L"FO_EM_HEIGHT", FO_EM_HEIGHT}, + { L"FO_GRAY16", FO_GRAY16}, + { L"FO_NOGRAY16", FO_NOGRAY16}, + { L"FO_CFF", FO_CFF}, + { L"FO_POSTSCRIPT", FO_POSTSCRIPT}, + { L"FO_MULTIPLEMASTER", FO_MULTIPLEMASTER}, + { L"FO_VERT_FACE", FO_VERT_FACE}, + { L"FO_DBCS_FONT", FO_DBCS_FONT}, + {NULL, 0} // The NULL entry is important + }; +#else + DBG_FLAGS gafdFONTOBJ_flFontType[] = { + {NULL, 0} + }; +#endif + +void +vDumpFONTOBJ( + INT iDebugLevel, + _In_ PWSTR pszInLabel, + FONTOBJ *pfo + ) + +/*++ + +Routine Description: + + Dumps the members of a FONTOBJ structure. + +Arguments: + + iDebugLevel - desired output debug level + pszInLabel - output label string + pfo - pointer to the FONTOBJ strct to be dumped + +Return Value: + + NONE + +--*/ + +{ + // Check if the debug level is appropriate + // + if (iDebugLevel < giDebugLevel) + { + // Nothing to output here + // + return; + } + + // Prepare the label string + // + PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pfo"); + + // Return if strct to be dumped is invalid + // + if (!pfo) + { + OEMDebugMessage(L"\nFONTOBJ [%s]: NULL\r\n", pszLabel); + + // Nothing else to output + // + return; + } + + // Format the data + // + OEMDebugMessage(L"\nFONTOBJ [%s]: %#x\r\n", pszLabel, pfo); + OEMDebugMessage(L"\tiUniq: %ld\r\n", pfo->iUniq); + OEMDebugMessage(L"\tiFace: %ld\r\n", pfo->iFace); + OEMDebugMessage(L"\tcxMax: %ld\r\n", pfo->cxMax); + OEMDebugMessage(L"\tflFontType: "); + vDumpFlags(pfo->flFontType, gafdFONTOBJ_flFontType); + OEMDebugMessage(L"\tiTTUniq: %#x\r\n", pfo->iTTUniq); + OEMDebugMessage(L"\tiFile: %#x\r\n", pfo->iFile); + OEMDebugMessage(L"\tsizLogResPpi: [%ld x %ld]\r\n", pfo->sizLogResPpi.cx, pfo->sizLogResPpi.cy); + OEMDebugMessage(L"\tulStyleSize: %ld\r\n", pfo->ulStyleSize); + if (!pfo->pvConsumer) + OEMDebugMessage(L"\tpvConsumer: NULL\r\n"); + else + OEMDebugMessage(L"\tpvConsumer: %#x\r\n", pfo->pvConsumer); + if (!pfo->pvProducer) + OEMDebugMessage(L"\tpvProducer: NULL\r\n"); + else + OEMDebugMessage(L"\tpvProducer: %#x\r\n", pfo->pvProducer); + + OEMDebugMessage(L"\n"); + +} + +void +vDumpCLIPOBJ( + INT iDebugLevel, + _In_ PWSTR pszInLabel, + CLIPOBJ *pco + ) + +/*++ + +Routine Description: + + Dumps the members of a CLIPOBJ structure. + +Arguments: + + iDebugLevel - desired output debug level + pszInLabel - output label string + pco - pointer to the CLIPOBJ strct to be dumped + +Return Value: + + NONE + +--*/ + +{ + // Check if the debug level is appropriate + // + if (iDebugLevel < giDebugLevel) + { + // Nothing to output here + // + return; + } + + // Prepare the label string + // + PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pco"); + + // Return if strct to be dumped is invalid + // + if (!pco) + { + OEMDebugMessage(L"\nCLIPOBJ [%s]: NULL\r\n", pszLabel); + + // Nothing else to output + // + return; + } + + // Format the data + // + OEMDebugMessage(L"\nCLIPOBJ [%s]: %#x\r\n", pszLabel, pco); + OEMDebugMessage(L"\tiUniq: %ld\r\n", pco->iUniq); + OEMDebugMessage(L"\trclBounds: (%ld, %ld) (%ld, %ld)\r\n", pco->rclBounds.left, pco->rclBounds.top, pco->rclBounds.right, pco->rclBounds.bottom); + + PWSTR psziDComplexity = L"Unknown iDComplexity."; + switch (pco->iDComplexity ) + { + case DC_COMPLEX: psziDComplexity = L"DC_COMPLEX"; break; + case DC_RECT: psziDComplexity = L"DC_RECT"; break; + case DC_TRIVIAL: psziDComplexity = L"DC_TRIVIAL"; break; + } + OEMDebugMessage(L"\tiDComplexity: %s\r\n", psziDComplexity); + + PWSTR psziFComplexity = L"0"; + switch (pco->iFComplexity) + { + case FC_COMPLEX: psziFComplexity = L"FC_COMPLEX"; break; + case FC_RECT: psziFComplexity = L"FC_RECT"; break; + case FC_RECT4: psziFComplexity = L"FC_RECT4"; break; + } + OEMDebugMessage(L"\tiFComplexity: %s\r\n", psziFComplexity); + + PWSTR psziMode = L"0"; + switch (pco->iMode) + { + case TC_PATHOBJ: psziMode = L"TC_PATHOBJ"; break; + case TC_RECTANGLES: psziMode = L"TC_RECTANGLES"; break; + } + OEMDebugMessage(L"\tiMode: %s\r\n", psziMode); + + PWSTR pszfjOptions = L"0"; + switch (pco->fjOptions) + { + case OC_BANK_CLIP: pszfjOptions = L"TC_PATHOBJ"; break; + } + OEMDebugMessage(L"\tfjOptions: %s\r\n", pszfjOptions); + + OEMDebugMessage(L"\n"); +} + +#if DBG + DBG_FLAGS gafdBRUSHOBJ_flColorType[] = { + { L"BR_CMYKCOLOR", BR_CMYKCOLOR}, + { L"BR_DEVICE_ICM", BR_DEVICE_ICM}, + { L"BR_HOST_ICM", BR_HOST_ICM}, + {NULL, 0} // The NULL entry is important + }; +#else + DBG_FLAGS gafdBRUSHOBJ_flColorType[] = { + {NULL, 0} + }; +#endif + +void +vDumpBRUSHOBJ( + INT iDebugLevel, + _In_ PWSTR pszInLabel, + BRUSHOBJ *pbo + ) + +/*++ + +Routine Description: + + Dumps the members of a BRUSHOBJ structure. + +Arguments: + + iDebugLevel - desired output debug level + pszInLabel - output label string + pbo - pointer to the BRUSHOBJ strct to be dumped + +Return Value: + + NONE + +--*/ + +{ + // Check if the debug level is appropriate + // + if (iDebugLevel < giDebugLevel) + { + // Nothing to output here + // + return; + } + + // Prepare the label string + // + PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pbo"); + + // Return if strct to be dumped is invalid + // + if (!pbo) + { + OEMDebugMessage(L"\nBRUSHOBJ [%s]: NULL\r\n", pszLabel); + + // Nothing else to output + // + return; + } + + // Format the data + // + OEMDebugMessage(L"\nBRUSHOBJ [%s]: %#x\r\n", pszLabel, pbo); + OEMDebugMessage(L"\tiSolidColor: %#x\r\n", pbo->iSolidColor); + OEMDebugMessage(L"\tpvRbrush: %#x\r\n", pbo->pvRbrush); + OEMDebugMessage(L"\tflColorType: "); + vDumpFlags(pbo->flColorType, gafdBRUSHOBJ_flColorType); + + OEMDebugMessage(L"\n"); +} + +#if DBG + DBG_FLAGS gafdGDIINFO_flHTFlags[] = { + { L"HT_FLAG_8BPP_CMY332_MASK", HT_FLAG_8BPP_CMY332_MASK}, + { L"HT_FLAG_ADDITIVE_PRIMS", HT_FLAG_ADDITIVE_PRIMS}, + { L"HT_FLAG_DO_DEVCLR_XFORM", HT_FLAG_DO_DEVCLR_XFORM}, + { L"HT_FLAG_HAS_BLACK_DYE", HT_FLAG_HAS_BLACK_DYE}, + { L"HT_FLAG_HIGH_INK_ABSORPTION", HT_FLAG_HIGH_INK_ABSORPTION}, + { L"HT_FLAG_HIGHER_INK_ABSORPTION", HT_FLAG_HIGHER_INK_ABSORPTION}, + { L"HT_FLAG_HIGHEST_INK_ABSORPTION", HT_FLAG_HIGHEST_INK_ABSORPTION}, + { L"HT_FLAG_INK_ABSORPTION_IDX0", HT_FLAG_INK_ABSORPTION_IDX0}, + { L"HT_FLAG_INK_ABSORPTION_IDX1", HT_FLAG_INK_ABSORPTION_IDX1}, + { L"HT_FLAG_INK_ABSORPTION_IDX2", HT_FLAG_INK_ABSORPTION_IDX2}, + { L"HT_FLAG_INK_ABSORPTION_IDX3", HT_FLAG_INK_ABSORPTION_IDX3}, + { L"HT_FLAG_INK_HIGH_ABSORPTION", HT_FLAG_INK_HIGH_ABSORPTION}, + { L"HT_FLAG_LOW_INK_ABSORPTION", HT_FLAG_LOW_INK_ABSORPTION}, + { L"HT_FLAG_LOWER_INK_ABSORPTION", HT_FLAG_LOWER_INK_ABSORPTION}, + { L"HT_FLAG_LOWEST_INK_ABSORPTION", HT_FLAG_LOWEST_INK_ABSORPTION}, + { L"HT_FLAG_OUTPUT_CMY", HT_FLAG_OUTPUT_CMY}, + { L"HT_FLAG_PRINT_DRAFT_MODE", HT_FLAG_PRINT_DRAFT_MODE}, + { L"HT_FLAG_SQUARE_DEVICE_PEL", HT_FLAG_SQUARE_DEVICE_PEL}, + { L"HT_FLAG_USE_8BPP_BITMASK", HT_FLAG_USE_8BPP_BITMASK}, + { L"HT_FLAG_NORMAL_INK_ABSORPTION", HT_FLAG_NORMAL_INK_ABSORPTION}, +// { L"HT_FLAG_INVERT_8BPP_BITMASK_IDX", HT_FLAG_INVERT_8BPP_BITMASK_IDX}, + {NULL, 0} // The NULL entry is important + }; +#else + DBG_FLAGS gafdGDIINFO_flHTFlags[] = { + {NULL, 0} + }; +#endif + +void +vDumpGDIINFO( + INT iDebugLevel, + _In_ PWSTR pszInLabel, + GDIINFO *pGdiInfo + ) + +/*++ + +Routine Description: + + Dumps the members of a GDIINFO structure. + +Arguments: + + iDebugLevel - desired output debug level + pszInLabel - output label string + pGdiInfo - pointer to the GDIINFO strct to be dumped + +Return Value: + + NONE + +--*/ + +{ + // Check if the debug level is appropriate + // + if (iDebugLevel < giDebugLevel) + { + // Nothing to output here + // + return; + } + + // Prepare the label string + // + PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pGdiInfo"); + + // Return if strct to be dumped is invalid + // + if (!pGdiInfo) + { + OEMDebugMessage(L"\nGDIINFO [%s]: NULL\r\n", pszLabel); + + // Nothing else to output + // + return; + } + + // Format the data + // + OEMDebugMessage(L"\nGDIINFO [%s]: %#x\r\n", pszLabel, pGdiInfo); + OEMDebugMessage(L"\tulVersion: %#x\r\n", pGdiInfo->ulVersion); + + PWSTR pszulTechnology = L"???"; + switch (pGdiInfo->ulTechnology) + { + case DT_PLOTTER: pszulTechnology = L"DT_PLOTTER"; break; + case DT_RASDISPLAY: pszulTechnology = L"DT_RASDISPLAY"; break; + case DT_RASPRINTER: pszulTechnology = L"DT_RASPRINTER"; break; + case DT_RASCAMERA: pszulTechnology = L"DT_RASCAMERA"; break; + case DT_CHARSTREAM: pszulTechnology = L"DT_CHARSTREAM"; break; + } + OEMDebugMessage(L"\tulTechnology: %ld [%s]\r\n", pGdiInfo->ulTechnology, pszulTechnology); + + OEMDebugMessage(L"\tulHorzSize: %ld\r\n", pGdiInfo->ulHorzSize); + OEMDebugMessage(L"\tulVertSize: %ld\r\n", pGdiInfo->ulVertSize); + OEMDebugMessage(L"\tulHorzRes: %ld\r\n", pGdiInfo->ulHorzRes); + OEMDebugMessage(L"\tulVertRes: %ld\r\n", pGdiInfo->ulVertRes); + OEMDebugMessage(L"\tcBitsPixel: %ld\r\n", pGdiInfo->cBitsPixel); + OEMDebugMessage(L"\tcPlanes: %ld\r\n", pGdiInfo->cPlanes); + OEMDebugMessage(L"\tulNumColors: %ld\r\n", pGdiInfo->ulNumColors); + OEMDebugMessage(L"\tflRaster: %#x\r\n", pGdiInfo->flRaster); + OEMDebugMessage(L"\tulLogPixelsX: %ld\r\n", pGdiInfo->ulLogPixelsX); + OEMDebugMessage(L"\tulLogPixelsY: %ld\r\n", pGdiInfo->ulLogPixelsY); + + PWSTR pszTextCaps = L"Text scrolling through DrvBitBlt/DrvCopyBits"; + if (TC_SCROLLBLT == (pGdiInfo->flTextCaps & TC_SCROLLBLT)) + { + pszTextCaps = L"Text scrolling through DrvTextOut"; + } + OEMDebugMessage(L"\tflTextCaps: %s\n", pszTextCaps); + + OEMDebugMessage(L"\tulDACRed: %#x\r\n", pGdiInfo->ulDACRed); + OEMDebugMessage(L"\tulDACGreen: %#x\r\n", pGdiInfo->ulDACGreen); + OEMDebugMessage(L"\tulDACBlue: %#x\r\n", pGdiInfo->ulDACBlue); + OEMDebugMessage(L"\tulAspectX: %ld\r\n", pGdiInfo->ulAspectX); + OEMDebugMessage(L"\tulAspectY: %ld\r\n", pGdiInfo->ulAspectY); + OEMDebugMessage(L"\tulAspectXY: %ld\r\n", pGdiInfo->ulAspectXY); + OEMDebugMessage(L"\txStyleStep: %ld\r\n", pGdiInfo->xStyleStep); + OEMDebugMessage(L"\tyStyleStep: %ld\r\n", pGdiInfo->yStyleStep); + OEMDebugMessage(L"\tdenStyleStep: %ld\r\n", pGdiInfo->denStyleStep); + OEMDebugMessage(L"\tptlPhysOffset: (%ld, %ld)\r\n", pGdiInfo->ptlPhysOffset.x, pGdiInfo->ptlPhysOffset.y); + OEMDebugMessage(L"\tszlPhysSize: (%ld, %ld)\r\n", pGdiInfo->szlPhysSize.cx, pGdiInfo->szlPhysSize.cy); + OEMDebugMessage(L"\tulNumPalReg: %ld\r\n", pGdiInfo->ulNumPalReg); + OEMDebugMessage(L"\tulDevicePelsDPI: %ld\r\n", pGdiInfo->ulDevicePelsDPI); + + PWSTR pszPrimaryOrder = L"???"; + switch(pGdiInfo->ulPrimaryOrder) + { + case PRIMARY_ORDER_ABC: pszPrimaryOrder = L"PRIMARY_ORDER_ABC [RGB/CMY]"; break; + case PRIMARY_ORDER_ACB: pszPrimaryOrder = L"PRIMARY_ORDER_ACB [RBG/CYM]"; break; + case PRIMARY_ORDER_BAC: pszPrimaryOrder = L"PRIMARY_ORDER_BAC [GRB/MCY]"; break; + case PRIMARY_ORDER_BCA: pszPrimaryOrder = L"PRIMARY_ORDER_BCA [GBR/MYC]"; break; + case PRIMARY_ORDER_CBA: pszPrimaryOrder = L"PRIMARY_ORDER_CBA [BGR/YMC]"; break; + case PRIMARY_ORDER_CAB: pszPrimaryOrder = L"PRIMARY_ORDER_CAB [BRG/YCM]"; break; + } + OEMDebugMessage(L"\tulPrimaryOrder: %s\n", pszPrimaryOrder); + + PWSTR pszHTPat = L"???"; + switch(pGdiInfo->ulHTPatternSize) + { + case HT_PATSIZE_2x2 : pszHTPat = L"HT_PATSIZE_2x2 "; break; + case HT_PATSIZE_2x2_M : pszHTPat = L"HT_PATSIZE_2x2_M"; break; + case HT_PATSIZE_4x4 : pszHTPat = L"HT_PATSIZE_4x4"; break; + case HT_PATSIZE_4x4_M : pszHTPat = L"HT_PATSIZE_4x4_M"; break; + case HT_PATSIZE_6x6 : pszHTPat = L"HT_PATSIZE_6x6"; break; + case HT_PATSIZE_6x6_M : pszHTPat = L"HT_PATSIZE_6x6_M"; break; + case HT_PATSIZE_8x8 : pszHTPat = L"HT_PATSIZE_8x8"; break; + case HT_PATSIZE_8x8_M : pszHTPat = L"HT_PATSIZE_8x8_M"; break; + case HT_PATSIZE_10x10 : pszHTPat = L"HT_PATSIZE_10x10"; break; + case HT_PATSIZE_10x10_M : pszHTPat = L"HT_PATSIZE_10x10_M"; break; + case HT_PATSIZE_12x12 : pszHTPat = L"HT_PATSIZE_12x12"; break; + case HT_PATSIZE_12x12_M : pszHTPat = L"HT_PATSIZE_12x12_M"; break; + case HT_PATSIZE_14x14 : pszHTPat = L"HT_PATSIZE_14x14"; break; + case HT_PATSIZE_14x14_M : pszHTPat = L"HT_PATSIZE_14x14_M"; break; + case HT_PATSIZE_16x16 : pszHTPat = L"HT_PATSIZE_16x16"; break; + case HT_PATSIZE_16x16_M : pszHTPat = L"HT_PATSIZE_16x16_M"; break; + case HT_PATSIZE_SUPERCELL : pszHTPat = L"HT_PATSIZE_SUPERCELL"; break; + case HT_PATSIZE_SUPERCELL_M : pszHTPat = L"HT_PATSIZE_SUPERCELL_M"; break; + case HT_PATSIZE_USER : pszHTPat = L"HT_PATSIZE_USER"; break; +// case HT_PATSIZE_MAX_INDEX : pszHTPat = L"HT_PATSIZE_MAX_INDEX"; break; +// case HT_PATSIZE_DEFAULT : pszHTPat = L"HT_PATSIZE_DEFAULT"; break; + } + OEMDebugMessage(L"\tulHTPatternSize: %s\n", pszHTPat); + + PWSTR pszHTOutputFormat = L"???"; + switch(pGdiInfo->ulHTOutputFormat) + { + case HT_FORMAT_1BPP : pszHTOutputFormat = L"HT_FORMAT_1BPP"; break; + case HT_FORMAT_4BPP : pszHTOutputFormat = L"HT_FORMAT_4BPP"; break; + case HT_FORMAT_4BPP_IRGB : pszHTOutputFormat = L"HT_FORMAT_4BPP_IRGB"; break; + case HT_FORMAT_8BPP : pszHTOutputFormat = L"HT_FORMAT_8BPP"; break; + case HT_FORMAT_16BPP : pszHTOutputFormat = L"HT_FORMAT_16BPP"; break; + case HT_FORMAT_24BPP : pszHTOutputFormat = L"HT_FORMAT_24BPP"; break; + case HT_FORMAT_32BPP : pszHTOutputFormat = L"HT_FORMAT_32BPP"; break; + } + OEMDebugMessage(L"\tulHTOutputFormat: %s\n", pszHTOutputFormat); + + OEMDebugMessage(L"\tflHTFlags: "); + vDumpFlags(pGdiInfo->flHTFlags, gafdGDIINFO_flHTFlags); + OEMDebugMessage(L"\tulVRefresh: %ld\r\n", pGdiInfo->ulVRefresh); + OEMDebugMessage(L"\tulBltAlignment: %ld\r\n", pGdiInfo->ulBltAlignment); + OEMDebugMessage(L"\tulPanningHorzRes: %ld\r\n", pGdiInfo->ulPanningHorzRes); + OEMDebugMessage(L"\tulPanningVertRes: %ld\r\n", pGdiInfo->ulPanningVertRes); + OEMDebugMessage(L"\txPanningAlignment: %ld\r\n", pGdiInfo->xPanningAlignment); + OEMDebugMessage(L"\tyPanningAlignment: %ld\r\n", pGdiInfo->yPanningAlignment); + OEMDebugMessage(L"\tcxHTPat: %ld\r\n", pGdiInfo->cxHTPat); + OEMDebugMessage(L"\tcyHTPat: %ld\r\n", pGdiInfo->cyHTPat); + OEMDebugMessage(L"\tpHTPatA: %#x\r\n", pGdiInfo->pHTPatA); + OEMDebugMessage(L"\tpHTPatB: %#x\r\n", pGdiInfo->pHTPatB); + OEMDebugMessage(L"\tpHTPatC: %#x\r\n", pGdiInfo->pHTPatC); + OEMDebugMessage(L"\tflShadeBlend: %#x\r\n", pGdiInfo->flShadeBlend); + + PWSTR pszPhysPixChars = L"???"; + switch(pGdiInfo->ulPhysicalPixelCharacteristics) + { + case PPC_DEFAULT: pszPhysPixChars = L"PPC_DEFAULT"; break; + case PPC_BGR_ORDER_HORIZONTAL_STRIPES: pszPhysPixChars = L"PPC_BGR_ORDER_HORIZONTAL_STRIPES"; break; + case PPC_BGR_ORDER_VERTICAL_STRIPES: pszPhysPixChars = L"PPC_BGR_ORDER_VERTICAL_STRIPES"; break; + case PPC_RGB_ORDER_HORIZONTAL_STRIPES: pszPhysPixChars = L"PPC_RGB_ORDER_HORIZONTAL_STRIPES"; break; + case PPC_RGB_ORDER_VERTICAL_STRIPES: pszPhysPixChars = L"PPC_RGB_ORDER_VERTICAL_STRIPES"; break; + case PPC_UNDEFINED: pszPhysPixChars = L"PPC_UNDEFINED"; break; + } + OEMDebugMessage(L"\tulPhysicalPixelCharacteristics: %s\n", pszPhysPixChars); + + PWSTR pszPhysPixGamma = L"???"; + switch(pGdiInfo->ulPhysicalPixelGamma) + { + case PPG_DEFAULT: pszPhysPixGamma = L"PPG_DEFAULT"; break; + case PPG_SRGB : pszPhysPixGamma = L"PPG_SRGB"; break; + } + OEMDebugMessage(L"\tulPhysicalPixelGamma: %s\n", pszPhysPixGamma); + + OEMDebugMessage(L"\n"); +} + +#if DBG + DBG_FLAGS gafdDEVINFO_flGraphicsCaps[] = { + { L"GCAPS_BEZIERS", GCAPS_BEZIERS}, + { L"GCAPS_GEOMETRICWIDE", GCAPS_GEOMETRICWIDE}, + { L"GCAPS_ALTERNATEFILL", GCAPS_ALTERNATEFILL}, + { L"GCAPS_WINDINGFILL", GCAPS_WINDINGFILL}, + { L"GCAPS_HALFTONE", GCAPS_HALFTONE}, + { L"GCAPS_COLOR_DITHER", GCAPS_COLOR_DITHER}, + { L"GCAPS_HORIZSTRIKE", GCAPS_HORIZSTRIKE}, + { L"GCAPS_VERTSTRIKE", GCAPS_VERTSTRIKE}, + { L"GCAPS_OPAQUERECT", GCAPS_OPAQUERECT}, + { L"GCAPS_VECTORFONT", GCAPS_VECTORFONT}, + { L"GCAPS_MONO_DITHER", GCAPS_MONO_DITHER}, + { L"GCAPS_ASYNCCHANGE", GCAPS_ASYNCCHANGE}, + { L"GCAPS_ASYNCMOVE", GCAPS_ASYNCMOVE}, + { L"GCAPS_DONTJOURNAL", GCAPS_DONTJOURNAL}, + { L"GCAPS_DIRECTDRAW", GCAPS_DIRECTDRAW}, + { L"GCAPS_ARBRUSHOPAQUE", GCAPS_ARBRUSHOPAQUE}, + { L"GCAPS_PANNING", GCAPS_PANNING}, + { L"GCAPS_PALMANAGED", GCAPS_PALMANAGED}, + { L"GCAPS_DITHERONREALIZE", GCAPS_DITHERONREALIZE}, + { L"GCAPS_NO64BITMEMACCESS", GCAPS_NO64BITMEMACCESS}, + { L"GCAPS_FORCEDITHER", GCAPS_FORCEDITHER}, + { L"GCAPS_GRAY16", GCAPS_GRAY16}, + { L"GCAPS_ICM", GCAPS_ICM}, + { L"GCAPS_CMYKCOLOR", GCAPS_CMYKCOLOR}, + { L"GCAPS_LAYERED", GCAPS_LAYERED}, + { L"GCAPS_ARBRUSHTEXT", GCAPS_ARBRUSHTEXT}, + { L"GCAPS_SCREENPRECISION", GCAPS_SCREENPRECISION}, + { L"GCAPS_FONT_RASTERIZER", GCAPS_FONT_RASTERIZER}, + { L"GCAPS_NUP", GCAPS_NUP}, + {NULL, 0} // The NULL entry is important + }; + + DBG_FLAGS gafdDEVINFO_flGraphicsCaps2[] = { + { L"GCAPS2_JPEGSRC", GCAPS2_JPEGSRC}, + { L"GCAPS2_xxxx", GCAPS2_xxxx}, + { L"GCAPS2_PNGSRC", GCAPS2_PNGSRC}, + { L"GCAPS2_CHANGEGAMMARAMP", GCAPS2_CHANGEGAMMARAMP}, + { L"GCAPS2_ALPHACURSOR", GCAPS2_ALPHACURSOR}, + { L"GCAPS2_SYNCFLUSH", GCAPS2_SYNCFLUSH}, + { L"GCAPS2_SYNCTIMER", GCAPS2_SYNCTIMER}, + { L"GCAPS2_ICD_MULTIMON", GCAPS2_ICD_MULTIMON}, + { L"GCAPS2_MOUSETRAILS", GCAPS2_MOUSETRAILS}, + { L"GCAPS2_REMOTEDRIVER", GCAPS2_REMOTEDRIVER}, + {NULL, 0} // The NULL entry is important + }; +#else + DBG_FLAGS gafdDEVINFO_flGraphicsCaps[] = { + {NULL, 0} + }; + + DBG_FLAGS gafdDEVINFO_flGraphicsCaps2[] = { + {NULL, 0} + }; +#endif + +void +vDumpDEVINFO( + INT iDebugLevel, + _In_ PWSTR pszInLabel, + DEVINFO *pDevInfo + ) + +/*++ + +Routine Description: + + Dumps the members of a DEVINFO structure. + +Arguments: + + iDebugLevel - desired output debug level + pszInLabel - output label string + pDevInfo - pointer to the DEVINFO strct to be dumped + +Return Value: + + NONE + +--*/ + +{ + // Check if the debug level is appropriate + // + if (iDebugLevel < giDebugLevel) + { + // Nothing to output here + // + return; + } + + // Prepare the label string + // + PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pDevInfo"); + + // Return if strct to be dumped is invalid + // + if (!pDevInfo) + { + OEMDebugMessage(L"\nDEVINFO [%s]: NULL\r\n", pszLabel); + + // Nothing else to output + // + return; + } + + // Format the data + // + OEMDebugMessage(L"\nDEVINFO [%s]: %#x\r\n", pszLabel, pDevInfo); + OEMDebugMessage(L"\tflGraphicsCaps: "); + vDumpFlags(pDevInfo->flGraphicsCaps, gafdDEVINFO_flGraphicsCaps); + OEMDebugMessage(L"\tcFonts: %ld\r\n", pDevInfo->cFonts); + + PWSTR psziDitherFormat = L"0"; + switch (pDevInfo->iDitherFormat) + { + case BMF_1BPP : psziDitherFormat = L"BMF_1BPP" ; break; + case BMF_4BPP : psziDitherFormat = L"BMF_4BPP" ; break; + case BMF_8BPP : psziDitherFormat = L"BMF_8BPP" ; break; + case BMF_16BPP: psziDitherFormat = L"BMF_16BPP"; break; + case BMF_24BPP: psziDitherFormat = L"BMF_24BPP"; break; + case BMF_32BPP: psziDitherFormat = L"BMF_32BPP"; break; + case BMF_4RLE : psziDitherFormat = L"BMF_4RLE" ; break; + case BMF_8RLE : psziDitherFormat = L"BMF_8RLE" ; break; + case BMF_JPEG : psziDitherFormat = L"BMF_JPEG" ; break; + case BMF_PNG : psziDitherFormat = L"BMF_PNG " ; break; + } + OEMDebugMessage(L"\tiDitherFormat: %s\r\n", psziDitherFormat); + + OEMDebugMessage(L"\tcxDither: %ld\r\n", pDevInfo->cxDither); + OEMDebugMessage(L"\tcyDither: %ld\r\n", pDevInfo->cyDither); + OEMDebugMessage(L"\thpalDefault: %#x\r\n", pDevInfo->hpalDefault); + OEMDebugMessage(L"\tflGraphicsCaps2: "); + vDumpFlags(pDevInfo->flGraphicsCaps2, gafdDEVINFO_flGraphicsCaps2); + + OEMDebugMessage(L"\n"); +} + +void +vDumpBitmapInfoHeader( + INT iDebugLevel, + _In_ PWSTR pszInLabel, + BITMAPINFOHEADER *pBitmapInfoHeader + ) + +/*++ + +Routine Description: + + Dumps the members of a BITMAPINFOHEADER structure. + +Arguments: + + iDebugLevel - desired output debug level + pszInLabel - output label string + pBitmapInfoHeader - pointer to the BITMAPINFOHEADER strct to be dumped + +Return Value: + + NONE + +--*/ + +{ + // Check if the debug level is appropriate + // + if (iDebugLevel < giDebugLevel) + { + // Nothing to output here + // + return; + } + + // Prepare the label string + // + PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pBitmapInfoHeader"); + + // Return if strct to be dumped is invalid + // + if (!pBitmapInfoHeader) + { + OEMDebugMessage(L"\nBITMAPINFOHEADER [%s]: NULL\r\n", pszLabel); + + // Nothing else to output + // + return; + } + + // Format the data + // + OEMDebugMessage(L"\nBITMAPINFOHEADER [%s]: %#x\r\n", pszLabel, pBitmapInfoHeader); + OEMDebugMessage(L"\tbiSize: %ld\r\n", pBitmapInfoHeader->biSize); + OEMDebugMessage(L"\tbiWidth: %ld\r\n", pBitmapInfoHeader->biWidth); + OEMDebugMessage(L"\tbiHeight: %ld\r\n", pBitmapInfoHeader->biHeight); + OEMDebugMessage(L"\tbiPlanes: %ld\r\n", pBitmapInfoHeader->biPlanes); + OEMDebugMessage(L"\tbiBitCount: %ld\r\n", pBitmapInfoHeader->biBitCount); + + PWSTR pszbiCompression = L"0"; + switch (pBitmapInfoHeader->biCompression) + { + case BI_RGB : pszbiCompression = L"BI_RGB" ; break; + case BI_RLE8 : pszbiCompression = L"BI_RLE8" ; break; + case BI_RLE4 : pszbiCompression = L"BI_RLE4" ; break; + case BI_BITFIELDS: pszbiCompression = L"BI_BITFIELDS"; break; + case BI_JPEG : pszbiCompression = L"BI_JPEG" ; break; + case BI_PNG : pszbiCompression = L"BI_PNG " ; break; + } + OEMDebugMessage(L"\tbiCompression: %s\r\n", pszbiCompression); + + OEMDebugMessage(L"\tbiSizeImage: %ld\r\n", pBitmapInfoHeader->biSizeImage); + OEMDebugMessage(L"\tbiXPelsPerMeter: %ld\r\n", pBitmapInfoHeader->biXPelsPerMeter); + OEMDebugMessage(L"\tbiYPelsPerMeter: %ld\r\n", pBitmapInfoHeader->biYPelsPerMeter); + OEMDebugMessage(L"\tbiClrUsed: %ld\r\n", pBitmapInfoHeader->biClrUsed); + OEMDebugMessage(L"\tbiClrImportant: %ld\r\n", pBitmapInfoHeader->biClrImportant); + + OEMDebugMessage(L"\n"); +} + +void +vDumpPOINTL( + INT iDebugLevel, + _In_ PWSTR pszInLabel, + POINTL *pptl + ) + +/*++ + +Routine Description: + + Dumps the members of a POINTL structure. + +Arguments: + + iDebugLevel - desired output debug level + pszInLabel - output label string + pptl - pointer to the POINTL strct to be dumped + +Return Value: + + NONE + +--*/ + +{ + // Check if the debug level is appropriate + // + if (iDebugLevel < giDebugLevel) + { + // Nothing to output here + // + return; + } + + // Prepare the label string + // + PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pptl"); + + // Return if strct to be dumped is invalid + // + if (!pptl) + { + OEMDebugMessage(L"\nPOINTL [%s]: NULL\r\n", pszLabel); + + // Nothing else to output + // + return; + } + + // Format the data + // + OEMDebugMessage(L"\nPOINTL [%s]: %#x (%ld, %ld)\r\n", pszLabel, pptl, pptl->x, pptl->y); + + OEMDebugMessage(L"\n"); +} + +void +vDumpRECTL( + INT iDebugLevel, + _In_ PWSTR pszInLabel, + RECTL *prcl + ) + +/*++ + +Routine Description: + + Dumps the members of a RECTL structure. + +Arguments: + + iDebugLevel - desired output debug level + pszInLabel - output label string + prcl - pointer to the RECTL strct to be dumped + +Return Value: + + NONE + +--*/ + +{ + // Check if the debug level is appropriate + // + if (iDebugLevel < giDebugLevel) + { + // Nothing to output here + // + return; + } + + // Prepare the label string + // + PCWSTR pszLabel = EnsureLabel(pszInLabel, L"prcl"); + + // Return if strct to be dumped is invalid + // + if (!prcl) + { + OEMDebugMessage(L"\nRECTL [%s]: NULL\r\n", pszLabel); + + // Nothing else to output + // + return; + } + + // Format the data + // + OEMDebugMessage(L"\nRECTL [%s]: %#x (%ld, %ld) (%ld, %ld)\r\n", pszLabel, prcl, prcl->left, prcl->top, prcl->right, prcl->bottom); + + OEMDebugMessage(L"\n"); +} + +#if DBG + DBG_FLAGS gafdXLATEOBJ_flXlate[] = { + { L"XO_DEVICE_ICM", XO_DEVICE_ICM}, + { L"XO_FROM_CMYK", XO_FROM_CMYK}, + { L"XO_HOST_ICM", XO_HOST_ICM}, + { L"XO_TABLE", XO_TABLE}, + { L"XO_TO_MONO", XO_TO_MONO}, + { L"XO_TRIVIAL", XO_TRIVIAL}, + {NULL, 0} // The NULL entry is important + }; +#else + DBG_FLAGS gafdXLATEOBJ_flXlate[] = { + {NULL, 0} + }; +#endif + +void +vDumpXLATEOBJ( + INT iDebugLevel, + _In_ PWSTR pszInLabel, + XLATEOBJ *pxlo + ) + +/*++ + +Routine Description: + + Dumps the members of a XLATEOBJ structure. + +Arguments: + + iDebugLevel - desired output debug level + pszInLabel - output label string + pxlo - pointer to the XLATEOBJ strct to be dumped + +Return Value: + + NONE + +--*/ + +{ + // Check if the debug level is appropriate + // + if (iDebugLevel < giDebugLevel) + { + // Nothing to output here + // + return; + } + + // Prepare the label string + // + PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pxlo"); + + // Return if strct to be dumped is invalid + // + if (!pxlo) + { + OEMDebugMessage(L"\nXLATEOBJ [%s]: NULL\r\n", pszLabel); + + // Nothing else to output + // + return; + } + + // Format the data + // + OEMDebugMessage(L"\nXLATEOBJ [%s]: %#x\r\n", pszLabel, pxlo); + OEMDebugMessage(L"\tiUniq: %ld\r\n", pxlo->iUniq); + OEMDebugMessage(L"\tflXlate: "); + vDumpFlags(pxlo->flXlate, gafdXLATEOBJ_flXlate); + OEMDebugMessage(L"\tiSrcType: %ld [obsolete]\r\n", pxlo->iSrcType); + OEMDebugMessage(L"\tiDstType: %ld [obsolete]\r\n", pxlo->iDstType); + OEMDebugMessage(L"\tcEntries: %ld\r\n", pxlo->cEntries); + if (pxlo->pulXlate) + OEMDebugMessage(L"\tpulXlate: %#x [%ld]\r\n", pxlo->pulXlate, *pxlo->pulXlate); + else + OEMDebugMessage(L"\tpulXlate: %#x\r\n", pxlo->pulXlate); + + OEMDebugMessage(L"\n"); +} + +#if DBG + DBG_FLAGS gafdCOLORADJUSTMENT_caFlags[] = { + { L"CA_NEGATIVE", CA_NEGATIVE}, + { L"CA_LOG_FILTER", CA_LOG_FILTER}, + {NULL, 0} // The NULL entry is important + }; +#else + DBG_FLAGS gafdCOLORADJUSTMENT_caFlags[] = { + {NULL, 0} + }; +#endif + +void +vDumpCOLORADJUSTMENT( + INT iDebugLevel, + _In_ PWSTR pszInLabel, + COLORADJUSTMENT *pca + ) + +/*++ + +Routine Description: + + Dumps the members of a COLORADJUSTMENT structure. + +Arguments: + + iDebugLevel - desired output debug level + pszInLabel - output label string + pca - pointer to the COLORADJUSTMENT strct to be dumped + +Return Value: + + NONE + +--*/ + +{ + // Check if the debug level is appropriate + // + if (iDebugLevel < giDebugLevel) + { + // Nothing to output here + // + return; + } + + // Prepare the label string + // + PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pca"); + + // Return if strct to be dumped is invalid + // + if (!pca) + { + OEMDebugMessage(L"\nCOLORADJUSTMENT [%s]: NULL\r\n", pszLabel); + + // Nothing else to output + // + return; + } + + // Format the data + // + OEMDebugMessage(L"\nCOLORADJUSTMENT [%s]: %#x\r\n", pszLabel, pca); + OEMDebugMessage(L"\tcaSize: %#x\r\n", pca->caSize); + OEMDebugMessage(L"\tcaFlags: "); + if (pca->caFlags) + vDumpFlags(pca->caFlags, gafdCOLORADJUSTMENT_caFlags); + else + OEMDebugMessage(L"NULL\r\n"); + + PWSTR pszcaIlluminantIndex = L"0"; + switch (pca->caIlluminantIndex) + { + case ILLUMINANT_DEVICE_DEFAULT: pszcaIlluminantIndex = L"ILLUMINANT_DEVICE_DEFAULT" ; break; + case ILLUMINANT_A: pszcaIlluminantIndex = L"ILLUMINANT_A [Tungsten lamp]" ; break; + case ILLUMINANT_B: pszcaIlluminantIndex = L"ILLUMINANT_B [Noon sunlight]" ; break; + case ILLUMINANT_C: pszcaIlluminantIndex = L"ILLUMINANT_C [NTSC daylight]" ; break; + case ILLUMINANT_D50: pszcaIlluminantIndex = L"ILLUMINANT_D50 [Normal print]" ; break; + case ILLUMINANT_D55: pszcaIlluminantIndex = L"ILLUMINANT_D55 [Bond paper print]" ; break; + case ILLUMINANT_D65: pszcaIlluminantIndex = L"ILLUMINANT_D65 [Standard daylight]" ; break; + case ILLUMINANT_D75: pszcaIlluminantIndex = L"ILLUMINANT_D75 [Northern daylight]" ; break; + case ILLUMINANT_F2: pszcaIlluminantIndex = L"ILLUMINANT_F2 [Cool white lamp]" ; break; + } + OEMDebugMessage(L"\tcaIlluminantIndex: %s\r\n", pszcaIlluminantIndex); + + OEMDebugMessage(L"\tcaRedGamma: %d\r\n", (int)pca->caRedGamma); + OEMDebugMessage(L"\tcaGreenGamma: %d\r\n", (int)pca->caGreenGamma); + OEMDebugMessage(L"\tcaBlueGamma: %d\r\n", (int)pca->caBlueGamma); + OEMDebugMessage(L"\tcaReferenceBlack: %d\r\n", (int)pca->caReferenceBlack); + OEMDebugMessage(L"\tcaReferenceWhite: %d\r\n", (int)pca->caReferenceWhite); + OEMDebugMessage(L"\tcaContrast: %d\r\n", (int)pca->caContrast); + OEMDebugMessage(L"\tcaBrightness: %d\r\n", (int)pca->caBrightness); + OEMDebugMessage(L"\tcaColorfulness: %d\r\n", (int)pca->caColorfulness); + OEMDebugMessage(L"\tcaRedGreenTint: %d\r\n", (int)pca->caRedGreenTint); + + OEMDebugMessage(L"\n"); +} + +#endif + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemprean/debug.h b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/debug.h new file mode 100644 index 00000000..2b488890 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/debug.h @@ -0,0 +1,215 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1996 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Debug.H +// +// +// PURPOSE: Define common data types, and external function prototypes +// for debugging functions. Also defines the various debug macros. +// +// +// History: +// 06/28/03 xxx created. +// +// + +#pragma once + +#include "devmode.h" + +// VC and Build use different debug defines. +// The following makes it so either will +// cause the inclusion of debugging code. +#if !defined(_DEBUG) && defined(DBG) + #define _DEBUG DBG +#elif defined(_DEBUG) && !defined(DBG) + #define DBG _DEBUG +#endif + + + +///////////////////////////////////////////////////////// +// Macros +///////////////////////////////////////////////////////// +// +// These macros are used for debugging purposes. They expand +// to white spaces on a free build. Here is a brief description +// of what they do and how they are used: +// +// giDebugLevel +// Global variable which set the current debug level to control +// the amount of debug messages emitted. +// +// VERBOSE(msg) +// Display a message if the current debug level is <= DBG_VERBOSE. +// +// TERSE(msg) +// Display a message if the current debug level is <= DBG_TERSE. +// +// WARNING(msg) +// Display a message if the current debug level is <= DBG_WARNING. +// The message format is: WRN filename (linenumber): message +// +// ERR(msg) +// Similiar to WARNING macro above - displays a message +// if the current debug level is <= DBG_ERROR. +// +// ASSERT(cond) +// Verify a condition is true. If not, force a breakpoint. +// +// ASSERTMSG(cond, msg) +// Verify a condition is true. If not, display a message and +// force a breakpoint. +// +// RIP(msg) +// Display a message and force a breakpoint. +// +// Usage: +// These macros require extra parantheses for the msg argument +// example, ASSERTMSG(x > 0, ("x is less than 0\n")); +// WARNING(("App passed NULL pointer, ignoring...\n")); +// + +#define DBG_VERBOSE 1 +#define DBG_TERSE 2 +#define DBG_WARNING 3 +#define DBG_ERROR 4 +#define DBG_RIP 5 +#define DBG_NONE 6 + +// +// Determine what level of debugging messages to emit. +// This can be set in the sources file, or omitted +// completely +// +#ifdef VERBOSE_MSG + #define DEBUG_LEVEL DBG_VERBOSE +#elif TERSE_MSG + #define DEBUG_LEVEL DBG_TERSE +#elif WARNING_MSG + #define DEBUG_LEVEL DBG_WARNING +#elif ERROR_MSG + #define DEBUG_LEVEL DBG_ERROR +#elif RIP_MSG + #define DEBUG_LEVEL DBG_RIP +#elif NO_DBG_MSG + #define DEBUG_LEVEL DBG_NONE +#else + #define DEBUG_LEVEL DBG_WARNING +#endif + + +#if DBG + + extern INT giDebugLevel; + + #define DBGMSG(level, prefix, msg) { \ + if (giDebugLevel <= (level)) { \ + OEMDebugMessage(L"%s %s (%d): ", prefix, StripDirPrefixA(__FILE__), __LINE__); \ + OEMDebugMessage(msg); \ + } \ + } + + #define VERBOSE if(giDebugLevel <= DBG_VERBOSE) OEMDebugMessage + #define TERSE if(giDebugLevel <= DBG_TERSE) OEMDebugMessage + #define WARNING if(giDebugLevel <= DBG_WARNING) OEMDebugMessage + #define ERR if(giDebugLevel <= DBG_ERROR) OEMDebugMessage + + #define DBG_OEMDMPARAM(iDbgLvl, szLabel, pobj) {vDumpOemDMParam(iDbgLvl, szLabel, pobj);} + #define DBG_SURFOBJ(iDbgLvl, szLabel, pobj) {vDumpSURFOBJ(iDbgLvl, szLabel, pobj);} + #define DBG_STROBJ(iDbgLvl, szLabel, pobj) {vDumpSTROBJ(iDbgLvl, szLabel, pobj);} + #define DBG_FONTOBJ(iDbgLvl, szLabel, pobj) {vDumpFONTOBJ(iDbgLvl, szLabel, pobj);} + #define DBG_CLIPOBJ(iDbgLvl, szLabel, pobj) {vDumpCLIPOBJ(iDbgLvl, szLabel, pobj);} + #define DBG_BRUSHOBJ(iDbgLvl, szLabel, pobj) {vDumpBRUSHOBJ(iDbgLvl, szLabel, pobj);} + #define DBG_GDIINFO(iDbgLvl, szLabel, pobj) {vDumpGDIINFO(iDbgLvl, szLabel, pobj);} + #define DBG_DEVINFO(iDbgLvl, szLabel, pobj) {vDumpDEVINFO(iDbgLvl, szLabel, pobj);} + #define DBG_BMPINFO(iDbgLvl, szLabel, pobj) {vDumpBitmapInfoHeader(iDbgLvl, szLabel, pobj);} + #define DBG_POINTL(iDbgLvl, szLabel, pobj) {vDumpPOINTL(iDbgLvl, szLabel, pobj);} + #define DBG_RECTL(iDbgLvl, szLabel, pobj) {vDumpRECTL(iDbgLvl, szLabel, pobj);} + #define DBG_XLATEOBJ(iDbgLvl, szLabel, pobj) {vDumpXLATEOBJ(iDbgLvl, szLabel, pobj);} + #define DBG_COLORADJUSTMENT(iDbgLvl, szLabel, pobj) {vDumpCOLORADJUSTMENT(iDbgLvl, szLabel, pobj);} + + #define ASSERT(cond) \ + { \ + if (! (cond)) \ + { \ + RIP((L"\n")); \ + } \ + } + + #define ASSERTMSG(cond, msg) \ + { \ + if (! (cond)) { \ + RIP(msg); \ + } \ + } + + #define RIP(msg) \ + { \ + DBGMSG(DBG_RIP, L"RIP", msg); \ + DebugBreak(); \ + } + + typedef struct DBG_FLAGS { + LPWSTR pszFlag; + DWORD dwFlag; + } *PDBG_FLAGS; + + BOOL OEMDebugMessage(LPCWSTR, ...); + void vDumpOemDMParam(INT iDebugLevel, _In_ PWSTR pszInLabel, POEMDMPARAM pOemDMParam); + void vDumpSURFOBJ(INT iDebugLevel, _In_ PWSTR pszInLabel, SURFOBJ *pso); + void vDumpSTROBJ(INT iDebugLevel, _In_ PWSTR pszInLabel, STROBJ *pstro); + void vDumpFONTOBJ(INT iDebugLevel, _In_ PWSTR pszInLabel, FONTOBJ *pfo); + void vDumpCLIPOBJ(INT iDebugLevel, _In_ PWSTR pszInLabel, CLIPOBJ *pco); + void vDumpBRUSHOBJ(INT iDebugLevel, _In_ PWSTR pszInLabel, BRUSHOBJ *pbo); + void vDumpGDIINFO(INT iDebugLevel, _In_ PWSTR pszInLabel, GDIINFO *pGdiInfo); + void vDumpDEVINFO(INT iDebugLevel, _In_ PWSTR pszInLabel, DEVINFO *pDevInfo); + void vDumpBitmapInfoHeader(INT iDebugLevel, _In_ PWSTR pszInLabel, PBITMAPINFOHEADER pBitmapInfoHeader); + void vDumpPOINTL(INT iDebugLevel, _In_ PWSTR pszInLabel, POINTL *pptl); + void vDumpRECTL(INT iDebugLevel, _In_ PWSTR pszInLabel, RECTL *prcl); + void vDumpXLATEOBJ(INT iDebugLevel, _In_ PWSTR pszInLabel, XLATEOBJ *pxlo); + void vDumpCOLORADJUSTMENT(INT iDebugLevel, _In_ PWSTR pszInLabel, COLORADJUSTMENT *pca); + + BOOL OEMRealDebugMessage(DWORD dwSize, LPCWSTR lpszMessage, va_list arglist); + PCSTR StripDirPrefixA(IN PCSTR pstrFilename); + void vDumpFlags(DWORD dwFlags, PDBG_FLAGS pDebugFlags); + +#else // !DBG + + #define DebugMsg NOP_FUNCTION + + #define VERBOSE NOP_FUNCTION + #define TERSE NOP_FUNCTION + #define WARNING NOP_FUNCTION + #define ERR NOP_FUNCTION + + #define DBG_OEMDMPARAM(iDbgLvl, szLabel, pobj) NOP_FUNCTION + #define DBG_OEMDEVMODE(iDbgLvl, szLabel, pobj) NOP_FUNCTION + #define DBG_SURFOBJ(iDbgLvl, szLabel, pobj) NOP_FUNCTION + #define DBG_STROBJ(iDbgLvl, szLabel, pobj) NOP_FUNCTION + #define DBG_FONTOBJ(iDbgLvl, szLabel, pobj) NOP_FUNCTION + #define DBG_CLIPOBJ(iDbgLvl, szLabel, pobj) NOP_FUNCTION + #define DBG_BRUSHOBJ(iDbgLvl, szLabel, pobj) NOP_FUNCTION + #define DBG_GDIINFO(iDbgLvl, szLabel, pobj) NOP_FUNCTION + #define DBG_DEVINFO(iDbgLvl, szLabel, pobj) NOP_FUNCTION + #define DBG_BMPINFO(iDbgLvl, szLabel, pobj) NOP_FUNCTION + #define DBG_POINTL(iDbgLvl, szLabel, pobj) NOP_FUNCTION + #define DBG_RECTL(iDbgLvl, szLabel, pobj) NOP_FUNCTION + #define DBG_XLATEOBJ(iDbgLvl, szLabel, pobj) NOP_FUNCTION + #define DBG_COLORADJUSTMENT(iDbgLvl, szLabel, pobj) NOP_FUNCTION + + #define ASSERT(cond) + + #define ASSERTMSG(cond, msg) + #define RIP(msg) + +#endif + + + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemprean/devmode.cpp b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/devmode.cpp new file mode 100644 index 00000000..92ca5dd9 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/devmode.cpp @@ -0,0 +1,229 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Devmode.cpp +// +// +// PURPOSE: Implementation of Devmode functions shared with OEM UI and OEM rendering modules. +// +// History: +// 06/24/03 xxx created. +// +// + +#include "precomp.h" +#include "oemprean.h" +#include "debug.h" +#include "devmode.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +HRESULT hrOEMDevMode( + DWORD dwMode, + POEMDMPARAM pOemDMParam + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::DevMode. + hrOEMDevMode is called by IPrintOemUni::DevMode + which is defined in intrface.cpp. + + The IPrintOemUni::DevMode method, provided by + rendering plug-ins for Unidrv, performs operations + on private DEVMODE members. + + Please refer to DDK documentation for more details. + +Arguments: + + dwMode - caller-supplied constant. Refer to the docs + for more information. + pOemDMParam - pointer to an OEMDMPARAM structure. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + +--*/ + +{ + POEMDEV pOEMDevIn; + POEMDEV pOEMDevOut; + + VERBOSE(L"hrOEMDevMode entry."); + + // Verify parameters. + if( (NULL == pOemDMParam) + || + ( (OEMDM_SIZE != dwMode) + && + (OEMDM_DEFAULT != dwMode) + && + (OEMDM_CONVERT != dwMode) + && + (OEMDM_MERGE != dwMode) + )) + { + ERR(ERRORTEXT("DevMode() ERROR_INVALID_PARAMETER.\r\n")); + ERR(DLLTEXT("\tdwMode = %d, pOemDMParam = %#lx.\r\n"), dwMode, pOemDMParam); + + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Cast generic (i.e. PVOID) to OEM private devmode pointer type. + pOEMDevIn = (POEMDEV) pOemDMParam->pOEMDMIn; + pOEMDevOut = (POEMDEV) pOemDMParam->pOEMDMOut; + + switch(dwMode) + { + case OEMDM_SIZE: + pOemDMParam->cbBufSize = sizeof(OEMDEV); + break; + + case OEMDM_DEFAULT: + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + pOEMDevOut->dwDriverData = 0; + break; + + case OEMDM_CONVERT: + bConvertOEMDevmode(pOEMDevIn, pOEMDevOut); + break; + + case OEMDM_MERGE: + bConvertOEMDevmode(pOEMDevIn, pOEMDevOut); + bMakeOEMDevmodeValid(pOEMDevOut); + break; + } + DBG_OEMDMPARAM(DBG_VERBOSE, L"pOemDMParam", pOemDMParam); + + return S_OK; +} + + +BOOL bConvertOEMDevmode( + PCOEMDEV pOEMDevIn, + POEMDEV pOEMDevOut + ) + +/*++ + +Routine Description: + + Converts private DEVMODE members to the + current version. + +Arguments: + + pOEMDevIn - pointer to OEM private devmode + pOEMDevOut - pointer to OEM private devmode + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE(L"bConvertOEMDevmode entry."); + + if( (NULL == pOEMDevIn) + || + (NULL == pOEMDevOut) + ) + { + ERR(ERRORTEXT("ConvertOEMDevmode() invalid parameters.\r\n")); + return FALSE; + } + + // Check OEM Signature, if it doesn't match ours, + // then just assume DMIn is bad and use defaults. + if(pOEMDevIn->dmOEMExtra.dwSignature == pOEMDevOut->dmOEMExtra.dwSignature) + { + VERBOSE(TEXT("Converting private OEM Devmode.\r\n")); + + // Set the devmode defaults so that anything the isn't copied over will + // be set to the default value. + pOEMDevOut->dwDriverData = 0; + + // Copy the old structure in to the new using which ever size is the smaller. + // Devmode maybe from newer Devmode (not likely since there is only one), or + // Devmode maybe a newer Devmode, in which case it maybe larger, + // but the first part of the structure should be the same. + + // DESIGN ASSUMPTION: the private DEVMODE structure only gets added to; + // the fields that are in the DEVMODE never change only new fields get added to the end. + + memcpy(pOEMDevOut, pOEMDevIn, __min(pOEMDevOut->dmOEMExtra.dwSize, pOEMDevIn->dmOEMExtra.dwSize)); + + // Re-fill in the size and version fields to indicated + // that the DEVMODE is the current private DEVMODE version. + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + } + else + { + VERBOSE(TEXT("Unknown DEVMODE signature, pOEMDMIn ignored.\r\n")); + + // Don't know what the input DEVMODE is, so just use defaults. + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + pOEMDevOut->dwDriverData = 0; + } + + return TRUE; +} + + +BOOL bMakeOEMDevmodeValid( + POEMDEV pOEMDevmode + ) + +/*++ + +Routine Description: + + Ensures that private OEM devmode members are valid. + +Arguments: + + pOEMDevmode - pointer to OEM private devmode + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + if(NULL == pOEMDevmode) + { + return FALSE; + } + + // ASSUMPTION: pOEMDevmode is large enough to contain OEMDEV structure. + + // Make sure that dmOEMExtra indicates the current OEMDEV structure. + pOEMDevmode->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevmode->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevmode->dmOEMExtra.dwVersion = OEM_VERSION; + + // Set driver data. + pOEMDevmode->dwDriverData = 0; + + return TRUE; +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemprean/devmode.h b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/devmode.h new file mode 100644 index 00000000..05f98204 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/devmode.h @@ -0,0 +1,43 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Devmode.h +// +// +// PURPOSE: Define common data types, and external function prototypes +// for devmode functions. +// +// History: +// 06/24/03 xxx created. +// +// + +#pragma once + + +//////////////////////////////////////////////////////// +// OEM Devmode Type Definitions +//////////////////////////////////////////////////////// + +typedef struct tagOEMDEV +{ + OEM_DMEXTRAHEADER dmOEMExtra; + BOOL dwDriverData; +} OEMDEV, *POEMDEV; + +typedef const OEMDEV *PCOEMDEV; + + +///////////////////////////////////////////////////////// +// Prototypes +///////////////////////////////////////////////////////// + +HRESULT hrOEMDevMode(DWORD dwMode, POEMDMPARAM pOemDMParam); +BOOL bConvertOEMDevmode(PCOEMDEV pOEMDevIn, POEMDEV pOEMDevOut); +BOOL bMakeOEMDevmodeValid(POEMDEV pOEMDevmode); + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemprean/dllentry.cpp b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/dllentry.cpp new file mode 100644 index 00000000..412f9446 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/dllentry.cpp @@ -0,0 +1,58 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: dllentry.cpp +// +// +// PURPOSE: Source module for DLL entry function(s). +// +// History: +// 06/24/03 xxx created. +// +// + +#include "precomp.h" +#include "oemprean.h" +#include "debug.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +/////////////////////////////////////////////////////////// +// +// DLL entry point +// + +BOOL WINAPI DllMain(HINSTANCE hInst, WORD wReason, LPVOID lpReserved) +{ + VERBOSE(L"DllMain entry."); + + UNREFERENCED_PARAMETER(hInst); + UNREFERENCED_PARAMETER(lpReserved); + + switch(wReason) + { + case DLL_PROCESS_ATTACH: + VERBOSE(TEXT("Process attach.\r\n")); + break; + + case DLL_THREAD_ATTACH: + VERBOSE(TEXT("Thread attach.\r\n")); + break; + + case DLL_PROCESS_DETACH: + VERBOSE(TEXT("Process detach.\r\n")); + break; + + case DLL_THREAD_DETACH: + VERBOSE(TEXT("Thread detach.\r\n")); + break; + } + + return TRUE; +} diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemprean/intrface.cpp b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/intrface.cpp new file mode 100644 index 00000000..9c102afc --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/intrface.cpp @@ -0,0 +1,1819 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Intrface.cpp +// +// +// PURPOSE: Interface for User Mode COM Customization DLL. +// +// +// Functions: +// IPrintOemUni2 interface functions +// COemCF class factory +// Registration functions: DllCanUnloadNow, DllGetClassObject +// +// History: +// 06/26/03 xxx created. +// +// + +#include "precomp.h" +#include <INITGUID.H> +#include <PRCOMOEM.H> + +#include "oemprean.h" +#include "debug.h" +#include "intrface.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +// ================================================================== +// Internal Globals +// +static long g_cComponents; // Count of active components +static long g_cServerLocks; // Count of locks +// +// ================================================================== + +// ================================================================== +// The purpose of this array is to inform UNIDRV of the callbacks +// that are implemented in this driver. +// +// Note that there is *NO* order dependency in this array. New +// index values and their corresponding callbacks can be placed +// anywhere within the list as needed. +// +static const DRVFN s_aOemHookFuncs[] = +{ + // The following are defined in ddihook.cpp. + // + {INDEX_DrvAlphaBlend, (PFN)OEMAlphaBlend}, + {INDEX_DrvBitBlt, (PFN)OEMBitBlt}, + {INDEX_DrvCopyBits, (PFN)OEMCopyBits}, + {INDEX_DrvDitherColor, (PFN)OEMDitherColor}, + {INDEX_DrvFillPath, (PFN)OEMFillPath}, + {INDEX_DrvFontManagement, (PFN)OEMFontManagement}, + {INDEX_DrvGetGlyphMode, (PFN)OEMGetGlyphMode}, + {INDEX_DrvGradientFill, (PFN)OEMGradientFill}, + {INDEX_DrvLineTo, (PFN)OEMLineTo}, + {INDEX_DrvPaint, (PFN)OEMPaint}, + {INDEX_DrvPlgBlt, (PFN)OEMPlgBlt}, + {INDEX_DrvQueryAdvanceWidths, (PFN)OEMQueryAdvanceWidths}, + {INDEX_DrvQueryFont, (PFN)OEMQueryFont}, + {INDEX_DrvQueryFontData, (PFN)OEMQueryFontData}, + {INDEX_DrvQueryFontTree, (PFN)OEMQueryFontTree}, + {INDEX_DrvRealizeBrush, (PFN)OEMRealizeBrush}, + {INDEX_DrvStretchBlt, (PFN)OEMStretchBlt}, + {INDEX_DrvStretchBltROP, (PFN)OEMStretchBltROP}, + {INDEX_DrvStrokeAndFillPath, (PFN)OEMStrokeAndFillPath}, + {INDEX_DrvStrokePath, (PFN)OEMStrokePath}, + {INDEX_DrvTextOut, (PFN)OEMTextOut}, + {INDEX_DrvTransparentBlt, (PFN)OEMTransparentBlt}, + {INDEX_DrvStartDoc, (PFN)OEMStartDoc}, + {INDEX_DrvEndDoc, (PFN)OEMEndDoc}, + {INDEX_DrvStartPage, (PFN)OEMStartPage}, + {INDEX_DrvSendPage, (PFN)OEMSendPage}, + {INDEX_DrvStartBanding, (PFN)OEMStartBanding}, + {INDEX_DrvNextBand, (PFN)OEMNextBand}, + {INDEX_DrvEscape, (PFN)OEMEscape} +}; + + +//////////////////////////////////////////////////////////////////////////////// +// +// COemUni2 body +// +COemUni2::COemUni2() +{ + m_cRef = 1; + + // Increment COM component count. + InterlockedIncrement(&g_cComponents); + + m_pOEMHelp = NULL; + +} + +COemUni2::~COemUni2() +{ + // Make sure that helper interface is released. + if(NULL != m_pOEMHelp) + { + m_pOEMHelp->Release(); + m_pOEMHelp = NULL; + } + + // If this instance of the object is being deleted, then the reference + // count should be zero. + assert(0 == m_cRef); +} + +HRESULT __stdcall +COemUni2:: +QueryInterface( + const IID& iid, + void** ppv + ) +{ + VERBOSE(L"COemUni2::QueryInterface() entry."); + + if (iid == IID_IUnknown) + { + *ppv = static_cast<IUnknown*>(this); + VERBOSE(DLLTEXT("COemUni2::QueryInterface IUnknown.\r\n")); + } + else if (iid == IID_IPrintOemUni2) + { + VERBOSE(DLLTEXT("COemUni2::QueryInterface IPrintOemUni2.\r\n")); + + *ppv = static_cast<IPrintOemUni2*>(this); + } + else + { + WARNING(DLLTEXT("COemUni2::QueryInterface NULL. Returning E_NOINTERFACE.\r\n")); + + *ppv = NULL; + return E_NOINTERFACE; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef(); + return S_OK; +} + +ULONG __stdcall +COemUni2:: +AddRef( + VOID + ) +{ + VERBOSE(L"COemUni2::AddRef() entry."); + + return InterlockedIncrement(&m_cRef); +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall +COemUni2:: +Release( + VOID + ) +{ + VERBOSE(L"COemUni2::Release() entry."); + ULONG cRef = InterlockedDecrement(&m_cRef); + + if (cRef == 0) + { + delete this; + return 0; + } + return cRef; +} + +HRESULT __stdcall +COemUni2:: +CommandCallback( + PDEVOBJ pdevobj, + DWORD dwCallbackID, + DWORD dwCount, + PDWORD pdwParams, + OUT INT *piResult + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::CommandCallback + + The IPrintOemUni::CommandCallback method is used + to provide dynamically generated printer commands + for Unidrv-supported printers. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + dwCallbackID - value representing the printer command's + *CallbackID attribute in the printer's generic printer + description (GPD) file. + dwCount - value representing the number of elements + in the array pointed to by pdwParams. Can be 0. + pdwParams - pointer to an array of DWORD-sized parameters + containing values specified by the printer commands + *Params attribute in the printer's GPD file. Can be NULL. + piResult - Receives a method-supplied result value. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + VERBOSE(L"COemUni2::CommandCallback() entry."); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(dwCallbackID); + UNREFERENCED_PARAMETER(dwCount); + UNREFERENCED_PARAMETER(pdwParams); + + *piResult = 0; + + return S_OK; +} + +HRESULT __stdcall +COemUni2:: +Compression( + PDEVOBJ pdevobj, + PBYTE pInBuf, + PBYTE pOutBuf, + DWORD dwInLen, + DWORD dwOutLen, + OUT INT *piResult + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::Compression + + The IPrintOemUni::Compression method can be used + with Unidrv-supported printers to provide a customized + bitmap compression method. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pInBuf - pointer to input scan line data. + pOutBuf - pointer to an output buffer to receive + compressed scan line data. + dwInLen - length of the input data. + dwOutLen - length of the output buffer. + piResult - Receives a method-supplied result value. If the + operation succeeds, this value should be the number + of compressed bytes, which must not be larger than + the value received for dwOutLen. If an error occurs, + or if the method cannot compress, the result value + should be -1. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + VERBOSE(L"COemUni2::Compression() entry."); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pInBuf); + UNREFERENCED_PARAMETER(pOutBuf); + UNREFERENCED_PARAMETER(dwInLen); + UNREFERENCED_PARAMETER(dwOutLen); + UNREFERENCED_PARAMETER(piResult); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +DevMode( + DWORD dwMode, + POEMDMPARAM pOemDMParam + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::DevMode + + The IPrintOemUni::DevMode method, provided by + rendering plug-ins for Unidrv, performs operations + on private DEVMODE members. + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::DevMode method. + + Please refer to DDK documentation for more details. + +Arguments: + + dwMode - caller-supplied constant. Refer to the docs + for more information. + pOemDMParam - pointer to an OEMDMPARAM structure. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + + +--*/ + +{ + VERBOSE(L"COemUni2:DevMode entry."); + + DBG_OEMDMPARAM(DBG_VERBOSE, L"pOemDMParam", pOemDMParam); + + return hrOEMDevMode(dwMode, pOemDMParam); +} + +HRESULT __stdcall +COemUni2:: +DisableDriver( + VOID + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::DisableDriver + + The IPrintOemUni::DisableDriver method allows a rendering + plug-in for Unidrv to free resources that were allocated by the + plug-in's IPrintOemUni::EnableDriver method. This is the last + IPrintOemUni interface method that is called before the rendering + plug-in is unloaded. + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::DisableDriver method. + + Please refer to DDK documentation for more details. + +Arguments: + + VOID + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + + +--*/ + +{ + VERBOSE(L"COemUni2::DisableDriver() entry."); + + // Release reference to Printer Driver's interface. + // + if (this->m_pOEMHelp) + { + this->m_pOEMHelp->Release(); + this->m_pOEMHelp = NULL; + } + + return S_OK; +} + +HRESULT __stdcall +COemUni2:: +DisablePDEV( + PDEVOBJ pdevobj + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::DisablePDEV + + The IPrintOemUni::DisablePDEV method performs the same types of + operations as the DrvDisablePDEV function. Its purpose is to allow a + rendering plug-in to delete the private PDEV structure that is pointed + to by the DEVOBJ structure's pdevOEM member. This PDEV structure + is one that was allocated by the plug-in's IPrintOemUni::EnablePDEV method. + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::DisablePDEV method. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + + +--*/ + +{ + VERBOSE(L"COemUni2::DisablePDEV() entry."); + + POEMPDEV pOemPDEV = static_cast<POEMPDEV>(pdevobj->pdevOEM); + delete pOemPDEV; + + return S_OK; +} + +HRESULT __stdcall +COemUni2:: +DownloadCharGlyph( + PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + HGLYPH hGlyph, + PDWORD pdwWidth, + OUT DWORD *pdwResult + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::DownloadCharGlyph + + The IPrintOemUni::DownloadCharGlyph method enables a + rendering plug-in for Unidrv to send a character glyph for + a specified soft font to the printer. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pUFObj - pointer to a UNIFONTOBJ structure. + hGlyph - glyph handle. + pdwWidth - pointer to receive the method-supplied width of the character. + pdwResult - Receives a method-supplied value representing the amount + of printer memory, in bytes, required to store the character glyph. + If the operation fails, the returned value should be zero. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + VERBOSE(L"COemUni2::DownloadCharGlyph() entry."); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pUFObj); + UNREFERENCED_PARAMETER(hGlyph); + UNREFERENCED_PARAMETER(pdwWidth); + UNREFERENCED_PARAMETER(pdwResult); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +DownloadFontHeader( + PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + OUT DWORD *pdwResult + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::DownloadFontHeader + + The IPrintOemUni::DownloadFontHeader method allows a + rendering plug-in for Unidrv to send a font's header + information to a printer. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pUFObj - pointer to a UNIFONTOBJ structure. + pdwResult - Receives a method-supplied value representing the amount + of printer memory, in bytes, required to store the font header + information. If the operation fails, the returned value should be zero. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + VERBOSE(L"COemUni2::DownloadFontHeader() entry."); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pUFObj); + UNREFERENCED_PARAMETER(pdwResult); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +DriverDMS( + PVOID pDevObj, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::DriverDMS + + The IPrintOemUni::DriverDMS method allows a rendering + plug-in for Unidrv to indicate that it uses a device-managed + drawing surface instead of the default GDI-managed surface. + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::DriverDMS method. + + Please refer to DDK documentation for more details. For general info + on device managed surfaces and how to handle them, please refer to + the section titled "Handling Device-Managed Surfaces". + +Arguments: + + pDevObj - pointer to a DEVOBJ structure. + pBuffer - pointer to a buffer to receive method-specified flags. + cbSize - size, in bytes, of the buffer pointed to by pBuffer. + pcbNeeded - pointer to a location to receive the required + minimum pBuffer size. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + + +--*/ + +{ + VERBOSE(L"COemUni2::DriverDMS() entry."); + + UNREFERENCED_PARAMETER(pDevObj); + UNREFERENCED_PARAMETER(pBuffer); + UNREFERENCED_PARAMETER(cbSize); + UNREFERENCED_PARAMETER(pcbNeeded); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +EnableDriver( + DWORD dwDriverVersion, + DWORD cbSize, + PDRVENABLEDATA pded + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::EnableDriver + + The IPrintOemUni::EnableDriver method allows a rendering + plug-in for Unidrv to hook out some graphics DDI functions. + + The IPrintOemUni::EnableDriver method allows a rendering + plug-in to perform the same types of operations as the + DrvEnableDriver function. Like the DrvEnableDriver function, + the IPrintOemUni::EnableDriver method is responsible for + providing addresses of internally supported graphics DDI functions, + or DDI hook functions. + + The method should fill the supplied DRVENABLEDATA structure + and allocate an array of DRVFN structures. It should fill the + array with pointers to hooking functions, along with winddi.h-defined + index values that identify the hooked out graphics DDI functions. + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::EnableDriver method. + + Please refer to DDK documentation for more details. + +Arguments: + + DriverVersion - interface version number. This value is + defined by PRINTER_OEMINTF_VERSION, in printoem.h. + cbSize - size, in bytes, of the structure pointed to by pded. + pded - pointer to a DRVENABLEDATA structure. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + + +--*/ + +{ + UNREFERENCED_PARAMETER(dwDriverVersion); + UNREFERENCED_PARAMETER(cbSize); + + VERBOSE(L"COemUni2::EnableDriver() entry."); + + pded->iDriverVersion = PRINTER_OEMINTF_VERSION; + pded->c = sizeof(s_aOemHookFuncs) / sizeof(DRVFN); + pded->pdrvfn = (DRVFN *) s_aOemHookFuncs; + + // Even if nothing is done, need to return S_OK so + // that DisableDriver() will be called, which releases + // the reference to the Printer Driver's interface. + // + return S_OK; +} + +HRESULT __stdcall +COemUni2:: +EnablePDEV( + PDEVOBJ pdevobj, + _In_ PWSTR pPrinterName, + ULONG cPatterns, + HSURF *phsurfPatterns, + ULONG cjGdiInfo, + GDIINFO *pGdiInfo, + ULONG cjDevInfo, + DEVINFO *pDevInfo, + DRVENABLEDATA *pded, + OUT PDEVOEM *ppDevOem + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::EnablePDEV + + The IPrintOemUni::EnablePDEV method performs the same types + of operations as the DrvEnablePDEV function that is exported + by a printer graphics DLL. Its purpose is to allow a rendering + plug-in to create its own PDEV structure. For more information + about PDEV structures, see "Customized PDEV Structures" in the DDK docs. + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::EnablePDEV method. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pPrinterName - pointer to a text string representing the + logical address of the printer. + cPatterns - value representing the number of HSURF-typed + surface handles contained in the buffer pointed to by + phsurfPatterns. + phsurfPatterns - pointer to a buffer that is large enough to + contain cPatterns number of HSURF-typed surface handles. + The handles represent surface fill patterns. + cjGdiInfo - value representing the size of the structure pointed + to by pGdiInfo. + pGdiInfo - pointer to a GDIINFO structure. + cjDevInfo - value representing the size of the structure pointed + to by pDevInfo. + pDevInfo - pointer to a DEVINFO structure. + pded - pointer to a DRVENABLEDATA structure containing the + addresses of the printer driver's graphics DDI hooking functions. + pDevOem - Receives a method-supplied pointer to a private PDEV structure. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + + If the operation fails, the method should call SetLastError to set an error code. + + +--*/ + +{ + VERBOSE(L"COemUni2::EnablePDEV() entry."); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pPrinterName); + UNREFERENCED_PARAMETER(cPatterns); + UNREFERENCED_PARAMETER(phsurfPatterns); + UNREFERENCED_PARAMETER(cjGdiInfo); + UNREFERENCED_PARAMETER(cjDevInfo); + + #ifndef DBG + UNREFERENCED_PARAMETER(pGdiInfo); + UNREFERENCED_PARAMETER(pDevInfo); + #endif + + // Allocate an instance of our private PDEV. + // + POEMPDEV pOemPDEV = new COemPDEV(); + *ppDevOem = pOemPDEV; + + if (NULL == pOemPDEV) + { + return E_FAIL; + } + + pOemPDEV->InitializeDDITable(pded); + + DBG_GDIINFO(DBG_VERBOSE, L"pGdiInfo", pGdiInfo); + DBG_DEVINFO(DBG_VERBOSE, L"pDevInfo", pDevInfo); + + pOemPDEV->bPreAnalysis = FALSE; // Initialize the pre-analysis flag + + return S_OK; +} + +HRESULT __stdcall +COemUni2:: +FilterGraphics( + PDEVOBJ pdevobj, + PBYTE pBuf, + DWORD dwLen + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::FilterGraphics + + The IPrintOemUni::FilterGraphics method can be used with + Unidrv-supported printers to modify scan line data and send + it to the spooler. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pBuf - pointer to a buffer containing scan line data to be printed. + dwLen - value representing the length, in bytes, of the data + pointed to by pBuf. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + DWORD dwResult; + + VERBOSE(L"COemUni2::FilterGraphics() entry."); + + m_pOEMHelp->DrvWriteSpoolBuf(pdevobj, pBuf, dwLen, &dwResult); + + if (dwResult == dwLen) + return S_OK; + else + return S_FALSE; +} + +HRESULT __stdcall +COemUni2:: +GetImplementedMethod( + _In_ PSTR pMethodName + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::GetImplementedMethod + + The IPrintOemUni::GetImplementedMethod method is used by + Unidrv to determine which IPrintOemUni interface methods + have been implemented by a rendering plug-in. + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::GetImplemented method. + + Please refer to DDK documentation for more details. + +Arguments: + + pMethodName - pointer to a string representing the name of an + IPrintOemUni interface method, such as "ImageProcessing" + for IPrintOemUni::ImageProcessing or "FilterGraphics" for + IPrintOemUni::FilterGraphics. + +Return Value: + + S_OK The operation succeeded (the specified method is implemented). + S_FALSE The operation failed (the specified method is not implemented). + + +--*/ + +{ + HRESULT Result = S_FALSE; + + VERBOSE(L"COemUni2::GetImplementedMethod() entry."); + VERBOSE(TEXT("\tCOemUni2::%hs: "), pMethodName); + + // Unidrv only calls GetImplementedMethod for optional + // methods. The required methods are assumed to be + // supported. + + // Return S_OK for supported function (i.e. implemented), + // and S_FALSE for functions that aren't supported (i.e. not implemented). + switch (*pMethodName) + { + case 'C': + if (!strcmp(NAME_CommandCallback, pMethodName)) + { + Result = S_OK; + } + break; + case 'F': + if (!strcmp(NAME_FilterGraphics, pMethodName)) + { + Result = S_OK; + } + break; + } + + VERBOSE(Result == S_OK ? TEXT("Supported\r\n") : TEXT("NOT supported\r\n")); + + return Result; +} + +HRESULT __stdcall +COemUni2:: +GetInfo( + DWORD dwMode, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::GetInfo + + A rendering plug-in's IPrintOemUni::GetInfo method returns + identification information. + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::GetInfo method. + + Please refer to DDK documentation for more details. + +Arguments: + + dwMode - Contains one of the following caller-supplied integer constants. + OEMGI_GETSIGNATURE - The method must return a unique four-byte + identification signature. The plug-in must also place this signature + in OPTITEM structures, as described in the description of the + OEMCUIPPARAM. structure's pOEMOptItems member. + OEMGI_GETVERSION - The method must return the user interface + plug-in's version number as a DWORD. The version format is + developer-defined. + pBuffer - pointer to memory allocated to receive the information specified + by dwInfo. + cbSize - size of the buffer pointed to by pBuffer. + pcbNeeded - pointer to a location to receive the number of bytes written + into the buffer pointed to by pBuffer. + +Return Value: + + S_OK The operation succeeded (the specified method is implemented). + S_FALSE The operation failed (the specified method is not implemented). + + +--*/ + +{ + PWSTR pszTag = L"COemUni2::GetInfo entry."; + + switch(dwMode) + { + case OEMGI_GETSIGNATURE: + pszTag = L"COemUni2::GetInfo entry. [OEMGI_GETSIGNATURE]"; + break; + case OEMGI_GETVERSION: + pszTag = L"COemUni2::GetInfo entry. [OEMGI_GETVERSION]"; + break; + } + + VERBOSE(pszTag); + + // Validate parameters. + if( (NULL == pcbNeeded) + || + ( (OEMGI_GETSIGNATURE != dwMode) + && + (OEMGI_GETVERSION != dwMode) ) ) + { + WARNING(DLLTEXT("COemUni2::GetInfo() exit pcbNeeded is NULL! ERROR_INVALID_PARAMETER.\r\n")); + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Set expected buffer size. + *pcbNeeded = sizeof(DWORD); + + // Check buffer size is sufficient. + if((cbSize < *pcbNeeded) || (NULL == pBuffer)) + { + VERBOSE(TEXT("COemUni2::GetInfo() exit insufficient buffer!\r\n")); + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return E_FAIL; + } + + switch(dwMode) + { + // OEM DLL Signature + case OEMGI_GETSIGNATURE: + *(PDWORD)pBuffer = OEM_SIGNATURE; + break; + + // OEM DLL version + case OEMGI_GETVERSION: + *(PDWORD)pBuffer = OEM_VERSION; + break; + + // dwMode not supported. + default: + // Set written bytes to zero since nothing was written. + WARNING(DLLTEXT("COemUni2::GetInfo() exit mode not supported.\r\n")); + *pcbNeeded = 0; + SetLastError(ERROR_NOT_SUPPORTED); + return E_FAIL; + } + + VERBOSE(TEXT("COemUni2::GetInfo() exit S_OK, (*pBuffer is %#x).\r\n"), *(PDWORD)pBuffer); + + return S_OK; +} + +HRESULT __stdcall +COemUni2:: +HalftonePattern( + PDEVOBJ pdevobj, + PBYTE pHTPattern, + DWORD dwHTPatternX, + DWORD dwHTPatternY, + DWORD dwHTNumPatterns, + DWORD dwCallbackID, + PBYTE pResource, + DWORD dwResourceSize + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::HalftonePattern + + The IPrintOemUni::HalftonePattern method can be used with + Unidrv-supported printers to create or modify a halftone + pattern before it is used in a halftoning operation. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pHTPattern - pointer to a buffer to receive the method-supplied + halftone pattern. Buffer size, in bytes, is: + (((dwHTPatternX * dwHTPatternY) + 3)/4) * 4 * dwHTNumPatterns. + dwHTPatternX - length, in pixels, of the halftone pattern, as specified + by the GPD file's *HTPatternSize attribute. + dwHTPatternY - height, in pixels, of the halftone pattern, as specified + by the GPD file's *HTPatternSize attribute. + dwHTNumPatterns - number of patterns, as specified by the GPD file's + *HTNumPatterns attribute. This can be 1 or 3. + dwCallbackID - value identifying the halftone method, as specified by + the GPD file's *HTCallbackID attribute. + pResource - pointer to a buffer containing a halftone pattern, as + specified by the GPD file's *rcHTPatternID attribute. This can be NULL. + dwResourceSize - size of the halftone pattern contained in the buffer + pointed to by pResource. This is zero if pResource is NULL. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + VERBOSE(L"COemUni2::HalftonePattern() entry."); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pHTPattern); + UNREFERENCED_PARAMETER(dwHTPatternX); + UNREFERENCED_PARAMETER(dwHTPatternY); + UNREFERENCED_PARAMETER(dwHTNumPatterns); + UNREFERENCED_PARAMETER(dwCallbackID); + UNREFERENCED_PARAMETER(pResource); + UNREFERENCED_PARAMETER(dwResourceSize); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +ImageProcessing( + PDEVOBJ pdevobj, + PBYTE pSrcBitmap, + PBITMAPINFOHEADER pBitmapInfoHeader, + PBYTE pColorTable, + DWORD dwCallbackID, + PIPPARAMS pIPParams, + OUT PBYTE *ppbResult + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::ImageProcessing + + The IPrintOemUni::ImageProcessing method can be used with + Unidrv-supported printers to modify image bitmap data, in order + to perform color formatting or halftoning. The method can return + the modified bitmap to Unidrv or send it directly to the print spooler. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pSrcBitmap - pointer to an input device-independent bitmap (DIB). + pBitmapInfoHeader - pointer to a BITMAPINFOHEADER structure + that describes the bitmap pointed to by pSrcBitmap. + pColorTable - pointer to a color table. Used only if the output format is + eight bits per pixel. + dwCallbackID - value assigned to the *IPCallbackID attribute of the + currently selected option for the ColorMode feature. + pIPParams - pointer to an IPPARAMS structure. + ppbResult - + If the method returns the converted DIB to Unidrv: + If the conversion succeeds, the method should return a + pointer to a buffer containing the converted DIB. + Otherwise it should return NULL. + If the method sends the converted DIB to the print spooler: + If the operation succeeds, the method should return TRUE. + Otherwise it should return FALSE. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + VERBOSE(L"COemUni2::ImageProcessing() entry."); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pSrcBitmap); + UNREFERENCED_PARAMETER(pBitmapInfoHeader); + UNREFERENCED_PARAMETER(pColorTable); + UNREFERENCED_PARAMETER(dwCallbackID); + UNREFERENCED_PARAMETER(pIPParams); + UNREFERENCED_PARAMETER(ppbResult); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +MemoryUsage( + PDEVOBJ pdevobj, + POEMMEMORYUSAGE pMemoryUsage + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::MemoryUsage + + The IPrintOemUni::MemoryUsage method can be used with + Unidrv-supported printers to specify the amount of memory + required for use by a rendering plug-in's IPrintOemUni::ImageProcessing + method. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pMemoryUsage - pointer to an OEMMEMORYUSAGE structure. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + VERBOSE(L"COemUni2::MemoryUsage() entry."); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pMemoryUsage); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +OutputCharStr( + PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + DWORD dwType, + DWORD dwCount, + PVOID pGlyph + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::OutputCharStr + + The IPrintOemUni::OutputCharStr method enables a rendering + plug-in to control the printing of font glyphs. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pUFObj - pointer to a UNIFONTOBJ structure. + dwType - value indicating the type of glyph specifier array + pointed to by pGlyph. Valid values are as follows: + TYPE_GLYPHHANDLE The pGlyph array elements are glyph + handles of type HGLYPH. + TYPE_GLYPHID The pGlyph array elements are glyph + identifiers of type DWORD. + dwCount - value representing the number of glyph specifiers in + the array pointed to by pGlyph. + pGlyph - pointer to an array of glyph specifiers, where the array + element type is indicated by dwType. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + VERBOSE(L"COemUni2::OutputCharStr() entry."); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pUFObj); + UNREFERENCED_PARAMETER(dwType); + UNREFERENCED_PARAMETER(dwCount); + UNREFERENCED_PARAMETER(pGlyph); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +PublishDriverInterface( + IUnknown *pIUnknown + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::PublishDriverInterface + + The IPrintOemUni::PublishDriverInterface method allows a + rendering plug-in for Unidrv to obtain the Unidrv driver's + IPrintOemDriverUni interface. + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::PublishDriverInterface method and the method + must return S_OK, or the driver will not call the plug-in's other + IPrintOemUni interface methods. + + Please refer to DDK documentation for more details. + +Arguments: + + pIUnknown - pointer to the IUnknown interface of the driver's + IPrintOemDriverUni COM interface. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + + +--*/ + +{ + VERBOSE(L"COemUni2::PublishDriverInterface() entry."); + + // Need to store pointer to Driver Helper functions, if we already haven't. + if (this->m_pOEMHelp == NULL) + { + HRESULT hResult; + + // Get Interface to Helper Functions. + hResult = pIUnknown->QueryInterface(IID_IPrintOemDriverUni, (void** ) &(this->m_pOEMHelp)); + + if(!SUCCEEDED(hResult)) + { + // Make sure that interface pointer reflects interface query failure. + this->m_pOEMHelp = NULL; + + return E_FAIL; + } + } + + return S_OK; +} + +HRESULT __stdcall +COemUni2:: +ResetPDEV( + PDEVOBJ pdevobjOld, + PDEVOBJ pdevobjNew + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::ResetPDEV + + A rendering plug-in's IPrintOemUni::ResetPDEV method performs + the same types of operations as the DrvResetPDEV function. During + the processing of an application's call to the Platform SDK ResetDC + function, the IPrintOemUni::ResetPDEV method is called by Unidrv's + DrvResetPDEV function. For more information about when DrvResetPDEV + is called, see its description in the DDK docs. + + The rendering plug-in's private PDEV structure's address is contained + in the pdevOEM member of the DEVOBJ structure pointed to by pdevobjOld. + The IPrintOemUni::ResetPDEV method should use relevant members of this + old structure to fill in the new structure, which is referenced through pdevobjNew. + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::ResetPDEV method. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobjOld - pointer to a DEVOBJ structure containing current PDEV information. + pdevobjNew - pointer to a DEVOBJ structure into which the method should place + new PDEV information. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + + +--*/ + +{ + VERBOSE(L"COemUni2::ResetPDEV() entry."); + + UNREFERENCED_PARAMETER(pdevobjOld); + UNREFERENCED_PARAMETER(pdevobjNew); + + return S_OK; +} + +HRESULT __stdcall +COemUni2:: +SendFontCmd( + PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + PFINVOCATION pFInv + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::SendFontCmd + + The IPrintOemUni::SendFontCmd method enables a rendering + plug-in to modify a printer's font selection command and then + send it to the printer. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pUFObj - pointer to a UNIFONTOBJ structure. + pFInv - pointer to an FINVOCATION structure. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + VERBOSE(L"COemUni2::SendFontCmd() entry."); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pUFObj); + UNREFERENCED_PARAMETER(pFInv); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +TextOutAsBitmap( + SURFOBJ *pso, + STROBJ *pstro, + FONTOBJ *pfo, + CLIPOBJ *pco, + RECTL *prclExtra, + RECTL *prclOpaque, + BRUSHOBJ *pboFore, + BRUSHOBJ *pboOpaque, + POINTL *pptlOrg, + MIX mix + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::TextOutAsBitmap + + The IPrintOemUni::TextOutAsBitmap method allows a rendering + plug-in to create a bitmap image of a text string, in case a + downloadable font is not available. + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Defines the surface on which to be written. + pstro - Defines the glyphs to be rendered and their positions + pfo - Specifies the font to be used + pco - Defines the clipping path + prclExtra - A NULL-terminated array of rectangles to be filled + prclOpaque - Specifies an opaque rectangle + pboFore - Defines the foreground brush + pboOpaque - Defines the opaque brush + pptlOrg - Pointer to POINT struct , defining th origin + mix - Specifies the foreground and background ROPs for pboFore + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + VERBOSE(L"COemUni2::TextOutAsBitmap() entry."); + + UNREFERENCED_PARAMETER(pso); + UNREFERENCED_PARAMETER(pstro); + UNREFERENCED_PARAMETER(pfo); + UNREFERENCED_PARAMETER(pco); + UNREFERENCED_PARAMETER(prclExtra); + UNREFERENCED_PARAMETER(prclOpaque); + UNREFERENCED_PARAMETER(pboFore); + UNREFERENCED_PARAMETER(pboOpaque); + UNREFERENCED_PARAMETER(pptlOrg); + UNREFERENCED_PARAMETER(mix); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +TTDownloadMethod( + PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + OUT DWORD *pdwResult + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::TTDownloadMethod + + The IPrintOemUni::TTDownloadMethod method enables a rendering + plug-in to indicate the format that Unidrv should use for a specified + TrueType soft font. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pUFObj - pointer to a UNIFONTOBJ structure. + pdwResult - Receives one of the following method-supplied constant values: + TTDOWNLOAD_BITMAP Unidrv should download the specified font as bitmaps. + TTDOWNLOAD_DONTCARE Unidrv can select the font format. + TTDOWNLOAD_GRAPHICS Unidrv should print TrueType fonts as graphics, + instead of downloading the font. + TTDOWNLOAD_TTOUTLINE Unidrv should download the specified font as outlines. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + VERBOSE(L"COemUni2::TTDownloadMethod() entry."); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pUFObj); + UNREFERENCED_PARAMETER(pdwResult); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +TTYGetInfo( + PDEVOBJ pdevobj, + DWORD dwInfoIndex, + PVOID pOutputBuf, + DWORD dwSize, + DWORD *pcbcNeeded + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::TTYGetInfo + + The IPrintOemUni::TTYGetInfo method enables a rendering plug-in + to supply Unidrv with information relevant to text-only printers. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + dwInfoIndex - constant identifying the type of information being requested. + The following constant values are defined: + OEMTTY_INFO_CODEPAGE - The pOutputBuf parameter points to a + DWORD in which the method should return the number of the + code page to be used. + OEMTTY_INFO_MARGINS - The pOutputBuf parameter points to a + RECT structure in which the method should return page margin + widths, in tenths of millimeters (for example, 20 represents 2 mm). + If the entire page is printable, all margin values must be 0. + OEMTTY_INFO_NUM_UFMS - The pOutputBuf parameter points to a + DWORD in which the method should return the number of resource + IDs of the UFMs for 10, 12, and 17 CPI fonts. To actually obtain + these resource IDs, perform a query using OEMTTY_INFO_UFM_IDS. + OEMTTY_INFO_UFM_IDS - The pOutputBuf parameter points to an array + of DWORDs of sufficient size to hold the number of resource IDs of + the UFMs for 10, 12, and 17 CPI fonts. (This number is obtained by + using OEMTTY_INFO_NUM_UFMS in a query.) The method should + return the resource IDs of the UFMs for 10,12, and 17 CPI fonts. + pOutputBuf - pointer to a buffer to receive the requested information. + dwSize - size, in bytes, of the buffer pointed to by pOutputBuf. + pcbcNeeded - pointer to a location to receive the number of bytes written into + the buffer pointed to by pOutputBuf. If the number of bytes required is + smaller than the number specified by dwSize, the method should supply + the required size and return E_FAIL. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + VERBOSE(L"COemUni2::TTYGetInfo() entry."); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(dwInfoIndex); + UNREFERENCED_PARAMETER(pOutputBuf); + UNREFERENCED_PARAMETER(dwSize); + UNREFERENCED_PARAMETER(pcbcNeeded); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +WritePrinter( + PDEVOBJ pdevobj, + PVOID pBuf, + DWORD cbBuffer, + PDWORD pcbWritten + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni2::WritePrinter + + The IPrintOemUni2::WritePrinter method, if supported, enables a + rendering plug-in to capture all output data generated by a Unidrv + driver. If this method is not supported, the output data would + otherwise be sent to the spooler in a call to the spooler's WritePrinter API. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pBuf - pointer to the first byte of an array of bytes that contains + the output data generated by the Unidrv driver. + cbBuffer - size, in bytes, of the array pointed to by pBuf. + pcbWritten - pointer to a DWORD value that receives the number + of bytes of data that were successfully sent to the plug-in. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + VERBOSE(L"COemUni2::WritePrinter() entry."); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pBuf); + UNREFERENCED_PARAMETER(cbBuffer); + UNREFERENCED_PARAMETER(pcbWritten); + + return E_NOTIMPL; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// oem class factory +// +class COemCF : public IClassFactory +{ +public: + // *** IUnknown methods *** + STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef)(THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release)(THIS); + + // *** IClassFactory methods *** + STDMETHOD(CreateInstance)(THIS_ + LPUNKNOWN pUnkOuter, + REFIID riid, + LPVOID FAR* ppvObject); + STDMETHOD(LockServer)(THIS_ BOOL bLock); + + + // Constructor + COemCF(): m_cRef(1) { }; + + // Destructor + ~COemCF() { }; + +protected: + LONG m_cRef; + +}; + +/////////////////////////////////////////////////////////// +// +// Class factory body +// +HRESULT __stdcall +COemCF:: +QueryInterface( + const IID& iid, + void** ppv) +{ + VERBOSE(L"COemCF::QueryInterface entry."); + if ((iid == IID_IUnknown) || (iid == IID_IClassFactory)) + { + *ppv = static_cast<COemCF*>(this); + } + else + { + *ppv = NULL; +#if DBG && defined(USERMODE_DRIVER) + TCHAR szOutput[80] = {0}; + StringFromGUID2(iid, szOutput, _countof(szOutput)); // can not fail! + VERBOSE(TEXT("COemCF::QueryInterface %s not supported.\r\n"), szOutput); +#endif + return E_NOINTERFACE; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef(); + return S_OK; +} + +ULONG __stdcall +COemCF:: +AddRef() +{ + return InterlockedIncrement(&m_cRef); +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall +COemCF:: +Release() +{ +// ASSERT( 0 != m_cRef); + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + } + return cRef; +} + +// IClassFactory implementation +HRESULT __stdcall +COemCF:: +CreateInstance( + IUnknown* pUnknownOuter, + const IID& iid, + void** ppv) +{ + VERBOSE(L"Class factory:Create component."); + + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Cannot aggregate. + if (pUnknownOuter != NULL) + { + return CLASS_E_NOAGGREGATION; + } + + // Create component. + COemUni2* pOemCP = new COemUni2; + if (pOemCP == NULL) + { + return E_OUTOFMEMORY; + } + + // Get the requested interface. + HRESULT hr = pOemCP->QueryInterface(iid, ppv); + + // Release the IUnknown pointer. + // (If QueryInterface failed, component will delete itself.) + pOemCP->Release(); + return hr; +} + +// LockServer +HRESULT __stdcall +COemCF:: +LockServer( + BOOL bLock + ) +{ + if (bLock) + { + InterlockedIncrement(&g_cServerLocks); + } + else + { + InterlockedDecrement(&g_cServerLocks); + } + return S_OK; +} + + +// +// Registration functions +// + +// +// Can DLL unload now? +// +STDAPI DllCanUnloadNow(void) +{ + VERBOSE(L"DllCanUnloadNow entry."); + + // + // To avoid leaving OEM DLL still in memory when Unidrv or Pscript drivers + // are unloaded, Unidrv and Pscript driver ignore the return value of + // DllCanUnloadNow of the OEM DLL, and always call FreeLibrary on the OEMDLL. + // + // If OEM DLL spins off a working thread that also uses the OEM DLL, the + // thread needs to call LoadLibrary and FreeLibraryAndExitThread, otherwise + // it may crash after Unidrv or Pscript calls FreeLibrary. + // + + if ((g_cComponents == 0) && (g_cServerLocks == 0)) + { + return S_OK; + } + else + { + return S_FALSE; + } +} + +// +// Get class factory +// +STDAPI DllGetClassObject( + _In_ REFCLSID clsid, + _In_ REFIID iid, + _Outptr_ LPVOID* ppv + ) +{ + VERBOSE(L"DllGetClassObject:\tCreate class factory."); + + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Can we create this component? + if (clsid != CLSID_OEMRENDER) + { + ERR(ERRORTEXT("DllGetClassObject:\tClass not available!\r\n")); + return CLASS_E_CLASSNOTAVAILABLE; + } + + // Create class factory. + COemCF* pFontCF = new COemCF; // Reference count set to 1 in constructor + if (pFontCF == NULL) + { + ERR(ERRORTEXT("DllGetClassObject:\tOut of Memory!\r\n")); + return E_OUTOFMEMORY; + } + + // Get requested interface. + HRESULT hrResult = pFontCF->QueryInterface(iid, ppv); + pFontCF->Release(); + + return hrResult; +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemprean/intrface.h b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/intrface.h new file mode 100644 index 00000000..28b2a82f --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/intrface.h @@ -0,0 +1,288 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Intrface.H +// +// +// PURPOSE: Define COM interface for User Mode Printer Customization DLL. +// +// History: +// 06/26/03 xxx created. +// +// + +#pragma once + +///////////////////////////////////////////////////////// +// String Literals +///////////////////////////////////////////////////////// + +CONST CHAR NAME_CommandCallback[] = "CommandCallback"; +CONST CHAR NAME_FilterGraphics[] = "FilterGraphics"; + +//////////////////////////////////////////////////////////////////////////////// +// +// COemUni2 +// +// Interface for Unidrv OEM sample rendering module +// +class COemUni2 : public IPrintOemUni2 +{ +public: + // *** IUnknown methods *** + + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release) (THIS); + + // + // Method for publishing Driver interface. + // + STDMETHOD(PublishDriverInterface)(THIS_ IUnknown *pIUnknown); + + // + // Method for getting the implemented methods. + // Returns S_OK if the given method is implemneted. + // Returns S_FALSE if the given method is notimplemneted. + // + + STDMETHOD(GetImplementedMethod)(THIS_ _In_ PSTR pMethodName); + + // + // Method for OEM to specify DDIs that have been hooked + // + + STDMETHOD(EnableDriver) (THIS_ DWORD DriverVersion, + DWORD cbSize, + PDRVENABLEDATA pded); + + // + // Method to notify OEM plugin that it is no longer required + // + + STDMETHOD(DisableDriver) (THIS); + + // + // Method for OEM plugin to contruct its own PDEV + // + + STDMETHOD(EnablePDEV)(THIS_ PDEVOBJ pdevobj, + _In_ PWSTR pPrinterName, + ULONG cPatterns, + HSURF *phsurfPatterns, + ULONG cjGdiInfo, + GDIINFO *pGdiInfo, + ULONG cjDevInfo, + DEVINFO *pDevInfo, + DRVENABLEDATA *pded, + OUT PDEVOEM *pDevOem); + + // + // Method for OEM to free any resource associated with its PDEV + // + + STDMETHOD(DisablePDEV)(THIS_ PDEVOBJ pdevobj); + + // + // Method for OEM to transfer from old PDEV to new PDEV + // + + STDMETHOD(ResetPDEV)(THIS_ PDEVOBJ pdevobjOld, + PDEVOBJ pdevobjNew); + + // + // Get OEM dll related information + // + + STDMETHOD(GetInfo)(THIS_ DWORD dwMode, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded); + + // + // OEMDriverDMS - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(DriverDMS)(THIS_ PVOID pDevObj, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded); + + // + // OEMDevMode + // + + STDMETHOD(DevMode)(THIS_ DWORD dwMode, + POEMDMPARAM pOemDMParam); + + // + // OEMCommandCallback - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(CommandCallback)(THIS_ PDEVOBJ pdevobj, + DWORD dwCallbackID, + DWORD dwCount, + PDWORD pdwParams, + OUT INT *piResult); + + // + // OEMImageProcessing - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(ImageProcessing)(THIS_ PDEVOBJ pdevobj, + PBYTE pSrcBitmap, + PBITMAPINFOHEADER pBitmapInfoHeader, + PBYTE pColorTable, + DWORD dwCallbackID, + PIPPARAMS pIPParams, + OUT PBYTE *ppbResult); + + // + // OEMFilterGraphics - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(FilterGraphics)(THIS_ PDEVOBJ pdevobj, + PBYTE pBuf, + DWORD dwLen); + // + // OEMCompression - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(Compression)(THIS_ PDEVOBJ pdevobj, + PBYTE pInBuf, + PBYTE pOutBuf, + DWORD dwInLen, + DWORD dwOutLen, + OUT INT *piResult); + + // + // OEMHalftone - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(HalftonePattern)(THIS_ PDEVOBJ pdevobj, + PBYTE pHTPattern, + DWORD dwHTPatternX, + DWORD dwHTPatternY, + DWORD dwHTNumPatterns, + DWORD dwCallbackID, + PBYTE pResource, + DWORD dwResourceSize); + + // + // OEMMemoryUsage - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(MemoryUsage)(THIS_ PDEVOBJ pdevobj, + POEMMEMORYUSAGE pMemoryUsage); + + // + // OEMTTYGetInfo - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(TTYGetInfo)(THIS_ PDEVOBJ pdevobj, + DWORD dwInfoIndex, + PVOID pOutputBuf, + DWORD dwSize, + DWORD *pcbcNeeded); + + // + // OEMDownloadFontheader - UNIDRV only + // + + STDMETHOD(DownloadFontHeader)(THIS_ PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + OUT DWORD *pdwResult); + + // + // OEMDownloadCharGlyph - UNIDRV only + // + + STDMETHOD(DownloadCharGlyph)(THIS_ PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + HGLYPH hGlyph, + PDWORD pdwWidth, + OUT DWORD *pdwResult); + + // + // OEMTTDownloadMethod - UNIDRV only + // + + STDMETHOD(TTDownloadMethod)(THIS_ PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + OUT DWORD *pdwResult); + + // + // OEMOutputCharStr - UNIDRV only + // + + STDMETHOD(OutputCharStr)(THIS_ PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + DWORD dwType, + DWORD dwCount, + PVOID pGlyph); + + // + // OEMSendFontCmd - UNIDRV only + // + + + STDMETHOD(SendFontCmd)(THIS_ PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + PFINVOCATION pFInv); + + // + // OEMTextOutAsBitmap - UNIDRV only + // + + STDMETHOD(TextOutAsBitmap)(THIS_ SURFOBJ *pso, + STROBJ *pstro, + FONTOBJ *pfo, + CLIPOBJ *pco, + RECTL *prclExtra, + RECTL *prclOpaque, + BRUSHOBJ *pboFore, + BRUSHOBJ *pboOpaque, + POINTL *pptlOrg, + MIX mix); + + // + // IPrintOemUni2 methods + // + + // + // Method for plugin to hook out spooler's WritePrinter API so it + // can get access to output data Universal driver is generating + // + // At DrvEnablePDEV time, Universal driver will call this function with + // pdevobj = NULL, pBuf = NULL, cbBuffer = 0 to detect if the plugin + // implements this function. Plugin should return S_OK to indicate it is + // implementing this function, or return E_NOTIMPL otherwise. + // + // In pcbWritten, plugins should return the number of bytes written to the + // spooler's WritePrinter function. Zero doesn't carry a special meaning, + // errors must be reported through the returned HRESULT. + // + + STDMETHOD(WritePrinter)(THIS_ PDEVOBJ pdevobj, + PVOID pBuf, + DWORD cbBuffer, + PDWORD pcbWritten); + + + COemUni2(); + ~COemUni2(); + +protected: + LONG m_cRef; + IPrintOemDriverUni* m_pOEMHelp; +}; + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemprean/oemprean.def b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/oemprean.def new file mode 100644 index 00000000..a9534822 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/oemprean.def @@ -0,0 +1,3 @@ +LIBRARY OEMPREAN +EXPORTS DllGetClassObject PRIVATE + DllCanUnloadNow PRIVATE diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemprean/oemprean.h b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/oemprean.h new file mode 100644 index 00000000..f8fa44a7 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/oemprean.h @@ -0,0 +1,259 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: OEMUNI.H +// +// +// PURPOSE: Define the COemPDEV class which stores the private +// PDEV for the driver. +// +// +// Functions: +// COemPDEV constructor and destructor +// COemPDEV::InitializeDDITable +// COemPDEV::_SavePFN +// COemPDEV::_ResetPointers +// +// History: +// 06/24/03 xxx created. +// +// + +#pragma once + +#include "debug.h" + +#define OEM_SIGNATURE 'MSFT' +#define OEM_VERSION 0x00000001L + +#define DLLTEXT(s) TEXT("OEMUNI: ") TEXT(s) +#define ERRORTEXT(s) TEXT("ERROR ") DLLTEXT(s) + +class COemPDEV +{ +public: + __stdcall COemPDEV(void) + { + + // Note that since our parent has AddRef'd the UNIDRV interface, + // we don't do so here since our scope is identical to our + // parent. + // + + VERBOSE(L"In COemPDEV constructor..."); + + _ResetPointers(); + } + + __stdcall ~COemPDEV(void) + { + VERBOSE(L"In COemPDEV destructor..."); + } + + void __stdcall InitializeDDITable(DRVENABLEDATA* pded) + { + VERBOSE(L"COemPDEV::InitializeDDITable entry."); + + UINT iDrvFn; + UINT cDrvFn = pded->c; + PDRVFN pDrvFn = pded->pdrvfn; + + for (iDrvFn = 0; iDrvFn < cDrvFn; ++iDrvFn, ++pDrvFn) + { + _SavePFN(pDrvFn->iFunc, pDrvFn->pfn); + } + } + +private: + + void __stdcall _SavePFN(ULONG uFunc, PFN pfn) + { + + // Note: if a "pass-through" driver is being constructed, then + // there is nothing for this method to do. So, to keep the + // compiler from complaining about a switch with no case + // statements, but which has a default statement, we surround + // the entire construct with preprocessor controls. + // + switch(uFunc) + { + // The following are the page/band related DDI hooks. + // + + case INDEX_DrvStartDoc: + m_pfnDrvStartDoc = (PFN_DrvStartDoc)pfn; + break; + case INDEX_DrvEndDoc: + m_pfnDrvEndDoc = (PFN_DrvEndDoc)pfn; + break; + case INDEX_DrvStartPage: + m_pfnDrvStartPage = (PFN_DrvStartPage)pfn; + break; + case INDEX_DrvSendPage: + m_pfnDrvSendPage = (PFN_DrvSendPage)pfn; + break; + case INDEX_DrvStartBanding: + m_pfnDrvStartBanding = (PFN_DrvStartBanding)pfn; + break; + case INDEX_DrvNextBand: + m_pfnDrvNextBand = (PFN_DrvNextBand)pfn; + break; + case INDEX_DrvEscape: + m_pfnDrvEscape = (PFN_DrvEscape)pfn; + break; + + // The following are the drawing related DDI hooks. + // + case INDEX_DrvAlphaBlend: + m_pfnDrvAlphaBlend = (PFN_DrvAlphaBlend)pfn; + break; + case INDEX_DrvBitBlt: + m_pfnDrvBitBlt = (PFN_DrvBitBlt)pfn; + break; + case INDEX_DrvCopyBits: + m_pfnDrvCopyBits = (PFN_DrvCopyBits)pfn; + break; + case INDEX_DrvDitherColor: + m_pfnDrvDitherColor = (PFN_DrvDitherColor)pfn; + break; + case INDEX_DrvFillPath: + m_pfnDrvFillPath = (PFN_DrvFillPath)pfn; + break; + case INDEX_DrvFontManagement: + m_pfnDrvFontManagement = (PFN_DrvFontManagement)pfn; + break; + case INDEX_DrvGetGlyphMode: + m_pfnDrvGetGlyphMode = (PFN_DrvGetGlyphMode)pfn; + break; + case INDEX_DrvGradientFill: + m_pfnDrvGradientFill = (PFN_DrvGradientFill)pfn; + break; + case INDEX_DrvLineTo: + m_pfnDrvLineTo = (PFN_DrvLineTo)pfn; + break; + case INDEX_DrvPaint: + m_pfnDrvPaint = (PFN_DrvPaint)pfn; + break; + case INDEX_DrvPlgBlt: + m_pfnDrvPlgBlt = (PFN_DrvPlgBlt)pfn; + break; + case INDEX_DrvQueryAdvanceWidths: + m_pfnDrvQueryAdvanceWidths = (PFN_DrvQueryAdvanceWidths)pfn; + break; + case INDEX_DrvQueryFont: + m_pfnDrvQueryFont = (PFN_DrvQueryFont)pfn; + break; + case INDEX_DrvQueryFontData: + m_pfnDrvQueryFontData = (PFN_DrvQueryFontData)pfn; + break; + case INDEX_DrvQueryFontTree: + m_pfnDrvQueryFontTree = (PFN_DrvQueryFontTree)pfn; + break; + case INDEX_DrvRealizeBrush: + m_pfnDrvRealizeBrush = (PFN_DrvRealizeBrush)pfn; + break; + case INDEX_DrvStretchBlt: + m_pfnDrvStretchBlt = (PFN_DrvStretchBlt)pfn; + break; + case INDEX_DrvStretchBltROP: + m_pfnDrvStretchBltROP = (PFN_DrvStretchBltROP)pfn; + break; + case INDEX_DrvStrokeAndFillPath: + m_pfnDrvStrokeAndFillPath = (PFN_DrvStrokeAndFillPath)pfn; + break; + case INDEX_DrvStrokePath: + m_pfnDrvStrokePath = (PFN_DrvStrokePath)pfn; + break; + case INDEX_DrvTextOut: + m_pfnDrvTextOut = (PFN_DrvTextOut)pfn; + break; + case INDEX_DrvTransparentBlt: + m_pfnDrvTransparentBlt = (PFN_DrvTransparentBlt)pfn; + break; + + } // switch(uFunc) + } + + void __stdcall _ResetPointers(void) + { + m_pfnDrvAlphaBlend = NULL; + m_pfnDrvBitBlt = NULL; + m_pfnDrvCopyBits = NULL; + m_pfnDrvDitherColor = NULL; + m_pfnDrvEndDoc = NULL; + m_pfnDrvEscape = NULL; + m_pfnDrvFillPath = NULL; + m_pfnDrvFontManagement = NULL; + m_pfnDrvGetGlyphMode = NULL; + m_pfnDrvGradientFill = NULL; + m_pfnDrvLineTo = NULL; + m_pfnDrvNextBand = NULL; + m_pfnDrvPaint = NULL; + m_pfnDrvPlgBlt = NULL; + m_pfnDrvQueryAdvanceWidths = NULL; + m_pfnDrvQueryFont = NULL; + m_pfnDrvQueryFontData = NULL; + m_pfnDrvQueryFontTree = NULL; + m_pfnDrvRealizeBrush = NULL; + m_pfnDrvSendPage = NULL; + m_pfnDrvStartBanding = NULL; + m_pfnDrvStartDoc = NULL; + m_pfnDrvStartPage = NULL; + m_pfnDrvStretchBlt = NULL; + m_pfnDrvStretchBltROP = NULL; + m_pfnDrvStrokeAndFillPath = NULL; + m_pfnDrvStrokePath = NULL; + m_pfnDrvTextOut = NULL; + m_pfnDrvTransparentBlt = NULL; + } + +public: + + // Unidrv function pointers so that we can punt + // back from the DDI hooks + // + PFN_DrvAlphaBlend m_pfnDrvAlphaBlend; + PFN_DrvBitBlt m_pfnDrvBitBlt; + PFN_DrvCopyBits m_pfnDrvCopyBits; + PFN_DrvDitherColor m_pfnDrvDitherColor; + PFN_DrvEndDoc m_pfnDrvEndDoc; + PFN_DrvEscape m_pfnDrvEscape; + PFN_DrvFillPath m_pfnDrvFillPath; + PFN_DrvFontManagement m_pfnDrvFontManagement; + PFN_DrvGetGlyphMode m_pfnDrvGetGlyphMode; + PFN_DrvGradientFill m_pfnDrvGradientFill; + PFN_DrvLineTo m_pfnDrvLineTo; + PFN_DrvNextBand m_pfnDrvNextBand; + PFN_DrvPaint m_pfnDrvPaint; + PFN_DrvPlgBlt m_pfnDrvPlgBlt; + PFN_DrvQueryAdvanceWidths m_pfnDrvQueryAdvanceWidths; + PFN_DrvQueryFont m_pfnDrvQueryFont; + PFN_DrvQueryFontData m_pfnDrvQueryFontData; + PFN_DrvQueryFontTree m_pfnDrvQueryFontTree; + PFN_DrvRealizeBrush m_pfnDrvRealizeBrush; + PFN_DrvSendPage m_pfnDrvSendPage; + PFN_DrvStartBanding m_pfnDrvStartBanding; + PFN_DrvStartDoc m_pfnDrvStartDoc; + PFN_DrvStartPage m_pfnDrvStartPage; + PFN_DrvStretchBlt m_pfnDrvStretchBlt; + PFN_DrvStretchBltROP m_pfnDrvStretchBltROP; + PFN_DrvStrokeAndFillPath m_pfnDrvStrokeAndFillPath; + PFN_DrvStrokePath m_pfnDrvStrokePath; + PFN_DrvTextOut m_pfnDrvTextOut; + PFN_DrvTransparentBlt m_pfnDrvTransparentBlt; + + /*******************************************/ + /* */ + /* Add any custom PDEV members here */ + /* */ + /*******************************************/ + + BOOL bPreAnalysis; // Indicates if a current pass is the pre-analysis pass + +}; +typedef COemPDEV* POEMPDEV; + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemprean/oemprean.rc b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/oemprean.rc new file mode 100644 index 00000000..875705f1 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/oemprean.rc @@ -0,0 +1,110 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "Written by DDK Support Team\0" + VALUE "CompanyName", "Microsoft Corp.\0" + VALUE "FileDescription", "OEM Pre-Analysis Sample\0" + VALUE "FileVersion", "1, 0, 0, 1\0" + VALUE "InternalName", "OEMPREAN\0" + VALUE "LegalCopyright", "Copyright � 1998-2003\0" + VALUE "LegalTrademarks", "Microsoft� is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation\0" + VALUE "OriginalFilename", "OEMPREAN.DLL\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "Microsoft OEMPREAN\0" + VALUE "ProductVersion", "1.0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // !_MAC + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemprean/oemprean.vcxproj b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/oemprean.vcxproj new file mode 100644 index 00000000..b1ff3191 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/oemprean.vcxproj @@ -0,0 +1,1096 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Win10 Debug|ARM64"> + <Configuration>Win10 Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|Win32"> + <Configuration>Win10 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|x64"> + <Configuration>Win10 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|ARM64"> + <Configuration>Win10 Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|Win32"> + <Configuration>Win10 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|x64"> + <Configuration>Win10 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|Win32"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|Win32"> + <Configuration>Win8 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|Win32"> + <Configuration>Win7 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|Win32"> + <Configuration>Win8.1 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|Win32"> + <Configuration>Win8 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|Win32"> + <Configuration>Win7 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|x64"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|x64"> + <Configuration>Win8 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|x64"> + <Configuration>Win7 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|x64"> + <Configuration>Win8.1 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|x64"> + <Configuration>Win8 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|x64"> + <Configuration>Win7 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{D5E225D5-EEEA-45FD-AD07-E4678C542E1A}</ProjectGuid> + <RootNamespace>$(MSBuildProjectName)</RootNamespace> + <Configuration Condition="'$(Configuration)' == ''">Win10 Debug</Configuration> + <Platform Condition="'$(Platform)' == ''">Win32</Platform> + <SampleGuid>{179B20BC-0106-4AEE-814D-8E6C0FD66347}</SampleGuid> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <PropertyGroup> + <OutDir>$(IntDir)</OutDir> + </PropertyGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ItemGroup Label="WrappedTaskItems" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetName>oemprean</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetName>oemprean</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetName>oemprean</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <TargetName>oemprean</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <TargetName>oemprean</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetName>oemprean</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetName>oemprean</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetName>oemprean</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <TargetName>oemprean</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <TargetName>oemprean</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetName>oemprean</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetName>oemprean</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetName>oemprean</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <TargetName>oemprean</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetName>oemprean</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetName>oemprean</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetName>oemprean</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <TargetName>oemprean</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Link> + <ModuleDefinitionFile>oemprean.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Link> + <ModuleDefinitionFile>oemprean.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Link> + <ModuleDefinitionFile>oemprean.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <Link> + <ModuleDefinitionFile>oemprean.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <Link> + <ModuleDefinitionFile>oemprean.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Link> + <ModuleDefinitionFile>oemprean.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Link> + <ModuleDefinitionFile>oemprean.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Link> + <ModuleDefinitionFile>oemprean.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <Link> + <ModuleDefinitionFile>oemprean.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <Link> + <ModuleDefinitionFile>oemprean.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Link> + <ModuleDefinitionFile>oemprean.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Link> + <ModuleDefinitionFile>oemprean.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Link> + <ModuleDefinitionFile>oemprean.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <Link> + <ModuleDefinitionFile>oemprean.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>oemprean.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>oemprean.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>oemprean.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>oemprean.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="ddihook.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="debug.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="devmode.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="dllentry.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Create</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ResourceCompile Include="oemprean.rc" /> + </ItemGroup> + <ItemGroup> + <Inf Exclude="@(Inf)" Include="*.inf" /> + <FilesToPackage Include="$(TargetPath)" Condition="'$(ConfigurationType)'=='Driver' or '$(ConfigurationType)'=='DynamicLibrary'" /> + </ItemGroup> + <ItemGroup> + <None Exclude="@(None)" Include="*.txt;*.htm;*.html" /> + <None Exclude="@(None)" Include="*.ico;*.cur;*.bmp;*.dlg;*.rct;*.gif;*.jpg;*.jpeg;*.wav;*.jpe;*.tiff;*.tif;*.png;*.rc2" /> + <None Exclude="@(None)" Include="*.def;*.bat;*.hpj;*.asmx" /> + </ItemGroup> + <ItemGroup> + <ClInclude Exclude="@(ClInclude)" Include="*.h;*.hpp;*.hxx;*.hm;*.inl;*.xsd" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemprean/oemprean.vcxproj.Filters b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/oemprean.vcxproj.Filters new file mode 100644 index 00000000..eae4ad4e --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/oemprean.vcxproj.Filters @@ -0,0 +1,177 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;*</Extensions> + <UniqueIdentifier>{846460B0-CFA8-4A48-BE85-411A0055B60C}</UniqueIdentifier> + </Filter> + <Filter Include="Header Files"> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + <UniqueIdentifier>{B95DE626-65CE-4B7F-A90F-6094DB24D175}</UniqueIdentifier> + </Filter> + <Filter Include="Resource Files"> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms;man;xml</Extensions> + <UniqueIdentifier>{3E039E41-E6A5-4CB3-8B97-DBE76450B55B}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClCompile Include="ddihook.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="debug.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="devmode.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="dllentry.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemprean.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemprean.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemprean.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemprean.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemprean.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemprean.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemprean.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemprean.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemprean.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemprean.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemprean.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemprean.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemprean.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemprean.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemprean.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemprean.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="oemprean.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> + <ItemGroup> + <None Include="oemprean.def"> + <Filter>Source Files</Filter> + </None> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemprean/precomp.h b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/precomp.h new file mode 100644 index 00000000..3bfba083 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/precomp.h @@ -0,0 +1,49 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: precomp.h +// +// PURPOSE: Consolidate common headers that do not change frequently. +// +// History: +// 06/24/03 xxx created. +// +// + +#pragma once + +// Necessary for compiling under VC. +#if(!defined(WINVER) || (WINVER < 0x0500)) + #undef WINVER + #define WINVER 0x0500 +#endif +#if(!defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500)) + #undef _WIN32_WINNT + #define _WIN32_WINNT 0x0500 +#endif + +// Required header files that shouldn't change often. + +#include <STDDEF.H> +#include <STDLIB.H> +#include <OBJBASE.H> +#include <STDARG.H> +#include <STDIO.H> +#include <WINDEF.H> +#include <WINERROR.H> +#include <WINBASE.H> +#include <WINGDI.H> +#include <WINDDI.H> +#include <TCHAR.H> +#include <EXCPT.H> +#include <ASSERT.H> +#include <PRINTOEM.H> + +// StrSafe.h needs to be included last +// to disallow unsafe string functions. +#include <STRSAFE.H> + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemprean/precompsrc.cpp b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/precompsrc.cpp new file mode 100644 index 00000000..5944cf51 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/precompsrc.cpp @@ -0,0 +1 @@ +#include "precomp.h"
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemprean/resource.h b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/resource.h new file mode 100644 index 00000000..8e941820 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/resource.h @@ -0,0 +1,17 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by OEMUNI.rc +// + + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 103 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemps.ini b/print/OEM Printer Customization Plug-in Samples/C++/oemps.ini new file mode 100644 index 00000000..7ad0e62a --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemps.ini @@ -0,0 +1,3 @@ +[OEMFiles] +OEMDriverFile1=OEMPS.DLL + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemps/OEMPS.rc b/print/OEM Printer Customization Plug-in Samples/C++/oemps/OEMPS.rc new file mode 100644 index 00000000..49008d4c --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemps/OEMPS.rc @@ -0,0 +1,109 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "Written by Windows Printing & Imaging Team\0" + VALUE "CompanyName", "Microsoft Corp.\0" + VALUE "FileDescription", "OEM Customization Sample\0" + VALUE "FileVersion", "1, 0, 0, 1\0" + VALUE "InternalName", "OEMPS\0" + VALUE "LegalCopyright", "Copyright � 1998-2003\0" + VALUE "LegalTrademarks", "Microsoft� is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation\0" + VALUE "OriginalFilename", "OEMPS.DLL\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "Microsoft OEMPS\0" + VALUE "ProductVersion", "1.0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // !_MAC + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemps/OEMPS.vcxproj b/print/OEM Printer Customization Plug-in Samples/C++/oemps/OEMPS.vcxproj new file mode 100644 index 00000000..c30249a8 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemps/OEMPS.vcxproj @@ -0,0 +1,1096 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Win10 Debug|ARM64"> + <Configuration>Win10 Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|Win32"> + <Configuration>Win10 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|x64"> + <Configuration>Win10 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|ARM64"> + <Configuration>Win10 Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|Win32"> + <Configuration>Win10 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|x64"> + <Configuration>Win10 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|Win32"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|Win32"> + <Configuration>Win8 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|Win32"> + <Configuration>Win7 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|Win32"> + <Configuration>Win8.1 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|Win32"> + <Configuration>Win8 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|Win32"> + <Configuration>Win7 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|x64"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|x64"> + <Configuration>Win8 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|x64"> + <Configuration>Win7 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|x64"> + <Configuration>Win8.1 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|x64"> + <Configuration>Win8 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|x64"> + <Configuration>Win7 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{9F374241-B8F9-45D3-B163-7E84E8E22C1F}</ProjectGuid> + <RootNamespace>$(MSBuildProjectName)</RootNamespace> + <Configuration Condition="'$(Configuration)' == ''">Win10 Debug</Configuration> + <Platform Condition="'$(Platform)' == ''">Win32</Platform> + <SampleGuid>{143DF0A4-9C2F-48FB-A070-C9D9465D83B2}</SampleGuid> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <PropertyGroup> + <OutDir>$(IntDir)</OutDir> + </PropertyGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ItemGroup Label="WrappedTaskItems" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetName>OEMPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetName>OEMPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetName>OEMPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <TargetName>OEMPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <TargetName>OEMPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetName>OEMPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetName>OEMPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetName>OEMPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <TargetName>OEMPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <TargetName>OEMPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetName>OEMPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetName>OEMPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetName>OEMPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <TargetName>OEMPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetName>OEMPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetName>OEMPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetName>OEMPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <TargetName>OEMPS</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Link> + <ModuleDefinitionFile>OEMPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Link> + <ModuleDefinitionFile>OEMPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Link> + <ModuleDefinitionFile>OEMPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <Link> + <ModuleDefinitionFile>OEMPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <Link> + <ModuleDefinitionFile>OEMPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Link> + <ModuleDefinitionFile>OEMPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Link> + <ModuleDefinitionFile>OEMPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Link> + <ModuleDefinitionFile>OEMPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <Link> + <ModuleDefinitionFile>OEMPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <Link> + <ModuleDefinitionFile>OEMPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Link> + <ModuleDefinitionFile>OEMPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Link> + <ModuleDefinitionFile>OEMPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Link> + <ModuleDefinitionFile>OEMPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <Link> + <ModuleDefinitionFile>OEMPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>OEMPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>OEMPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>OEMPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>OEMPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="command.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="ddihook.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="devmode.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="dllentry.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Create</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ResourceCompile Include="oemps.rc" /> + </ItemGroup> + <ItemGroup> + <Inf Exclude="@(Inf)" Include="*.inf" /> + <FilesToPackage Include="$(TargetPath)" Condition="'$(ConfigurationType)'=='Driver' or '$(ConfigurationType)'=='DynamicLibrary'" /> + </ItemGroup> + <ItemGroup> + <None Exclude="@(None)" Include="*.txt;*.htm;*.html" /> + <None Exclude="@(None)" Include="*.ico;*.cur;*.bmp;*.dlg;*.rct;*.gif;*.jpg;*.jpeg;*.wav;*.jpe;*.tiff;*.tif;*.png;*.rc2" /> + <None Exclude="@(None)" Include="*.def;*.bat;*.hpj;*.asmx" /> + </ItemGroup> + <ItemGroup> + <ClInclude Exclude="@(ClInclude)" Include="*.h;*.hpp;*.hxx;*.hm;*.inl;*.xsd" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemps/OEMPS.vcxproj.Filters b/print/OEM Printer Customization Plug-in Samples/C++/oemps/OEMPS.vcxproj.Filters new file mode 100644 index 00000000..6935f366 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemps/OEMPS.vcxproj.Filters @@ -0,0 +1,220 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;*</Extensions> + <UniqueIdentifier>{CFF33BBA-FC87-4E95-B9C5-476E1462EEBF}</UniqueIdentifier> + </Filter> + <Filter Include="Header Files"> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + <UniqueIdentifier>{9BFF3627-E67C-4BAB-A7A6-BCE2D1B5C993}</UniqueIdentifier> + </Filter> + <Filter Include="Resource Files"> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms;man;xml</Extensions> + <UniqueIdentifier>{87727098-2810-47BA-A965-219906793BC2}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClCompile Include="command.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="ddihook.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="devmode.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="dllentry.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemps.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemps.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemps.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemps.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemps.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemps.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemps.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemps.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemps.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemps.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemps.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemps.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemps.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemps.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemps.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemps.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemps.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemps.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="debug.h" /> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemps.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="oemps.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> + <ItemGroup> + <None Include="oemps.def"> + <Filter>Source Files</Filter> + </None> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemps/command.cpp b/print/OEM Printer Customization Plug-in Samples/C++/oemps/command.cpp new file mode 100644 index 00000000..06e049c9 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemps/command.cpp @@ -0,0 +1,278 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: command.cpp +// +// PURPOSE: Source module for OEM customized Command(s). +// + +#include "precomp.h" +#include "oemps.h" +#include "debug.h" +#include "command.h" +#include "resource.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +//////////////////////////////////////////////////////// +// Internal String Literals +//////////////////////////////////////////////////////// + +const CHAR TEST_BEGINSTREAM[] = "%%Test: Before begin stream\r\n"; +const CHAR TEST_PSADOBE[] = "%%Test: Before %!PS-Adobe\r\n"; +const CHAR TEST_PAGESATEND[] = "%%Test: Replace driver's %%PagesAtend\r\n"; +const CHAR TEST_PAGES[] = "%%Test: Replace driver's %%Pages: (atend)\r\n"; +const CHAR TEST_DOCUMENTPROCESSCOLORS[] = "%%Test: Replace driver's %%DocumentProcessColors: (atend)\r\n"; +const CHAR TEST_COMMENTS[] = "%%Test: Before %%EndComments\r\n"; +const CHAR TEST_DEFAULTS[] = "%%Test: Before %%BeginDefaults and %%EndDefaults\r\n"; +const CHAR TEST_BEGINPROLOG[] = "%%Test: After %%BeginProlog\r\n"; +const CHAR TEST_ENDPROLOG[] = "%%Test: Before %%EndProlog\r\n"; +const CHAR TEST_BEGINSETUP[] = "%%Test: After %%BeginSetup\r\n"; +const CHAR TEST_ENDSETUP[] = "%%Test: Before %%EndSetup\r\n"; +const CHAR TEST_BEGINPAGESETUP[] = "%%Test: After %%BeginPageSetup\r\n"; +const CHAR TEST_ENDPAGESETUP[] = "%%Test: Before %%EndpageSetup\r\n"; +const CHAR TEST_PAGETRAILER[] = "%%Test: After %%PageTrailer\r\n"; +const CHAR TEST_TRAILER[] = "%%Test: After %%Trailer\r\n"; +const CHAR TEST_PAGENUMBER[] = "%%Test: Replace driver's %%Page:\r\n"; +const CHAR TEST_PAGEORDER[] = "%%Test: Replace driver's %%PageOrder:\r\n"; +const CHAR TEST_ORIENTATION[] = "%%Test: Replace driver's %%Orientation:\r\n"; +const CHAR TEST_BOUNDINGBOX[] = "%%Test: Replace driver's %%BoundingBox:\r\n"; +const CHAR TEST_DOCNEEDEDRES[] = "%%Test: Append to driver's %%DocumentNeededResourc\r\n"; +const CHAR TEST_DOCSUPPLIEDRES[] = "%%Test: Append to driver's %%DocumentSuppliedResou\r\n"; +const CHAR TEST_EOF[] = "%%Test: After %%EOF\r\n"; +const CHAR TEST_ENDSTREAM[] = "%%Test: After the last byte of job stream\r\n"; +const CHAR TEST_DOCUMENTPROCESSCOLORSATEND[] = "%%Test: DocumentProcessColorsAtend\r\n"; +const CHAR TEST_VMSAVE[] = "%%Test: %%VMSave\r\n"; +const CHAR TEST_VMRESTORE[] = "%%Test: %%VMRestore\r\n"; +const CHAR TEST_PLATECOLOR[] = "%%Test: %%PlateColor:\r\n"; +const CHAR TEST_SHOWPAGE[] = "%%Test: %%SowPage:\r\n"; +const CHAR TEST_PAGEBBOX[] = "%%Test: %%PageBox:\r\n"; +const CHAR TEST_ENDPAGECOMMENTS[] = "%%Test: %%EndPageComments:\r\n"; + + +//////////////////////////////////////////////////////////////////////////////////// +// The PSCRIPT driver calls this OEM function at specific points during output +// generation. This gives the OEM DLL an opportunity to insert code fragments +// at specific injection points in the driver's code. It should use +// DrvWriteSpoolBuf for generating any output it requires. + +HRESULT PSCommand(PDEVOBJ pdevobj, DWORD dwIndex, PVOID pData, DWORD cbSize, + IPrintOemDriverPS* pOEMHelp, PDWORD pdwReturn) +{ + PCSTR pProcedure = NULL; + DWORD dwLen = 0; + DWORD dwSize = 0; + HRESULT hResult = E_FAIL; + + VERBOSE("Entering OEMCommand...\r\n"); + + UNREFERENCED_PARAMETER(cbSize); + UNREFERENCED_PARAMETER(pData); + + switch (dwIndex) + { + case PSINJECT_BEGINSTREAM: + VERBOSE("OEMCommand PSINJECT_BEGINSTREAM\n"); + pProcedure = TEST_BEGINSTREAM; + break; + + case PSINJECT_PSADOBE: + VERBOSE("OEMCommand PSINJECT_PSADOBE\n"); + pProcedure = TEST_PSADOBE; + break; + + case PSINJECT_PAGESATEND: + VERBOSE("OEMCommand PSINJECT_PAGESATEND\n"); + pProcedure = TEST_PAGESATEND; + break; + + case PSINJECT_PAGES: + VERBOSE("OEMCommand PSINJECT_PAGES\n"); + pProcedure = TEST_PAGES; + break; + + case PSINJECT_DOCNEEDEDRES: + VERBOSE("OEMCommand PSINJECT_DOCNEEDEDRES\n"); + pProcedure = TEST_DOCNEEDEDRES; + break; + + case PSINJECT_DOCSUPPLIEDRES: + VERBOSE("OEMCommand PSINJECT_DOCSUPPLIEDRES\n"); + pProcedure = TEST_DOCSUPPLIEDRES; + break; + + case PSINJECT_PAGEORDER: + VERBOSE("OEMCommand PSINJECT_PAGEORDER\n"); + pProcedure = TEST_PAGEORDER; + break; + + case PSINJECT_ORIENTATION: + VERBOSE("OEMCommand PSINJECT_ORIENTATION\n"); + pProcedure = TEST_ORIENTATION; + break; + + case PSINJECT_BOUNDINGBOX: + VERBOSE("OEMCommand PSINJECT_BOUNDINGBOX\n"); + pProcedure = TEST_BOUNDINGBOX; + break; + + case PSINJECT_DOCUMENTPROCESSCOLORS: + VERBOSE("OEMCommand PSINJECT_DOCUMENTPROCESSCOLORS\n"); + pProcedure = TEST_DOCUMENTPROCESSCOLORS; + break; + + case PSINJECT_COMMENTS: + VERBOSE("OEMCommand PSINJECT_COMMENTS\n"); + pProcedure = TEST_COMMENTS; + break; + + case PSINJECT_BEGINDEFAULTS: + VERBOSE("OEMCommand PSINJECT_BEGINDEFAULTS\n"); + pProcedure = TEST_DEFAULTS; + break; + + case PSINJECT_ENDDEFAULTS: + VERBOSE("OEMCommand PSINJECT_BEGINDEFAULTS\n"); + pProcedure = TEST_DEFAULTS; + break; + + case PSINJECT_BEGINPROLOG: + VERBOSE("OEMCommand PSINJECT_BEGINPROLOG\n"); + pProcedure = TEST_BEGINPROLOG; + break; + + case PSINJECT_ENDPROLOG: + VERBOSE("OEMCommand PSINJECT_ENDPROLOG\n"); + pProcedure = TEST_ENDPROLOG; + break; + + case PSINJECT_BEGINSETUP: + VERBOSE("OEMCommand PSINJECT_BEGINSETUP\n"); + pProcedure = TEST_BEGINSETUP; + break; + + case PSINJECT_ENDSETUP: + VERBOSE("OEMCommand PSINJECT_ENDSETUP\n"); + pProcedure = TEST_ENDSETUP; + break; + + case PSINJECT_BEGINPAGESETUP: + VERBOSE("OEMCommand PSINJECT_BEGINPAGESETUP\n"); + pProcedure = TEST_BEGINPAGESETUP; + break; + + case PSINJECT_ENDPAGESETUP: + VERBOSE("OEMCommand PSINJECT_ENDPAGESETUP\n"); + pProcedure = TEST_ENDPAGESETUP; + break; + + case PSINJECT_PAGETRAILER: + VERBOSE("OEMCommand PSINJECT_PAGETRAILER\n"); + pProcedure = TEST_PAGETRAILER; + break; + + case PSINJECT_TRAILER: + VERBOSE("OEMCommand PSINJECT_TRAILER\n"); + pProcedure = TEST_TRAILER; + break; + + case PSINJECT_PAGENUMBER: + VERBOSE("OEMCommand PSINJECT_PAGENUMBER\n"); + pProcedure = TEST_PAGENUMBER; + break; + + case PSINJECT_EOF: + VERBOSE("OEMCommand PSINJECT_EOF\n"); + pProcedure = TEST_EOF; + break; + + case PSINJECT_ENDSTREAM: + VERBOSE("OEMCommand PSINJECT_ENDSTREAM\n"); + pProcedure = TEST_ENDSTREAM; + break; + + case PSINJECT_DOCUMENTPROCESSCOLORSATEND: + VERBOSE("OEMCommand PSINJECT_DOCUMENTPROCESSCOLORSATEND\n"); + pProcedure = TEST_DOCUMENTPROCESSCOLORSATEND; + break; + + case PSINJECT_VMSAVE: + VERBOSE("OEMCommand PSINJECT_VMSAVE\n"); + pProcedure = TEST_VMSAVE; + break; + + case PSINJECT_VMRESTORE: + VERBOSE("OEMCommand PSINJECT_VMRESTORE\n"); + pProcedure = TEST_VMRESTORE; + break; + + case PSINJECT_PLATECOLOR: + VERBOSE("OEMCommand PSINJECT_PLATECOLOR\n"); + pProcedure = TEST_PLATECOLOR; + break; + + case PSINJECT_SHOWPAGE: + VERBOSE("OEMCommand PSINJECT_SHOWPAGE\n"); + pProcedure = TEST_SHOWPAGE; + break; + + case PSINJECT_PAGEBBOX: + VERBOSE("OEMCommand PSINJECT_PAGEBBOX\n"); + pProcedure = TEST_PAGEBBOX; + break; + + case PSINJECT_ENDPAGECOMMENTS: + VERBOSE("OEMCommand PSINJECT_ENDPAGECOMMENTS\n"); + pProcedure = TEST_ENDPAGECOMMENTS; + break; + + default: + ERR("Undefined PSCommand!\r\n"); + *pdwReturn = ERROR_NOT_SUPPORTED; + return E_NOTIMPL; + } + + // INVARIANT: should have injection string. + + if(NULL != pProcedure) + { + // Write PostScript to spool file. + dwLen = (DWORD)strlen(pProcedure); + if (dwLen > 0) + { + hResult = pOEMHelp->DrvWriteSpoolBuf(pdevobj, const_cast<PSTR>(pProcedure), dwLen, &dwSize); + } + + // Set return values. + if(SUCCEEDED(hResult) && (dwLen == dwSize)) + { + *pdwReturn = ERROR_SUCCESS; + } + else + { + // Return a meaningful + // error value. + *pdwReturn = GetLastError(); + if(ERROR_SUCCESS == *pdwReturn) + { + *pdwReturn = ERROR_WRITE_FAULT; + } + + // Make sure we return failure + // if the write didn't succeded. + if(SUCCEEDED(hResult)) + { + hResult = HRESULT_FROM_WIN32(*pdwReturn); + } + } + } + + return hResult; +} + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemps/command.h b/print/OEM Printer Customization Plug-in Samples/C++/oemps/command.h new file mode 100644 index 00000000..e18cdfac --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemps/command.h @@ -0,0 +1,24 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Command.h +// +// +// PURPOSE: Declare the function that handles custom +// processing of commands. +// + +#pragma once + +///////////////////////////////////////////////////////// +// Prototypes +///////////////////////////////////////////////////////// + +HRESULT PSCommand(PDEVOBJ, DWORD, PVOID, DWORD, IPrintOemDriverPS*, PDWORD); + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemps/ddihook.cpp b/print/OEM Printer Customization Plug-in Samples/C++/oemps/ddihook.cpp new file mode 100644 index 00000000..e14d9cdd --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemps/ddihook.cpp @@ -0,0 +1,1049 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: DDIHook.cpp +// +// +// PURPOSE: DDI Hook routines for User Mode COM Customization DLL. +// + +#include "precomp.h" +#include "debug.h" +#include "oemps.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +// +// OEMBitBlt +// + +BOOL APIENTRY +OEMBitBlt( + SURFOBJ *psoTrg, + SURFOBJ *psoSrc, + SURFOBJ *psoMask, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + RECTL *prclTrg, + POINTL *pptlSrc, + POINTL *pptlMask, + BRUSHOBJ *pbo, + POINTL *pptlBrush, + ROP4 rop4 + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMBitBlt() entry.\r\n"); + + pdevobj = (PDEVOBJ)psoTrg->dhpdev; + + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call PS + // + + return (((PFN_DrvBitBlt)(poempdev->pfnPS[UD_DrvBitBlt])) ( + psoTrg, + psoSrc, + psoMask, + pco, + pxlo, + prclTrg, + pptlSrc, + pptlMask, + pbo, + pptlBrush, + rop4)); + +} + +// +// OEMStretchBlt +// + +BOOL APIENTRY +OEMStretchBlt( + SURFOBJ *psoDest, + SURFOBJ *psoSrc, + SURFOBJ *psoMask, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + COLORADJUSTMENT *pca, + POINTL *pptlHTOrg, + RECTL *prclDest, + RECTL *prclSrc, + POINTL *pptlMask, + ULONG iMode + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMStretchBlt() entry.\r\n"); + + pdevobj = (PDEVOBJ)psoDest->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + + // + // turn around to call PS + // + + return (((PFN_DrvStretchBlt)(poempdev->pfnPS[UD_DrvStretchBlt])) ( + psoDest, + psoSrc, + psoMask, + pco, + pxlo, + pca, + pptlHTOrg, + prclDest, + prclSrc, + pptlMask, + iMode)); + +} + + +// +// OEMCopyBits +// + +BOOL APIENTRY +OEMCopyBits( + SURFOBJ *psoDest, + SURFOBJ *psoSrc, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + RECTL *prclDest, + POINTL *pptlSrc + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMCopyBits() entry.\r\n"); + + pdevobj = (PDEVOBJ)psoDest->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call PS + // + + return (((PFN_DrvCopyBits)(poempdev->pfnPS[UD_DrvCopyBits])) ( + psoDest, + psoSrc, + pco, + pxlo, + prclDest, + pptlSrc)); + +} + +// +// OEMTextOut +// + +BOOL APIENTRY +OEMTextOut( + SURFOBJ *pso, + STROBJ *pstro, + FONTOBJ *pfo, + CLIPOBJ *pco, + RECTL *prclExtra, + RECTL *prclOpaque, + BRUSHOBJ *pboFore, + BRUSHOBJ *pboOpaque, + POINTL *pptlOrg, + MIX mix + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMTextOut() entry.\r\n"); + + pdevobj = (PDEVOBJ)pso->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call PS + // + + return (((PFN_DrvTextOut)(poempdev->pfnPS[UD_DrvTextOut])) ( + pso, + pstro, + pfo, + pco, + prclExtra, + prclOpaque, + pboFore, + pboOpaque, + pptlOrg, + mix)); + +} + +// +// OEMStrokePath +// + +BOOL APIENTRY +OEMStrokePath( + SURFOBJ *pso, + PATHOBJ *ppo, + CLIPOBJ *pco, + XFORMOBJ *pxo, + BRUSHOBJ *pbo, + POINTL *pptlBrushOrg, + LINEATTRS *plineattrs, + MIX mix + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMStokePath() entry.\r\n"); + + pdevobj = (PDEVOBJ)pso->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call PS + // + + return (((PFN_DrvStrokePath)(poempdev->pfnPS[UD_DrvStrokePath])) ( + pso, + ppo, + pco, + pxo, + pbo, + pptlBrushOrg, + plineattrs, + mix)); + +} + +// +// OEMFillPath +// + +BOOL APIENTRY +OEMFillPath( + SURFOBJ *pso, + PATHOBJ *ppo, + CLIPOBJ *pco, + BRUSHOBJ *pbo, + POINTL *pptlBrushOrg, + MIX mix, + FLONG flOptions + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMFillPath() entry.\r\n"); + + pdevobj = (PDEVOBJ)pso->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call PS + // + + return (((PFN_DrvFillPath)(poempdev->pfnPS[UD_DrvFillPath])) ( + pso, + ppo, + pco, + pbo, + pptlBrushOrg, + mix, + flOptions)); + +} + +// +// OEMStrokeAndFillPath +// + +BOOL APIENTRY +OEMStrokeAndFillPath( + SURFOBJ *pso, + PATHOBJ *ppo, + CLIPOBJ *pco, + XFORMOBJ *pxo, + BRUSHOBJ *pboStroke, + LINEATTRS *plineattrs, + BRUSHOBJ *pboFill, + POINTL *pptlBrushOrg, + MIX mixFill, + FLONG flOptions + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMStrokeAndFillPath() entry.\r\n"); + + pdevobj = (PDEVOBJ)pso->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call PS + // + + return (((PFN_DrvStrokeAndFillPath)(poempdev->pfnPS[UD_DrvStrokeAndFillPath])) ( + pso, + ppo, + pco, + pxo, + pboStroke, + plineattrs, + pboFill, + pptlBrushOrg, + mixFill, + flOptions)); + +} + +// +// OEMRealizeBrush +// + +BOOL APIENTRY +OEMRealizeBrush( + BRUSHOBJ *pbo, + SURFOBJ *psoTarget, + SURFOBJ *psoPattern, + SURFOBJ *psoMask, + XLATEOBJ *pxlo, + ULONG iHatch + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMRealizeBrush() entry.\r\n"); + + pdevobj = (PDEVOBJ)psoTarget->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call PS + // + + return (((PFN_DrvRealizeBrush)(poempdev->pfnPS[UD_DrvRealizeBrush])) ( + pbo, + psoTarget, + psoPattern, + psoMask, + pxlo, + iHatch)); + +} + +// +// OEMStartPage +// + +BOOL APIENTRY +OEMStartPage( + SURFOBJ *pso + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMStartPage() entry.\r\n"); + + pdevobj = (PDEVOBJ)pso->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call PS + // + + return (((PFN_DrvStartPage)(poempdev->pfnPS[UD_DrvStartPage]))(pso)); + +} + +#define OEM_TESTSTRING "The DDICMDCB DLL adds this line of text." + +// +// OEMSendPage +// + +BOOL APIENTRY +OEMSendPage( + SURFOBJ *pso + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMSendPage() entry.\r\n"); + + pdevobj = (PDEVOBJ)pso->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // print a line of text, just for testing + // + if (pso->iType == STYPE_BITMAP) + { + pdevobj->pDrvProcs->DrvXMoveTo(pdevobj, 0, 0); + pdevobj->pDrvProcs->DrvYMoveTo(pdevobj, 0, 0); + pdevobj->pDrvProcs->DrvWriteSpoolBuf(pdevobj, OEM_TESTSTRING, + sizeof(OEM_TESTSTRING)); + } + + // + // turn around to call PS + // + + return (((PFN_DrvSendPage)(poempdev->pfnPS[UD_DrvSendPage]))(pso)); + +} + +// +// OEMEscape +// + +ULONG APIENTRY +OEMEscape( + SURFOBJ *pso, + ULONG iEsc, + ULONG cjIn, + _In_reads_bytes_(cjIn) PVOID pvIn, + ULONG cjOut, + _Out_writes_bytes_(cjOut) PVOID pvOut + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMEscape() entry.\r\n"); + + pdevobj = (PDEVOBJ)pso->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call PS + // + + return (((PFN_DrvEscape)(poempdev->pfnPS[UD_DrvEscape])) ( + pso, + iEsc, + cjIn, + pvIn, + cjOut, + pvOut)); + +} + +// +// OEMStartDoc +// + +BOOL APIENTRY +OEMStartDoc( + SURFOBJ *pso, + _In_ PWSTR pwszDocName, + DWORD dwJobId + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMStartDoc() entry.\r\n"); + + pdevobj = (PDEVOBJ)pso->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call PS + // + + return (((PFN_DrvStartDoc)(poempdev->pfnPS[UD_DrvStartDoc])) ( + pso, + pwszDocName, + dwJobId)); + +} + +// +// OEMEndDoc +// + +BOOL APIENTRY +OEMEndDoc( + SURFOBJ *pso, + FLONG fl + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMEndDoc() entry.\r\n"); + + pdevobj = (PDEVOBJ)pso->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call PS + // + + return (((PFN_DrvEndDoc)(poempdev->pfnPS[UD_DrvEndDoc])) ( + pso, + fl)); + +} + +//////// +// NOTE: +// OEM DLL needs to hook out the following six font related DDI calls only +// if it enumerates additional fonts beyond what's in the GPD file. +// And if it does, it needs to take care of its own fonts for all font DDI +// calls and DrvTextOut call. +/////// + +// +// OEMQueryFont +// + +PIFIMETRICS APIENTRY +OEMQueryFont( + DHPDEV dhpdev, + ULONG_PTR iFile, + ULONG iFace, + ULONG_PTR *pid + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMQueryFont() entry.\r\n"); + + pdevobj = (PDEVOBJ)dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call PS + // + + return (((PFN_DrvQueryFont)(poempdev->pfnPS[UD_DrvQueryFont])) ( + dhpdev, + iFile, + iFace, + pid)); + +} + +// +// OEMQueryFontTree +// + +PVOID APIENTRY +OEMQueryFontTree( + DHPDEV dhpdev, + ULONG_PTR iFile, + ULONG iFace, + ULONG iMode, + ULONG_PTR *pid + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMQueryFontTree() entry.\r\n"); + + pdevobj = (PDEVOBJ)dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call PS + // + + return (((PFN_DrvQueryFontTree)(poempdev->pfnPS[UD_DrvQueryFontTree])) ( + dhpdev, + iFile, + iFace, + iMode, + pid)); + +} + +// +// OEMQueryFontData +// + +LONG APIENTRY +OEMQueryFontData( + DHPDEV dhpdev, + FONTOBJ *pfo, + ULONG iMode, + HGLYPH hg, + GLYPHDATA *pgd, + _Out_writes_bytes_(cjSize) PVOID pv, + ULONG cjSize + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMQueryFontData() entry.\r\n"); + + pdevobj = (PDEVOBJ)dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call PS if this is not the font that OEM enumerated. + // + + return (((PFN_DrvQueryFontData)(poempdev->pfnPS[UD_DrvQueryFontData])) ( + dhpdev, + pfo, + iMode, + hg, + pgd, + pv, + cjSize)); + +} + +// +// OEMQueryAdvanceWidths +// + +BOOL APIENTRY +OEMQueryAdvanceWidths( + DHPDEV dhpdev, + FONTOBJ *pfo, + ULONG iMode, + _In_reads_(cGlyphs) HGLYPH *phg, + _Out_writes_bytes_(cGlyphs*sizeof(USHORT)) PVOID pvWidths, + ULONG cGlyphs + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMQueryAdvanceWidths() entry.\r\n"); + + pdevobj = (PDEVOBJ)dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call PS if this is not the font that OEM enumerated. + // + + return (((PFN_DrvQueryAdvanceWidths) + (poempdev->pfnPS[UD_DrvQueryAdvanceWidths])) ( + dhpdev, + pfo, + iMode, + phg, + pvWidths, + cGlyphs)); + +} + +// +// OEMFontManagement +// + +ULONG APIENTRY +OEMFontManagement( + SURFOBJ *pso, + FONTOBJ *pfo, + ULONG iMode, + ULONG cjIn, + _In_reads_bytes_(cjIn) PVOID pvIn, + ULONG cjOut, + _Out_writes_bytes_(cjOut) PVOID pvOut + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMFontManagement() entry.\r\n"); + + // + // Note that PS will not call OEM DLL for iMode==QUERYESCSUPPORT. + // So pso is not NULL for sure. + // + pdevobj = (PDEVOBJ)pso->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call PS if this is not the font that OEM enumerated. + // + + return (((PFN_DrvFontManagement)(poempdev->pfnPS[UD_DrvFontManagement])) ( + pso, + pfo, + iMode, + cjIn, + pvIn, + cjOut, + pvOut)); + +} + +// +// OEMGetGlyphMode +// + +ULONG APIENTRY +OEMGetGlyphMode( + DHPDEV dhpdev, + FONTOBJ *pfo + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMGetGlyphMode() entry.\r\n"); + + pdevobj = (PDEVOBJ)dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call PS if this is not the font that OEM enumerated. + // + + return (((PFN_DrvGetGlyphMode)(poempdev->pfnPS[UD_DrvGetGlyphMode])) ( + dhpdev, + pfo)); + +} + + +// +// OEMStretchBltROP +// + +BOOL APIENTRY +OEMStretchBltROP( + SURFOBJ *psoDest, + SURFOBJ *psoSrc, + SURFOBJ *psoMask, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + COLORADJUSTMENT *pca, + POINTL *pptlHTOrg, + RECTL *prclDest, + RECTL *prclSrc, + POINTL *pptlMask, + ULONG iMode, + BRUSHOBJ *pbo, + ROP4 rop4 + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMStretchBltROP() entry.\r\n"); + + pdevobj = (PDEVOBJ)psoDest->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call PS + // + + return (((PFN_DrvStretchBltROP)(poempdev->pfnPS[UD_DrvStretchBltROP])) ( + psoDest, + psoSrc, + psoMask, + pco, + pxlo, + pca, + pptlHTOrg, + prclDest, + prclSrc, + pptlMask, + iMode, + pbo, + rop4 + )); + + +} + +// +// OEMPlgBlt +// + +BOOL APIENTRY +OEMPlgBlt( + SURFOBJ *psoDst, + SURFOBJ *psoSrc, + SURFOBJ *psoMask, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + COLORADJUSTMENT *pca, + POINTL *pptlBrushOrg, + POINTFIX *pptfixDest, + RECTL *prclSrc, + POINTL *pptlMask, + ULONG iMode + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMPlgBlt() entry.\r\n"); + + pdevobj = (PDEVOBJ)psoDst->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call PS + // + + return (((PFN_DrvPlgBlt)(poempdev->pfnPS[UD_DrvPlgBlt])) ( + psoDst, + psoSrc, + psoMask, + pco, + pxlo, + pca, + pptlBrushOrg, + pptfixDest, + prclSrc, + pptlMask, + iMode)); + +} + +// +// OEMAlphaBlend +// + +BOOL APIENTRY +OEMAlphaBlend( + SURFOBJ *psoDest, + SURFOBJ *psoSrc, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + RECTL *prclDest, + RECTL *prclSrc, + BLENDOBJ *pBlendObj + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMAlphaBlend() entry.\r\n"); + + pdevobj = (PDEVOBJ)psoDest->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call PS + // + + return (((PFN_DrvAlphaBlend)(poempdev->pfnPS[UD_DrvAlphaBlend])) ( + psoDest, + psoSrc, + pco, + pxlo, + prclDest, + prclSrc, + pBlendObj + )); + +} + +// +// OEMGradientFill +// + +BOOL APIENTRY +OEMGradientFill( + SURFOBJ *psoDest, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + TRIVERTEX *pVertex, + ULONG nVertex, + PVOID pMesh, + ULONG nMesh, + RECTL *prclExtents, + POINTL *pptlDitherOrg, + ULONG ulMode + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMGradientFill() entry.\r\n"); + + pdevobj = (PDEVOBJ)psoDest->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call PS + // + + return (((PFN_DrvGradientFill)(poempdev->pfnPS[UD_DrvGradientFill])) ( + psoDest, + pco, + pxlo, + pVertex, + nVertex, + pMesh, + nMesh, + prclExtents, + pptlDitherOrg, + ulMode + )); + +} + +BOOL APIENTRY +OEMTransparentBlt( + SURFOBJ *psoDst, + SURFOBJ *psoSrc, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + RECTL *prclDst, + RECTL *prclSrc, + ULONG iTransColor, + ULONG ulReserved + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMTransparentBlt() entry.\r\n"); + + pdevobj = (PDEVOBJ)psoDst->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call PS + // + + return (((PFN_DrvTransparentBlt)(poempdev->pfnPS[UD_DrvTransparentBlt])) ( + psoDst, + psoSrc, + pco, + pxlo, + prclDst, + prclSrc, + iTransColor, + ulReserved + )); + +} + +HANDLE APIENTRY +OEMIcmCreateColorTransform( + DHPDEV dhpdev, + LPLOGCOLORSPACEW pLogColorSpace, + _In_reads_bytes_opt_(cjSourceProfile) PVOID pvSourceProfile, + ULONG cjSourceProfile, + _In_reads_bytes_(cjDestProfile) PVOID pvDestProfile, + ULONG cjDestProfile, + _In_reads_bytes_opt_(cjTargetProfile) PVOID pvTargetProfile, + ULONG cjTargetProfile, + DWORD dwReserved + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMCreateColorTransform() entry.\r\n"); + + pdevobj = (PDEVOBJ)dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call PS + // + + return (((PFN_DrvIcmCreateColorTransform)(poempdev->pfnPS[UD_DrvIcmCreateColorTransform])) ( + dhpdev, + pLogColorSpace, + pvSourceProfile, + cjSourceProfile, + pvDestProfile, + cjDestProfile, + pvTargetProfile, + cjTargetProfile, + dwReserved + )); + +} + +BOOL APIENTRY +OEMIcmDeleteColorTransform( + DHPDEV dhpdev, + HANDLE hcmXform + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMDeleteColorTransform() entry.\r\n"); + + pdevobj = (PDEVOBJ)dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call PS + // + + return (((PFN_DrvIcmDeleteColorTransform)(poempdev->pfnPS[UD_DrvIcmDeleteColorTransform])) ( + dhpdev, + hcmXform + )); + +} + +BOOL APIENTRY +OEMQueryDeviceSupport( + SURFOBJ *pso, + XLATEOBJ *pxlo, + XFORMOBJ *pxo, + ULONG iType, + ULONG cjIn, + _In_reads_bytes_(cjIn) PVOID pvIn, + ULONG cjOut, + _Out_writes_bytes_(cjOut) PVOID pvOut + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE("OEMQueryDeviceSupport() entry.\r\n"); + + pdevobj = (PDEVOBJ)pso->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call PS + // + + return (((PFN_DrvQueryDeviceSupport)(poempdev->pfnPS[UD_DrvQueryDeviceSupport])) ( + pso, + pxlo, + pxo, + iType, + cjIn, + pvIn, + cjOut, + pvOut + )); +} diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemps/debug.h b/print/OEM Printer Customization Plug-in Samples/C++/oemps/debug.h new file mode 100644 index 00000000..0414569c --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemps/debug.h @@ -0,0 +1,82 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1996 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Debug.H +// +// PURPOSE: Define common data types, and external function prototypes +// for debugging functions. Also defines the various debug macros. +// +// + +#pragma once + +///////////////////////////////////////////////////////// +// Macros +///////////////////////////////////////////////////////// +// +// These macros are used for debugging purposes. They expand +// to white spaces on a free build. Here is a brief description +// of what they do and how they are used: +// +// giDebugLevel +// Global variable which set the current debug level to control +// the amount of debug messages emitted. +// +// WARNING(msg) +// Display a message if the current debug level is <= DBG_WARNING. +// The message format is: WRN filename (linenumber): message +// +// ERR(msg) +// Similiar to WARNING macro above - displays a message +// if the current debug level is <= DBG_ERROR. +// +// ASSERT(cond) +// Verify a condition is true. If not, force a breakpoint. +// +// RIP(msg) +// Display a message and force a breakpoint. +// +// Usage: +// WARNING("App passed NULL pointer, ignoring...\n"); +// + +#define DBG_VERBOSE 0 +#define DBG_WARNING 1 +#define DBG_ERROR 2 +#define DBG_NONE 3 + +// VC and Build use different debug defines. +#if defined (DBG) || defined (_DEBUG) + + // __declspec(selectany) ensures that even if this is defined in multiple compilation + // modules, they will all resolve to the same symbol in the linked DLL + __declspec(selectany) INT giDebugLevel = 2; + + #define STRINGIZE(x) #x + #define QUOTE(x) STRINGIZE(x) + #define FILE_AND_LINE __FILE__ "@" QUOTE(__LINE__) + + #define VERBOSE(msg) { if(giDebugLevel <= DBG_VERBOSE) OutputDebugStringA( FILE_AND_LINE ": " msg); } + #define WARNING(msg) { if(giDebugLevel <= DBG_WARNING) OutputDebugStringA( FILE_AND_LINE ": Warning: " msg); } + #define ERR(msg) { if(giDebugLevel <= DBG_ERROR) OutputDebugStringA(FILE_AND_LINE ": Error:" msg); } + #define ASSERT(cond) { if (!(cond)) RIP("\n"); } + #define RIP(msg) { OutputDebugStringA(FILE_AND_LINE ": Error (not recoverable): " msg); DebugBreak(); } + +#else // !DBG + + #define VERBOSE(msg) + #define WARNING(msg) + #define ERR(msg) + #define ASSERT(cond) + #define RIP(msg) + +#endif + + + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemps/devmode.cpp b/print/OEM Printer Customization Plug-in Samples/C++/oemps/devmode.cpp new file mode 100644 index 00000000..3e66faeb --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemps/devmode.cpp @@ -0,0 +1,151 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Devmode.cpp +// +// +// PURPOSE: Implementation of Devmode functions shared with OEM UI and OEM rendering modules. +// + +#include "precomp.h" +#include "oemps.h" +#include "debug.h" +#include "devmode.h" + + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +HRESULT hrOEMDevMode(DWORD dwMode, POEMDMPARAM pOemDMParam) +{ + POEMDEV pOEMDevIn; + POEMDEV pOEMDevOut; + + + // Verify parameters. + if( (NULL == pOemDMParam) + || + ( (OEMDM_SIZE != dwMode) + && + (OEMDM_DEFAULT != dwMode) + && + (OEMDM_CONVERT != dwMode) + && + (OEMDM_MERGE != dwMode) + ) + ) + { + ERR("DevMode() ERROR_INVALID_PARAMETER.\r\n"); + + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Cast generic (i.e. PVOID) to OEM private devomode pointer type. + pOEMDevIn = (POEMDEV) pOemDMParam->pOEMDMIn; + pOEMDevOut = (POEMDEV) pOemDMParam->pOEMDMOut; + + switch(dwMode) + { + case OEMDM_SIZE: + pOemDMParam->cbBufSize = sizeof(OEMDEV); + break; + + case OEMDM_DEFAULT: + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + pOEMDevOut->dwDriverData = 0; + break; + + case OEMDM_CONVERT: + ConvertOEMDevmode(pOEMDevIn, pOEMDevOut); + break; + + case OEMDM_MERGE: + ConvertOEMDevmode(pOEMDevIn, pOEMDevOut); + MakeOEMDevmodeValid(pOEMDevOut); + break; + } + + return S_OK; +} + + +BOOL ConvertOEMDevmode(PCOEMDEV pOEMDevIn, POEMDEV pOEMDevOut) +{ + if( (NULL == pOEMDevIn) + || + (NULL == pOEMDevOut) + ) + { + ERR("ConvertOEMDevmode() invalid parameters.\r\n"); + return FALSE; + } + + // Check OEM Signature, if it doesn't match ours, + // then just assume DMIn is bad and use defaults. + if(pOEMDevIn->dmOEMExtra.dwSignature == pOEMDevOut->dmOEMExtra.dwSignature) + { + VERBOSE("Converting private OEM Devmode.\r\n"); + + // Set the devmode defaults so that anything the isn't copied over will + // be set to the default value. + pOEMDevOut->dwDriverData = 0; + + // Copy the old structure in to the new using which ever size is the smaller. + // Devmode maybe from newer Devmode (not likely since there is only one), or + // Devmode maybe a newer Devmode, in which case it maybe larger, + // but the first part of the structure should be the same. + + // DESIGN ASSUMPTION: the private DEVMODE structure only gets added to; + // the fields that are in the DEVMODE never change only new fields get added to the end. + + memcpy(pOEMDevOut, pOEMDevIn, __min(pOEMDevOut->dmOEMExtra.dwSize, pOEMDevIn->dmOEMExtra.dwSize)); + + // Re-fill in the size and version fields to indicated + // that the DEVMODE is the current private DEVMODE version. + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + } + else + { + WARNING("Unknown DEVMODE signature, pOEMDMIn ignored.\r\n"); + + // Don't know what the input DEVMODE is, so just use defaults. + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + pOEMDevOut->dwDriverData = 0; + } + + return TRUE; +} + + +BOOL MakeOEMDevmodeValid(POEMDEV pOEMDevmode) +{ + if(NULL == pOEMDevmode) + { + return FALSE; + } + + // ASSUMPTION: pOEMDevmode is large enough to contain OEMDEV structure. + + // Make sure that dmOEMExtra indicates the current OEMDEV structure. + pOEMDevmode->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevmode->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevmode->dmOEMExtra.dwVersion = OEM_VERSION; + + // Set driver data. + pOEMDevmode->dwDriverData = 0; + + return TRUE; +} + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemps/devmode.h b/print/OEM Printer Customization Plug-in Samples/C++/oemps/devmode.h new file mode 100644 index 00000000..3cf13641 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemps/devmode.h @@ -0,0 +1,44 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Devmode.h +// +// +// PURPOSE: Define common data types, and external function prototypes +// for devmode functions. +// +#pragma once + +//////////////////////////////////////////////////////// +// OEM Devmode Defines +//////////////////////////////////////////////////////// + +#define OEM_SIGNATURE 'MSFT' +#define OEM_VERSION 0x00000001L + +//////////////////////////////////////////////////////// +// OEM Devmode Type Definitions +//////////////////////////////////////////////////////// + +typedef struct tagOEMDEV +{ + OEM_DMEXTRAHEADER dmOEMExtra; + BOOL dwDriverData; + +} OEMDEV, *POEMDEV; + +typedef const OEMDEV *PCOEMDEV; + +///////////////////////////////////////////////////////// +// Prototypes +///////////////////////////////////////////////////////// + +HRESULT hrOEMDevMode(DWORD dwMode, POEMDMPARAM pOemDMParam); +BOOL ConvertOEMDevmode(PCOEMDEV pOEMDevIn, POEMDEV pOEMDevOut); +BOOL MakeOEMDevmodeValid(POEMDEV pOEMDevmode); +void Dump(PCOEMDEV pOEMDevIn); + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemps/dllentry.cpp b/print/OEM Printer Customization Plug-in Samples/C++/oemps/dllentry.cpp new file mode 100644 index 00000000..d9851eff --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemps/dllentry.cpp @@ -0,0 +1,50 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: dllentry.cpp +// +// +// PURPOSE: Source module for DLL entry function(s). +// + +#include "precomp.h" +#include "oemps.h" +#include "debug.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +/////////////////////////////////////////////////////////// +// +// DLL entry point +// +BOOL WINAPI DllMain(HINSTANCE hInst, WORD wReason, LPVOID lpReserved) +{ + UNREFERENCED_PARAMETER(hInst); + UNREFERENCED_PARAMETER(lpReserved); + + switch(wReason) + { + case DLL_PROCESS_ATTACH: + VERBOSE("Process attach.\r\n"); + break; + + case DLL_THREAD_ATTACH: + VERBOSE("Thread attach.\r\n"); + break; + + case DLL_PROCESS_DETACH: + VERBOSE("Process detach.\r\n"); + break; + + case DLL_THREAD_DETACH: + VERBOSE("Thread detach.\r\n"); + break; + } + + return TRUE; +} diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemps/intrface.cpp b/print/OEM Printer Customization Plug-in Samples/C++/oemps/intrface.cpp new file mode 100644 index 00000000..34f0914c --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemps/intrface.cpp @@ -0,0 +1,632 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Intrface.cpp +// +// +// PURPOSE: Interface for User Mode COM Customization DLL. +// + +#include "precomp.h" + +#include "debug.h" + +#include "devmode.h" +#include "oemps.h" +#include "command.h" +#include "intrface.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +//////////////////////////////////////////////////////// +// Internal Globals +//////////////////////////////////////////////////////// + +static long g_cComponents; // Count of active components +static long g_cServerLocks; // Count of locks + +//////////////////////////////////////////////////////// +// Internal Constants +//////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////// +// Warning: the following array order must match the +// order in enum ENUMHOOKS. +/////////////////////////////////////////////////////// +static const DRVFN OEMHookFuncs[] = +{ + { INDEX_DrvRealizeBrush, (PFN) OEMRealizeBrush }, + { INDEX_DrvCopyBits, (PFN) OEMCopyBits }, + { INDEX_DrvBitBlt, (PFN) OEMBitBlt }, + { INDEX_DrvStretchBlt, (PFN) OEMStretchBlt }, + { INDEX_DrvTextOut, (PFN) OEMTextOut }, + { INDEX_DrvStrokePath, (PFN) OEMStrokePath }, + { INDEX_DrvFillPath, (PFN) OEMFillPath }, + { INDEX_DrvStrokeAndFillPath, (PFN) OEMStrokeAndFillPath }, + { INDEX_DrvStartPage, (PFN) OEMStartPage }, + { INDEX_DrvSendPage, (PFN) OEMSendPage }, + { INDEX_DrvEscape, (PFN) OEMEscape }, + { INDEX_DrvStartDoc, (PFN) OEMStartDoc }, + { INDEX_DrvEndDoc, (PFN) OEMEndDoc }, + { INDEX_DrvQueryFont, (PFN) OEMQueryFont }, + { INDEX_DrvQueryFontTree, (PFN) OEMQueryFontTree }, + { INDEX_DrvQueryFontData, (PFN) OEMQueryFontData }, + { INDEX_DrvQueryAdvanceWidths, (PFN) OEMQueryAdvanceWidths }, + { INDEX_DrvFontManagement, (PFN) OEMFontManagement }, + { INDEX_DrvGetGlyphMode, (PFN) OEMGetGlyphMode }, + { INDEX_DrvStretchBltROP, (PFN) OEMStretchBltROP }, + { INDEX_DrvPlgBlt, (PFN) OEMPlgBlt }, + { INDEX_DrvTransparentBlt, (PFN) OEMTransparentBlt }, + { INDEX_DrvAlphaBlend, (PFN) OEMAlphaBlend }, + { INDEX_DrvGradientFill, (PFN) OEMGradientFill }, + { INDEX_DrvIcmCreateColorTransform, (PFN) OEMIcmCreateColorTransform }, + { INDEX_DrvIcmDeleteColorTransform, (PFN) OEMIcmDeleteColorTransform }, + { INDEX_DrvQueryDeviceSupport, (PFN) OEMQueryDeviceSupport }, +}; + + +//////////////////////////////////////////////////////////////////////////////// +// +// IOemPS body +// +IOemPS::IOemPS() : m_cRef(1) +{ + VERBOSE("IOemPS::IOemPS() entered.\r\n"); + + // Increment COM component count. + InterlockedIncrement(&g_cComponents); + + m_pOEMHelp = NULL; + + VERBOSE("IOemPS::IOemPS() leaving.\r\n"); +} + + +IOemPS::~IOemPS() +{ + // Make sure that helper interface is released. + if(NULL != m_pOEMHelp) + { + m_pOEMHelp->Release(); + m_pOEMHelp = NULL; + } + + // If this instance of the object is being deleted, then the reference + // count should be zero. + assert(0 == m_cRef); + + // Decrement COM compontent count. + InterlockedDecrement(&g_cComponents); +} + + +HRESULT __stdcall IOemPS::QueryInterface(const IID& iid, void** ppv) +{ + if (iid == IID_IUnknown) + { + *ppv = static_cast<IUnknown*>(this); + VERBOSE("IOemPS::QueryInterface IUnknown.\r\n"); + } + else if (iid == IID_IPrintOemPS) + { + *ppv = static_cast<IPrintOemPS*>(this); + VERBOSE("IOemPS::QueryInterface IPrintOemPs.\r\n"); + } + else + { + VERBOSE("IOemPS::QueryInterface (interface not supported).\r\n"); + *ppv = NULL; + return E_NOINTERFACE; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef(); + return S_OK; +} + +ULONG __stdcall IOemPS::AddRef() +{ + VERBOSE("IOemPS::AddRef() entry.\r\n"); + return InterlockedIncrement(&m_cRef); +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall IOemPS::Release() +{ + VERBOSE("IOemPS::Release() entry.\r\n"); + ASSERT( 0 != m_cRef); + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + + } + return cRef; +} + + +HRESULT __stdcall IOemPS::GetInfo ( + DWORD dwMode, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded) +{ + VERBOSE("IOemPS::GetInfo(%d) entry.\r\n"); + + // Validate parameters. + if( (NULL == pcbNeeded) + || + ( (OEMGI_GETSIGNATURE != dwMode) + && + (OEMGI_GETVERSION != dwMode) + && + (OEMGI_GETPUBLISHERINFO != dwMode) + ) + ) + { + ERR("IOemPS::GetInfo() exit pcbNeeded is NULL!\r\n"); + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Set expected buffer size. + if(OEMGI_GETPUBLISHERINFO != dwMode) + { + *pcbNeeded = sizeof(DWORD); + } + else + { + *pcbNeeded = sizeof(PUBLISHERINFO); + return E_FAIL; + } + + // Check buffer size is sufficient. + if((cbSize < *pcbNeeded) || (NULL == pBuffer)) + { + ERR("IOemPS::GetInfo() exit insufficient buffer!\r\n"); + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return E_FAIL; + } + + switch(dwMode) + { + // OEM DLL Signature + case OEMGI_GETSIGNATURE: + *(PDWORD)pBuffer = OEM_SIGNATURE; + break; + + // OEM DLL version + case OEMGI_GETVERSION: + *(PDWORD)pBuffer = OEM_VERSION; + break; + + // dwMode not supported. + case OEMGI_GETPUBLISHERINFO: + case OEMGI_GETREQUESTEDHELPERINTERFACES: + default: + // Set written bytes to zero since nothing was written. + ERR("IOemPS::GetInfo() exit, mode not supported.\r\n"); + *pcbNeeded = 0; + SetLastError(ERROR_NOT_SUPPORTED); + return E_FAIL; + } + + return S_OK; +} + +HRESULT __stdcall IOemPS::PublishDriverInterface( + IUnknown *pIUnknown) +{ + VERBOSE("IOemPS::PublishDriverInterface() entry.\r\n"); + + // Need to store pointer to Driver Helper functions, if we already haven't. + if (this->m_pOEMHelp == NULL) + { + HRESULT hResult; + + + // Get Interface to Helper Functions. + hResult = pIUnknown->QueryInterface(IID_IPrintOemDriverPS, (void** ) &(this->m_pOEMHelp)); + + if(!SUCCEEDED(hResult)) + { + // Make sure that interface pointer reflects interface query failure. + this->m_pOEMHelp = NULL; + + return E_FAIL; + } + } + + return S_OK; +} + + +HRESULT __stdcall IOemPS::EnableDriver(DWORD dwDriverVersion, + DWORD cbSize, + PDRVENABLEDATA pded) +{ + VERBOSE("IOemPS::EnableDriver() entry.\r\n"); + + UNREFERENCED_PARAMETER(dwDriverVersion); + UNREFERENCED_PARAMETER(cbSize); + + // List DDI functions that are hooked. + pded->iDriverVersion = PRINTER_OEMINTF_VERSION; + pded->c = sizeof(OEMHookFuncs) / sizeof(DRVFN); + pded->pdrvfn = (DRVFN *) OEMHookFuncs; + + // Even if nothing is done, need to return S_OK so + // that DisableDriver() will be called, which releases + // the reference to the Printer Driver's interface. + // If error occurs, return E_FAIL. + return S_OK; +} + +HRESULT __stdcall IOemPS::DisableDriver(VOID) +{ + VERBOSE("IOemPS::DisaleDriver() entry.\r\n"); + + // Release reference to Printer Driver's interface. + if (this->m_pOEMHelp) + { + this->m_pOEMHelp->Release(); + this->m_pOEMHelp = NULL; + } + + return S_OK; +} + +HRESULT __stdcall IOemPS::DisablePDEV( + PDEVOBJ pdevobj) +{ + VERBOSE("IOemPS::DisablePDEV() entry.\r\n"); + + // + // Free memory for OEMPDEV and any memory block that hangs off OEMPDEV. + // + assert(NULL != pdevobj->pdevOEM); + delete pdevobj->pdevOEM; + + return S_OK; +}; + +HRESULT __stdcall IOemPS::EnablePDEV( + PDEVOBJ pdevobj, + _In_ PWSTR pPrinterName, + ULONG cPatterns, + HSURF *phsurfPatterns, + ULONG cjGdiInfo, + GDIINFO *pGdiInfo, + ULONG cjDevInfo, + DEVINFO *pDevInfo, + DRVENABLEDATA *pded, + OUT PDEVOEM *pDevOem) +{ + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pPrinterName); + UNREFERENCED_PARAMETER(cPatterns); + UNREFERENCED_PARAMETER(phsurfPatterns); + UNREFERENCED_PARAMETER(cjGdiInfo); + UNREFERENCED_PARAMETER(pGdiInfo); + UNREFERENCED_PARAMETER(cjDevInfo); + UNREFERENCED_PARAMETER(pDevInfo); + + VERBOSE("IOemPS::EnablePDEV() entry.\r\n"); + + POEMPDEV poempdev; + INT i, j; + DWORD dwDDIIndex; + PDRVFN pdrvfn; + + // + // Allocate the OEMDev + // + poempdev = new OEMPDEV; + if (NULL == poempdev) + { + return E_FAIL; + } + + // + // Fill in OEMDEV + // + + for (i = 0; i < MAX_DDI_HOOKS; i++) + { + // + // search through PS's hooks and locate the function ptr + // + dwDDIIndex = OEMHookFuncs[i].iFunc; + for (j = pded->c, pdrvfn = pded->pdrvfn; j > 0; j--, pdrvfn++) + { + if (dwDDIIndex == pdrvfn->iFunc) + { + poempdev->pfnPS[i] = pdrvfn->pfn; + break; + } + } + if (j == 0) + { + // + // Didn't find the hook. This could mean PS doesn't hook this DDI but allows OEMs to hook it out. + // + poempdev->pfnPS[i] = NULL; + } + + } + + *pDevOem = (POEMPDEV) poempdev; + + return S_OK; +} + + +HRESULT __stdcall IOemPS::ResetPDEV( + PDEVOBJ pdevobjOld, + PDEVOBJ pdevobjNew) +{ + UNREFERENCED_PARAMETER(pdevobjOld); + UNREFERENCED_PARAMETER(pdevobjNew); + + VERBOSE("IOemPS::ResetPDEV() entry.\r\n"); + + // + // If any information from the previous PDEV needs to be preserved, + // copy it in this function. + // + + return TRUE; +} + + +HRESULT __stdcall IOemPS::DevMode( + DWORD dwMode, + POEMDMPARAM pOemDMParam) +{ + VERBOSE("IOemPS:DevMode entry.\n"); + return hrOEMDevMode(dwMode, pOemDMParam); +} + +HRESULT __stdcall IOemPS::Command( + PDEVOBJ pdevobj, + DWORD dwIndex, + PVOID pData, + DWORD cbSize, + OUT DWORD *pdwResult) +{ + HRESULT hResult = E_NOTIMPL; + + + VERBOSE("IOemPS::Command() entry.\r\n"); + hResult = PSCommand(pdevobj, dwIndex, pData, cbSize, m_pOEMHelp, pdwResult); + + return hResult; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// oem class factory +// +class IOemCF : public IClassFactory +{ +public: + // *** IUnknown methods *** + + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release) (THIS); + + // *** IClassFactory methods *** + STDMETHOD(CreateInstance) (THIS_ + LPUNKNOWN pUnkOuter, + REFIID riid, + LPVOID FAR* ppvObject); + STDMETHOD(LockServer) (THIS_ BOOL bLock); + + + // Constructor + IOemCF(); + ~IOemCF(); + +protected: + long m_cRef; +}; + +/////////////////////////////////////////////////////////// +// +// Class factory body +// +IOemCF::IOemCF() : m_cRef(1) +{ + VERBOSE("IOemCF::IOemCF() entered.\r\n"); +} + +IOemCF::~IOemCF() +{ + VERBOSE("IOemCF::~IOemCF() entered.\r\n"); + + // If this instance of the object is being deleted, then the reference + // count should be zero. + assert(0 == m_cRef); +} + +HRESULT __stdcall IOemCF::QueryInterface(const IID& iid, void** ppv) +{ + VERBOSE("IOemCF::QueryInterface entered.\r\n"); + + if ((iid == IID_IUnknown) || (iid == IID_IClassFactory)) + { + *ppv = static_cast<IOemCF*>(this); + } + else + { + WARNING("IOemCF::QueryInterface (interface not supported).\r\n"); + *ppv = NULL; + return E_NOINTERFACE; + } + + reinterpret_cast<IUnknown*>(*ppv)->AddRef(); + + VERBOSE("IOemCF::QueryInterface leaving.\r\n"); + + return S_OK; +} + +ULONG __stdcall IOemCF::AddRef() +{ + VERBOSE("IOemCF::AddRef() called.\r\n"); + return InterlockedIncrement(&m_cRef); +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall IOemCF::Release() +{ + VERBOSE("IOemCF::Release() called.\r\n"); + + ASSERT( 0 != m_cRef); + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + + } + return cRef; +} + +// IClassFactory implementation +HRESULT __stdcall IOemCF::CreateInstance(IUnknown* pUnknownOuter, + const IID& iid, + void** ppv) +{ + VERBOSE("Class factory: Create component.\r\n"); + + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Cannot aggregate. + if (pUnknownOuter != NULL) + { + WARNING("Class factory: non-Null pUnknownOuter.\r\n"); + + return CLASS_E_NOAGGREGATION; + } + + // Create component. + IOemPS* pOemCP = new IOemPS; + if (pOemCP == NULL) + { + ERR("Class factory: failed to allocate IOemPS.\r\n"); + + return E_OUTOFMEMORY; + } + + // Get the requested interface. + HRESULT hr = pOemCP->QueryInterface(iid, ppv); + + // Release the IUnknown pointer. + // (If QueryInterface failed, component will delete itself.) + pOemCP->Release(); + return hr; +} + +// LockServer +HRESULT __stdcall IOemCF::LockServer(BOOL bLock) +{ + VERBOSE("IOemCF::LockServer entered.\r\n"); + + if (bLock) + { + InterlockedIncrement(&g_cServerLocks); + } + else + { + InterlockedDecrement(&g_cServerLocks); + } + + VERBOSE("IOemCF::LockServer() leaving.\r\n"); + return S_OK; +} + + +// +// Registration functions +// + +// +// Can DLL unload now? +// +STDAPI DllCanUnloadNow() +{ + // + // To avoid leaving OEM DLL still in memory when Unidrv or Pscript drivers + // are unloaded, Unidrv and Pscript driver ignore the return value of + // DllCanUnloadNow of the OEM DLL, and always call FreeLibrary on the OEMDLL. + // + // If OEM DLL spins off a working thread that also uses the OEM DLL, the + // thread needs to call LoadLibrary and FreeLibraryAndExitThread, otherwise + // it may crash after Unidrv or Pscript calls FreeLibrary. + // + + VERBOSE("DllCanUnloadNow entered.\r\n"); + + if ((g_cComponents == 0) && (g_cServerLocks == 0)) + { + return S_OK; + } + else + { + return S_FALSE; + } +} + +// +// Get class factory +// +STDAPI DllGetClassObject( + _In_ REFCLSID clsid, + _In_ REFIID iid, + _Outptr_ LPVOID* ppv) +{ + VERBOSE("DllGetClassObject: Create class factory entered.\r\n"); + + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Can we create this component? + if (clsid != CLSID_OEMRENDER) + { + WARNING("DllGetClassObject: doesn't support clsid!\r\n"); + return CLASS_E_CLASSNOTAVAILABLE; + } + + // Create class factory. + IOemCF* pFontCF = new IOemCF; // Reference count set to 1 + // in constructor + if (pFontCF == NULL) + { + WARNING("DllGetClassObject: memory allocation failed!\r\n"); + return E_OUTOFMEMORY; + } + + // Get requested interface. + HRESULT hr = pFontCF->QueryInterface(iid, ppv); + pFontCF->Release(); + + return hr; +} diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemps/intrface.h b/print/OEM Printer Customization Plug-in Samples/C++/oemps/intrface.h new file mode 100644 index 00000000..87b00473 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemps/intrface.h @@ -0,0 +1,119 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Intrface.H +// +// +// PURPOSE: Define COM interface for User Mode Printer Customization DLL. +// +#pragma once + +//////////////////////////////////////////////////////////////////////////////// +// +// IOemPS +// +// Interface for PostScript OEM sample rendering module +// +class IOemPS : public IPrintOemPS +{ +public: + // *** IUnknown methods *** + + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release) (THIS); + + // *** IPrintOemPS methods *** + + // + // Method for publishing Driver interface. + // + STDMETHOD(PublishDriverInterface)(THIS_ IUnknown *pIUnknown); + + // + // Method for OEM to specify DDI hook out + // + + STDMETHOD(EnableDriver) (THIS_ DWORD DriverVersion, + DWORD cbSize, + PDRVENABLEDATA pded); + + // + // Method to notify OEM plugin that it is no longer required + // + + STDMETHOD(DisableDriver) (THIS); + + // + // Method for OEM to contruct its own PDEV + // + + STDMETHOD(EnablePDEV) (THIS_ PDEVOBJ pdevobj, + _In_ PWSTR pPrinterName, + ULONG cPatterns, + HSURF *phsurfPatterns, + ULONG cjGdiInfo, + GDIINFO *pGdiInfo, + ULONG cjDevInfo, + DEVINFO *pDevInfo, + DRVENABLEDATA *pded, + OUT PDEVOEM *pDevOem); + + // + // Method for OEM to free any resource associated with its PDEV + // + + STDMETHOD(DisablePDEV) (THIS_ PDEVOBJ pdevobj); + + // + // Method for OEM to transfer from old PDEV to new PDEV + // + + STDMETHOD(ResetPDEV) (THIS_ PDEVOBJ pdevobjOld, + PDEVOBJ pdevobjNew); + + + // + // Get OEM dll related information + // + + STDMETHOD(GetInfo) (THIS_ DWORD dwMode, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded); + // + // OEMDevMode + // + + STDMETHOD(DevMode) (THIS_ DWORD dwMode, + POEMDMPARAM pOemDMParam); + + // + // OEMCommand - PSCRIPT only, return E_NOTIMPL on Unidrv + // + + STDMETHOD(Command) (THIS_ PDEVOBJ pdevobj, + DWORD dwIndex, + PVOID pData, + DWORD cbSize, + OUT DWORD *pdwResult); + + IOemPS(); + ~IOemPS(); + +protected: + + long m_cRef; + + IPrintOemDriverPS* m_pOEMHelp; +}; + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemps/oemps.def b/print/OEM Printer Customization Plug-in Samples/C++/oemps/oemps.def new file mode 100644 index 00000000..9992eb3e --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemps/oemps.def @@ -0,0 +1,3 @@ +LIBRARY OEMPS +EXPORTS DllGetClassObject PRIVATE + DllCanUnloadNow PRIVATE
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemps/oemps.h b/print/OEM Printer Customization Plug-in Samples/C++/oemps/oemps.h new file mode 100644 index 00000000..4fc07721 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemps/oemps.h @@ -0,0 +1,76 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: OEMPS.H +// +// +// PURPOSE: Define common data types, and external function prototypes +// for oemps.cpp. +// +#pragma once + + +/////////////////////////////////////////////////////// +// Warning: the following enum order must match the +// order in OEMHookFuncs[]. +/////////////////////////////////////////////////////// +typedef enum tag_Hooks { + UD_DrvRealizeBrush, + UD_DrvCopyBits, + UD_DrvBitBlt, + UD_DrvStretchBlt, + UD_DrvTextOut, + UD_DrvStrokePath, + UD_DrvFillPath, + UD_DrvStrokeAndFillPath, + UD_DrvStartPage, + UD_DrvSendPage, + UD_DrvEscape, + UD_DrvStartDoc, + UD_DrvEndDoc, + UD_DrvQueryFont, + UD_DrvQueryFontTree, + UD_DrvQueryFontData, + UD_DrvQueryAdvanceWidths, + UD_DrvFontManagement, + UD_DrvGetGlyphMode, + UD_DrvStretchBltROP, + UD_DrvPlgBlt, + UD_DrvTransparentBlt, + UD_DrvAlphaBlend, + UD_DrvGradientFill, + UD_DrvIcmCreateColorTransform, + UD_DrvIcmDeleteColorTransform, + UD_DrvQueryDeviceSupport, + + MAX_DDI_HOOKS, + +} ENUMHOOKS; + + +typedef struct _OEMPDEV { + // + // define whatever needed, such as working buffers, tracking information, + // etc. + // + // This test DLL hooks out every drawing DDI. So it needs to remember + // PS's hook function pointer so it call back. + // + PFN pfnPS[MAX_DDI_HOOKS]; + + // + // define whatever needed, such as working buffers, tracking information, + // etc. + // + DWORD dwReserved[1]; + +} OEMPDEV, *POEMPDEV; + + + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemps/precomp.h b/print/OEM Printer Customization Plug-in Samples/C++/oemps/precomp.h new file mode 100644 index 00000000..4efe4e6f --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemps/precomp.h @@ -0,0 +1,47 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: precomp.h +// +// PURPOSE: Header files that should be in the precompiled header. +// +#pragma once + +// Necessary for compiling under VC. +#if(!defined(WINVER) || (WINVER < 0x0500)) + #undef WINVER + #define WINVER 0x0500 +#endif +#if(!defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500)) + #undef _WIN32_WINNT + #define _WIN32_WINNT 0x0500 +#endif + + +// Required header files that shouldn't change often. + +#include <STDDEF.H> +#include <STDLIB.H> +#include <OBJBASE.H> +#include <STDARG.H> +#include <STDIO.H> +#include <WINDEF.H> +#include <WINERROR.H> +#include <WINBASE.H> +#include <WINGDI.H> +#include <WINDDI.H> +#include <TCHAR.H> +#include <EXCPT.H> +#include <ASSERT.H> +#include <PRINTOEM.H> +#include <INITGUID.H> +#include <PRCOMOEM.H> + +// StrSafe.h needs to be included last +// to disallow unsafe string functions. +#include <STRSAFE.H> + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemps/precompsrc.cpp b/print/OEM Printer Customization Plug-in Samples/C++/oemps/precompsrc.cpp new file mode 100644 index 00000000..5944cf51 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemps/precompsrc.cpp @@ -0,0 +1 @@ +#include "precomp.h"
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemps/resource.h b/print/OEM Printer Customization Plug-in Samples/C++/oemps/resource.h new file mode 100644 index 00000000..48f784ad --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemps/resource.h @@ -0,0 +1,15 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by OEMPS.rc +// + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 103 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemui.ini b/print/OEM Printer Customization Plug-in Samples/C++/oemui.ini new file mode 100644 index 00000000..6324a104 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemui.ini @@ -0,0 +1,3 @@ +[OEMFiles] +OEMConfigFile1=OEMUI.DLL + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemui/OEMUI.def b/print/OEM Printer Customization Plug-in Samples/C++/oemui/OEMUI.def new file mode 100644 index 00000000..68bdffc0 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemui/OEMUI.def @@ -0,0 +1,3 @@ +LIBRARY OEMUI +EXPORTS DllGetClassObject PRIVATE + DllCanUnloadNow PRIVATE
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemui/OEMUI.rc b/print/OEM Printer Customization Plug-in Samples/C++/oemui/OEMUI.rc new file mode 100644 index 00000000..c9968413 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemui/OEMUI.rc @@ -0,0 +1,169 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "Written by Windows Printing & Imaging Team" + VALUE "CompanyName", "Microsoft Corp." + VALUE "FileDescription", "OEM UI Test Module." + VALUE "FileVersion", "1, 0, 0, 1" + VALUE "InternalName", "OEMUI" + VALUE "LegalCopyright", "Copyright � 1998 - 2003 Microsoft Corp." + VALUE "LegalTrademarks", "Microsoft� is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation" + VALUE "OriginalFilename", "OEMUI.dll" + VALUE "ProductName", "Microsoft OEMUI" + VALUE "ProductVersion", "1.1" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_DEVICE_PROPPAGE DIALOG 0, 0, 179, 113 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Device Property Page" +FONT 8, "MS Shell Dialog" +BEGIN + LTEXT "OEM UI Added Page",IDC_STATIC,55,14,68,11 + PUSHBUTTON "Calibrate",IDC_CALIBRATE,61,34,50,14 +END + +IDD_DOC_PROPPAGE DIALOG 0, 0, 210, 154 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Document Property Page" +FONT 8, "MS Shell Dialog" +BEGIN + LTEXT "OEM UI Document Property Page",IDC_STATIC,60,73,108,8 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_DEVICE_PROPPAGE, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 172 + TOPMARGIN, 8 + BOTTOMMARGIN, 106 + END + + IDD_DOC_PROPPAGE, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 203 + TOPMARGIN, 7 + BOTTOMMARGIN, 147 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDS_SECTION "OEM UI Added Item" + IDS_CALIBRATED "Printer has been calibrated." + IDS_NAME "OEM UI Customization DLL" + IDS_DEV_SECTION "Device Settings OEM UI Added Item" + IDS_ADV_SECTION "Advanced OEM UI Added Item" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemui/OEMUI.vcxproj b/print/OEM Printer Customization Plug-in Samples/C++/oemui/OEMUI.vcxproj new file mode 100644 index 00000000..7c5e5bcc --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemui/OEMUI.vcxproj @@ -0,0 +1,1042 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Win10 Debug|ARM64"> + <Configuration>Win10 Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|Win32"> + <Configuration>Win10 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|x64"> + <Configuration>Win10 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|ARM64"> + <Configuration>Win10 Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|Win32"> + <Configuration>Win10 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|x64"> + <Configuration>Win10 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|Win32"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|Win32"> + <Configuration>Win8 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|Win32"> + <Configuration>Win7 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|Win32"> + <Configuration>Win8.1 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|Win32"> + <Configuration>Win8 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|Win32"> + <Configuration>Win7 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|x64"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|x64"> + <Configuration>Win8 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|x64"> + <Configuration>Win7 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|x64"> + <Configuration>Win8.1 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|x64"> + <Configuration>Win8 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|x64"> + <Configuration>Win7 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{452209BF-AEB7-457D-956B-90CDE70CED7D}</ProjectGuid> + <RootNamespace>$(MSBuildProjectName)</RootNamespace> + <Configuration Condition="'$(Configuration)' == ''">Win10 Debug</Configuration> + <Platform Condition="'$(Platform)' == ''">Win32</Platform> + <SampleGuid>{84C69391-30E8-404B-B0F2-7C88DEB2A456}</SampleGuid> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <PropertyGroup> + <OutDir>$(IntDir)</OutDir> + </PropertyGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ItemGroup Label="WrappedTaskItems" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetName>OEMUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetName>OEMUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetName>OEMUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <TargetName>OEMUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <TargetName>OEMUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetName>OEMUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetName>OEMUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetName>OEMUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <TargetName>OEMUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <TargetName>OEMUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetName>OEMUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetName>OEMUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetName>OEMUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <TargetName>OEMUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetName>OEMUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetName>OEMUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetName>OEMUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <TargetName>OEMUI</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;winspool.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Link> + <ModuleDefinitionFile>OEMUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Link> + <ModuleDefinitionFile>OEMUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Link> + <ModuleDefinitionFile>OEMUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <Link> + <ModuleDefinitionFile>OEMUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <Link> + <ModuleDefinitionFile>OEMUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Link> + <ModuleDefinitionFile>OEMUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Link> + <ModuleDefinitionFile>OEMUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Link> + <ModuleDefinitionFile>OEMUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <Link> + <ModuleDefinitionFile>OEMUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <Link> + <ModuleDefinitionFile>OEMUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Link> + <ModuleDefinitionFile>OEMUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Link> + <ModuleDefinitionFile>OEMUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Link> + <ModuleDefinitionFile>OEMUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <Link> + <ModuleDefinitionFile>OEMUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>OEMUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>OEMUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>OEMUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>OEMUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="devmode.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="dllentry.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="globals.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="OEMUI.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Create</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ResourceCompile Include="OEMUI.rc" /> + </ItemGroup> + <ItemGroup> + <Inf Exclude="@(Inf)" Include="*.inf" /> + <FilesToPackage Include="$(TargetPath)" Condition="'$(ConfigurationType)'=='Driver' or '$(ConfigurationType)'=='DynamicLibrary'" /> + </ItemGroup> + <ItemGroup> + <None Exclude="@(None)" Include="*.txt;*.htm;*.html" /> + <None Exclude="@(None)" Include="*.ico;*.cur;*.bmp;*.dlg;*.rct;*.gif;*.jpg;*.jpeg;*.wav;*.jpe;*.tiff;*.tif;*.png;*.rc2" /> + <None Exclude="@(None)" Include="*.def;*.bat;*.hpj;*.asmx" /> + </ItemGroup> + <ItemGroup> + <ClInclude Exclude="@(ClInclude)" Include="*.h;*.hpp;*.hxx;*.hm;*.inl;*.xsd" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemui/OEMUI.vcxproj.Filters b/print/OEM Printer Customization Plug-in Samples/C++/oemui/OEMUI.vcxproj.Filters new file mode 100644 index 00000000..07492222 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemui/OEMUI.vcxproj.Filters @@ -0,0 +1,220 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;*</Extensions> + <UniqueIdentifier>{03B02FF3-CA63-4469-8907-F08C69CCE4DC}</UniqueIdentifier> + </Filter> + <Filter Include="Header Files"> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + <UniqueIdentifier>{5AE6A39D-71A9-44D0-B561-2746C654DA3B}</UniqueIdentifier> + </Filter> + <Filter Include="Resource Files"> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms;man;xml</Extensions> + <UniqueIdentifier>{C46C5ADA-08FD-4FA4-829D-1007F014DC71}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClCompile Include="devmode.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="dllentry.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="globals.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="OEMUI.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="globals.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="oemui.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="OEMUI.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> + <ItemGroup> + <None Include="OEMUI.def"> + <Filter>Source Files</Filter> + </None> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemui/debug.h b/print/OEM Printer Customization Plug-in Samples/C++/oemui/debug.h new file mode 100644 index 00000000..0414569c --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemui/debug.h @@ -0,0 +1,82 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1996 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Debug.H +// +// PURPOSE: Define common data types, and external function prototypes +// for debugging functions. Also defines the various debug macros. +// +// + +#pragma once + +///////////////////////////////////////////////////////// +// Macros +///////////////////////////////////////////////////////// +// +// These macros are used for debugging purposes. They expand +// to white spaces on a free build. Here is a brief description +// of what they do and how they are used: +// +// giDebugLevel +// Global variable which set the current debug level to control +// the amount of debug messages emitted. +// +// WARNING(msg) +// Display a message if the current debug level is <= DBG_WARNING. +// The message format is: WRN filename (linenumber): message +// +// ERR(msg) +// Similiar to WARNING macro above - displays a message +// if the current debug level is <= DBG_ERROR. +// +// ASSERT(cond) +// Verify a condition is true. If not, force a breakpoint. +// +// RIP(msg) +// Display a message and force a breakpoint. +// +// Usage: +// WARNING("App passed NULL pointer, ignoring...\n"); +// + +#define DBG_VERBOSE 0 +#define DBG_WARNING 1 +#define DBG_ERROR 2 +#define DBG_NONE 3 + +// VC and Build use different debug defines. +#if defined (DBG) || defined (_DEBUG) + + // __declspec(selectany) ensures that even if this is defined in multiple compilation + // modules, they will all resolve to the same symbol in the linked DLL + __declspec(selectany) INT giDebugLevel = 2; + + #define STRINGIZE(x) #x + #define QUOTE(x) STRINGIZE(x) + #define FILE_AND_LINE __FILE__ "@" QUOTE(__LINE__) + + #define VERBOSE(msg) { if(giDebugLevel <= DBG_VERBOSE) OutputDebugStringA( FILE_AND_LINE ": " msg); } + #define WARNING(msg) { if(giDebugLevel <= DBG_WARNING) OutputDebugStringA( FILE_AND_LINE ": Warning: " msg); } + #define ERR(msg) { if(giDebugLevel <= DBG_ERROR) OutputDebugStringA(FILE_AND_LINE ": Error:" msg); } + #define ASSERT(cond) { if (!(cond)) RIP("\n"); } + #define RIP(msg) { OutputDebugStringA(FILE_AND_LINE ": Error (not recoverable): " msg); DebugBreak(); } + +#else // !DBG + + #define VERBOSE(msg) + #define WARNING(msg) + #define ERR(msg) + #define ASSERT(cond) + #define RIP(msg) + +#endif + + + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemui/devmode.cpp b/print/OEM Printer Customization Plug-in Samples/C++/oemui/devmode.cpp new file mode 100644 index 00000000..dd9ff650 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemui/devmode.cpp @@ -0,0 +1,182 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Devmode.cpp +// +// +// PURPOSE: Implementation of Devmode functions shared with OEM UI and OEM rendering modules. +// + +#include "precomp.h" +#include "debug.h" +#include "devmode.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +// +//Performs operation on UI Plugins Private DevMode Members. +//Called via IOemUI::DevMode +// + +HRESULT hrOEMDevMode(DWORD dwMode, POEMDMPARAM pOemDMParam) +{ + POEMDEV pOEMDevIn; + POEMDEV pOEMDevOut; + + + // Verify parameters. + if( (NULL == pOemDMParam) + || + ( (OEMDM_SIZE != dwMode) + && + (OEMDM_DEFAULT != dwMode) + && + (OEMDM_CONVERT != dwMode) + && + (OEMDM_MERGE != dwMode) + ) + ) + { + ERR("DevMode() ERROR_INVALID_PARAMETER.\r\n"); + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Cast generic (i.e. PVOID) to OEM private devomode pointer type. + pOEMDevIn = (POEMDEV) pOemDMParam->pOEMDMIn; + pOEMDevOut = (POEMDEV) pOemDMParam->pOEMDMOut; + + switch(dwMode) + { + // + //The Method should return the size of the memory allocation needed to store the UI plugin Private DEVMODE. + // + case OEMDM_SIZE: + pOemDMParam->cbBufSize = sizeof(OEMDEV); + break; + + // + //Should fill the Private DEVMODE with the default values. + // + case OEMDM_DEFAULT: + // + //OEM_DMEXTRAHEADER Members + // + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + + // + //Private members + // + pOEMDevOut->dwDriverData = 0; + pOEMDevOut->dwAdvancedData = 0; + break; + + // + //The method should convert private DEVMODE members to the current version, if necessary. + // + case OEMDM_CONVERT: + ConvertOEMDevmode(pOEMDevIn, pOEMDevOut); + break; + + // + //The method should validate the information contained in private DEVMODE members and merge validated values into a private DEVMODE structure containing default values + // + case OEMDM_MERGE: + ConvertOEMDevmode(pOEMDevIn, pOEMDevOut); + MakeOEMDevmodeValid(pOEMDevOut); + break; + } + + return S_OK; +} + + +BOOL ConvertOEMDevmode(PCOEMDEV pOEMDevIn, POEMDEV pOEMDevOut) +{ + if( (NULL == pOEMDevIn) + || + (NULL == pOEMDevOut) + ) + { + ERR("ConvertOEMDevmode() invalid parameters.\r\n"); + return FALSE; + } + + // Check OEM Signature, if it doesn't match ours, + // then just assume DMIn is bad and use defaults. + if(pOEMDevIn->dmOEMExtra.dwSignature == pOEMDevOut->dmOEMExtra.dwSignature) + { + VERBOSE("Converting private OEM Devmode.\r\n"); + + // Set the devmode defaults so that anything the isn't copied over will + // be set to the default value. + pOEMDevOut->dwDriverData = 0; + pOEMDevOut->dwAdvancedData = 0; + + // Copy the old structure in to the new using which ever size is the smaller. + // Devmode maybe from newer Devmode (not likely since there is only one), or + // Devmode maybe a newer Devmode, in which case it maybe larger, + // but the first part of the structure should be the same. + + // DESIGN ASSUMPTION: the private DEVMODE structure only gets added to; + // the fields that are in the DEVMODE never change only new fields get added to the end. + + memcpy(pOEMDevOut, pOEMDevIn, __min(pOEMDevOut->dmOEMExtra.dwSize, pOEMDevIn->dmOEMExtra.dwSize)); + + // Re-fill in the size and version fields to indicated + // that the DEVMODE is the current private DEVMODE version. + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + } + else + { + WARNING("Unknown DEVMODE signature, pOEMDMIn ignored.\r\n"); + + // Don't know what the input DEVMODE is, so just use defaults. + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + pOEMDevOut->dwDriverData = 0; + pOEMDevOut->dwAdvancedData = 0; + } + + return TRUE; +} + + +BOOL MakeOEMDevmodeValid(POEMDEV pOEMDevmode) +{ + if(NULL == pOEMDevmode) + { + return FALSE; + } + + // ASSUMPTION: pOEMDevmode is large enough to contain OEMDEV structure. + + // Make sure that dmOEMExtra indicates the current OEMDEV structure. + pOEMDevmode->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevmode->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevmode->dmOEMExtra.dwVersion = OEM_VERSION; + + // Set driver data, if not valid. + if(pOEMDevmode->dwDriverData > 100) + { + pOEMDevmode->dwDriverData = 0; + } + + // Set Advanced driver data, if not valid. + if(pOEMDevmode->dwAdvancedData > 100) + { + pOEMDevmode->dwAdvancedData = 0; + } + + return TRUE; +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemui/devmode.h b/print/OEM Printer Customization Plug-in Samples/C++/oemui/devmode.h new file mode 100644 index 00000000..3dcbba25 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemui/devmode.h @@ -0,0 +1,52 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Devmode.h +// +// PURPOSE: Define common data types, and external function prototypes +// for devmode functions. +// + +#pragma once + +//////////////////////////////////////////////////////// +// OEM Devmode Defines +//////////////////////////////////////////////////////// + +#define OEM_SIGNATURE 'MSFT' +#define OEM_VERSION 0x00000001L + +//////////////////////////////////////////////////////// +// OEM Devmode Type Definitions +//////////////////////////////////////////////////////// + +// +// This structure must be prefixed by OEM_DMEXTRAHEADER +// Plug-ins must implement the IPrintOemUI::DevMode method +// +typedef struct tagOEMDEV +{ + OEM_DMEXTRAHEADER dmOEMExtra; + DWORD dwDriverData; + DWORD dwAdvancedData; + + // + //Private DevMode Members + // + +} OEMDEV, *POEMDEV; + +typedef const OEMDEV *PCOEMDEV; + + +///////////////////////////////////////////////////////// +// ProtoTypes +///////////////////////////////////////////////////////// + +HRESULT hrOEMDevMode(DWORD dwMode, POEMDMPARAM pOemDMParam); +BOOL ConvertOEMDevmode(PCOEMDEV pOEMDevIn, POEMDEV pOEMDevOut); +BOOL MakeOEMDevmodeValid(POEMDEV pOEMDevmode); diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemui/dllentry.cpp b/print/OEM Printer Customization Plug-in Samples/C++/oemui/dllentry.cpp new file mode 100644 index 00000000..0823030c --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemui/dllentry.cpp @@ -0,0 +1,49 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: dllentry.cpp +// +// PURPOSE: Source module for DLL entry function(s). +// + +#include "precomp.h" +#include "debug.h" +#include "globals.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +/////////////////////////////////////////////////////////// +// +// DLL entry point +// +BOOL WINAPI DllMain(HINSTANCE hInst, WORD wReason, LPVOID lpReserved) +{ + UNREFERENCED_PARAMETER(lpReserved); + + switch(wReason) + { + case DLL_PROCESS_ATTACH: + VERBOSE("Process attach.\r\n"); + ghInstance = hInst; + break; + + case DLL_THREAD_ATTACH: + VERBOSE("Thread attach.\r\n"); + break; + + case DLL_PROCESS_DETACH: + VERBOSE("Process detach.\r\n"); + break; + + case DLL_THREAD_DETACH: + VERBOSE("Thread detach.\r\n"); + break; + } + + return TRUE; +} diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemui/globals.cpp b/print/OEM Printer Customization Plug-in Samples/C++/oemui/globals.cpp new file mode 100644 index 00000000..40cfbbc2 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemui/globals.cpp @@ -0,0 +1,22 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Globals.cpp +// +// PURPOSE: File that contains all the globals. +// + +#include "precomp.h" +#include "globals.h" + + +/////////////////////////////////////// +// Globals +/////////////////////////////////////// + +// Module's Instance handle from DLLEntry of process. +HINSTANCE ghInstance = NULL; diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemui/globals.h b/print/OEM Printer Customization Plug-in Samples/C++/oemui/globals.h new file mode 100644 index 00000000..c809fdc6 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemui/globals.h @@ -0,0 +1,17 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Globals.h +// +// PURPOSE: Lists of globals declared in Globals.cpp. +// + +#pragma once + +// Module's Instance handle from DLLEntry of process. +extern HINSTANCE ghInstance; + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemui/intrface.cpp b/print/OEM Printer Customization Plug-in Samples/C++/oemui/intrface.cpp new file mode 100644 index 00000000..a05b4643 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemui/intrface.cpp @@ -0,0 +1,567 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Intrface.cpp +// +// PURPOSE: Implementation of interface for PScript5 and Unidrv UI plug-ins. +// + +#include "precomp.h" + +#include "debug.h" +#include "devmode.h" +#include "oemui.h" +#include "intrface.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +//////////////////////////////////////////////////////// +// Internal Globals +//////////////////////////////////////////////////////// + +static long g_cComponents = 0 ; // Count of active components +static long g_cServerLocks = 0 ; // Count of locks + +//////////////////////////////////////////////////////////////////////////////// +// +// IOemUI body +// +IOemUI::~IOemUI() +{ + // Make sure that helper interface is released. + if(NULL != m_pOEMHelp) + { + m_pOEMHelp->Release(); + m_pOEMHelp = NULL; + } + + // If this instance of the object is being deleted, then the reference + // count should be zero. + assert(0 == m_cRef); +} + +HRESULT __stdcall IOemUI::QueryInterface(const IID& iid, void** ppv) +{ + VERBOSE("IOemUI:QueryInterface entry.\r\n\r\n"); + if (iid == IID_IUnknown) + { + *ppv = static_cast<IUnknown*>(this); + VERBOSE("IOemUI:Return pointer to IUnknown.\r\n\r\n"); + } + else if (iid == IID_IPrintOemUI) + { + *ppv = static_cast<IPrintOemUI*>(this) ; + VERBOSE("IOemUI:Return pointer to IPrintOemUI.\r\n"); + } + else + { + VERBOSE("IOemUI::QueryInterface IID not supported.\r\n"); + *ppv = NULL ; + return E_NOINTERFACE ; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef() ; + return S_OK ; +} + +ULONG __stdcall IOemUI::AddRef() +{ + VERBOSE("IOemUI:AddRef entry.\r\n"); + return InterlockedIncrement(&m_cRef) ; +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall IOemUI::Release() +{ + VERBOSE("IOemUI:Release entry.\r\n"); + ASSERT( 0 != m_cRef); + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + + } + return cRef; +} + +HRESULT __stdcall IOemUI::PublishDriverInterface( + IUnknown *pIUnknown) +{ + VERBOSE("IOemUI:PublishDriverInterface entry.\r\n"); + + // Need to store pointer to Driver Helper functions, if we already haven't. + if (m_pOEMHelp == NULL) + { + HRESULT hResult; + + + // Get Interface to Helper Functions. + hResult = pIUnknown->QueryInterface(IID_IPrintOemDriverUI, (void** ) &(m_pOEMHelp)); + + if(!SUCCEEDED(hResult)) + { + // Make sure that interface pointer reflects interface query failure. + m_pOEMHelp = NULL; + + return E_FAIL; + } + } + + return S_OK; +} + +HRESULT __stdcall IOemUI::GetInfo( + DWORD dwMode, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded) +{ + VERBOSE("IOemUI::GetInfo entry.\r\r\n"); + + // Validate parameters. + if( (NULL == pcbNeeded) + || + ( (OEMGI_GETSIGNATURE != dwMode) + && + (OEMGI_GETVERSION != dwMode) + && + (OEMGI_GETPUBLISHERINFO != dwMode) + ) + ) + { + WARNING("IOemUI::GetInfo() exit pcbNeeded is NULL! ERROR_INVALID_PARAMETER\r\r\n"); + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Set expected buffer size and number of bytes written. + *pcbNeeded = sizeof(DWORD); + + // Check buffer size is sufficient. + if((cbSize < *pcbNeeded) || (NULL == pBuffer)) + { + WARNING("IOemUI::GetInfo() exit insufficient buffer!\r\r\n"); + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return E_FAIL; + } + + switch(dwMode) + { + // OEM DLL Signature + case OEMGI_GETSIGNATURE: + *(PDWORD)pBuffer = OEM_SIGNATURE; + break; + + // OEM DLL version + case OEMGI_GETVERSION: + *(PDWORD)pBuffer = OEM_VERSION; + break; + + // dwMode not supported. + default: + // Set written bytes to zero since nothing was written. + WARNING("IOemUI::GetInfo() exit mode not supported.\r\r\n"); + *pcbNeeded = 0; + SetLastError(ERROR_NOT_SUPPORTED); + return E_FAIL; + } + + VERBOSE("IOemUI::GetInfo() exit S_OK\r\n"); + return S_OK; +} + +HRESULT __stdcall IOemUI::DevMode( + DWORD dwMode, + POEMDMPARAM pOemDMParam) +{ + VERBOSE("IOemUI:DevMode entry.\r\n"); + + return hrOEMDevMode(dwMode, pOemDMParam); +} + +HRESULT __stdcall IOemUI::CommonUIProp( + DWORD dwMode, + POEMCUIPPARAM pOemCUIPParam) +{ + VERBOSE("IOemUI:CommonUIProp entry.\r\n"); + + return hrOEMPropertyPage(dwMode, pOemCUIPParam); +} + + +HRESULT __stdcall IOemUI::DocumentPropertySheets( + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam) +{ + VERBOSE("IOemUI:DocumentPropertySheets entry.\r\n"); + + return hrOEMDocumentPropertySheets(pPSUIInfo, lParam, m_pOEMHelp); +} + +HRESULT __stdcall IOemUI::DevicePropertySheets( + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam) +{ + VERBOSE("IOemUI:DevicePropertySheets entry.\r\n"); + + return hrOEMDevicePropertySheets(pPSUIInfo, lParam); +} + +HRESULT __stdcall IOemUI::DeviceCapabilities( + POEMUIOBJ poemuiobj, + HANDLE hPrinter, + _In_ PWSTR pDeviceName, + WORD wCapability, + PVOID pOutput, + PDEVMODE pPublicDM, + PVOID pOEMDM, + DWORD dwOld, + DWORD *dwResult) +{ + VERBOSE("IOemUI:DeviceCapabilities entry.\r\n"); + + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(pDeviceName); + UNREFERENCED_PARAMETER(wCapability); + UNREFERENCED_PARAMETER(pOutput); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + UNREFERENCED_PARAMETER(dwOld); + UNREFERENCED_PARAMETER(dwResult); + + return E_NOTIMPL; +} + +HRESULT __stdcall IOemUI::DevQueryPrintEx( + POEMUIOBJ poemuiobj, + PDEVQUERYPRINT_INFO pDQPInfo, + PDEVMODE pPublicDM, + PVOID pOEMDM) +{ + VERBOSE("IOemUI:DevQueryPrintEx entry.\r\n"); + + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(pDQPInfo); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + + return E_NOTIMPL; +} + +HRESULT __stdcall IOemUI::UpgradePrinter( + DWORD dwLevel, + PBYTE pDriverUpgradeInfo) +{ + VERBOSE("IOemUI:UpgradePrinter entry.\r\n"); + + UNREFERENCED_PARAMETER(dwLevel); + UNREFERENCED_PARAMETER(pDriverUpgradeInfo); + + return E_NOTIMPL; +} + +HRESULT __stdcall IOemUI::PrinterEvent( + _In_ PWSTR pPrinterName, + INT iDriverEvent, + DWORD dwFlags, + LPARAM lParam) +{ + VERBOSE("IOemUI:PrinterEvent entry.\r\n"); + + UNREFERENCED_PARAMETER(pPrinterName); + UNREFERENCED_PARAMETER(iDriverEvent); + UNREFERENCED_PARAMETER(dwFlags); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +} + +HRESULT __stdcall IOemUI::DriverEvent( + DWORD dwDriverEvent, + DWORD dwLevel, + LPBYTE pDriverInfo, + LPARAM lParam) +{ + VERBOSE("IOemUI:DriverEvent entry.\r\n"); + + UNREFERENCED_PARAMETER(dwDriverEvent); + UNREFERENCED_PARAMETER(dwLevel); + UNREFERENCED_PARAMETER(pDriverInfo); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +}; + + +#define PROFILE_NAME L"OEMPROFILE.icm\0" + +HRESULT __stdcall IOemUI::QueryColorProfile( + HANDLE hPrinter, + POEMUIOBJ poemuiobj, + PDEVMODE pPublicDM, + PVOID pOEMDM, + ULONG ulQueryMode, + VOID *pvProfileData, + ULONG *pcbProfileData, + FLONG *pflProfileData) +{ + HRESULT Result = E_FAIL; + + VERBOSE("IOemUI:QueryColorProfile entry.\r\n"); + + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + + if(QCP_DEVICEPROFILE == ulQueryMode) + { + if(NULL == pvProfileData) + { + *pcbProfileData = sizeof(PROFILE_NAME); + SetLastError(ERROR_INSUFFICIENT_BUFFER); + } + else + { + if(*pcbProfileData < sizeof(PROFILE_NAME)) + { + *pcbProfileData = sizeof(PROFILE_NAME); + SetLastError(ERROR_INSUFFICIENT_BUFFER); + } + else + { + Result = StringCbCopy((LPWSTR)pvProfileData, *pcbProfileData, PROFILE_NAME); + *pcbProfileData = sizeof(PROFILE_NAME); + *pflProfileData = QCP_PROFILEDISK; + + if(FAILED(Result)) + { + SetLastError(Result); + } + } + } + } + + return Result; +}; + +HRESULT __stdcall IOemUI::FontInstallerDlgProc( + HWND hWnd, + UINT usMsg, + WPARAM wParam, + LPARAM lParam) +{ + VERBOSE("IOemUI:FontInstallerDlgProc entry.\r\n"); + + UNREFERENCED_PARAMETER(hWnd); + UNREFERENCED_PARAMETER(usMsg); + UNREFERENCED_PARAMETER(wParam); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +}; + +HRESULT __stdcall IOemUI::UpdateExternalFonts( + HANDLE hPrinter, + HANDLE hHeap, + _In_ PWSTR pwstrCartridges) +{ + VERBOSE("IOemUI:UpdateExternalFonts entry.\r\n"); + + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(hHeap); + UNREFERENCED_PARAMETER(pwstrCartridges); + + return E_NOTIMPL; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// oem class factory +// +class IOemCF : public IClassFactory +{ +public: + // *** IUnknown methods *** + + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) STDMETHOD_(ULONG,Release)(THIS); + + // *** IClassFactory methods *** + STDMETHOD(CreateInstance) (THIS_ + LPUNKNOWN pUnkOuter, + REFIID riid, + LPVOID FAR* ppvObject); + STDMETHOD(LockServer) (THIS_ BOOL bLock); + + + // Constructor + IOemCF(): m_cRef(1) { }; + ~IOemCF() { }; + +protected: + LONG m_cRef; + +}; + +/////////////////////////////////////////////////////////// +// +// Class factory body +// +HRESULT __stdcall IOemCF::QueryInterface(const IID& iid, void** ppv) +{ + if ((iid == IID_IUnknown) || (iid == IID_IClassFactory)) + { + *ppv = static_cast<IOemCF*>(this) ; + } + else + { + VERBOSE("IOemCF::QueryInterface IID not supported.\r\n"); + *ppv = NULL ; + return E_NOINTERFACE ; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef() ; + return S_OK ; +} + +ULONG __stdcall IOemCF::AddRef() +{ + return InterlockedIncrement(&m_cRef) ; +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall IOemCF::Release() +{ + ASSERT( 0 != m_cRef); + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + + } + return cRef; +} + +// IClassFactory implementation +HRESULT __stdcall IOemCF::CreateInstance(IUnknown* pUnknownOuter, + const IID& iid, + void** ppv) +{ + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Cannot aggregate. + if (pUnknownOuter != NULL) + { + return CLASS_E_NOAGGREGATION ; + } + + // Create component. + IOemUI* pOemCB = new IOemUI ; + if (pOemCB == NULL) + { + return E_OUTOFMEMORY ; + } + // Get the requested interface. + HRESULT hr = pOemCB->QueryInterface(iid, ppv) ; + + // Release the IUnknown pointer. + // (If QueryInterface failed, component will delete itself.) + pOemCB->Release() ; + return hr ; +} + +// LockServer +HRESULT __stdcall IOemCF::LockServer(BOOL bLock) +{ + if (bLock) + { + InterlockedIncrement(&g_cServerLocks) ; + } + else + { + InterlockedDecrement(&g_cServerLocks) ; + } + return S_OK ; +} + +/////////////////////////////////////////////////////////// +// +// Exported functions +// + + +// Can DLL unload now? +// +STDAPI DllCanUnloadNow() +{ + // + // To avoid leaving OEM DLL still in memory when Unidrv or Pscript drivers + // are unloaded, Unidrv and Pscript driver ignore the return value of + // DllCanUnloadNow of the OEM DLL, and always call FreeLibrary on the OEMDLL. + // + // If OEM DLL spins off a working thread that also uses the OEM DLL, the + // thread needs to call LoadLibrary and FreeLibraryAndExitThread, otherwise + // it may crash after Unidrv or Pscript calls FreeLibrary. + // + + if ((g_cComponents == 0) && (g_cServerLocks == 0)) + { + return S_OK ; + } + else + { + return S_FALSE; + } +} + +// +// Get class factory +// +STDAPI DllGetClassObject( + _In_ REFCLSID clsid, + _In_ REFIID iid, + _Outptr_ LPVOID* ppv) +{ + VERBOSE("DllGetClassObject:Create class factory.\r\n"); + + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Can we create this component? + if (clsid != CLSID_OEMUI) + { + return CLASS_E_CLASSNOTAVAILABLE ; + } + + // Create class factory. + IOemCF* pFontCF = new IOemCF ; // Reference count set to 1 + // in constructor + if (pFontCF == NULL) + { + return E_OUTOFMEMORY ; + } + + // Get requested interface. + HRESULT hr = pFontCF->QueryInterface(iid, ppv) ; + pFontCF->Release() ; + + return hr ; +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemui/intrface.h b/print/OEM Printer Customization Plug-in Samples/C++/oemui/intrface.h new file mode 100644 index 00000000..3ae5c07c --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemui/intrface.h @@ -0,0 +1,178 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Intrface.cpp +// +// +// PURPOSE: Header of interface for PScript5 & Unidrv UI plug-ins. +// +#pragma once + +//////////////////////////////////////////////////////////////////////////////// +// +// IOemUI +// +class IOemUI: public IPrintOemUI +{ +public: + // *** IUnknown methods *** + + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) STDMETHOD_(ULONG,Release)(THIS); + + // + // Method for publishing Driver interface. + // + STDMETHOD(PublishDriverInterface)(THIS_ IUnknown *pIUnknown); + + // + // Get OEM dll related information + // + + STDMETHOD(GetInfo) (THIS_ DWORD dwMode, PVOID pBuffer, DWORD cbSize, + PDWORD pcbNeeded); + + // + // OEMDevMode + // + + STDMETHOD(DevMode) (THIS_ DWORD dwMode, POEMDMPARAM pOemDMParam) ; + + // + // OEMCommonUIProp + // + + STDMETHOD(CommonUIProp) (THIS_ + DWORD dwMode, + POEMCUIPPARAM pOemCUIPParam + ); + + // + // OEMDocumentPropertySheets + // + + STDMETHOD(DocumentPropertySheets) (THIS_ + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam + ); + + // + // OEMDevicePropertySheets + // + + STDMETHOD(DevicePropertySheets) (THIS_ + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam + ); + + + // + // OEMDevQueryPrintEx + // + + STDMETHOD(DevQueryPrintEx) (THIS_ + POEMUIOBJ poemuiobj, + PDEVQUERYPRINT_INFO pDQPInfo, + PDEVMODE pPublicDM, + PVOID pOEMDM + ); + + // + // OEMDeviceCapabilities + // + + STDMETHOD(DeviceCapabilities) (THIS_ + POEMUIOBJ poemuiobj, + HANDLE hPrinter, + _In_ PWSTR pDeviceName, + WORD wCapability, + PVOID pOutput, + PDEVMODE pPublicDM, + PVOID pOEMDM, + DWORD dwOld, + DWORD *dwResult + ); + + // + // OEMUpgradePrinter + // + + STDMETHOD(UpgradePrinter) (THIS_ + DWORD dwLevel, + PBYTE pDriverUpgradeInfo + ); + + // + // OEMPrinterEvent + // + + STDMETHOD(PrinterEvent) (THIS_ + _In_ PWSTR pPrinterName, + INT iDriverEvent, + DWORD dwFlags, + LPARAM lParam + ); + + // + // OEMDriverEvent + // + + STDMETHOD(DriverEvent)(THIS_ + DWORD dwDriverEvent, + DWORD dwLevel, + LPBYTE pDriverInfo, + LPARAM lParam + ); + + // + // OEMQueryColorProfile + // + + STDMETHOD(QueryColorProfile) (THIS_ + HANDLE hPrinter, + POEMUIOBJ poemuiobj, + PDEVMODE pPublicDM, + PVOID pOEMDM, + ULONG ulReserved, + VOID *pvProfileData, + ULONG *pcbProfileData, + FLONG *pflProfileData); + + // + // OEMFontInstallerDlgProc + // + + STDMETHOD(FontInstallerDlgProc) (THIS_ + HWND hWnd, + UINT usMsg, + WPARAM wParam, + LPARAM lParam + ); + // + // UpdateExternalFonts + // + + STDMETHOD(UpdateExternalFonts) (THIS_ + HANDLE hPrinter, + HANDLE hHeap, + _In_ PWSTR pwstrCartridges + ); + + + IOemUI() { m_cRef = 1; m_pOEMHelp = NULL; }; + ~IOemUI(); + +protected: + LONG m_cRef; + IPrintOemDriverUI* m_pOEMHelp; +}; + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemui/oemui.cpp b/print/OEM Printer Customization Plug-in Samples/C++/oemui/oemui.cpp new file mode 100644 index 00000000..421fa9d0 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemui/oemui.cpp @@ -0,0 +1,737 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: OEMUI.cpp +// +// PURPOSE: Main file for OEM UI test module. +// + +#include "precomp.h" + +#include "debug.h" +#include "resource.h" +#include "globals.h" +#include "devmode.h" +#include "oemui.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +//////////////////////////////////////////////////////// +// INTERNAL MACROS and DEFINES +//////////////////////////////////////////////////////// + +typedef struct _tagCBUserData +{ + HANDLE hComPropSheet; + HANDLE hPropPage; + POEMUIPSPARAM pOEMUIParam; + PFNCOMPROPSHEET pfnComPropSheet; + +} CBUSERDATA, *PCBUSERDATA; + + + +//////////////////////////////////////////////////////// +// INTERNAL PROTOTYPES +//////////////////////////////////////////////////////// + +static HRESULT hrDocumentPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam); +static HRESULT hrPrinterPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam); +LONG APIENTRY OEMPrinterUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam); +LONG APIENTRY OEMDocUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam); +LONG APIENTRY OEMDocUICallBack2(PCPSUICBPARAM pCallbackParam); +INT_PTR CALLBACK DevicePropPageProc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam); +static POPTITEM CreateOptItems(HANDLE hHeap, DWORD dwOptItems); +static void InitOptItems(POPTITEM pOptItems, DWORD dwOptItems); +static POPTTYPE CreateOptType(HANDLE hHeap, WORD wOptParams); +static PTSTR GetStringResource(HANDLE hHeap, HANDLE hModule, UINT uResource); + + + +//////////////////////////////////////////////////////////////////////////////// +// +// Initializes OptItems to display OEM device or document property UI. +// +HRESULT hrOEMPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam) +{ + HRESULT hResult = S_OK; + + VERBOSE("hrOEMPropertyPage entry.\r\n"); + + // Validate parameters. + if( (OEMCUIP_DOCPROP != dwMode) + && + (OEMCUIP_PRNPROP != dwMode) + ) + { + ERR("hrOEMPropertyPage() ERROR_INVALID_PARAMETER.\r\n"); + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + switch(dwMode) + { + case OEMCUIP_DOCPROP: + hResult = hrDocumentPropertyPage(dwMode, pOEMUIParam); + break; + + case OEMCUIP_PRNPROP: + hResult = hrPrinterPropertyPage(dwMode, pOEMUIParam); + break; + + default: + // Should never reach this! + ERR("hrOEMPropertyPage() Invalid dwMode"); + SetLastError(ERROR_INVALID_PARAMETER); + hResult = E_FAIL; + break; + } + + return hResult; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// Initializes OptItems to display OEM document property UI. +// +static HRESULT hrDocumentPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam) +{ + UNREFERENCED_PARAMETER(dwMode); + + if(NULL == pOEMUIParam->pOEMOptItems) + { + // Fill in the number of OptItems to create for OEM document property UI. + pOEMUIParam->cOEMOptItems = 1; + + VERBOSE("hrDocumentPropertyPage() requesting items.\r\n"); + } + else + { + POEMDEV pOEMDev = (POEMDEV) pOEMUIParam->pOEMDM; + + VERBOSE("hrDocumentPropertyPage() fill out items.\r\n"); + + // Init UI Callback reference. + pOEMUIParam->OEMCUIPCallback = OEMDocUICallBack; + + // Init OEMOptItmes. + InitOptItems(pOEMUIParam->pOEMOptItems, pOEMUIParam->cOEMOptItems); + + // Fill out tree view items. + + // New section. + pOEMUIParam->pOEMOptItems[0].Level = 1; + pOEMUIParam->pOEMOptItems[0].Flags = OPTIF_COLLAPSE; + pOEMUIParam->pOEMOptItems[0].pName = GetStringResource(pOEMUIParam->hOEMHeap, pOEMUIParam->hModule, IDS_ADV_SECTION); + pOEMUIParam->pOEMOptItems[0].Sel = pOEMDev->dwAdvancedData; + + pOEMUIParam->pOEMOptItems[0].pOptType = CreateOptType(pOEMUIParam->hOEMHeap, 2); + + pOEMUIParam->pOEMOptItems[0].pOptType->Type = TVOT_UDARROW; + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].IconID = 0; + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].lParam = 100; + } + + return S_OK; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// Initializes OptItems to display OEM printer property UI. +// +static HRESULT hrPrinterPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam) +{ + UNREFERENCED_PARAMETER(dwMode); + + if(NULL == pOEMUIParam->pOEMOptItems) + { + // Fill in the number of OptItems to create for OEM printer property UI. + pOEMUIParam->cOEMOptItems = 1; + + VERBOSE("hrPrinterPropertyPage() requesting items.\r\n"); + } + else + { + DWORD dwError; + DWORD dwDeviceValue; + DWORD dwType; + DWORD dwNeeded; + + + VERBOSE("hrPrinterPropertyPage() fill out items.\r\n"); + + // Get device settings value from printer. + dwError = GetPrinterData(pOEMUIParam->hPrinter, OEMUI_VALUE, &dwType, (PBYTE) &dwDeviceValue, + sizeof(dwDeviceValue), &dwNeeded); + if( (ERROR_SUCCESS != dwError) + || + (dwDeviceValue > 100) + ) + { + // Failed to get the device value or value is invalid, just use the default. + dwDeviceValue = 0; + } + + // Init UI Callback reference. + pOEMUIParam->OEMCUIPCallback = OEMPrinterUICallBack; + + // Init OEMOptItmes. + InitOptItems(pOEMUIParam->pOEMOptItems, pOEMUIParam->cOEMOptItems); + + // Fill out tree view items. + + // New section. + pOEMUIParam->pOEMOptItems[0].Level = 1; + pOEMUIParam->pOEMOptItems[0].Flags = OPTIF_COLLAPSE; + pOEMUIParam->pOEMOptItems[0].pName = GetStringResource(pOEMUIParam->hOEMHeap, pOEMUIParam->hModule, IDS_DEV_SECTION); + pOEMUIParam->pOEMOptItems[0].Sel = dwDeviceValue; + + pOEMUIParam->pOEMOptItems[0].pOptType = CreateOptType(pOEMUIParam->hOEMHeap, 2); + + pOEMUIParam->pOEMOptItems[0].pOptType->Type = TVOT_UDARROW; + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].IconID = 0; + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].lParam = 100; + } + + return S_OK; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Adds property page to Document property sheet. +// +HRESULT hrOEMDocumentPropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam, + IPrintOemDriverUI* pOEMHelp) +{ + LONG_PTR lResult = 0; + HRESULT hrResult = S_OK; + + VERBOSE("hrOEMDocumentPropertySheets() entry.\r\n"); + + UNREFERENCED_PARAMETER(pOEMHelp); + + // Validate parameters. + if( (NULL == pPSUIInfo) + || + (PROPSHEETUI_INFO_VERSION != pPSUIInfo->Version) + ) + { + ERR("hrOEMDocumentPropertySheets() ERROR_INVALID_PARAMETER.\r\n"); + + // Return invalid parameter error. + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Do action. + switch(pPSUIInfo->Reason) + { + case PROPSHEETUI_REASON_INIT: + { + DWORD dwSheets = 0; + PCBUSERDATA pUserData = NULL; + POEMUIPSPARAM pOEMUIParam = (POEMUIPSPARAM) pPSUIInfo->lParamInit; + HANDLE hHeap = pOEMUIParam->hOEMHeap; + POEMDEV pOEMDev = (POEMDEV) pOEMUIParam->pOEMDM; + COMPROPSHEETUI Sheet; + + + // Init property page. + memset(&Sheet, 0, sizeof(COMPROPSHEETUI)); + Sheet.cbSize = sizeof(COMPROPSHEETUI); + Sheet.Flags = CPSUIF_UPDATE_PERMISSION; + Sheet.hInstCaller = ghInstance; + Sheet.pCallerName = GetStringResource(hHeap, ghInstance, IDS_NAME); + Sheet.pHelpFile = NULL; + Sheet.pfnCallBack = OEMDocUICallBack2; + Sheet.pDlgPage = CPSUI_PDLGPAGE_TREEVIEWONLY; + Sheet.cOptItem = 1; + Sheet.IconID = IDI_CPSUI_PRINTER; + Sheet.pOptItemName = GetStringResource(hHeap, ghInstance, IDS_SECTION); + Sheet.CallerVersion = 0x100; + Sheet.OptItemVersion = 0x100; + + // Init user data. + pUserData = (PCBUSERDATA) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(CBUSERDATA)); + if (NULL == pUserData) + { + ERR("hrOEMDocumentPropertySheets() failed to allocate user data.\r\n"); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + pUserData->hComPropSheet = pPSUIInfo->hComPropSheet; + pUserData->pfnComPropSheet = pPSUIInfo->pfnComPropSheet; + pUserData->pOEMUIParam = pOEMUIParam; + Sheet.UserData = (ULONG_PTR) pUserData; + + // Create OptItems for page. + Sheet.pOptItem = CreateOptItems(hHeap, Sheet.cOptItem); + if (NULL == Sheet.pOptItem) + { + ERR("hrOEMDocumentPropertySheets() failed to allocate OPTITEMs.\r\n"); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + // Initialize OptItems + Sheet.pOptItem[0].Level = 1; + Sheet.pOptItem[0].Flags = OPTIF_COLLAPSE; + Sheet.pOptItem[0].pName = GetStringResource(hHeap, ghInstance, IDS_SECTION); + Sheet.pOptItem[0].Sel = pOEMDev->dwDriverData; + + Sheet.pOptItem[0].pOptType = CreateOptType(hHeap, 2); + if (NULL == Sheet.pOptItem[0].pOptType) + { + ERR("hrOEMDocumentPropertySheets() failed to allocate OPTTYPE.\r\n"); + + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + Sheet.pOptItem[0].pOptType->Type = TVOT_UDARROW; + Sheet.pOptItem[0].pOptType->pOptParam[1].IconID = 0; + Sheet.pOptItem[0].pOptType->pOptParam[1].lParam = 100; + + + // Add property sheets. + lResult = pPSUIInfo->pfnComPropSheet(pPSUIInfo->hComPropSheet, CPSFUNC_ADD_PCOMPROPSHEETUI, + (LPARAM)&Sheet, (LPARAM)&dwSheets); + } + break; + + case PROPSHEETUI_REASON_GET_INFO_HEADER: + { + PPROPSHEETUI_INFO_HEADER pHeader = (PPROPSHEETUI_INFO_HEADER) lParam; + + pHeader->pTitle = (LPTSTR)PROP_TITLE; + lResult = TRUE; + } + break; + + case PROPSHEETUI_REASON_GET_ICON: + // No icon + lResult = 0; + break; + + case PROPSHEETUI_REASON_SET_RESULT: + { + PSETRESULT_INFO pInfo = (PSETRESULT_INFO) lParam; + + lResult = pInfo->Result; + } + break; + + case PROPSHEETUI_REASON_DESTROY: + lResult = TRUE; + break; + } + +Exit: + + pPSUIInfo->Result = lResult; + return hrResult; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Adds property page to printer property sheet. +// +HRESULT hrOEMDevicePropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam) +{ + LONG_PTR lResult = 0; + + VERBOSE("hrOEMDevicePropertySheets entry\r\n"); + + // Validate parameters. + if( (NULL == pPSUIInfo) + || + (PROPSHEETUI_INFO_VERSION != pPSUIInfo->Version) + ) + { + ERR("hrOEMDevicePropertySheets() ERROR_INVALID_PARAMETER.\r\n"); + + // Return invalid parameter error. + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Do action. + switch(pPSUIInfo->Reason) + { + case PROPSHEETUI_REASON_INIT: + { + PROPSHEETPAGE Page; + + // Init property page. + memset(&Page, 0, sizeof(PROPSHEETPAGE)); + Page.dwSize = sizeof(PROPSHEETPAGE); + Page.dwFlags = PSP_DEFAULT; + Page.hInstance = ghInstance; + Page.pszTemplate = MAKEINTRESOURCE(IDD_DEVICE_PROPPAGE); + Page.pfnDlgProc = DevicePropPageProc; + + // Add property sheets. + lResult = pPSUIInfo->pfnComPropSheet(pPSUIInfo->hComPropSheet, CPSFUNC_ADD_PROPSHEETPAGE, (LPARAM)&Page, 0); + } + break; + + case PROPSHEETUI_REASON_GET_INFO_HEADER: + { + PPROPSHEETUI_INFO_HEADER pHeader = (PPROPSHEETUI_INFO_HEADER) lParam; + + pHeader->pTitle = (LPTSTR)PROP_TITLE; + lResult = TRUE; + } + break; + + case PROPSHEETUI_REASON_GET_ICON: + // No icon + lResult = 0; + break; + + case PROPSHEETUI_REASON_SET_RESULT: + { + PSETRESULT_INFO pInfo = (PSETRESULT_INFO) lParam; + + lResult = pInfo->Result; + } + break; + + case PROPSHEETUI_REASON_DESTROY: + lResult = TRUE; + break; + } + + pPSUIInfo->Result = lResult; + return S_OK; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// OptItems call back for OEM printer property UI. +// +LONG APIENTRY OEMPrinterUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam) +{ + LONG lReturn = CPSUICB_ACTION_NONE; + + VERBOSE("OEMPrinterUICallBack() entry.\r\n"); + + switch(pCallbackParam->Reason) + { + case CPSUICB_REASON_APPLYNOW: + { + DWORD dwDriverValue = pOEMUIParam->pOEMOptItems[0].Sel; + + // Store OptItems state in printer data. + SetPrinterData(pOEMUIParam->hPrinter, OEMUI_VALUE, REG_DWORD, (PBYTE) &dwDriverValue, sizeof(DWORD)); + } + break; + + default: + break; + } + + return lReturn; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Call back for OEM device property UI. +// +#pragma warning(push) +#pragma warning( disable : 6262 ) // 2 MAX_PATH strings exceeds the default prefast stack size warning threshold by a few bytes. +INT_PTR CALLBACK DevicePropPageProc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uiMsg) + { + case WM_COMMAND: + switch(HIWORD(wParam)) + { + case BN_CLICKED: + switch(LOWORD(wParam)) + { + case IDC_CALIBRATE: + // Just display a message that the printer is calibrated, + // since we don't acutally calibrate anything. + { + TCHAR szName[MAX_PATH]; + TCHAR szCalibrated[MAX_PATH]; + + + LoadString(ghInstance, IDS_NAME, szName, sizeof(szName)/sizeof(szName[0])); + LoadString(ghInstance, IDS_CALIBRATED, szCalibrated, sizeof(szCalibrated)/sizeof(szCalibrated[0])); + MessageBox(hDlg, szCalibrated, szName, MB_OK); + } + break; + } + break; + + default: + return FALSE; + } + return TRUE; + + case WM_NOTIFY: + { + switch (((LPNMHDR)lParam)->code) // type of notification message + { + case PSN_SETACTIVE: + break; + + case PSN_KILLACTIVE: + break; + + case PSN_APPLY: + break; + + case PSN_RESET: + break; + } + } + break; + } + + return FALSE; +} +#pragma warning(pop) + +//////////////////////////////////////////////////////////////////////////////// +// +// OptItems call back for OEM document property UI. +// +LONG APIENTRY OEMDocUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam) +{ + LONG lReturn = CPSUICB_ACTION_NONE; + POEMDEV pOEMDev = (POEMDEV) pOEMUIParam->pOEMDM; + + + VERBOSE("OEMDocUICallBack() entry\r\n"); + + switch(pCallbackParam->Reason) + { + case CPSUICB_REASON_APPLYNOW: + // Update UI item data. + pOEMDev->dwAdvancedData = pOEMUIParam->pOEMOptItems[0].Sel; + break; + + case CPSUICB_REASON_KILLACTIVE: + // Update devmode if settings have changed. + if(pOEMDev->dwAdvancedData != (DWORD)(pOEMUIParam->pOEMOptItems[0].Sel)) + { + // Update OEM Devmode driver data. + pOEMDev->dwAdvancedData = pOEMUIParam->pOEMOptItems[0].Sel; + } + break; + + case CPSUICB_REASON_SETACTIVE: + if((DWORD)(pOEMUIParam->pOEMOptItems[0].Sel) != pOEMDev->dwAdvancedData) + { + pOEMUIParam->pOEMOptItems[0].Sel = pOEMDev->dwAdvancedData; + pOEMUIParam->pOEMOptItems[0].Flags |= OPTIF_CHANGED; + lReturn = CPSUICB_ACTION_OPTIF_CHANGED; + } + break; + + default: + break; + } + + return lReturn; +} + + +LONG APIENTRY OEMDocUICallBack2(PCPSUICBPARAM pCallbackParam) +{ + LONG lReturn = CPSUICB_ACTION_NONE; + PCBUSERDATA pUserData = (PCBUSERDATA) pCallbackParam->UserData; + POEMDEV pOEMDev = (POEMDEV) pUserData->pOEMUIParam->pOEMDM; + + + VERBOSE("OEMDocUICallBack2() entry.\r\n"); + + switch(pCallbackParam->Reason) + { + case CPSUICB_REASON_APPLYNOW: + // Update OEM devmode driver data. + pOEMDev->dwDriverData = pCallbackParam->pOptItem[0].Sel; + pUserData->pfnComPropSheet(pUserData->hComPropSheet, CPSFUNC_SET_RESULT, + (LPARAM)pUserData->hPropPage, + (LPARAM)CPSUI_OK); + break; + + case CPSUICB_REASON_KILLACTIVE: + if(pOEMDev->dwDriverData != (DWORD)(pCallbackParam->pOptItem[0].Sel)) + { + // Update OEM devmode driver data. + pOEMDev->dwDriverData = pCallbackParam->pOptItem[0].Sel; + } + break; + + case CPSUICB_REASON_SETACTIVE: + if((DWORD)(pCallbackParam->pOptItem[0].Sel) != pOEMDev->dwDriverData) + { + pCallbackParam->pOptItem[0].Sel = pOEMDev->dwDriverData; + pCallbackParam->pOptItem[0].Flags |= OPTIF_CHANGED; + lReturn = CPSUICB_ACTION_OPTIF_CHANGED; + } + break; + + default: + break; + } + + return lReturn; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Creates and Initializes OptItems. +// +static POPTITEM CreateOptItems(HANDLE hHeap, DWORD dwOptItems) +{ + POPTITEM pOptItems = NULL; + + + // Allocate memory for OptItems; + pOptItems = (POPTITEM) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(OPTITEM) * dwOptItems); + if(NULL != pOptItems) + { + InitOptItems(pOptItems, dwOptItems); + } + else + { + ERR("CreateOptItems() failed to allocate memory for OPTITEMs!\r\n"); + } + + return pOptItems; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Initializes OptItems. +// +static void InitOptItems(POPTITEM pOptItems, DWORD dwOptItems) +{ + VERBOSE("InitOptItems() entry.\r\n"); + + // Zero out memory. + memset(pOptItems, 0, sizeof(OPTITEM) * dwOptItems); + + // Set each OptItem's size, and Public DM ID. + for(DWORD dwCount = 0; dwCount < dwOptItems; dwCount++) + { + pOptItems[dwCount].cbSize = sizeof(OPTITEM); + pOptItems[dwCount].DMPubID = DMPUB_NONE; + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Allocates and initializes OptType for OptItem. +// +static POPTTYPE CreateOptType(HANDLE hHeap, WORD wOptParams) +{ + POPTTYPE pOptType = NULL; + + + VERBOSE("CreateOptType() entry.\r\n"); + + // Allocate memory from the heap for the OPTTYPE; the driver will take care of clean up. + pOptType = (POPTTYPE) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(OPTTYPE)); + if(NULL != pOptType) + { + // Initialize OPTTYPE. + pOptType->cbSize = sizeof(OPTTYPE); + pOptType->Count = wOptParams; + + // Allocate memory from the heap for the OPTPARAMs for the OPTTYPE. + pOptType->pOptParam = (POPTPARAM) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, wOptParams * sizeof(OPTPARAM)); + if(NULL != pOptType->pOptParam) + { + // Initialize the OPTPARAMs. + for(WORD wCount = 0; wCount < wOptParams; wCount++) + { + pOptType->pOptParam[wCount].cbSize = sizeof(OPTPARAM); + } + } + else + { + ERR("CreateOptType() failed to allocated memory for OPTPARAMs!\r\n"); + + // Free allocated memory and return NULL. + HeapFree(hHeap, 0, pOptType); + pOptType = NULL; + } + } + else + { + ERR("CreateOptType() failed to allocated memory for OPTTYPE!\r\n"); + } + + return pOptType; +} + +//////////////////////////////////////////////////////////////////////////////////// +// +// Retrieves pointer to a String resource. +// +static PTSTR GetStringResource(HANDLE hHeap, HANDLE hModule, UINT uResource) +{ + int nResult; + DWORD dwSize = MAX_PATH; + PTSTR pszString = NULL; + + VERBOSE("GetStringResource entered.\r\n"); + + // Allocate buffer for string resource from heap; let the driver clean it up. + pszString = (PTSTR) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwSize * sizeof(TCHAR)); + if(NULL != pszString) + { + // Load string resource; resize after loading so as not to waste memory. + nResult = LoadString((HMODULE)hModule, uResource, pszString, dwSize); + if(nResult > 0) + { + PTSTR pszTemp; + + pszTemp = (PTSTR) HeapReAlloc(hHeap, HEAP_ZERO_MEMORY, pszString, (nResult + 1) * sizeof(TCHAR)); + if(NULL != pszTemp) + { + pszString = pszTemp; + } + else + { + ERR("GetStringResource() HeapReAlloc() of string retrieved failed!\r\n"); + } + } + else + { + ERR("LoadString() failed.\r\n"); + ERR("GetStringResource() failed to load string resource !\r\n"); + + pszString = NULL; + } + } + else + { + ERR("GetStringResource() failed to allocate string buffer!\r\n"); + } + + return pszString; +} + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemui/oemui.h b/print/OEM Printer Customization Plug-in Samples/C++/oemui/oemui.h new file mode 100644 index 00000000..b584893e --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemui/oemui.h @@ -0,0 +1,37 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: OEMUI.H +// +// +// PURPOSE: Define common data types, and external function prototypes +// for OEMUI Test Module. +// +#pragma once + +//////////////////////////////////////////////////////// +// OEM UI Defines +//////////////////////////////////////////////////////// + +// OEM Signature and version. +#define PROP_TITLE L"OEM UI Page" + +// Printer registry keys where OEM data is stored. +#define OEMUI_VALUE TEXT("OEMUI_VALUE") +#define OEMUI_DEVICE_VALUE TEXT("OEMUI_DEVICE_VALUE") + + + +//////////////////////////////////////////////////////// +// Prototypes +//////////////////////////////////////////////////////// + +HRESULT hrOEMPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam); +HRESULT hrOEMDocumentPropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam, IPrintOemDriverUI* pOEMHelp); +HRESULT hrOEMDevicePropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam); + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemui/precomp.h b/print/OEM Printer Customization Plug-in Samples/C++/oemui/precomp.h new file mode 100644 index 00000000..1f73e0ad --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemui/precomp.h @@ -0,0 +1,52 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: pecomp.H +// +// PURPOSE: Optimize compilation of headers that don't change frequently. +// +#pragma once + +// Necessary for compiling under VC. +#if(!defined(WINVER) || (WINVER < 0x0500)) + #undef WINVER + #define WINVER 0x0500 +#endif +#if(!defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500)) + #undef _WIN32_WINNT + #define _WIN32_WINNT 0x0500 +#endif + + +// Required header files that shouldn't change often. + + +#include <STDDEF.H> +#include <STDLIB.H> +#include <OBJBASE.H> +#include <STDARG.H> +#include <STDIO.H> +#include <WINDEF.H> +#include <WINERROR.H> +#include <WINBASE.H> +#include <WINGDI.H> +#include <WINDDI.H> +#include <WINSPOOL.H> +#include <TCHAR.H> +#include <EXCPT.H> +#include <ASSERT.H> +#include <PRSHT.H> +#include <COMPSTUI.H> +#include <WINDDIUI.H> +#include <PRINTOEM.H> +#include <INITGUID.H> +#include <PRCOMOEM.H> + +// StrSafe.h needs to be included last +// to disallow unsafe string functions. +#include <STRSAFE.H> + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemui/precompsrc.cpp b/print/OEM Printer Customization Plug-in Samples/C++/oemui/precompsrc.cpp new file mode 100644 index 00000000..5944cf51 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemui/precompsrc.cpp @@ -0,0 +1 @@ +#include "precomp.h"
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemui/resource.h b/print/OEM Printer Customization Plug-in Samples/C++/oemui/resource.h new file mode 100644 index 00000000..71d3d3d6 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemui/resource.h @@ -0,0 +1,24 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by OEMUI.rc +// +#define IDS_SECTION 1 +#define IDS_CALIBRATED 2 +#define IDS_NAME 3 +#define IDS_DEV_SECTION 4 +#define IDS_DEVICE_SECTION 4 +#define IDS_ADV_SECTION 10 +#define IDD_DEVICE_PROPPAGE 106 +#define IDD_DOC_PROPPAGE 107 +#define IDC_CALIBRATE 1001 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 103 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1002 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemuni.ini b/print/OEM Printer Customization Plug-in Samples/C++/oemuni.ini new file mode 100644 index 00000000..399b2f9b --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemuni.ini @@ -0,0 +1,3 @@ +[OEMFiles] +OEMDriverFile1=OEMUNI.DLL + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemuni/OEMUNI.def b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/OEMUNI.def new file mode 100644 index 00000000..be2aaf17 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/OEMUNI.def @@ -0,0 +1,3 @@ +LIBRARY OEMUNI +EXPORTS DllGetClassObject PRIVATE + DllCanUnloadNow PRIVATE diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemuni/OEMUNI.h b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/OEMUNI.h new file mode 100644 index 00000000..6df79055 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/OEMUNI.h @@ -0,0 +1,234 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: OEMUNI.H +// +// +// PURPOSE: Define the COemPDEV class which stores the private +// PDEV for the driver. +// + +#pragma once + +class COemPDEV +{ +public: + __stdcall COemPDEV(void) + { + + // Note that since our parent has AddRef'd the UNIDRV interface, + // we don't do so here since our scope is identical to our + // parent. + // + + VERBOSE("In COemPDEV constructor..."); + + _ResetPointers(); + } + + __stdcall ~COemPDEV(void) + { + VERBOSE("In COemPDEV destructor..."); + } + + void __stdcall InitializeDDITable(DRVENABLEDATA* pded) + { + VERBOSE("COemPDEV::InitializeDDITable entry."); + + UINT iDrvFn; + UINT cDrvFn = pded->c; + PDRVFN pDrvFn = pded->pdrvfn; + + for (iDrvFn = 0; iDrvFn < cDrvFn; ++iDrvFn, ++pDrvFn) + { + _SavePFN(pDrvFn->iFunc, pDrvFn->pfn); + } + } + +private: + + void __stdcall _SavePFN(ULONG uFunc, PFN pfn) + { + + // Note: if a "pass-through" driver is being constructed, then + // there is nothing for this method to do. So, to keep the + // compiler from complaining about a switch with no case + // statements, but which has a default statement, we surround + // the entire construct with preprocessor controls. + // + switch(uFunc) + { + // The following are the drawing related DDI hooks. + // + case INDEX_DrvAlphaBlend: + m_pfnDrvAlphaBlend = (PFN_DrvAlphaBlend)pfn; + break; + case INDEX_DrvBitBlt: + m_pfnDrvBitBlt = (PFN_DrvBitBlt)pfn; + break; + case INDEX_DrvCopyBits: + m_pfnDrvCopyBits = (PFN_DrvCopyBits)pfn; + break; + case INDEX_DrvDitherColor: + m_pfnDrvDitherColor = (PFN_DrvDitherColor)pfn; + break; + case INDEX_DrvFillPath: + m_pfnDrvFillPath = (PFN_DrvFillPath)pfn; + break; + case INDEX_DrvFontManagement: + m_pfnDrvFontManagement = (PFN_DrvFontManagement)pfn; + break; + case INDEX_DrvGetGlyphMode: + m_pfnDrvGetGlyphMode = (PFN_DrvGetGlyphMode)pfn; + break; + case INDEX_DrvGradientFill: + m_pfnDrvGradientFill = (PFN_DrvGradientFill)pfn; + break; + case INDEX_DrvLineTo: + m_pfnDrvLineTo = (PFN_DrvLineTo)pfn; + break; + case INDEX_DrvPaint: + m_pfnDrvPaint = (PFN_DrvPaint)pfn; + break; + case INDEX_DrvPlgBlt: + m_pfnDrvPlgBlt = (PFN_DrvPlgBlt)pfn; + break; + case INDEX_DrvQueryAdvanceWidths: + m_pfnDrvQueryAdvanceWidths = (PFN_DrvQueryAdvanceWidths)pfn; + break; + case INDEX_DrvQueryFont: + m_pfnDrvQueryFont = (PFN_DrvQueryFont)pfn; + break; + case INDEX_DrvQueryFontData: + m_pfnDrvQueryFontData = (PFN_DrvQueryFontData)pfn; + break; + case INDEX_DrvQueryFontTree: + m_pfnDrvQueryFontTree = (PFN_DrvQueryFontTree)pfn; + break; + case INDEX_DrvRealizeBrush: + m_pfnDrvRealizeBrush = (PFN_DrvRealizeBrush)pfn; + break; + case INDEX_DrvStretchBlt: + m_pfnDrvStretchBlt = (PFN_DrvStretchBlt)pfn; + break; + case INDEX_DrvStretchBltROP: + m_pfnDrvStretchBltROP = (PFN_DrvStretchBltROP)pfn; + break; + case INDEX_DrvStrokeAndFillPath: + m_pfnDrvStrokeAndFillPath = (PFN_DrvStrokeAndFillPath)pfn; + break; + case INDEX_DrvStrokePath: + m_pfnDrvStrokePath = (PFN_DrvStrokePath)pfn; + break; + case INDEX_DrvTextOut: + m_pfnDrvTextOut = (PFN_DrvTextOut)pfn; + break; + case INDEX_DrvTransparentBlt: + m_pfnDrvTransparentBlt = (PFN_DrvTransparentBlt)pfn; + break; + // The following are the page/band related DDI hooks. + // + case INDEX_DrvStartDoc: + m_pfnDrvStartDoc = (PFN_DrvStartDoc)pfn; + break; + case INDEX_DrvEndDoc: + m_pfnDrvEndDoc = (PFN_DrvEndDoc)pfn; + break; + case INDEX_DrvStartPage: + m_pfnDrvStartPage = (PFN_DrvStartPage)pfn; + break; + case INDEX_DrvSendPage: + m_pfnDrvSendPage = (PFN_DrvSendPage)pfn; + break; + case INDEX_DrvStartBanding: + m_pfnDrvStartBanding = (PFN_DrvStartBanding)pfn; + break; + case INDEX_DrvNextBand: + m_pfnDrvNextBand = (PFN_DrvNextBand)pfn; + break; + case INDEX_DrvEscape: + m_pfnDrvEscape = (PFN_DrvEscape)pfn; + break; + } // switch(uFunc) + } + + void __stdcall _ResetPointers(void) + { + m_pfnDrvAlphaBlend = NULL; + m_pfnDrvBitBlt = NULL; + m_pfnDrvCopyBits = NULL; + m_pfnDrvDitherColor = NULL; + m_pfnDrvEndDoc = NULL; + m_pfnDrvEscape = NULL; + m_pfnDrvFillPath = NULL; + m_pfnDrvFontManagement = NULL; + m_pfnDrvGetGlyphMode = NULL; + m_pfnDrvGradientFill = NULL; + m_pfnDrvLineTo = NULL; + m_pfnDrvNextBand = NULL; + m_pfnDrvPaint = NULL; + m_pfnDrvPlgBlt = NULL; + m_pfnDrvQueryAdvanceWidths = NULL; + m_pfnDrvQueryFont = NULL; + m_pfnDrvQueryFontData = NULL; + m_pfnDrvQueryFontTree = NULL; + m_pfnDrvRealizeBrush = NULL; + m_pfnDrvSendPage = NULL; + m_pfnDrvStartBanding = NULL; + m_pfnDrvStartDoc = NULL; + m_pfnDrvStartPage = NULL; + m_pfnDrvStretchBlt = NULL; + m_pfnDrvStretchBltROP = NULL; + m_pfnDrvStrokeAndFillPath = NULL; + m_pfnDrvStrokePath = NULL; + m_pfnDrvTextOut = NULL; + m_pfnDrvTransparentBlt = NULL; + } + +public: + + // Unidrv function pointers so that we can punt + // back from the DDI hooks + // + PFN_DrvAlphaBlend m_pfnDrvAlphaBlend; + PFN_DrvBitBlt m_pfnDrvBitBlt; + PFN_DrvCopyBits m_pfnDrvCopyBits; + PFN_DrvDitherColor m_pfnDrvDitherColor; + PFN_DrvEndDoc m_pfnDrvEndDoc; + PFN_DrvEscape m_pfnDrvEscape; + PFN_DrvFillPath m_pfnDrvFillPath; + PFN_DrvFontManagement m_pfnDrvFontManagement; + PFN_DrvGetGlyphMode m_pfnDrvGetGlyphMode; + PFN_DrvGradientFill m_pfnDrvGradientFill; + PFN_DrvLineTo m_pfnDrvLineTo; + PFN_DrvNextBand m_pfnDrvNextBand; + PFN_DrvPaint m_pfnDrvPaint; + PFN_DrvPlgBlt m_pfnDrvPlgBlt; + PFN_DrvQueryAdvanceWidths m_pfnDrvQueryAdvanceWidths; + PFN_DrvQueryFont m_pfnDrvQueryFont; + PFN_DrvQueryFontData m_pfnDrvQueryFontData; + PFN_DrvQueryFontTree m_pfnDrvQueryFontTree; + PFN_DrvRealizeBrush m_pfnDrvRealizeBrush; + PFN_DrvSendPage m_pfnDrvSendPage; + PFN_DrvStartBanding m_pfnDrvStartBanding; + PFN_DrvStartDoc m_pfnDrvStartDoc; + PFN_DrvStartPage m_pfnDrvStartPage; + PFN_DrvStretchBlt m_pfnDrvStretchBlt; + PFN_DrvStretchBltROP m_pfnDrvStretchBltROP; + PFN_DrvStrokeAndFillPath m_pfnDrvStrokeAndFillPath; + PFN_DrvStrokePath m_pfnDrvStrokePath; + PFN_DrvTextOut m_pfnDrvTextOut; + PFN_DrvTransparentBlt m_pfnDrvTransparentBlt; + + /*******************************************/ + /* */ + /* Add any custom PDEV members here */ + /* */ + /*******************************************/ + +}; +typedef COemPDEV* POEMPDEV; diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemuni/OEMUNI.rc b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/OEMUNI.rc new file mode 100644 index 00000000..6a21e8d3 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/OEMUNI.rc @@ -0,0 +1,110 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "Written by DDK Support Team\0" + VALUE "CompanyName", "Microsoft Corp.\0" + VALUE "FileDescription", "OEM Customization Sample\0" + VALUE "FileVersion", "1, 0, 0, 1\0" + VALUE "InternalName", "OEMUNI\0" + VALUE "LegalCopyright", "Copyright � 1998-2003\0" + VALUE "LegalTrademarks", "Microsoft� is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation\0" + VALUE "OriginalFilename", "OEMUNI.DLL\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "Microsoft OEMUNI\0" + VALUE "ProductVersion", "1.0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // !_MAC + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemuni/OEMUNI.vcxproj b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/OEMUNI.vcxproj new file mode 100644 index 00000000..eeeac176 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/OEMUNI.vcxproj @@ -0,0 +1,1090 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Win10 Debug|ARM64"> + <Configuration>Win10 Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|Win32"> + <Configuration>Win10 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|x64"> + <Configuration>Win10 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|ARM64"> + <Configuration>Win10 Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|Win32"> + <Configuration>Win10 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|x64"> + <Configuration>Win10 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|Win32"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|Win32"> + <Configuration>Win8 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|Win32"> + <Configuration>Win7 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|Win32"> + <Configuration>Win8.1 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|Win32"> + <Configuration>Win8 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|Win32"> + <Configuration>Win7 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|x64"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|x64"> + <Configuration>Win8 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|x64"> + <Configuration>Win7 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|x64"> + <Configuration>Win8.1 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|x64"> + <Configuration>Win8 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|x64"> + <Configuration>Win7 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{B0F13767-2056-47FC-B37B-41D7E339900B}</ProjectGuid> + <RootNamespace>$(MSBuildProjectName)</RootNamespace> + <Configuration Condition="'$(Configuration)' == ''">Win10 Debug</Configuration> + <Platform Condition="'$(Platform)' == ''">Win32</Platform> + <SampleGuid>{96600CA6-8E9E-4691-ACB9-0225A5B57563}</SampleGuid> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <PropertyGroup> + <OutDir>$(IntDir)</OutDir> + </PropertyGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ItemGroup Label="WrappedTaskItems" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetName>OEMUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetName>OEMUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetName>OEMUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <TargetName>OEMUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <TargetName>OEMUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetName>OEMUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetName>OEMUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetName>OEMUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <TargetName>OEMUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <TargetName>OEMUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetName>OEMUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetName>OEMUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetName>OEMUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <TargetName>OEMUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetName>OEMUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetName>OEMUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetName>OEMUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <TargetName>OEMUNI</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;winspool.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Link> + <ModuleDefinitionFile>OEMUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Link> + <ModuleDefinitionFile>OEMUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Link> + <ModuleDefinitionFile>OEMUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <Link> + <ModuleDefinitionFile>OEMUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <Link> + <ModuleDefinitionFile>OEMUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Link> + <ModuleDefinitionFile>OEMUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Link> + <ModuleDefinitionFile>OEMUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Link> + <ModuleDefinitionFile>OEMUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <Link> + <ModuleDefinitionFile>OEMUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <Link> + <ModuleDefinitionFile>OEMUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Link> + <ModuleDefinitionFile>OEMUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Link> + <ModuleDefinitionFile>OEMUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Link> + <ModuleDefinitionFile>OEMUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <Link> + <ModuleDefinitionFile>OEMUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>OEMUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>OEMUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>OEMUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>OEMUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="ddihook.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="devmode.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="dllentry.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Create</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ResourceCompile Include="oemuni.rc" /> + </ItemGroup> + <ItemGroup> + <Inf Exclude="@(Inf)" Include="*.inf" /> + <FilesToPackage Include="$(TargetPath)" Condition="'$(ConfigurationType)'=='Driver' or '$(ConfigurationType)'=='DynamicLibrary'" /> + </ItemGroup> + <ItemGroup> + <None Exclude="@(None)" Include="*.txt;*.htm;*.html" /> + <None Exclude="@(None)" Include="*.ico;*.cur;*.bmp;*.dlg;*.rct;*.gif;*.jpg;*.jpeg;*.wav;*.jpe;*.tiff;*.tif;*.png;*.rc2" /> + <None Exclude="@(None)" Include="*.def;*.bat;*.hpj;*.asmx" /> + </ItemGroup> + <ItemGroup> + <ClInclude Exclude="@(ClInclude)" Include="*.h;*.hpp;*.hxx;*.hm;*.inl;*.xsd" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemuni/OEMUNI.vcxproj.Filters b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/OEMUNI.vcxproj.Filters new file mode 100644 index 00000000..8287cc90 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/OEMUNI.vcxproj.Filters @@ -0,0 +1,174 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;*</Extensions> + <UniqueIdentifier>{25BB1250-6D65-4A18-B7D2-D29AB885B616}</UniqueIdentifier> + </Filter> + <Filter Include="Header Files"> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + <UniqueIdentifier>{C1A83E63-7DD3-4CAD-9079-BA272CB24B89}</UniqueIdentifier> + </Filter> + <Filter Include="Resource Files"> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms;man;xml</Extensions> + <UniqueIdentifier>{6B77C327-966D-4CD1-AC7A-EB5A773904D2}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClCompile Include="ddihook.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="devmode.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="dllentry.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="OEMUNI.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="OEMUNI.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="OEMUNI.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="OEMUNI.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="OEMUNI.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="OEMUNI.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="OEMUNI.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="OEMUNI.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="OEMUNI.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="OEMUNI.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="OEMUNI.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="OEMUNI.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="OEMUNI.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="OEMUNI.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="OEMUNI.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="OEMUNI.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="oemuni.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> + <ItemGroup> + <None Include="OEMUNI.def"> + <Filter>Source Files</Filter> + </None> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemuni/ddihook.cpp b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/ddihook.cpp new file mode 100644 index 00000000..48922ae6 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/ddihook.cpp @@ -0,0 +1,1670 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: DDIHook.cpp +// +// PURPOSE: DDI Hook routines for User Mode COM Customization DLL. This module +// implements the following methods defined in printoem.h +// OEMCopyBits +// OEMBitBlt +// OEMStretchBlt +// OEMDitherColor +// OEMStretchBltROP +// OEMPlgBlt +// OEMPaint +// OEMRealizeBrush +// OEMStrokePath +// OEMFillPath +// OEMStrokeAndFillPath +// OEMLineTo +// OEMAlphaBlend +// OEMGradientFill +// OEMTransparentBlt +// OEMTextOut +// OEMQueryFont +// OEMQueryFontTree +// OEMQueryFontData +// OEMFontManagement +// OEMQueryAdvanceWidths +// OEMGetGlyphMode +// OEMStartDoc +// OEMEndDoc +// OEMStartPage +// OEMSendPage +// OEMStartBanding +// OEMNextBand +// OEMEscape +// + +#include "precomp.h" +#include "debug.h" +#include "devmode.h" +#include "oemuni.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +BOOL APIENTRY +OEMCopyBits( + SURFOBJ *psoDst, + SURFOBJ *psoSrc, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + RECTL *prclDst, + POINTL *pptlSrc + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvCopyBits. + + DrvCopyBits translates between device-managed + raster surfaces and GDI standard-format bitmaps. + GDI will call DrvCopyBits when it needs to copy from + one surface to another and at least one of the + surfaces is device-managed. + + Please refer to DDK documentation for more details. + +Arguments: + + psoDst - Points to the Dstination surface + psoSrc - Points to the source surface + pxlo - XLATEOBJ provided by the engine + pco - Defines a clipping region on the Dstination surface + pxlo - Defines the translation of color indices + between the source and target surfaces + prclDst - Defines the area to be modified + pptlSrc - Defines the upper-left corner of the source rectangle + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE("OEMCopyBits entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)psoDst->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvCopyBits)(psoDst, + psoSrc, + pco, + pxlo, + prclDst, + pptlSrc); +} + +BOOL APIENTRY +OEMBitBlt( + SURFOBJ *psoDst, + SURFOBJ *psoSrc, + SURFOBJ *psoMask, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + RECTL *prclDst, + POINTL *pptlSrc, + POINTL *pptlMask, + BRUSHOBJ *pbo, + POINTL *pptlBrush, + ROP4 rop4 + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvBitBlt. + + DrvBitBlt provides general bit-block transfer capabilities + between device-managed surfaces, between GDI-managed + standard-format bitmaps, or between a device-managed + surface and a GDI-managed standard-format bitmap. + + Please refer to DDK documentation for more details. + +Arguments: + + psoDst - Describes the target surface + psoSrc - Describes the source surface + psoMask - Describes the mask for rop4 + pco - Limits the area to be modified + pxlo - Specifies how color indices are translated + between the source and target surfaces + prclDst - Defines the area to be modified + pptlSrc - Defines the upper left corner of the source rectangle + pptlMask - Defines which pixel in the mask corresponds to + the upper left corner of the source rectangle + pbo - Defines the pattern for bitblt + pptlBrush - Defines the origin of the brush in the Dstination surface + rop4 - ROP code that defines how the mask, pattern, source, and + Dstination pixels are combined to write to the Dstination surface + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE("OEMBitBlt entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)psoDst->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvBitBlt)(psoDst, + psoSrc, + psoMask, + pco, + pxlo, + prclDst, + pptlSrc, + pptlMask, + pbo, + pptlBrush, + rop4); +} + +BOOL APIENTRY +OEMStretchBlt( + SURFOBJ *psoDst, + SURFOBJ *psoSrc, + SURFOBJ *psoMask, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + COLORADJUSTMENT *pca, + POINTL *pptlHTOrg, + RECTL *prclDst, + RECTL *prclSrc, + POINTL *pptlMask, + ULONG iMode + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvStretchBlt. + + DrvStretchBlt provides stretching bit-block transfer + capabilities between any combination of device-managed + and GDI-managed surfaces. DrvStretchBlt enables the + device driver to write to GDI bitmaps, especially when the + driver can do halftoning. This function allows the same + halftoning algorithm to be applied to GDI bitmaps and + device surfaces. This function can be provided to handle + only certain forms of stretching, such as by integer multiples. + + Please refer to DDK documentation for more details. + +Arguments: + + psoDst - Defines the surface on which to draw + psoSrc - Defines the source for blt operation + psoMask - Defines a surface that provides a mask for the source + pco - Limits the area to be modified on the Dstination + pxlo - Specifies how color dwIndexes are to be translated + between the source and target surfaces + pca - Defines color adjustment values to be applied to the source bitmap + pptlHTOrg - Specifies the origin of the halftone brush + prclDst - Defines the area to be modified on the Dstination surface + prclSrc - Defines the area to be copied from the source surface + pptlMask - Specifies which pixel in the given mask corresponds to + the upper left pixel in the source rectangle + iMode - Specifies how source pixels are combined to get output pixels + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE("OEMStretchBlt entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)psoDst->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvStretchBlt)(psoDst, + psoSrc, + psoMask, + pco, + pxlo, + pca, + pptlHTOrg, + prclDst, + prclSrc, + pptlMask, + iMode); +} + +ULONG APIENTRY +OEMDitherColor( + DHPDEV dhpdev, + ULONG iMode, + ULONG rgbColor, + ULONG *pulDither + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvDitherColor. + + DrvDitherColor requests the device to create a + brush dithered against a device palette. + + Please refer to DDK documentation for more details. + +Arguments: + + dhpdev - DHPDEV passed, it is our pDEV + iMode - Not used + rgbColor - Solid rgb color to be used + pulDither - buffer to put the halftone brush. + +Return Value: + + Returns halftone method. + + DCR_DRIVER if the dither values have been calculated by the driver. + DCR_SOLID if the engine should use the best solid color approximation of the color. + DCR_HALFTONE if the engine should create a halftone approximation for the driver. + +--*/ + +{ + VERBOSE("OEMDitherColor entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvDitherColor)(dhpdev, + iMode, + rgbColor, + pulDither); +} + +BOOL APIENTRY +OEMStretchBltROP( + SURFOBJ *psoDst, + SURFOBJ *psoSrc, + SURFOBJ *psoMask, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + COLORADJUSTMENT *pca, + POINTL *pptlHTOrg, + RECTL *prclDst, + RECTL *prclSrc, + POINTL *pptlMask, + ULONG iMode, + BRUSHOBJ *pbo, + ROP4 rop4 + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvStretchBltROP. + + DrvStretchBltROP performs a stretching bit-block transfer + using a ROP. + + Please refer to DDK documentation for more details. + +Arguments: + + psoDst - Specifies the target surface + psoSrc - Specifies the source surface + psoMask - Specifies the mask surface + pco - Limits the area to be modified + pxlo - Specifies how color indices are translated + between the source and target surfaces + pca - Defines color adjustment values to be applied to the source bitmap + pptlHTOrg - Specifies the halftone origin + prclDst - Area to be modified on the destination surface + prclSrc - Rectangle area on the source surface + pptlMask - Defines which pixel in the mask corresponds to + the upper left corner of the source rectangle + iMode - Specifies how source pixels are combined to get output pixels + pbo - Defines the pattern for bitblt + rop4 - ROP code that defines how the mask, pattern, source, and + destination pixels are combined on the destination surface + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE("OEMStretchBltROP entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)psoDst->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvStretchBltROP)(psoDst, + psoSrc, + psoMask, + pco, + pxlo, + pca, + pptlHTOrg, + prclDst, + prclSrc, + pptlMask, + iMode, + pbo, + rop4); +} + +BOOL APIENTRY +OEMPlgBlt( + SURFOBJ *psoDst, + SURFOBJ *psoSrc, + SURFOBJ *psoMask, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + COLORADJUSTMENT *pca, + POINTL *pptlBrushOrg, + POINTFIX *pptfixDest, + RECTL *prclSrc, + POINTL *pptlMask, + ULONG iMode + ) +/*++ + +Routine Description: + + Implementation of DDI hook for DrvPlgBlt. + + DrvPlgBlt provides rotate bit-block transfer capabilities between + combinations of device-managed and GDI-managed surfaces. + + Please refer to DDK documentation for more details. + +Arguments: + + psoDst - Defines the surface on which to draw + psoSrc - Defines the source for blt operation + psoMask - Defines a surface that provides a mask for the source + pco - Limits the area to be modified on the Dstination + pxlo - Specifies how color dwIndexes are to be translated + between the source and target surfaces + pca - Defines color adjustment values to be applied to the source bitmap + pptlBrushOrg - Specifies the origin of the halftone brush + pptfixDest - Defines the area to be modified on the Dstination surface + prclSrc - Defines the area to be copied from the source surface + pptlMask - Specifies which pixel in the given mask corresponds to + the upper left pixel in the source rectangle + iMode - Specifies how source pixels are combined to get output pixels + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE("OEMPlgBlt entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)psoDst->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvPlgBlt)(psoDst, + psoSrc, + psoMask, + pco, + pxlo, + pca, + pptlBrushOrg, + pptfixDest, + prclSrc, + pptlMask, + iMode); +} + +BOOL APIENTRY +OEMPaint( + SURFOBJ *pso, + CLIPOBJ *pco, + BRUSHOBJ *pbo, + POINTL *pptlBrushOrg, + MIX mix + ) +/*++ + +Routine Description: + + Implementation of DDI hook for DrvPaint. + + DrvPaint is an obsolete function. + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Defines the surface on which to draw + pco - Limits the area to be modified on the Dstination + pbo - Points to a BRUSHOBJ which defined the pattern and colors to fill with + pptlBrushOrg - Specifies the origin of the halftone brush + mix - Defines the foreground and background raster operations to use for + the brush + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE("OEMPaint entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvPaint)(pso, + pco, + pbo, + pptlBrushOrg, + mix); +} + +BOOL APIENTRY +OEMRealizeBrush( + BRUSHOBJ *pbo, + SURFOBJ *psoTarget, + SURFOBJ *psoPattern, + SURFOBJ *psoMask, + XLATEOBJ *pxlo, + ULONG iHatch + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvRealizeBrush. + + DrvRealizeBrush requests that the driver realize a specified brush + for a specified surface. To realize a brush, the driver converts a + GDI brush into a form that can be used internally. A realized brush + contains device-specific information needed by the device to + accelerate drawing using the brush. The driver's realization of a brush + is written into the buffer allocated by a call to BRUSHOBJ_pvAllocRBrush. + + Please refer to DDK documentation for more details. + +Arguments: + + pbo - BRUSHOBJ to be realized + psoTarget - Defines the surface for which the brush is to be realized + psoPattern - Defines the pattern for the brush + psoMask - Transparency mask for the brush + pxlo - Defines the interpretration of colors in the pattern + iHatch - Specifies whether psoPattern is one of the hatch brushes + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE("OEMRealizeBrush entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)psoTarget->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvRealizeBrush)(pbo, + psoTarget, + psoPattern, + psoMask, + pxlo, + iHatch); +} + +BOOL APIENTRY +OEMStrokePath( + SURFOBJ *pso, + PATHOBJ *ppo, + CLIPOBJ *pco, + XFORMOBJ *pxo, + BRUSHOBJ *pbo, + POINTL *pptlBrushOrg, + LINEATTRS *plineattrs, + MIX mix + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvStrokePath. + + DrvStrokePath strokes a path when called by GDI. + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Identifies the surface on which to draw + ppo - Defines the path to be stroked + pco - Defines the clipping path + pxo - Specifies the world to device coordinate transformation + pbo - Specifies the brush to be used when drawing the path + pptlBrushOrg - Defines the brush origin + plineattrs - Defines the line attributes + mix - Specifies how to combine the brush with the destination + +Return Value: + + TRUE if successful + FALSE if driver cannot handle the path + DDI_ERROR if there is an error + +--*/ + +{ + VERBOSE("OEMStrokePath entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvStrokePath)(pso, + ppo, + pco, + pxo, + pbo, + pptlBrushOrg, + plineattrs, + mix); +} + +BOOL APIENTRY +OEMFillPath( + SURFOBJ *pso, + PATHOBJ *ppo, + CLIPOBJ *pco, + BRUSHOBJ *pbo, + POINTL *pptlBrushOrg, + MIX mix, + FLONG flOptions + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvFillPath. + + DrvFillPath is an optional entry point to handle the filling of closed paths. + GDI can call DrvFillPath to fill a path on a device-managed surface. + When deciding whether to call this function, GDI compares the fill + requirements with the following flags in the flGraphicsCaps member of + the DEVINFO structure: GCAPS_BEZIERS, GCAPS_ALTERNATEFILL, + and GCAPS_WINDINGFILL. + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Defines the surface on which to draw. + ppo - Defines the path to be filled + pco - Defines the clipping path + pbo - Defines the pattern and colors to fill with + pptlBrushOrg - Defines the brush origin + mix - Defines the foreground and background ROPs to use for the brush + flOptions - Whether to use zero-winding or odd-even rule + +Return Value: + + TRUE if successful + FALSE if driver cannot handle the path + DDI_ERROR if there is an error + +--*/ + +{ + VERBOSE("OEMFillPath entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvFillPath)(pso, + ppo, + pco, + pbo, + pptlBrushOrg, + mix, + flOptions); +} + +BOOL APIENTRY +OEMStrokeAndFillPath( + SURFOBJ *pso, + PATHOBJ *ppo, + CLIPOBJ *pco, + XFORMOBJ *pxo, + BRUSHOBJ *pboStroke, + LINEATTRS *plineattrs, + BRUSHOBJ *pboFill, + POINTL *pptlBrushOrg, + MIX mixFill, + FLONG flOptions + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvStrokeAndFillPath. + + DrvStrokeAndFillPath strokes and fills a path concurrently. + The driver can return FALSE if the path or the clipping is too + complex for the device to handle; in that case, GDI converts + to a simpler call. For example, if the device driver has set the + GCAPS_BEZIERS flag in the flGraphicsCaps member of the + DEVINFO structure and then receives a path with Bezier curves, + it can return FALSE; GDI will then convert the Bezier curves to + lines and call DrvStrokeAndFillPath again. If the device driver + returns FALSE again, GDI will further simplify the call, making + calls to DrvStrokePath and DrvFillPath, or to DrvBitBlt, depending + on the mix and width of the lines making up the path. + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Describes the surface on which to draw + ppo - Describes the path to be filled + pco - Defines the clipping path + pxo - Specifies the world to device coordinate transformation + pboStroke - Specifies the brush to use when stroking the path + plineattrs - Specifies the line attributes + pboFill - Specifies the brush to use when filling the path + pptlBrushOrg - Specifies the brush origin for both brushes + mixFill - Specifies the foreground and background ROPs to use + for the fill brush + flOptions - Whether to use zero-winding or odd-even rule + +Return Value: + + TRUE if successful + FALSE if driver cannot handle the path + DDI_ERROR if there is an error + +--*/ + +{ + VERBOSE("OEMStrokeAndFillPath entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvStrokeAndFillPath)(pso, + ppo, + pco, + pxo, + pboStroke, + plineattrs, + pboFill, + pptlBrushOrg, + mixFill, + flOptions); +} + +BOOL APIENTRY +OEMLineTo( + SURFOBJ *pso, + CLIPOBJ *pco, + BRUSHOBJ *pbo, + LONG x1, + LONG y1, + LONG x2, + LONG y2, + RECTL *prclBounds, + MIX mix + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvLineTo. + + DrvLineTo draws a single, solid, integer-only cosmetic line. + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Describes the surface on which to draw + pco - Defines the clipping path + pbo - Defines the brush used to draw the line + x1,y1 - Specifies the line's starting point + x2,y2 - Specifies the line's ending point + prclBounds - Defines a rectangle that bounds the unclipped line. + mix - Specifies the foreground and background ROP + +Return Value: + + TRUE if successful + FALSE if driver cannot handle the path + DDI_ERROR if there is an error + +--*/ + +{ + VERBOSE("OEMLineTo entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvLineTo)(pso, + pco, + pbo, + x1, + y1, + x2, + y2, + prclBounds, + mix); +} + +BOOL APIENTRY +OEMAlphaBlend( + SURFOBJ *psoDest, + SURFOBJ *psoSrc, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + RECTL *prclDest, + RECTL *prclSrc, + BLENDOBJ *pBlendObj + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvAlphaBlend. + + DrvAlphaBlend provides bit-block transfer capabilities with alpha blending. + + Please refer to DDK documentation for more details. + +Arguments: + + psoDest - Defines the surface on which to draw + psoSrc - Defines the source + pco - Limits the area to be modified on the Destination + pxlo - Specifies how color dwIndexes are to be translated + between the source and target surfaces + prclDest - Defines the area to be modified on the Destination surface + prclSrc - Defines the area to be copied from the source surface + BlendFunction - Specifies the blend function to be used + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE("OEMAlphaBlend entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)psoDest->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvAlphaBlend)(psoDest, + psoSrc, + pco, + pxlo, + prclDest, + prclSrc, + pBlendObj); +} + +BOOL APIENTRY +OEMGradientFill( + SURFOBJ *psoDest, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + TRIVERTEX *pVertex, + ULONG nVertex, + PVOID pMesh, + ULONG nMesh, + RECTL *prclExtents, + POINTL *pptlDitherOrg, + ULONG ulMode + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvGradientFill. + + DrvGradientFill shades the specified primitives. + + Please refer to DDK documentation for more details. + +Arguments: + + psoDest - Defines the surface on which to draw + pco - Limits the area to be modified on the Destination + pxlo - Should be ignored by the driver + pVertex - Pointer to an array of TRIVERTEX structures, + with each entry containing position and color information + nVertex - Specifies the number of TRIVERTEX structures in the + array to which pVertex points + pMesh - Pointer to an array of structures that define the connectivity + of the TRIVERTEX elements to which pVertex points + nMesh - Specifies the number of elements in the array to which + pMesh points + prclExtents - Pointer to a RECTL structure that defines the area in + which the gradient drawing is to occur + pptlDitherOrg - Pointer to a POINTL structure that defines the origin + on the surface for dithering + ulMode - Specifies the current drawing mode and how to interpret + the array to which pMesh points + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE("OEMGradientFill entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)psoDest->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvGradientFill)(psoDest, + pco, + pxlo, + pVertex, + nVertex, + pMesh, + nMesh, + prclExtents, + pptlDitherOrg, + ulMode); +} + +BOOL APIENTRY +OEMTransparentBlt( + SURFOBJ *psoDst, + SURFOBJ *psoSrc, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + RECTL *prclDst, + RECTL *prclSrc, + ULONG iTransColor, + ULONG ulReserved + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvTransparentBlt. + + DrvTransparentBlt provides bit-block transfer capabilities with + transparency. + + Please refer to DDK documentation for more details. + +Arguments: + + psoDst - Defines the surface on which to draw + psoSrc - Defines the source + pco - Limits the area to be modified on the Destination + pxlo - Specifies how color dwIndexes are to be translated + between the source and target surfaces + prclDst - Defines the area to be modified on the Destination surface + prclSrc - Defines the area to be copied from the source surface + iTransColor - Specifies the transparent color + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE("OEMTransparentBlt entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)psoDst->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvTransparentBlt)(psoDst, + psoSrc, + pco, + pxlo, + prclDst, + prclSrc, + iTransColor, + ulReserved); +} + +BOOL APIENTRY +OEMTextOut( + SURFOBJ *pso, + STROBJ *pstro, + FONTOBJ *pfo, + CLIPOBJ *pco, + RECTL *prclExtra, + RECTL *prclOpaque, + BRUSHOBJ *pboFore, + BRUSHOBJ *pboOpaque, + POINTL *pptlOrg, + MIX mix + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvTextOut. + + DrvTextOut is the entry point from GDI that calls for the + driver to render a set of glyphs at specified positions. + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Defines the surface on which to be written. + pstro - Defines the glyphs to be rendered and their positions + pfo - Specifies the font to be used + pco - Defines the clipping path + prclExtra - A NULL-terminated array of rectangles to be filled + prclOpaque - Specifies an opaque rectangle + pboFore - Defines the foreground brush + pboOpaque - Defines the opaque brush + pptlOrg - Pointer to POINT struct , defining th origin + mix - Specifies the foreground and background ROPs for pboFore + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE("OEMTextOut entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvTextOut)(pso, + pstro, + pfo, + pco, + prclExtra, + prclOpaque, + pboFore, + pboOpaque, + pptlOrg, + mix); +} + +PIFIMETRICS APIENTRY +OEMQueryFont( + DHPDEV dhpdev, + ULONG_PTR iFile, + ULONG iFace, + ULONG_PTR *pid + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvQueryFont. + + DrvQueryFont is used by GDI to get the IFIMETRICS structure + for a given font. + + Please refer to DDK documentation for more details. + +Arguments: + + dhpdev - Driver device handle + iFile - Identifies the driver font file + iFace - One-based index of the driver font + pid - Points to a LONG variable for returning an identifier + which GDI will pass to DrvFree + +Return Value: + + Pointer to an IFIMETRICS structure for the given font. + NULL if there is an error + +--*/ + +{ + VERBOSE("OEMQueryFont entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvQueryFont)(dhpdev, + iFile, + iFace, + pid); +} + +PVOID APIENTRY +OEMQueryFontTree( + DHPDEV dhpdev, + ULONG_PTR iFile, + ULONG iFace, + ULONG iMode, + ULONG_PTR *pid + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvQueryFontTree. + + DrvQueryFontTree provides GDI with a pointer to a structure that + defines one of the following: + - A mapping from Unicode to glyph handles, including glyph variants + - A mapping of kerning pairs to kerning handles + + Please refer to DDK documentation for more details. + +Arguments: + + dhpdev - Driver device handle + iFile - Identifies the driver font file + iFace - One-based index of the driver font + iMode - Specifies the type of information to be provided + pid - Points to a LONG variable for returning an identifier + which GDI will pass to DrvFree + +Return Value: + + Pointer to the structure requested based on iMode. + NULL if there is an error + +--*/ + +{ + VERBOSE("OEMQueryFontTree entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvQueryFontTree)(dhpdev, + iFile, + iFace, + iMode, + pid); +} + +LONG APIENTRY +OEMQueryFontData( + DHPDEV dhpdev, + FONTOBJ *pfo, + ULONG iMode, + HGLYPH hg, + GLYPHDATA *pgd, + _Out_writes_bytes_(cjSize) PVOID pv, + ULONG cjSize + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvQueryFontData. + + DrvQueryFontData retrieves information about a realized font. + GDI provides a pointer to an array of glyph or kerning handles, + and the driver returns information about the glyphs or kerning + pairs. The driver can assume that all handles in the array are valid. + + Please refer to DDK documentation for more details. + +Arguments: + + dhpdev - Driver device handle + pfo - Points to a FONTOBJ structure + iMode - Type of information requested + hg - A glyph handle + pgd - Points to a GLYPHDATA structure + pv - Points to output buffer + cjSize - Size of output buffer + +Return Value: + + Depends on iMode. FD_ERROR if there is an error + +--*/ + +{ + VERBOSE("OEMQueryFontData entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvQueryFontData)(dhpdev, + pfo, + iMode, + hg, + pgd, + pv, + cjSize); +} + +ULONG APIENTRY +OEMFontManagement( + SURFOBJ *pso, + FONTOBJ *pfo, + ULONG iMode, + ULONG cjIn, + _In_reads_bytes_(cjIn) PVOID pvIn, + ULONG cjOut, + _Out_writes_bytes_(cjOut) PVOID pvOut + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvFontManagement. + + Is this function valid for Unidrv drivers? + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Points to a SURFOBJ structure + pfo - Points to a FONTOBJ structure + iMode - Escape number + cjIn - Size of input buffer + pvIn - Points to input buffer + cjOut - Size of output buffer + pvOut - Points to output buffer + +Return Value: + + 0x00000001 to 0x7fffffff for success + 0x80000000 to 0xffffffff for failure + 0 if the specified escape number if not supported + +--*/ + +{ + VERBOSE("OEMFontManagement entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvFontManagement)(pso, + pfo, + iMode, + cjIn, + pvIn, + cjOut, + pvOut); +} + +BOOL APIENTRY +OEMQueryAdvanceWidths( + DHPDEV dhpdev, + FONTOBJ *pfo, + ULONG iMode, + _In_reads_(cGlyphs) HGLYPH *phg, + _Out_writes_bytes_(cGlyphs*sizeof(USHORT)) PVOID pvWidths, + ULONG cGlyphs + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvQueryAdvanceWidths. + + DrvQueryAdvanceWidths returns character advance widths + for a specified set of glyphs. + + Please refer to DDK documentation for more details. + +Arguments: + + dhpdev - Driver device handle + pfo - Points to a FONTOBJ structure + iMode - Type of information to be provided + phg - Points to an array of HGLYPHs for which the driver will + provide character advance widths + pvWidths - Points to a buffer for returning width data + cGlyphs - Number of glyphs in the phg array + +Return Value: + + Depends on iMode + +--*/ + +{ + VERBOSE("OEMQueryAdvanceWidths entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvQueryAdvanceWidths)(dhpdev, + pfo, + iMode, + phg, + pvWidths, + cGlyphs); +} + +ULONG APIENTRY +OEMGetGlyphMode( + DHPDEV dhpdev, + FONTOBJ *pfo + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvGetGlyphMode. + + DrvGetGlyphMode tells GDI how to cache glyph information. + GDI calls a driver's DrvGetGlyphMode routine to determine the + range of font information that should be cached for a particular + font; that is, DrvGetGlyphMode determines what GDI stores in + its font cache. A device that caches fonts on its own should return + FO_HGLYPHS to minimize the storage requirements for the font. + GDI calls DrvGetGlyphMode for each font realization. For example, + a driver might want to download outlines for point sizes larger than + 12 point, but raster images for smaller fonts. However, GDI reserves + the right to refuse this request. + + Please refer to DDK documentation for more details. + +Arguments: + + dhpdev - Driver device handle + pfo - Points to a FONTOBJ structure + +Return Value: + + The glyph mode or FO_GLYPHMODE, which is the default. + +--*/ + +{ + VERBOSE("OEMGetGlyphMode entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvGetGlyphMode)(dhpdev, + pfo); +} + +BOOL APIENTRY +OEMStartDoc( + SURFOBJ *pso, + _In_ PWSTR pwszDocName, + DWORD dwJobId + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvStartDoc. + + DrvStartDoc is called by GDI when it is ready to + start sending a document to the driver for rendering. + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Defines the surface object + pDocName - Specifies a Unicode document name + jobId - Identifies the print job + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE("OEMStartDoc entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvStartDoc)(pso, + pwszDocName, + dwJobId); +} + +BOOL APIENTRY +OEMEndDoc( + SURFOBJ *pso, + FLONG fl + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvEndDoc. + + DrvEndDoc is called by GDI when it has finished + sending a document to the driver for rendering. + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Defines the surface object + flags - A set of flag bits + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE("OEMEndDoc entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvEndDoc)(pso, + fl); +} + +BOOL APIENTRY +OEMStartPage( + SURFOBJ *pso + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvStartPage. + + DrvStartPage is called by GDI when it is ready to + start sending the contents of a physical page to the + driver for rendering. + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Defines the surface object + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE("OEMStartPage entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvStartPage)(pso); +} + +BOOL APIENTRY +OEMSendPage( + SURFOBJ *pso + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvSendPage. + + DrvSendPage is called by GDI when it has finished + drawing a physical page, so the driver can send + the page to the printer. + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Defines the surface object + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE("OEMSendPage entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvSendPage)(pso); +} + +BOOL APIENTRY +OEMStartBanding( + SURFOBJ *pso, + POINTL *pptl + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvStartBanding. + + DrvStartBanding is called by GDI when it is ready to start + sending bands of a physical page to the driver for rendering. + Note: DrvStartBanding is called to prepare the driver + for banding, call only once per page (not at everyband!!) + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Defines the surface object + pptl - Pointer to origin of next band (to return to GDI) + +Return Value: + + Fill out pptl to contain the origin of the first band + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE("OEMStartBanding entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvStartBanding)(pso, + pptl); +} + +BOOL APIENTRY +OEMNextBand( + SURFOBJ *pso, + POINTL *pptl + ) + +/*++ + +Routine Description: + + Implementation of DDI hook for DrvNextBand. + + DrvNextBand is called by GDI when it has finished + drawing a band for a physical page, so the driver + can send the band to the printer. + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Defines the surface object + pptl - Pointer to origin of next band (to return to GDI) + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE("OEMNextBand entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvNextBand)(pso, + pptl); +} + +ULONG APIENTRY +OEMEscape( + SURFOBJ *pso, + ULONG iEsc, + ULONG cjIn, + _In_reads_bytes_(cjIn) PVOID pvIn, + ULONG cjOut, + _Out_writes_bytes_(cjOut) PVOID pvOut + ) + +/*++ + +Routine Description: + + Implementation of DDI entry point DrvEscape. + + DrvEscape is used for retrieving information from a device + that is not available in a device-independent device driver + interface; the particular query depends on the value of the + iEsc parameter. + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Describes the surface the call is directed to + iEsc - Specifies a query + cjIn - Specifies the size in bytes of the buffer pointed to by pvIn + pvIn - Points to input data buffer + cjOut - Specifies the size in bytes of the buffer pointed to by pvOut + pvOut - Points to the output buffer + +Return Value: + + Depends on the query specified by iEsc parameter. + + Zero if the function specified by the query is not supported. + +--*/ + +{ + VERBOSE("OEMEscape entry."); + + PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev; + POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM; + + // Punt call back to UNIDRV. + // + return (pOemPDEV->m_pfnDrvEscape)(pso, + iEsc, + cjIn, + pvIn, + cjOut, + pvOut); +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemuni/debug.h b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/debug.h new file mode 100644 index 00000000..0414569c --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/debug.h @@ -0,0 +1,82 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1996 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Debug.H +// +// PURPOSE: Define common data types, and external function prototypes +// for debugging functions. Also defines the various debug macros. +// +// + +#pragma once + +///////////////////////////////////////////////////////// +// Macros +///////////////////////////////////////////////////////// +// +// These macros are used for debugging purposes. They expand +// to white spaces on a free build. Here is a brief description +// of what they do and how they are used: +// +// giDebugLevel +// Global variable which set the current debug level to control +// the amount of debug messages emitted. +// +// WARNING(msg) +// Display a message if the current debug level is <= DBG_WARNING. +// The message format is: WRN filename (linenumber): message +// +// ERR(msg) +// Similiar to WARNING macro above - displays a message +// if the current debug level is <= DBG_ERROR. +// +// ASSERT(cond) +// Verify a condition is true. If not, force a breakpoint. +// +// RIP(msg) +// Display a message and force a breakpoint. +// +// Usage: +// WARNING("App passed NULL pointer, ignoring...\n"); +// + +#define DBG_VERBOSE 0 +#define DBG_WARNING 1 +#define DBG_ERROR 2 +#define DBG_NONE 3 + +// VC and Build use different debug defines. +#if defined (DBG) || defined (_DEBUG) + + // __declspec(selectany) ensures that even if this is defined in multiple compilation + // modules, they will all resolve to the same symbol in the linked DLL + __declspec(selectany) INT giDebugLevel = 2; + + #define STRINGIZE(x) #x + #define QUOTE(x) STRINGIZE(x) + #define FILE_AND_LINE __FILE__ "@" QUOTE(__LINE__) + + #define VERBOSE(msg) { if(giDebugLevel <= DBG_VERBOSE) OutputDebugStringA( FILE_AND_LINE ": " msg); } + #define WARNING(msg) { if(giDebugLevel <= DBG_WARNING) OutputDebugStringA( FILE_AND_LINE ": Warning: " msg); } + #define ERR(msg) { if(giDebugLevel <= DBG_ERROR) OutputDebugStringA(FILE_AND_LINE ": Error:" msg); } + #define ASSERT(cond) { if (!(cond)) RIP("\n"); } + #define RIP(msg) { OutputDebugStringA(FILE_AND_LINE ": Error (not recoverable): " msg); DebugBreak(); } + +#else // !DBG + + #define VERBOSE(msg) + #define WARNING(msg) + #define ERR(msg) + #define ASSERT(cond) + #define RIP(msg) + +#endif + + + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemuni/devmode.cpp b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/devmode.cpp new file mode 100644 index 00000000..6196a054 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/devmode.cpp @@ -0,0 +1,222 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Devmode.cpp +// +// PURPOSE: Implementation of Devmode functions shared with OEM UI and OEM rendering modules. +// + +#include "precomp.h" + +#include "resource.h" +#include "devmode.h" +#include "debug.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +HRESULT hrOEMDevMode( + DWORD dwMode, + POEMDMPARAM pOemDMParam + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::DevMode. + hrOEMDevMode is called by IPrintOemUni::DevMode + which is defined in intrface.cpp. + + The IPrintOemUni::DevMode method, provided by + rendering plug-ins for Unidrv, performs operations + on private DEVMODE members. + + Please refer to DDK documentation for more details. + +Arguments: + + dwMode - caller-supplied constant. Refer to the docs + for more information. + pOemDMParam - pointer to an OEMDMPARAM structure. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + +--*/ + +{ + POEMDEV pOEMDevIn; + POEMDEV pOEMDevOut; + + VERBOSE("hrOEMDevMode entry."); + + // Verify parameters. + if( (NULL == pOemDMParam) + || + ( (OEMDM_SIZE != dwMode) + && + (OEMDM_DEFAULT != dwMode) + && + (OEMDM_CONVERT != dwMode) + && + (OEMDM_MERGE != dwMode) + )) + { + ERR("DevMode() ERROR_INVALID_PARAMETER.\r\n"); + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Cast generic (i.e. PVOID) to OEM private devmode pointer type. + pOEMDevIn = (POEMDEV) pOemDMParam->pOEMDMIn; + pOEMDevOut = (POEMDEV) pOemDMParam->pOEMDMOut; + + switch(dwMode) + { + case OEMDM_SIZE: + pOemDMParam->cbBufSize = sizeof(OEMDEV); + break; + + case OEMDM_DEFAULT: + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + pOEMDevOut->dwDriverData = 0; + break; + + case OEMDM_CONVERT: + bConvertOEMDevmode(pOEMDevIn, pOEMDevOut); + break; + + case OEMDM_MERGE: + bConvertOEMDevmode(pOEMDevIn, pOEMDevOut); + bMakeOEMDevmodeValid(pOEMDevOut); + break; + } + + return S_OK; +} + + +BOOL bConvertOEMDevmode( + PCOEMDEV pOEMDevIn, + POEMDEV pOEMDevOut + ) + +/*++ + +Routine Description: + + Converts private DEVMODE members to the + current version. + +Arguments: + + pOEMDevIn - pointer to OEM private devmode + pOEMDevOut - pointer to OEM private devmode + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + VERBOSE("bConvertOEMDevmode entry."); + + if( (NULL == pOEMDevIn) + || + (NULL == pOEMDevOut) + ) + { + ERR("ConvertOEMDevmode() invalid parameters.\r\n"); + return FALSE; + } + + // Check OEM Signature, if it doesn't match ours, + // then just assume DMIn is bad and use defaults. + if(pOEMDevIn->dmOEMExtra.dwSignature == pOEMDevOut->dmOEMExtra.dwSignature) + { + VERBOSE("Converting private OEM Devmode.\r\n"); + + // Set the devmode defaults so that anything the isn't copied over will + // be set to the default value. + pOEMDevOut->dwDriverData = 0; + + // Copy the old structure in to the new using which ever size is the smaller. + // Devmode maybe from newer Devmode (not likely since there is only one), or + // Devmode maybe a newer Devmode, in which case it maybe larger, + // but the first part of the structure should be the same. + + // DESIGN ASSUMPTION: the private DEVMODE structure only gets added to; + // the fields that are in the DEVMODE never change only new fields get added to the end. + + memcpy(pOEMDevOut, pOEMDevIn, __min(pOEMDevOut->dmOEMExtra.dwSize, pOEMDevIn->dmOEMExtra.dwSize)); + + // Re-fill in the size and version fields to indicated + // that the DEVMODE is the current private DEVMODE version. + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + } + else + { + VERBOSE("Unknown DEVMODE signature, pOEMDMIn ignored.\r\n"); + + // Don't know what the input DEVMODE is, so just use defaults. + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + pOEMDevOut->dwDriverData = 0; + } + + return TRUE; +} + + +BOOL bMakeOEMDevmodeValid( + POEMDEV pOEMDevmode + ) + +/*++ + +Routine Description: + + Ensures that private OEM devmode members are valid. + +Arguments: + + pOEMDevmode - pointer to OEM private devmode + +Return Value: + + TRUE if successful, FALSE if there is an error + +--*/ + +{ + if(NULL == pOEMDevmode) + { + return FALSE; + } + + // ASSUMPTION: pOEMDevmode is large enough to contain OEMDEV structure. + + // Make sure that dmOEMExtra indicates the current OEMDEV structure. + pOEMDevmode->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevmode->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevmode->dmOEMExtra.dwVersion = OEM_VERSION; + + // Set driver data. + pOEMDevmode->dwDriverData = 0; + + return TRUE; +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemuni/devmode.h b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/devmode.h new file mode 100644 index 00000000..02af4909 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/devmode.h @@ -0,0 +1,43 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Devmode.h +// +// PURPOSE: Define common data types, and external function prototypes +// for devmode functions. +// + +#pragma once + +//////////////////////////////////////////////////////// +// OEM Devmode Defines +//////////////////////////////////////////////////////// + +#define OEM_SIGNATURE 'MSFT' +#define OEM_VERSION 0x00000001L + +//////////////////////////////////////////////////////// +// OEM Devmode Type Definitions +//////////////////////////////////////////////////////// + +typedef struct tagOEMDEV +{ + OEM_DMEXTRAHEADER dmOEMExtra; + BOOL dwDriverData; +} OEMDEV, *POEMDEV; + +typedef const OEMDEV *PCOEMDEV; + + +///////////////////////////////////////////////////////// +// ProtoTypes +///////////////////////////////////////////////////////// + +HRESULT hrOEMDevMode(DWORD dwMode, POEMDMPARAM pOemDMParam); +BOOL bConvertOEMDevmode(PCOEMDEV pOEMDevIn, POEMDEV pOEMDevOut); +BOOL bMakeOEMDevmodeValid(POEMDEV pOEMDevmode); + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemuni/dllentry.cpp b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/dllentry.cpp new file mode 100644 index 00000000..8ed3e0e7 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/dllentry.cpp @@ -0,0 +1,55 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: dllentry.cpp +// +// PURPOSE: Source module for DLL entry function(s). +// + +#include "precomp.h" + +#include "debug.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +/////////////////////////////////////////////////////////// +// +// DLL entry point +// + +// DllMain isn't called/used for kernel mode version. +// +BOOL WINAPI DllMain(HINSTANCE hInst, WORD wReason, LPVOID lpReserved) +{ + VERBOSE("DllMain entry."); + + UNREFERENCED_PARAMETER(hInst); + UNREFERENCED_PARAMETER(lpReserved); + + switch(wReason) + { + case DLL_PROCESS_ATTACH: + VERBOSE("Process attach.\r\n"); + break; + + case DLL_THREAD_ATTACH: + VERBOSE("Thread attach.\r\n"); + break; + + case DLL_PROCESS_DETACH: + VERBOSE("Process detach.\r\n"); + break; + + case DLL_THREAD_DETACH: + VERBOSE("Thread detach.\r\n"); + break; + } + + return TRUE; +} diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemuni/intrface.cpp b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/intrface.cpp new file mode 100644 index 00000000..8d87053f --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/intrface.cpp @@ -0,0 +1,1797 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Intrface.cpp +// +// PURPOSE: Interface for User Mode COM Customization DLL. +// + +#include "precomp.h" +#include "resource.h" +#include "devmode.h" +#include "debug.h" +#include "oemuni.h" +#include "intrface.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +// ================================================================== +// Internal Globals +// +static long g_cComponents; // Count of active components +static long g_cServerLocks; // Count of locks +// +// ================================================================== + +// ================================================================== +// The purpose of this array is to inform UNIDRV of the callbacks +// that are implemented in this driver. +// +// Note that there is *NO* order dependency in this array. New +// index values and their corresponding callbacks can be placed +// anywhere within the list as needed. +// +static const DRVFN s_aOemHookFuncs[] = +{ + // The following are declared in printoem.h and defined in ddihook.cpp. + {INDEX_DrvAlphaBlend, (PFN)OEMAlphaBlend}, + {INDEX_DrvBitBlt, (PFN)OEMBitBlt}, + {INDEX_DrvCopyBits, (PFN)OEMCopyBits}, + {INDEX_DrvDitherColor, (PFN)OEMDitherColor}, + {INDEX_DrvFillPath, (PFN)OEMFillPath}, + {INDEX_DrvFontManagement, (PFN)OEMFontManagement}, + {INDEX_DrvGetGlyphMode, (PFN)OEMGetGlyphMode}, + {INDEX_DrvGradientFill, (PFN)OEMGradientFill}, + {INDEX_DrvLineTo, (PFN)OEMLineTo}, + {INDEX_DrvPaint, (PFN)OEMPaint}, + {INDEX_DrvPlgBlt, (PFN)OEMPlgBlt}, + {INDEX_DrvQueryAdvanceWidths, (PFN)OEMQueryAdvanceWidths}, + {INDEX_DrvQueryFont, (PFN)OEMQueryFont}, + {INDEX_DrvQueryFontData, (PFN)OEMQueryFontData}, + {INDEX_DrvQueryFontTree, (PFN)OEMQueryFontTree}, + {INDEX_DrvRealizeBrush, (PFN)OEMRealizeBrush}, + {INDEX_DrvStretchBlt, (PFN)OEMStretchBlt}, + {INDEX_DrvStretchBltROP, (PFN)OEMStretchBltROP}, + {INDEX_DrvStrokeAndFillPath, (PFN)OEMStrokeAndFillPath}, + {INDEX_DrvStrokePath, (PFN)OEMStrokePath}, + {INDEX_DrvTextOut, (PFN)OEMTextOut}, + {INDEX_DrvTransparentBlt, (PFN)OEMTransparentBlt}, + {INDEX_DrvStartDoc, (PFN)OEMStartDoc}, + {INDEX_DrvEndDoc, (PFN)OEMEndDoc}, + {INDEX_DrvStartPage, (PFN)OEMStartPage}, + {INDEX_DrvSendPage, (PFN)OEMSendPage}, + {INDEX_DrvStartBanding, (PFN)OEMStartBanding}, + {INDEX_DrvNextBand, (PFN)OEMNextBand}, + {INDEX_DrvEscape, (PFN)OEMEscape} +}; + +//////////////////////////////////////////////////////////////////////////////// +// +// COemUni2 body +// +COemUni2::COemUni2() +{ + m_cRef = 1; + + // Increment COM component count. + InterlockedIncrement(&g_cComponents); + + m_pOEMHelp = NULL; +} + +COemUni2::~COemUni2() +{ + // Make sure that helper interface is released. + if(NULL != m_pOEMHelp) + { + m_pOEMHelp->Release(); + m_pOEMHelp = NULL; + } + + // If this instance of the object is being deleted, then the reference + // count should be zero. + assert(0 == m_cRef); +} + +HRESULT __stdcall +COemUni2:: +QueryInterface( + const IID& iid, + void** ppv + ) +{ + VERBOSE("COemUni2::QueryInterface() entry."); + + if (iid == IID_IUnknown) + { + *ppv = static_cast<IUnknown*>(this); + VERBOSE("COemUni2::QueryInterface IUnknown.\r\n"); + } + else if (iid == IID_IPrintOemUni2) + { + VERBOSE("COemUni2::QueryInterface IPrintOemUni2.\r\n"); + + *ppv = static_cast<IPrintOemUni2*>(this); + } + else + { + WARNING("COemUni2::QueryInterface NULL. Returning E_NOINTERFACE.\r\n"); + + *ppv = NULL; + return E_NOINTERFACE; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef(); + return S_OK; +} + +ULONG __stdcall +COemUni2:: +AddRef( + VOID + ) +{ + VERBOSE("COemUni2::AddRef() entry."); + + return InterlockedIncrement(&m_cRef); +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall +COemUni2:: +Release( + VOID + ) +{ + VERBOSE("COemUni2::Release() entry."); + ULONG cRef = InterlockedDecrement(&m_cRef); + + if (cRef == 0) + { + delete this; + return 0; + } + return cRef; +} + +HRESULT __stdcall +COemUni2:: +CommandCallback( + PDEVOBJ pdevobj, + DWORD dwCallbackID, + DWORD dwCount, + PDWORD pdwParams, + OUT INT *piResult + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::CommandCallback + + The IPrintOemUni::CommandCallback method is used + to provide dynamically generated printer commands + for Unidrv-supported printers. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + dwCallbackID - value representing the printer command's + *CallbackID attribute in the printer's generic printer + description (GPD) file. + dwCount - value representing the number of elements + in the array pointed to by pdwParams. Can be 0. + pdwParams - pointer to an array of DWORD-sized parameters + containing values specified by the printer commands + *Params attribute in the printer's GPD file. Can be NULL. + piResult - Receives a method-supplied result value. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + VERBOSE("COemUni2::CommandCallback() entry."); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(dwCallbackID); + UNREFERENCED_PARAMETER(dwCount); + UNREFERENCED_PARAMETER(pdwParams); + + *piResult = 0; + + return S_OK; +} + +HRESULT __stdcall +COemUni2:: +Compression( + PDEVOBJ pdevobj, + PBYTE pInBuf, + PBYTE pOutBuf, + DWORD dwInLen, + DWORD dwOutLen, + OUT INT *piResult + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::Compression + + The IPrintOemUni::Compression method can be used + with Unidrv-supported printers to provide a customized + bitmap compression method. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pInBuf - pointer to input scan line data. + pOutBuf - pointer to an output buffer to receive + compressed scan line data. + dwInLen - length of the input data. + dwOutLen - length of the output buffer. + piResult - Receives a method-supplied result value. If the + operation succeeds, this value should be the number + of compressed bytes, which must not be larger than + the value received for dwOutLen. If an error occurs, + or if the method cannot compress, the result value + should be -1. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + VERBOSE("COemUni2::Compression() entry."); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pInBuf); + UNREFERENCED_PARAMETER(pOutBuf); + UNREFERENCED_PARAMETER(dwInLen); + UNREFERENCED_PARAMETER(dwOutLen); + UNREFERENCED_PARAMETER(piResult); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +DevMode( + DWORD dwMode, + POEMDMPARAM pOemDMParam + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::DevMode + + The IPrintOemUni::DevMode method, provided by + rendering plug-ins for Unidrv, performs operations + on private DEVMODE members. + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::DevMode method. + + Please refer to DDK documentation for more details. + +Arguments: + + dwMode - caller-supplied constant. Refer to the docs + for more information. + pOemDMParam - pointer to an OEMDMPARAM structure. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + + +--*/ + +{ + VERBOSE("COemUni2:DevMode entry."); + + return hrOEMDevMode(dwMode, pOemDMParam); +} + +HRESULT __stdcall +COemUni2:: +DisableDriver( + VOID + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::DisableDriver + + The IPrintOemUni::DisableDriver method allows a rendering + plug-in for Unidrv to free resources that were allocated by the + plug-in's IPrintOemUni::EnableDriver method. This is the last + IPrintOemUni interface method that is called before the rendering + plug-in is unloaded. + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::DisableDriver method. + + Please refer to DDK documentation for more details. + +Arguments: + + VOID + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + + +--*/ + +{ + VERBOSE("COemUni2::DisableDriver() entry."); + + // Release reference to Printer Driver's interface. + // + if (this->m_pOEMHelp) + { + this->m_pOEMHelp->Release(); + this->m_pOEMHelp = NULL; + } + + return S_OK; +} + +HRESULT __stdcall +COemUni2:: +DisablePDEV( + PDEVOBJ pdevobj + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::DisablePDEV + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::DisablePDEV method. + + The IPrintOemUni::DisablePDEV method performs the same types of + operations as the DrvDisablePDEV function. Its purpose is to allow a + rendering plug-in to delete the private PDEV structure that is pointed + to by the DEVOBJ structure's pdevOEM member. This PDEV structure + is one that was allocated by the plug-in's IPrintOemUni::EnablePDEV method. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + + +--*/ + +{ + VERBOSE("COemUni2::DisablePDEV() entry."); + + POEMPDEV pOemPDEV = (POEMPDEV)pdevobj->pdevOEM; + delete pOemPDEV; + + return S_OK; +} + +HRESULT __stdcall +COemUni2:: +DownloadCharGlyph( + PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + HGLYPH hGlyph, + PDWORD pdwWidth, + OUT DWORD *pdwResult + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::DownloadCharGlyph + + The IPrintOemUni::DownloadCharGlyph method enables a + rendering plug-in for Unidrv to send a character glyph for + a specified soft font to the printer. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pUFObj - pointer to a UNIFONTOBJ structure. + hGlyph - glyph handle. + pdwWidth - pointer to receive the method-supplied width of the character. + pdwResult - Receives a method-supplied value representing the amount + of printer memory, in bytes, required to store the character glyph. + If the operation fails, the returned value should be zero. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + VERBOSE("COemUni2::DownloadCharGlyph() entry."); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pUFObj); + UNREFERENCED_PARAMETER(hGlyph); + UNREFERENCED_PARAMETER(pdwWidth); + UNREFERENCED_PARAMETER(pdwResult); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +DownloadFontHeader( + PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + OUT DWORD *pdwResult + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::DownloadFontHeader + + The IPrintOemUni::DownloadFontHeader method allows a + rendering plug-in for Unidrv to send a font's header + information to a printer. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pUFObj - pointer to a UNIFONTOBJ structure. + pdwResult - Receives a method-supplied value representing the amount + of printer memory, in bytes, required to store the font header + information. If the operation fails, the returned value should be zero. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + VERBOSE("COemUni2::DownloadFontHeader() entry."); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pUFObj); + UNREFERENCED_PARAMETER(pdwResult); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +DriverDMS( + PVOID pDevObj, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::DriverDMS + + The IPrintOemUni::DriverDMS method allows a rendering + plug-in for Unidrv to indicate that it uses a device-managed + drawing surface instead of the default GDI-managed surface. + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::DriverDMS method. + + Please refer to DDK documentation for more details. For general info + on device managed surfaces and how to handle them, please refer to + the section titled "Handling Device-Managed Surfaces". + +Arguments: + + pDevObj - pointer to a DEVOBJ structure. + pBuffer - pointer to a buffer to receive method-specified flags. + cbSize - size, in bytes, of the buffer pointed to by pBuffer. + pcbNeeded - pointer to a location to receive the required + minimum pBuffer size. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + + +--*/ + +{ + VERBOSE("COemUni2::DriverDMS() entry."); + + UNREFERENCED_PARAMETER(pDevObj); + UNREFERENCED_PARAMETER(pBuffer); + UNREFERENCED_PARAMETER(cbSize); + UNREFERENCED_PARAMETER(pcbNeeded); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +EnableDriver( + DWORD dwDriverVersion, + DWORD cbSize, + PDRVENABLEDATA pded + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::EnableDriver + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::EnableDriver method. + + The IPrintOemUni::EnableDriver method allows a rendering + plug-in to perform the same types of operations as the + DrvEnableDriver function. Like the DrvEnableDriver function, + the IPrintOemUni::EnableDriver method is responsible for + providing addresses of internally supported graphics DDI functions, + or DDI hook functions. + + The method should fill the supplied DRVENABLEDATA structure + and allocate an array of DRVFN structures. It should fill the + array with pointers to hooking functions, along with winddi.h-defined + index values that identify the hooked out graphics DDI functions. + + Please refer to DDK documentation for more details. + +Arguments: + + DriverVersion - interface version number. This value is + defined by PRINTER_OEMINTF_VERSION, in printoem.h. + cbSize - size, in bytes, of the structure pointed to by pded. + pded - pointer to a DRVENABLEDATA structure. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + + +--*/ + +{ + VERBOSE("COemUni2::EnableDriver() entry."); + + UNREFERENCED_PARAMETER(dwDriverVersion); + UNREFERENCED_PARAMETER(cbSize); + + // We need to return the DDI functions that have been hooked + // in pded. Here we fill out the fields in pded. + // + pded->iDriverVersion = PRINTER_OEMINTF_VERSION; + pded->c = sizeof(s_aOemHookFuncs) / sizeof(DRVFN); + pded->pdrvfn = (DRVFN *) s_aOemHookFuncs; + + // Even if nothing is done, need to return S_OK so + // that DisableDriver() will be called, which releases + // the reference to the Printer Driver's interface. + // + return S_OK; +} + +HRESULT __stdcall +COemUni2:: +EnablePDEV( + PDEVOBJ pdevobj, + _In_ PWSTR pPrinterName, + ULONG cPatterns, + HSURF *phsurfPatterns, + ULONG cjGdiInfo, + GDIINFO *pGdiInfo, + ULONG cjDevInfo, + DEVINFO *pDevInfo, + DRVENABLEDATA *pded, + OUT PDEVOEM *pDevOem + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::EnablePDEV + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::EnablePDEV method. + + The IPrintOemUni::EnablePDEV method performs the same types + of operations as the DrvEnablePDEV function that is exported + by a printer graphics DLL. Its purpose is to allow a rendering + plug-in to create its own PDEV structure. For more information + about PDEV structures, see "Customized PDEV Structures" in the DDK docs. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pPrinterName - pointer to a text string representing the + logical address of the printer. + cPatterns - value representing the number of HSURF-typed + surface handles contained in the buffer pointed to by + phsurfPatterns. + phsurfPatterns - pointer to a buffer that is large enough to + contain cPatterns number of HSURF-typed surface handles. + The handles represent surface fill patterns. + cjGdiInfo - value representing the size of the structure pointed + to by pGdiInfo. + pGdiInfo - pointer to a GDIINFO structure. + cjDevInfo - value representing the size of the structure pointed + to by pDevInfo. + pDevInfo - pointer to a DEVINFO structure. + pded - pointer to a DRVENABLEDATA structure containing the + addresses of the printer driver's graphics DDI hooking functions. + pDevOem - Receives a method-supplied pointer to a private PDEV structure. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + + If the operation fails, the method should call SetLastError to set an error code. + + +--*/ + +{ + VERBOSE("COemUni2::EnablePDEV() entry."); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pPrinterName); + UNREFERENCED_PARAMETER(cPatterns); + UNREFERENCED_PARAMETER(phsurfPatterns); + UNREFERENCED_PARAMETER(cjGdiInfo); + UNREFERENCED_PARAMETER(cjDevInfo); + UNREFERENCED_PARAMETER(pDevInfo); + UNREFERENCED_PARAMETER(pGdiInfo); + + // Allocate an instance of our private PDEV. + // + POEMPDEV pOemPDEV = new COemPDEV(); + + if (NULL == pOemPDEV) + { + return NULL; + } + + pOemPDEV->InitializeDDITable(pded); + + *pDevOem = pOemPDEV; + + return S_OK; +} + +HRESULT __stdcall +COemUni2:: +FilterGraphics( + PDEVOBJ pdevobj, + PBYTE pBuf, + DWORD dwLen + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::FilterGraphics + + The IPrintOemUni::FilterGraphics method can be used with + Unidrv-supported printers to modify scan line data and send + it to the spooler. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pBuf - pointer to a buffer containing scan line data to be printed. + dwLen - value representing the length, in bytes, of the data + pointed to by pBuf. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + DWORD dwResult; + + VERBOSE("COemUni2::FilterGraphics() entry."); + + m_pOEMHelp->DrvWriteSpoolBuf(pdevobj, pBuf, dwLen, &dwResult); + + if (dwResult == dwLen) + return S_OK; + else + return S_FALSE; +} + +HRESULT __stdcall +COemUni2:: +GetImplementedMethod( + _In_ PSTR pMethodName + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::GetImplementedMethod + + The IPrintOemUni::GetImplementedMethod method is used by + Unidrv to determine which IPrintOemUni interface methods + have been implemented by a rendering plug-in. + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::GetImplemented method. + + Please refer to DDK documentation for more details. + +Arguments: + + pMethodName - pointer to a string representing the name of an + IPrintOemUni interface method, such as "ImageProcessing" + for IPrintOemUni::ImageProcessing or "FilterGraphics" for + IPrintOemUni::FilterGraphics. + +Return Value: + + S_OK The operation succeeded (the specified method is implemented). + S_FALSE The operation failed (the specified method is not implemented). + + +--*/ + +{ + HRESULT Result = S_FALSE; + + VERBOSE("COemUni2::GetImplementedMethod() entry."); + + // Unidrv only calls GetImplementedMethod for optional + // methods. The required methods are assumed to be + // supported. + + // Return S_OK for supported function (i.e. implemented), + // and S_FALSE for functions that aren't supported (i.e. not implemented). + switch (*pMethodName) + { + case 'C': + if (!strcmp(NAME_CommandCallback, pMethodName)) + { + Result = S_OK; + } + break; + case 'F': + if (!strcmp(NAME_FilterGraphics, pMethodName)) + { + Result = S_OK; + } + break; + } + + return Result; +} + +HRESULT __stdcall +COemUni2:: +GetInfo( + DWORD dwMode, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::GetInfo + + A rendering plug-in's IPrintOemUni::GetInfo method returns + identification information. + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::GetInfo method. + + Please refer to DDK documentation for more details. + +Arguments: + + dwMode - Contains one of the following caller-supplied integer constants. + OEMGI_GETSIGNATURE - The method must return a unique four-byte + identification signature. The plug-in must also place this signature + in OPTITEM structures, as described in the description of the + OEMCUIPPARAM. structure's pOEMOptItems member. + OEMGI_GETVERSION - The method must return the user interface + plug-in's version number as a DWORD. The version format is + developer-defined. + pBuffer - pointer to memory allocated to receive the information specified + by dwInfo. + cbSize - size of the buffer pointed to by pBuffer. + pcbNeeded - pointer to a location to receive the number of bytes written + into the buffer pointed to by pBuffer. + +Return Value: + + S_OK The operation succeeded (the specified method is implemented). + S_FALSE The operation failed (the specified method is not implemented). + + +--*/ + +{ + PWSTR pszTag = L"COemUni2::GetInfo entry."; + switch(dwMode) + { + case OEMGI_GETSIGNATURE: + pszTag = L"COemUni2::GetInfo entry. [OEMGI_GETSIGNATURE]"; + break; + case OEMGI_GETVERSION: + pszTag = L"COemUni2::GetInfo entry. [OEMGI_GETVERSION]"; + break; + + } + + // Validate parameters. + if( (NULL == pcbNeeded) + || + ( (OEMGI_GETSIGNATURE != dwMode) + && + (OEMGI_GETVERSION != dwMode) ) ) + { + WARNING("COemUni2::GetInfo() exit pcbNeeded is NULL! ERROR_INVALID_PARAMETER.\r\n"); + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Set expected buffer size. + *pcbNeeded = sizeof(DWORD); + + // Check buffer size is sufficient. + if((cbSize < *pcbNeeded) || (NULL == pBuffer)) + { + VERBOSE("COemUni2::GetInfo() exit insufficient buffer!\r\n"); + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return E_FAIL; + } + + switch(dwMode) + { + // OEM DLL Signature + case OEMGI_GETSIGNATURE: + *(PDWORD)pBuffer = OEM_SIGNATURE; + break; + + // OEM DLL version + case OEMGI_GETVERSION: + *(PDWORD)pBuffer = OEM_VERSION; + break; + + // dwMode not supported. + default: + // Set written bytes to zero since nothing was written. + WARNING("COemUni2::GetInfo() exit mode not supported.\r\n"); + *pcbNeeded = 0; + SetLastError(ERROR_NOT_SUPPORTED); + return E_FAIL; + } + + return S_OK; +} + +HRESULT __stdcall +COemUni2:: +HalftonePattern( + PDEVOBJ pdevobj, + PBYTE pHTPattern, + DWORD dwHTPatternX, + DWORD dwHTPatternY, + DWORD dwHTNumPatterns, + DWORD dwCallbackID, + PBYTE pResource, + DWORD dwResourceSize + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::HalftonePattern + + The IPrintOemUni::HalftonePattern method can be used with + Unidrv-supported printers to create or modify a halftone + pattern before it is used in a halftoning operation. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pHTPattern - pointer to a buffer to receive the method-supplied + halftone pattern. Buffer size, in bytes, is: + (((dwHTPatternX * dwHTPatternY) + 3)/4) * 4 * dwHTNumPatterns. + dwHTPatternX - length, in pixels, of the halftone pattern, as specified + by the GPD file's *HTPatternSize attribute. + dwHTPatternY - height, in pixels, of the halftone pattern, as specified + by the GPD file's *HTPatternSize attribute. + dwHTNumPatterns - number of patterns, as specified by the GPD file's + *HTNumPatterns attribute. This can be 1 or 3. + dwCallbackID - value identifying the halftone method, as specified by + the GPD file's *HTCallbackID attribute. + pResource - pointer to a buffer containing a halftone pattern, as + specified by the GPD file's *rcHTPatternID attribute. This can be NULL. + dwResourceSize - size of the halftone pattern contained in the buffer + pointed to by pResource. This is zero if pResource is NULL. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + VERBOSE("COemUni2::HalftonePattern() entry."); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pHTPattern); + UNREFERENCED_PARAMETER(dwHTPatternX); + UNREFERENCED_PARAMETER(dwHTPatternY); + UNREFERENCED_PARAMETER(dwHTNumPatterns); + UNREFERENCED_PARAMETER(dwCallbackID); + UNREFERENCED_PARAMETER(pResource); + UNREFERENCED_PARAMETER(dwResourceSize); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +ImageProcessing( + PDEVOBJ pdevobj, + PBYTE pSrcBitmap, + PBITMAPINFOHEADER pBitmapInfoHeader, + PBYTE pColorTable, + DWORD dwCallbackID, + PIPPARAMS pIPParams, + OUT PBYTE *ppbResult + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::ImageProcessing + + The IPrintOemUni::ImageProcessing method can be used with + Unidrv-supported printers to modify image bitmap data, in order + to perform color formatting or halftoning. The method can return + the modified bitmap to Unidrv or send it directly to the print spooler. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pSrcBitmap - pointer to an input device-independent bitmap (DIB). + pBitmapInfoHeader - pointer to a BITMAPINFOHEADER structure + that describes the bitmap pointed to by pSrcBitmap. + pColorTable - pointer to a color table. Used only if the output format is + eight bits per pixel. + dwCallbackID - value assigned to the *IPCallbackID attribute of the + currently selected option for the ColorMode feature. + pIPParams - pointer to an IPPARAMS structure. + ppbResult - + If the method returns the converted DIB to Unidrv: + If the conversion succeeds, the method should return a + pointer to a buffer containing the converted DIB. + Otherwise it should return NULL. + If the method sends the converted DIB to the print spooler: + If the operation succeeds, the method should return TRUE. + Otherwise it should return FALSE. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + VERBOSE("COemUni2::ImageProcessing() entry."); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pSrcBitmap); + UNREFERENCED_PARAMETER(pBitmapInfoHeader); + UNREFERENCED_PARAMETER(pColorTable); + UNREFERENCED_PARAMETER(dwCallbackID); + UNREFERENCED_PARAMETER(pIPParams); + UNREFERENCED_PARAMETER(ppbResult); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +MemoryUsage( + PDEVOBJ pdevobj, + POEMMEMORYUSAGE pMemoryUsage + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::MemoryUsage + + The IPrintOemUni::MemoryUsage method can be used with + Unidrv-supported printers to specify the amount of memory + required for use by a rendering plug-in's IPrintOemUni::ImageProcessing + method. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pMemoryUsage - pointer to an OEMMEMORYUSAGE structure. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + VERBOSE("COemUni2::MemoryUsage() entry."); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pMemoryUsage); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +OutputCharStr( + PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + DWORD dwType, + DWORD dwCount, + PVOID pGlyph + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::OutputCharStr + + The IPrintOemUni::OutputCharStr method enables a rendering + plug-in to control the printing of font glyphs. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pUFObj - pointer to a UNIFONTOBJ structure. + dwType - value indicating the type of glyph specifier array + pointed to by pGlyph. Valid values are as follows: + TYPE_GLYPHHANDLE The pGlyph array elements are glyph + handles of type HGLYPH. + TYPE_GLYPHID The pGlyph array elements are glyph + identifiers of type DWORD. + dwCount - value representing the number of glyph specifiers in + the array pointed to by pGlyph. + pGlyph - pointer to an array of glyph specifiers, where the array + element type is indicated by dwType. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + VERBOSE("COemUni2::OutputCharStr() entry."); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pUFObj); + UNREFERENCED_PARAMETER(dwType); + UNREFERENCED_PARAMETER(dwCount); + UNREFERENCED_PARAMETER(pGlyph); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +PublishDriverInterface( + IUnknown *pIUnknown + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::PublishDriverInterface + + The IPrintOemUni::PublishDriverInterface method allows a + rendering plug-in for Unidrv to obtain the Unidrv driver's + IPrintOemDriverUni interface. + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::PublishDriverInterface method and the method + must return S_OK, or the driver will not call the plug-in's other + IPrintOemUni interface methods. + + Please refer to DDK documentation for more details. + +Arguments: + + pIUnknown - pointer to the IUnknown interface of the driver's + IPrintOemDriverUni COM interface. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + + +--*/ + +{ + VERBOSE("COemUni2::PublishDriverInterface() entry."); + + // Need to store pointer to Driver Helper functions, if we already haven't. + if (this->m_pOEMHelp == NULL) + { + HRESULT hResult; + + // Get Interface to Helper Functions. + hResult = pIUnknown->QueryInterface(IID_IPrintOemDriverUni, (void** ) &(this->m_pOEMHelp)); + + if(!SUCCEEDED(hResult)) + { + // Make sure that interface pointer reflects interface query failure. + this->m_pOEMHelp = NULL; + + return E_FAIL; + } + } + + return S_OK; +} + +HRESULT __stdcall +COemUni2:: +ResetPDEV( + PDEVOBJ pdevobjOld, + PDEVOBJ pdevobjNew + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::ResetPDEV + + A rendering plug-in for Unidrv MUST implement the + IPrintOemUni::ResetPDEV method. + + A rendering plug-in's IPrintOemUni::ResetPDEV method performs + the same types of operations as the DrvResetPDEV function. During + the processing of an application's call to the Platform SDK ResetDC + function, the IPrintOemUni::ResetPDEV method is called by Unidrv's + DrvResetPDEV function. For more information about when DrvResetPDEV + is called, see its description in the DDK docs. + + The rendering plug-in's private PDEV structure's address is contained + in the pdevOEM member of the DEVOBJ structure pointed to by pdevobjOld. + The IPrintOemUni::ResetPDEV method should use relevant members of this + old structure to fill in the new structure, which is referenced through pdevobjNew. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobjOld - pointer to a DEVOBJ structure containing current PDEV information. + pdevobjNew - pointer to a DEVOBJ structure into which the method should place + new PDEV information. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + + +--*/ + +{ + VERBOSE("COemUni2::ResetPDEV() entry."); + + UNREFERENCED_PARAMETER(pdevobjOld); + UNREFERENCED_PARAMETER(pdevobjNew); + + return S_OK; +} + +HRESULT __stdcall +COemUni2:: +SendFontCmd( + PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + PFINVOCATION pFInv + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::SendFontCmd + + The IPrintOemUni::SendFontCmd method enables a rendering + plug-in to modify a printer's font selection command and then + send it to the printer. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pUFObj - pointer to a UNIFONTOBJ structure. + pFInv - pointer to an FINVOCATION structure. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + VERBOSE("COemUni2::SendFontCmd() entry."); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pUFObj); + UNREFERENCED_PARAMETER(pFInv); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +TextOutAsBitmap( + SURFOBJ *pso, + STROBJ *pstro, + FONTOBJ *pfo, + CLIPOBJ *pco, + RECTL *prclExtra, + RECTL *prclOpaque, + BRUSHOBJ *pboFore, + BRUSHOBJ *pboOpaque, + POINTL *pptlOrg, + MIX mix + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::TextOutAsBitmap + + The IPrintOemUni::TextOutAsBitmap method allows a rendering + plug-in to create a bitmap image of a text string, in case a + downloadable font is not available. + + Please refer to DDK documentation for more details. + +Arguments: + + pso - Defines the surface on which to be written. + pstro - Defines the glyphs to be rendered and their positions + pfo - Specifies the font to be used + pco - Defines the clipping path + prclExtra - A NULL-terminated array of rectangles to be filled + prclOpaque - Specifies an opaque rectangle + pboFore - Defines the foreground brush + pboOpaque - Defines the opaque brush + pptlOrg - Pointer to POINT struct , defining th origin + mix - Specifies the foreground and background ROPs for pboFore + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + VERBOSE("COemUni2::TextOutAsBitmap() entry."); + + UNREFERENCED_PARAMETER(pso); + UNREFERENCED_PARAMETER(pstro); + UNREFERENCED_PARAMETER(pfo); + UNREFERENCED_PARAMETER(pco); + UNREFERENCED_PARAMETER(prclExtra); + UNREFERENCED_PARAMETER(prclOpaque); + UNREFERENCED_PARAMETER(pboFore); + UNREFERENCED_PARAMETER(pboOpaque); + UNREFERENCED_PARAMETER(pptlOrg); + UNREFERENCED_PARAMETER(mix); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +TTDownloadMethod( + PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + OUT DWORD *pdwResult + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::TTDownloadMethod + + The IPrintOemUni::TTDownloadMethod method enables a rendering + plug-in to indicate the format that Unidrv should use for a specified + TrueType soft font. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pUFObj - pointer to a UNIFONTOBJ structure. + pdwResult - Receives one of the following method-supplied constant values: + TTDOWNLOAD_BITMAP Unidrv should download the specified font as bitmaps. + TTDOWNLOAD_DONTCARE Unidrv can select the font format. + TTDOWNLOAD_GRAPHICS Unidrv should print TrueType fonts as graphics, + instead of downloading the font. + TTDOWNLOAD_TTOUTLINE Unidrv should download the specified font as outlines. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + VERBOSE("COemUni2::TTDownloadMethod() entry."); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pUFObj); + UNREFERENCED_PARAMETER(pdwResult); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +TTYGetInfo( + PDEVOBJ pdevobj, + DWORD dwInfoIndex, + PVOID pOutputBuf, + DWORD dwSize, + DWORD *pcbcNeeded + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni::TTYGetInfo + + The IPrintOemUni::TTYGetInfo method enables a rendering plug-in + to supply Unidrv with information relevant to text-only printers. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + dwInfoIndex - constant identifying the type of information being requested. + The following constant values are defined: + OEMTTY_INFO_CODEPAGE - The pOutputBuf parameter points to a + DWORD in which the method should return the number of the + code page to be used. + OEMTTY_INFO_MARGINS - The pOutputBuf parameter points to a + RECT structure in which the method should return page margin + widths, in tenths of millimeters (for example, 20 represents 2 mm). + If the entire page is printable, all margin values must be 0. + OEMTTY_INFO_NUM_UFMS - The pOutputBuf parameter points to a + DWORD in which the method should return the number of resource + IDs of the UFMs for 10, 12, and 17 CPI fonts. To actually obtain + these resource IDs, perform a query using OEMTTY_INFO_UFM_IDS. + OEMTTY_INFO_UFM_IDS - The pOutputBuf parameter points to an array + of DWORDs of sufficient size to hold the number of resource IDs of + the UFMs for 10, 12, and 17 CPI fonts. (This number is obtained by + using OEMTTY_INFO_NUM_UFMS in a query.) The method should + return the resource IDs of the UFMs for 10,12, and 17 CPI fonts. + pOutputBuf - pointer to a buffer to receive the requested information. + dwSize - size, in bytes, of the buffer pointed to by pOutputBuf. + pcbcNeeded - pointer to a location to receive the number of bytes written into + the buffer pointed to by pOutputBuf. If the number of bytes required is + smaller than the number specified by dwSize, the method should supply + the required size and return E_FAIL. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + VERBOSE("COemUni2::TTYGetInfo() entry."); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(dwInfoIndex); + UNREFERENCED_PARAMETER(pOutputBuf); + UNREFERENCED_PARAMETER(dwSize); + UNREFERENCED_PARAMETER(pcbcNeeded); + + return E_NOTIMPL; +} + +HRESULT __stdcall +COemUni2:: +WritePrinter( + PDEVOBJ pdevobj, + PVOID pBuf, + DWORD cbBuffer, + PDWORD pcbWritten + ) + +/*++ + +Routine Description: + + Implementation of IPrintOemUni2::WritePrinter + + The IPrintOemUni2::WritePrinter method, if supported, enables a + rendering plug-in to capture all output data generated by a Unidrv + driver. If this method is not supported, the output data would + otherwise be sent to the spooler in a call to the spooler's WritePrinter API. + + Please refer to DDK documentation for more details. + +Arguments: + + pdevobj - pointer to a DEVOBJ structure. + pBuf - pointer to the first byte of an array of bytes that contains + the output data generated by the Unidrv driver. + cbBuffer - size, in bytes, of the array pointed to by pBuf. + pcbWritten - pointer to a DWORD value that receives the number + of bytes of data that were successfully sent to the plug-in. + +Return Value: + + S_OK The operation succeeded. + E_FAIL The operation failed. + E_NOTIMPL The method is not implemented. + + +--*/ + +{ + VERBOSE("COemUni2::WritePrinter() entry."); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pBuf); + UNREFERENCED_PARAMETER(cbBuffer); + UNREFERENCED_PARAMETER(pcbWritten); + + return E_NOTIMPL; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// oem class factory +// +class COemCF : public IClassFactory +{ +public: + // *** IUnknown methods *** + // + + STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef)(THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release)(THIS); + + // *** IClassFactory methods *** + // + STDMETHOD(CreateInstance)(THIS_ + LPUNKNOWN pUnkOuter, + REFIID riid, + LPVOID FAR* ppvObject); + STDMETHOD(LockServer)(THIS_ BOOL bLock); + + + // Constructor + // + COemCF(): m_cRef(1) { }; + + // Destructor + // + ~COemCF() { }; + +protected: + LONG m_cRef; + +}; + +/////////////////////////////////////////////////////////// +// +// Class factory body +// +HRESULT __stdcall +COemCF:: +QueryInterface( + const IID& iid, + void** ppv) +{ + VERBOSE("COemCF::QueryInterface entry."); + if ((iid == IID_IUnknown) || (iid == IID_IClassFactory)) + { + *ppv = static_cast<COemCF*>(this); + } + else + { + *ppv = NULL; + VERBOSE("COemCF::QueryInterface IID not supported.\r\n"); + return E_NOINTERFACE; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef(); + return S_OK; +} + +ULONG __stdcall +COemCF:: +AddRef() +{ + return InterlockedIncrement(&m_cRef); +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall +COemCF:: +Release() +{ + assert(0 != m_cRef); + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + } + return cRef; +} + +// IClassFactory implementation +// +HRESULT __stdcall +COemCF:: +CreateInstance( + IUnknown* pUnknownOuter, + const IID& iid, + void** ppv) +{ + VERBOSE("Class factory:Create component."); + + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Cannot aggregate. + // + if (pUnknownOuter != NULL) + { + return CLASS_E_NOAGGREGATION; + } + + // Create component. + // + COemUni2* pOemCP = new COemUni2; + if (pOemCP == NULL) + { + return E_OUTOFMEMORY; + } + + // Get the requested interface. + // + HRESULT hr = pOemCP->QueryInterface(iid, ppv); + + // Release the IUnknown pointer. + // (If QueryInterface failed, component will delete itself.) + // + pOemCP->Release(); + return hr; +} + +// LockServer +// +HRESULT __stdcall +COemCF:: +LockServer( + BOOL bLock + ) +{ + if (bLock) + { + InterlockedIncrement(&g_cServerLocks); + } + else + { + InterlockedDecrement(&g_cServerLocks); + } + return S_OK; +} + + +// +// Registration functions +// + +// +// Can DLL unload now? +// +STDAPI DllCanUnloadNow(void) +{ + VERBOSE("DllCanUnloadNow entry."); + + // + // To avoid leaving OEM DLL still in memory when Unidrv or Pscript drivers + // are unloaded, Unidrv and Pscript driver ignore the return value of + // DllCanUnloadNow of the OEM DLL, and always call FreeLibrary on the OEMDLL. + // + // If OEM DLL spins off a working thread that also uses the OEM DLL, the + // thread needs to call LoadLibrary and FreeLibraryAndExitThread, otherwise + // it may crash after Unidrv or Pscript calls FreeLibrary. + // + + if ((g_cComponents == 0) && (g_cServerLocks == 0)) + { + return S_OK; + } + else + { + return S_FALSE; + } +} + +// +// Get class factory +// +STDAPI DllGetClassObject( + _In_ REFCLSID clsid, + _In_ REFIID iid, + _Outptr_ LPVOID* ppv) +{ + VERBOSE("DllGetClassObject:\tCreate class factory."); + + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Can we create this component? + // + if (clsid != CLSID_OEMRENDER) + { + ERR("DllGetClassObject:\tClass not available!\r\n"); + return CLASS_E_CLASSNOTAVAILABLE; + } + + // Create class factory. + // + COemCF* pFontCF = new COemCF; // Reference count set to 1 in constructor + if (pFontCF == NULL) + { + ERR("DllGetClassObject:\tOut of Memory!\r\n"); + return E_OUTOFMEMORY; + } + + // Get requested interface. + // + HRESULT hrResult = pFontCF->QueryInterface(iid, ppv); + pFontCF->Release(); + + return hrResult; +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemuni/intrface.h b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/intrface.h new file mode 100644 index 00000000..771a42c7 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/intrface.h @@ -0,0 +1,283 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Intrface.H +// +// +// PURPOSE: Define COM interface for User Mode Printer Customization DLL. +// + +#pragma once + +///////////////////////////////////////////////////////// +// String Literals +///////////////////////////////////////////////////////// + +CONST CHAR NAME_CommandCallback[] = "CommandCallback"; +CONST CHAR NAME_FilterGraphics[] = "FilterGraphics"; + +//////////////////////////////////////////////////////////////////////////////// +// +// COemUni2 +// +// Interface for Unidrv OEM sample rendering module +// +class COemUni2 : public IPrintOemUni2 +{ +public: + // *** IUnknown methods *** + + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release) (THIS); + + // + // Method for publishing Driver interface. + // + STDMETHOD(PublishDriverInterface)(THIS_ IUnknown *pIUnknown); + + // + // Method for getting the implemented methods. + // Returns S_OK if the given method is implemneted. + // Returns S_FALSE if the given method is notimplemneted. + // + + STDMETHOD(GetImplementedMethod)(THIS_ _In_ PSTR pMethodName); + + // + // Method for OEM to specify DDIs that have been hooked + // + + STDMETHOD(EnableDriver) (THIS_ DWORD DriverVersion, + DWORD cbSize, + PDRVENABLEDATA pded); + + // + // Method to notify OEM plugin that it is no longer required + // + + STDMETHOD(DisableDriver) (THIS); + + // + // Method for OEM plugin to contruct its own PDEV + // + + STDMETHOD(EnablePDEV)(THIS_ PDEVOBJ pdevobj, + _In_ PWSTR pPrinterName, + ULONG cPatterns, + HSURF *phsurfPatterns, + ULONG cjGdiInfo, + GDIINFO *pGdiInfo, + ULONG cjDevInfo, + DEVINFO *pDevInfo, + DRVENABLEDATA *pded, + OUT PDEVOEM *pDevOem); + + // + // Method for OEM to free any resource associated with its PDEV + // + + STDMETHOD(DisablePDEV)(THIS_ PDEVOBJ pdevobj); + + // + // Method for OEM to transfer from old PDEV to new PDEV + // + + STDMETHOD(ResetPDEV)(THIS_ PDEVOBJ pdevobjOld, + PDEVOBJ pdevobjNew); + + // + // Get OEM dll related information + // + + STDMETHOD(GetInfo)(THIS_ DWORD dwMode, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded); + + // + // OEMDriverDMS - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(DriverDMS)(THIS_ PVOID pDevObj, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded); + + // + // OEMDevMode + // + + STDMETHOD(DevMode)(THIS_ DWORD dwMode, + POEMDMPARAM pOemDMParam); + + // + // OEMCommandCallback - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(CommandCallback)(THIS_ PDEVOBJ pdevobj, + DWORD dwCallbackID, + DWORD dwCount, + PDWORD pdwParams, + OUT INT *piResult); + + // + // OEMImageProcessing - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(ImageProcessing)(THIS_ PDEVOBJ pdevobj, + PBYTE pSrcBitmap, + PBITMAPINFOHEADER pBitmapInfoHeader, + PBYTE pColorTable, + DWORD dwCallbackID, + PIPPARAMS pIPParams, + OUT PBYTE *ppbResult); + + // + // OEMFilterGraphics - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(FilterGraphics)(THIS_ PDEVOBJ pdevobj, + PBYTE pBuf, + DWORD dwLen); + // + // OEMCompression - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(Compression)(THIS_ PDEVOBJ pdevobj, + PBYTE pInBuf, + PBYTE pOutBuf, + DWORD dwInLen, + DWORD dwOutLen, + OUT INT *piResult); + + // + // OEMHalftone - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(HalftonePattern)(THIS_ PDEVOBJ pdevobj, + PBYTE pHTPattern, + DWORD dwHTPatternX, + DWORD dwHTPatternY, + DWORD dwHTNumPatterns, + DWORD dwCallbackID, + PBYTE pResource, + DWORD dwResourceSize); + + // + // OEMMemoryUsage - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(MemoryUsage)(THIS_ PDEVOBJ pdevobj, + POEMMEMORYUSAGE pMemoryUsage); + + // + // OEMTTYGetInfo - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(TTYGetInfo)(THIS_ PDEVOBJ pdevobj, + DWORD dwInfoIndex, + PVOID pOutputBuf, + DWORD dwSize, + DWORD *pcbcNeeded); + + // + // OEMDownloadFontheader - UNIDRV only + // + + STDMETHOD(DownloadFontHeader)(THIS_ PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + OUT DWORD *pdwResult); + + // + // OEMDownloadCharGlyph - UNIDRV only + // + + STDMETHOD(DownloadCharGlyph)(THIS_ PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + HGLYPH hGlyph, + PDWORD pdwWidth, + OUT DWORD *pdwResult); + + // + // OEMTTDownloadMethod - UNIDRV only + // + + STDMETHOD(TTDownloadMethod)(THIS_ PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + OUT DWORD *pdwResult); + + // + // OEMOutputCharStr - UNIDRV only + // + + STDMETHOD(OutputCharStr)(THIS_ PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + DWORD dwType, + DWORD dwCount, + PVOID pGlyph); + + // + // OEMSendFontCmd - UNIDRV only + // + + + STDMETHOD(SendFontCmd)(THIS_ PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + PFINVOCATION pFInv); + + // + // OEMTextOutAsBitmap - UNIDRV only + // + + STDMETHOD(TextOutAsBitmap)(THIS_ SURFOBJ *pso, + STROBJ *pstro, + FONTOBJ *pfo, + CLIPOBJ *pco, + RECTL *prclExtra, + RECTL *prclOpaque, + BRUSHOBJ *pboFore, + BRUSHOBJ *pboOpaque, + POINTL *pptlOrg, + MIX mix); + + // + // IPrintOemUni2 methods + // + + // + // Method for plugin to hook out spooler's WritePrinter API so it + // can get access to output data Universal driver is generating + // + // At DrvEnablePDEV time, Universal driver will call this function with + // pdevobj = NULL, pBuf = NULL, cbBuffer = 0 to detect if the plugin + // implements this function. Plugin should return S_OK to indicate it is + // implementing this function, or return E_NOTIMPL otherwise. + // + // In pcbWritten, plugins should return the number of bytes written to the + // spooler's WritePrinter function. Zero doesn't carry a special meaning, + // errors must be reported through the returned HRESULT. + // + + STDMETHOD(WritePrinter)(THIS_ PDEVOBJ pdevobj, + PVOID pBuf, + DWORD cbBuffer, + PDWORD pcbWritten); + + + COemUni2(); + ~COemUni2(); + +protected: + LONG m_cRef; + IPrintOemDriverUni* m_pOEMHelp; +}; diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemuni/precomp.h b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/precomp.h new file mode 100644 index 00000000..89396205 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/precomp.h @@ -0,0 +1,36 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Precomp.h +// +// PURPOSE: Header files that should be in the precompiled header. +// + +#pragma once + +#include <STDDEF.H> +#include <STDLIB.H> +#include <OBJBASE.H> +#include <STDARG.H> +#include <STDIO.H> +#include <INITGUID.H> +#include <WINDEF.H> +#include <WINERROR.H> +#include <WINBASE.H> +#include <WINGDI.H> +#include <WINDDI.H> +#include <TCHAR.H> +#include <EXCPT.H> +#include <ASSERT.H> + +#include <PRINTOEM.H> +#include <PRCOMOEM.H> + +// This should always be included last +#include <STRSAFE.H> + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemuni/precompsrc.cpp b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/precompsrc.cpp new file mode 100644 index 00000000..5944cf51 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/precompsrc.cpp @@ -0,0 +1 @@ +#include "precomp.h"
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemuni/resource.h b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/resource.h new file mode 100644 index 00000000..8e941820 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/oemuni/resource.h @@ -0,0 +1,17 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by OEMUNI.rc +// + + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 103 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/psuirep.ini b/print/OEM Printer Customization Plug-in Samples/C++/psuirep.ini new file mode 100644 index 00000000..74fbd433 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/psuirep.ini @@ -0,0 +1,3 @@ +[OEMFiles] +OEMConfigFile1=PSUIREP.DLL + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/syncset.gpd b/print/OEM Printer Customization Plug-in Samples/C++/syncset.gpd new file mode 100644 index 00000000..39f7a0e2 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/syncset.gpd @@ -0,0 +1,654 @@ +*GPDSpecVersion: "1.0" +*Include: "StdNames.gpd" +*ModelName: "OEM CUSTOM SAMPLE SYNC DATA IN UI" +*MasterUnits: PAIR(1200, 1200) +*ResourceDLL: "unires.dll" +*PrinterType: PAGE +*MaxCopies: 99 + +*PrintRate: 8 +*PrintRateUnit: PPM +*PrintRatePPM: 8 + +*Feature: Orientation +{ + *rcNameID: =ORIENTATION_DISPLAY + *DefaultOption: PORTRAIT + *Option: PORTRAIT + { + *rcNameID: =PORTRAIT_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.6 + *Cmd: "<1B>&l0O" + } + } + *Option: LANDSCAPE_CC90 + { + *rcNameID: =LANDSCAPE_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.6 + *Cmd: "<1B>&l1O" + } + } +} +*Feature: InputBin +{ + *rcNameID: =PAPER_SOURCE_DISPLAY + *DefaultOption: UPPER + *Option: UPPER + { + *rcNameID: =UPPER_TRAY_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.9 + *Cmd: "<1B>&l1H" + } + } +} +*Feature: Resolution +{ + *rcNameID: =RESOLUTION_DISPLAY + *DefaultOption: Option1 + *Option: Option1 + { + *Name: "300 x 300 " =DOTS_PER_INCH + *DPI: PAIR(300, 300) + *TextDPI: PAIR(300, 300) + *MinStripBlankPixels: 32 + EXTERN_GLOBAL: *StripBlanks: LIST(ENCLOSED,TRAILING) + *SpotDiameter: 100 + *Command: CmdBeginRaster { *Cmd : "<1B>*v7S<1B>*r1A" } + *Command: CmdEndRaster { *Cmd : "<1B>*rC" } + *Command: CmdSendBlockData { *Cmd : "<1B>*b" %d{NumOfDataBytes}"W" } + *Command: CmdSelect + { + *Order: DOC_SETUP.4 + *Cmd: "<1B>%%-12345X" ++ "@PJL COMMENT HP Color LaserJet 5/5M " ++ "Version 0.56<0A>" ++ "@PJL SET RESOLUTION=300<0A>" ++ "@PJL ENTER LANGUAGE=PCL<0A0D1B>E<1B>*t300R" + } + } + *Option: Option2 + { + *Name: "150 x 150 " =DOTS_PER_INCH + *DPI: PAIR(150, 150) + *TextDPI: PAIR(300, 300) + *MinStripBlankPixels: 32 + EXTERN_GLOBAL: *StripBlanks: LIST(ENCLOSED,TRAILING) + *SpotDiameter: 100 + *Command: CmdBeginRaster { *Cmd : "<1B>*v7S<1B>*r1A" } + *Command: CmdEndRaster { *Cmd : "<1B>*rC" } + *Command: CmdSendBlockData { *Cmd : "<1B>*b" %d{NumOfDataBytes}"W" } + *Command: CmdSelect + { + *Order: DOC_SETUP.4 + *Cmd: "<1B>%%-12345X" ++ "@PJL COMMENT HP Color LaserJet 5/5M " ++ "Version 0.56<0A>" ++ "@PJL SET RESOLUTION=150<0A>" ++ "@PJL ENTER LANGUAGE=PCL<0A0D1B>E<1B>*t300R" + } + } +} + +*Feature: PaperSize +{ + *rcNameID: =PAPER_SIZE_DISPLAY + *DefaultOption: LETTER + *Option: LETTER + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *switch: Orientation + { + *case: PORTRAIT + { + *%(9600, 12648) +*% *PrintableArea: PAIR(9600, 12648) + *PrintableArea: PAIR(9564, 12600) +*% *PrintableArea: PAIR(5000,5000) + *PrintableOrigin: PAIR(300, 300) +*% *PrintableOrigin: PAIR(300, 500) + *switch: Resolution + { + *case: Option2 + { +*% Warning: the following printable width is adjusted (9600->9592) so it is divisible by the resolution X scale. +*% Warning: the following printable length is adjusted (12648->12640) so it is divisible by the resolution Y scale. + *PrintableArea: PAIR(9592, 12640) +*% Warning: the following printable origin X is adjusted (300->304) so it is divisible by the resolution X scale. +*% Warning: the following printable origin Y is adjusted (300->304) so it is divisible by the resolution Y scale. + *PrintableOrigin: PAIR(304, 304) + } + } + *CursorOrigin: PAIR(300, 180) + *Command: CmdSelect + { + *%5760 -- 7560 + *Order: DOC_SETUP.10 + *Cmd: "<1B>&l2a8c1E<1B>*p0x0Y<1B>*c0t5760x7604Y" + } + } + *case: LANDSCAPE_CC90 + { + *%(9720, 12648) + *PrintableArea: PAIR(9760, 12688) + *PrintableOrigin: PAIR(200, 272) + *CursorOrigin: PAIR(200, 12960) + *Command: CmdSelect + { + *Order: DOC_SETUP.10 + *Cmd: "<1B>&l2a8c1E<1B>*p0x0Y<1B>*c0t7632x5880Y" + } + } + } + } + *Option: LEGAL + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(9540, 16248) + *PrintableOrigin: PAIR(300, 300) + *switch: Resolution + { + *case: Option2 + { +*% Warning: the following printable width is adjusted (9600->9592) so it is divisible by the resolution X scale. +*% Warning: the following printable length is adjusted (16248->16240) so it is divisible by the resolution Y scale. + *PrintableArea: PAIR(9592, 16240) +*% Warning: the following printable origin X is adjusted (300->304) so it is divisible by the resolution X scale. +*% Warning: the following printable origin Y is adjusted (300->304) so it is divisible by the resolution Y scale. + *PrintableOrigin: PAIR(304, 304) + } + } + *CursorOrigin: PAIR(300, 180) + *Command: CmdSelect + { + *Order: DOC_SETUP.10 + *Cmd: "<1B>&l3a8c1E<1B>*p0x0Y<1B>*c0t5760x9864Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(9760, 16288) + *PrintableOrigin: PAIR(200, 272) + *CursorOrigin: PAIR(200, 16560) + *Command: CmdSelect + { + *Order: DOC_SETUP.10 + *Cmd: "<1B>&l3a8c1E<1B>*p0x0Y<1B>*c0t9792x5880Y" + } + } + } + } + *Option: EXECUTIVE + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(8100, 12000) + *PrintableOrigin: PAIR(300, 300) + *switch: Resolution + { + *case: Option2 + { +*% Warning: the following printable width is adjusted (8100->8096) so it is divisible by the resolution X scale. +*% Warning: the following printable length is adjusted (12000->11992) so it is divisible by the resolution Y scale. + *PrintableArea: PAIR(8096, 11992) +*% Warning: the following printable origin X is adjusted (300->304) so it is divisible by the resolution X scale. +*% Warning: the following printable origin Y is adjusted (300->304) so it is divisible by the resolution Y scale. + *PrintableOrigin: PAIR(304, 304) + } + } + *CursorOrigin: PAIR(300, 180) + *Command: CmdSelect + { + *Order: DOC_SETUP.10 + *Cmd: "<1B>&l1a8c1E<1B>*p0x0Y<1B>*c0t4860x7344Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(8200, 12080) + *PrintableOrigin: PAIR(240, 280) + *CursorOrigin: PAIR(200, 12360) + *Command: CmdSelect + { + *Order: DOC_SETUP.10 + *Cmd: "<1B>&l1a8c1E<1B>*p0x0Y<1B>*c0t7272x4980Y" + } + } + } + } + *Option: A4 + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(9324, 13476) + *PrintableOrigin: PAIR(300, 300) + *switch: Resolution + { + *case: Option2 + { +*% Warning: the following printable width is adjusted (9324->9320) so it is divisible by the resolution X scale. +*% Warning: the following printable length is adjusted (13476->13472) so it is divisible by the resolution Y scale. + *PrintableArea: PAIR(9320, 13472) +*% Warning: the following printable origin X is adjusted (300->304) so it is divisible by the resolution X scale. +*% Warning: the following printable origin Y is adjusted (300->304) so it is divisible by the resolution Y scale. + *PrintableOrigin: PAIR(304, 304) + } + } + *CursorOrigin: PAIR(300, 180) + *Command: CmdSelect + { + *Order: DOC_SETUP.10 + *Cmd: "<1B>&l26a8c1E<1B>*p0x0Y<1B>*c0t5594x8201Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(9464, 13516) + *PrintableOrigin: PAIR(220, 272) + *switch: Resolution + { + *case: Option2 + { +*% Warning: the following printable width is adjusted (9464->9456) so it is divisible by the resolution X scale. +*% Warning: the following printable length is adjusted (13516->13512) so it is divisible by the resolution Y scale. + *PrintableArea: PAIR(9456, 13512) +*% Warning: the following printable origin X is adjusted (220->224) so it is divisible by the resolution X scale. + *PrintableOrigin: PAIR(224, 272) + } + } + *CursorOrigin: PAIR(200, 13788) + *Command: CmdSelect + { + *Order: DOC_SETUP.10 + *Cmd: "<1B>&l26a8c1E<1B>*p0x0Y<1B>*c0t8129x5714Y" + } + } + } + } + *Option: A3 + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(13428, 19308) + *PrintableOrigin: PAIR(300, 300) + *switch: Resolution + { + *case: Option2 + { +*% Warning: the following printable width is adjusted (13428->13424) so it is divisible by the resolution X scale. +*% Warning: the following printable length is adjusted (19308->19304) so it is divisible by the resolution Y scale. + *PrintableArea: PAIR(13424, 19304) +*% Warning: the following printable origin X is adjusted (300->304) so it is divisible by the resolution X scale. +*% Warning: the following printable origin Y is adjusted (300->304) so it is divisible by the resolution Y scale. + *PrintableOrigin: PAIR(304, 304) + } + } + *CursorOrigin: PAIR(300, 180) + *Command: CmdSelect + { + *Order: DOC_SETUP.10 + *Cmd: "<1B>&l27a8c1E<1B>*p0x0Y<1B>*c0t8057x11693Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(13588, 19368) + *PrintableOrigin: PAIR(200, 240) + *switch: Resolution + { + *case: Option2 + { +*% Warning: the following printable width is adjusted (13588->13584) so it is divisible by the resolution X scale. + *PrintableArea: PAIR(13584, 19368) + } + } + *CursorOrigin: PAIR(200, 19608) + *Command: CmdSelect + { + *Order: DOC_SETUP.10 + *Cmd: "<1B>&l27a8c1E<1B>*p0x0Y<1B>*c0t11621x8177Y" + } + } + } + } + *Option: TABLOID + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *switch: Orientation + { + *case: PORTRAIT + { +*% *PrintableArea: PAIR(12600, 19800) + *PrintableArea: PAIR(12540, 19740) + *PrintableOrigin: PAIR(300, 300) + *switch: Resolution + { + *case: Option2 + { +*% Warning: the following printable width is adjusted (12600->12592) so it is divisible by the resolution X scale. +*% Warning: the following printable length is adjusted (19800->19792) so it is divisible by the resolution Y scale. + *PrintableArea: PAIR(12592, 19792) +*% Warning: the following printable origin X is adjusted (300->304) so it is divisible by the resolution X scale. +*% Warning: the following printable origin Y is adjusted (300->304) so it is divisible by the resolution Y scale. + *PrintableOrigin: PAIR(304, 304) + } + } + *CursorOrigin: PAIR(300, 200) + *Command: CmdSelect + { + *Order: DOC_SETUP.10 + *Cmd: "<1B>&l6a8c1E<1B>*p0x0Y<1B>*c0t7560x12000Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(12600, 19800) + *PrintableOrigin: PAIR(300, 300) + *switch: Resolution + { + *case: Option2 + { +*% Warning: the following printable width is adjusted (12600->12592) so it is divisible by the resolution X scale. +*% Warning: the following printable length is adjusted (19800->19792) so it is divisible by the resolution Y scale. + *PrintableArea: PAIR(12592, 19792) +*% Warning: the following printable origin X is adjusted (300->304) so it is divisible by the resolution X scale. +*% Warning: the following printable origin Y is adjusted (300->304) so it is divisible by the resolution Y scale. + *PrintableOrigin: PAIR(304, 304) + } + } + *CursorOrigin: PAIR(200, 20100) + *Command: CmdSelect + { + *Order: DOC_SETUP.10 + *Cmd: "<1B>&l6a8c1E<1B>*p0x0Y<1B>*c0t11880x7680Y" + } + } + } + } +} +*Feature: MediaType +{ + *rcNameID: =MEDIA_TYPE_DISPLAY + *DefaultOption: STANDARD + *Option: STANDARD + { + *rcNameID: =PLAIN_PAPER_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.14 + *Cmd: "<1B>&l0M" + } + } + *Option: TRANSPARENCY + { + *rcNameID: =TRANSPARENCY_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.14 + *Cmd: "<1B>&l4M" + } + } +} +*Feature: ColorMode +{ + *rcNameID: =COLOR_PRINTING_MODE_DISPLAY + *HelpIndex: 12004 + *DefaultOption: 24bpp + *Option: 24bpp + { + *rcNameID: =24BPP_DISPLAY + *DevNumOfPlanes: 1 + *DevBPP: 24 + *DrvBPP: 24 + *Command: CmdEnableDRC { *Cmd : "<1B>*b3M" } + *PaletteSize: 256 + *PaletteProgrammable? : TRUE + *Command: CmdDefinePaletteEntry { *Cmd : "<1B>*v" %d{RedValue}"a" %d{GreenValue}"b" %d{BlueValue}"c" %d{PaletteIndexToProgram} ++ "I" } + *Command: CmdSelectPaletteEntry { *Cmd : "<1B>*v" %d{CurrentPaletteIndex}"S" } + *Command: CmdSetSrcBmpWidth { *Cmd : "<1B>*r" %d{RasterDataWidthInBytes / 3}"S" } + *Command: CmdSelect + { + *Order: PAGE_SETUP.16 + *Cmd: "<1B>*v1N<1B>*v1O<1B>*l184O<1B>*v6W<0003080808081B>*v0a0b0c7i255a255b255c0I<1B>*" ++ "o3W<060400>" + } + } +} +*Feature: Halftone +{ + *rcNameID: =HALFTONING_DISPLAY + *HelpIndex: 12005 + *DefaultOption: HT_PATSIZE_AUTO + *Option: HT_PATSIZE_AUTO + { + *rcNameID: =HT_AUTO_SELECT_DISPLAY + } + *Option: HT_PATSIZE_SUPERCELL_M + { + *rcNameID: =HT_SUPERCELL_DISPLAY + } + *Option: HT_PATSIZE_6x6_M + { + *rcNameID: =HT_DITHER6X6_DISPLAY + } + *Option: HT_PATSIZE_8x8_M + { + *rcNameID: =HT_DITHER8X8_DISPLAY + } +} + +*%------------------------------------------------------------------------- +*% Duplex +*%------------------------------------------------------------------------- +*Feature: Duplex +{ + *rcNameID: =TWO_SIDED_PRINTING_DISPLAY + *DefaultOption: NONE + *Option: NONE + { + *rcNameID: =NONE_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.9 + *Cmd: "<1B>&l0S" + } + } + *Option: VERTICAL + { + *rcNameID: =FLIP_ON_LONG_EDGE_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.10 + *Cmd: "<1B>&l1S" + + } + } + *Option: HORIZONTAL + { + *rcNameID: =FLIP_ON_SHORT_EDGE_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.10 + *Cmd: "<1B>&l2S" + } + } +} + +*%------------------------------------------------------------------------- +*% Installable Option - Duplex Unit +*% IMPORTANT NOTE: The OEM extension assumes that this feature's keyname is +*% "DuplexUnit" and the options are "TRUE" and "FALSE" +*%------------------------------------------------------------------------- +*Feature: DuplexUnit +{ + *Name: "Optional Duplex Unit" *% Duplex Unit + *HelpIndex: 12004 + *FeatureType: PRINTER_PROPERTY + *DefaultOption: FALSE + *Option: FALSE + { + *Name: "Not Installed" + *DisabledFeatures: LIST(Duplex) + } + *Option: TRUE + { + *Name: "Installed" + } +} + + +*%------------------------------------------------------------------------- +*% Installable Option - Envelope Feeder +*% IMPORTANT NOTE: The OEM extension assumes that this feature's keyname is +*% "EnvFeeder" and the options are "TRUE" and "FALSE" +*%------------------------------------------------------------------------- +*Feature: EnvFeeder +{ + *Name: "Envelope Feeder" + *HelpIndex: 12000 + *FeatureType: PRINTER_PROPERTY + *DefaultOption: FALSE + *Option: FALSE + { + *Name: "Not Installed" + } + *Option: TRUE + { + *Name: "Installed" + } +} + + +*%------------------------------------------------------------------------- +*% Installable Option - PrinterHardDisk +*% IMPORTANT NOTE: The OEM extension assumes that this feature's keyname is +*% "PrinterHardDisk" and the options are "TRUE" and "FALSE" +*%------------------------------------------------------------------------- +*Feature: PrinterHardDisk +{ + *Name: "Printer Hard-Disk" *% Printer Hard-Disk + *HelpIndex: 12002 + *FeatureType: PRINTER_PROPERTY + *DefaultOption: FALSE + *Option: FALSE + { + *Name: "Not Installed" + *%*Constraints: LIST(JobRetention.Option2, JobRetention.Option4) + } + *Option: TRUE + { + *Name: "Installed" + } +} + + + +*Command: CmdStartDoc +{ + *Order: DOC_SETUP.5 + *Cmd: "<1B>&u300D<1B>*r0F" +} +*Command: CmdStartPage +{ + *Order: PAGE_SETUP.1 + *Cmd: "<1B>*b0M<0D>" +} +*Command: CmdEndJob +{ + *Order: JOB_FINISH.1 + *Cmd: "<1B>E<1B>%%-12345X" +} +*Command: CmdCopies +{ + *Order: DOC_SETUP.11 + *Cmd: "<1B>&l" %d{NumOfCopies}"X" +} +*RotateCoordinate?: TRUE +*RotateRaster?: TRUE +*RotateFont?: TRUE +*TextCaps: LIST(TC_CR_90,TC_UA_ABLE) +*MemoryUsage: LIST(FONT) +*CursorXAfterCR: AT_PRINTABLE_X_ORIGIN +*BadCursorMoveInGrxMode: LIST(X_PORTRAIT,Y_LANDSCAPE) +*XMoveThreshold: 0 +*YMoveThreshold: 0 +*XMoveUnit: 300 +*YMoveUnit: 300 +*Command: CmdXMoveAbsolute { *Cmd : "<1B>*p" %d{(DestX / 4) }"X" } +*Command: CmdXMoveRelRight { *Cmd : "<1B>*p+" %d[0,9600]{max_repeat((DestXRel / 4) )}"X" } +*Command: CmdXMoveRelLeft { *Cmd : "<1B>*p-" %d[0,9600]{max_repeat((DestXRel / 4) )}"X" } +*Command: CmdYMoveAbsolute { *Cmd : "<1B>*p" %d{(DestY / 4) }"Y" } +*Command: CmdYMoveRelDown { *Cmd : "<1B>*p+" %d[1,12600]{max_repeat((DestYRel / 4) )}"Y" } +*Command: CmdYMoveRelUp { *Cmd : "<1B>*p-" %d[1,12600]{max_repeat((DestYRel / 4) )}"Y" } +*Command: CmdCR { *Cmd : "<0D>" } +*Command: CmdLF { *Cmd : "<0A>" } +*Command: CmdFF { *Cmd : "<0C>" } +*Command: CmdDefinePaletteEntry { *Cmd : "<1B>*v" %d{RedValue}"a" %d{GreenValue}"b" %d{BlueValue}"c" %d{PaletteIndexToProgram} ++ "I" } +*Command: CmdSelectPaletteEntry { *Cmd : "<1B>*v" %d{CurrentPaletteIndex}"S" } +*Command: CmdBackSpace { *Cmd : "<08>" } +*Command: CmdUniDirectionOn { *Cmd : "<00>" } +*Command: CmdUniDirectionOff { *Cmd : "<00>" } +*Command: CmdPushCursor { *Cmd : "<1B>&f0S" } +*Command: CmdPopCursor { *Cmd : "<1B>&f1S" } +*Command: CmdSetSimpleRotation { *Cmd : "<1B>&a" %d{PrintDirInCCDegrees}"P" } +*EjectPageWithFF?: TRUE +*Command: CmdEnableTIFF4 { *Cmd : "<1B>*b2M" } +*Command: CmdDisableCompression { *Cmd : "<1B>*b0M" } +*OutputDataFormat: H_BYTE +*OptimizeLeftBound?: TRUE +*CursorXAfterSendBlockData: AT_GRXDATA_ORIGIN +*CursorYAfterSendBlockData: AUTO_INCREMENT + +*DefaultFont: 136 +*DefaultCTT: 0 +*CharPosition: BASELINE +*TTFSEnabled?: TRUE +*DeviceFonts: LIST(134,135,136,137,138,139,140,146,147,148,149,150,151,152,153,154, ++ 155,156,157,164,165,166,196,197,198,199,200,201,202,203,209,210, ++ 211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226, ++ 227,228,229,230) + +*MinFontID: 16534 +*MaxFontID: 32768 +*FontFormat: HPPCL_OUTLINE +*% When the %f format is implemented we can remove the /100 part of +*% CmdSelectFontHeight and CmdSelectFontWidth +*% NOTE: MasterUnits.x is hardcoded here! +*% NOTE: THIS dividing by 200 because I want to /100 and then /2 for now. +*% The number 60000 may look strange, but it's 1200/2 * 100. +*Command: CmdSelectFontHeight { *Cmd : "<1B>(s" %d{FontHeight}"V" } +*Command: CmdSelectFontWidth { *Cmd : "<1B>(s" %f{1200 / FontWidth}"H" } +*Command: CmdSetFontID { *Cmd : "<1B>*c" %d{NextFontID}"D" } +*Command: CmdSelectFontID { *Cmd : "<1B>(" %d{CurrentFontID}"X" } +*Command: CmdSetCharCode { *Cmd : "<1B>*c" %d{NextGlyph}"E" } +*Command: CmdUnderlineOn { *Cmd : "<1B>&dD" } +*Command: CmdUnderlineOff { *Cmd : "<1B>&d@" } +*Command: CmdWhiteTextOn { *Cmd : "<1B>*v1o1T" } +*Command: CmdWhiteTextOff { *Cmd : "<1B>*v0o0T" } +*MinGrayFill: 1 +*MaxGrayFill: 100 +*Command: CmdSetRectWidth { *Cmd : "<1B>*c" %d{(RectXSize / 4) }"A" } +*Command: CmdSetRectHeight { *Cmd : "<1B>*c" %d{(RectYSize / 4) }"B" } +*Command: CmdRectGrayFill { *Cmd : "<1B>*c" %d{GrayPercentage }"g2P" } +*Command: CmdRectWhiteFill { *Cmd : "<1B>*c1P" } +*Command: CmdRectBlackFill { *Cmd : "<1B>*c0P" } diff --git a/print/OEM Printer Customization Plug-in Samples/C++/syncset.ini b/print/OEM Printer Customization Plug-in Samples/C++/syncset.ini new file mode 100644 index 00000000..11e9f7b0 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/syncset.ini @@ -0,0 +1,3 @@ +[OEMFiles] +OEMConfigFile1=SYNCSET.DLL + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/themeui.ini b/print/OEM Printer Customization Plug-in Samples/C++/themeui.ini new file mode 100644 index 00000000..c3c9d2c9 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/themeui.ini @@ -0,0 +1,3 @@ +[OEMFiles] +OEMConfigFile1=ThemeUISmpl.DLL + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/uisamples.inf b/print/OEM Printer Customization Plug-in Samples/C++/uisamples.inf new file mode 100644 index 00000000..189db3ce --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/uisamples.inf @@ -0,0 +1,133 @@ + +; UISAMPLES.INF +; +; INF file for OEM DLL UI samples +; +; Copyright 2001-2003 Microsoft Corporation + + +[Version] +Signature="$Windows NT$" +Provider=%MS% +LayoutFile=ntprint.inf +ClassGUID={4D36E979-E325-11CE-BFC1-08002BE10318} +Class=Printer +DriverVer=6/07/2001,1.0.0.1 + +; +; Manufacturer section. +; +; This section lists all of the manufacturers +; that we will display in the Dialog box +; +[Manufacturer] +"Microsoft"=Microsoft, NTamd64, NTia64 + +; +; Model sections. +; +; Each section here corresponds with an entry listed in the +; [Manufacturer] section, above. The models will be displayed in the order +; that they appear in the INF file. +; + +[Microsoft] +"OEM Custom UI Plugin" = SYNCSET.UNI +"OEM Custom Help" = CUSTHELP.UNI + +[Microsoft.NTamd64] +"OEM Custom UI Plugin" = SYNCSET.UNI +"OEM Custom Help" = CUSTHELP.UNI + +[Microsoft.NTia64] +"OEM Custom UI Plugin" = SYNCSET.UNI +"OEM Custom Help" = CUSTHELP.UNI + +; +; Installer Sections +; +; These sections control file installation, and reference all files that +; need to be copied. The section name will be assumed to be the driver +; file, unless there is an explicit DriverFile section listed. +; + +[SYNCSET.UNI] +CopyFiles=SYNCSET +DataFile=SYNCSET.GPD +DataSection=UNIDRV_DATA +Include=NTPRINT.INF +Needs=UNIDRV.OEM,UNIDRV_DATA + +[CUSTHELP.UNI] +CopyFiles=CUSTHLP +DataFile=custhlp.gpd +DataSection=UNIDRV_DATA +Include=NTPRINT.INF +Needs=UNIDRV.OEM,UNIDRV_DATA + + +; Copy Sections +; +; Lists of files that are actually copied. These sections are referenced +; from the installer sections, above. Only create a section if it contains +; two or more files (if we only copy a single file, identify it in the +; installer section, using the @filename notation) or if it's a color +; profile (since the DestinationDirs can only handle sections, and not +; individual files). +; + +[SYNCSET] +SYNCSET.DLL + +[CUSTHLP] +CUSTOMDRV.HLP +CUSTHLP.DLL + + +; +; Location of source files not in Layout.inf. +; + +[SourceDisksNames] +100 = %OEMUISample% + +[SourceDisksFiles.x86] +CUSTHLP.DLL = 100,CustHlp\x86 +SYNCSET.DLL = 100,SyncSet\x86 + +[SourceDisksFiles.amd64] +CUSTHLP.DLL = 100,CustHlp\amd64 +SYNCSET.DLL = 100,SyncSet\amd64 + +[SourceDisksFiles.ia64] +CUSTHLP.DLL = 100,CustHlp\ia64 +SYNCSET.DLL = 100,SyncSet\ia64 + +[SourceDisksFiles] +SYNCSET.GPD = 100 +custhlp.gpd = 100 +CUSTHLP.ini = 100 +SYNCSET.ini = 100 +CUSTOMDRV.hlp = 100 + + +; +; Call SetupSetDirectoryId with 66000 to set the target directory at runtime +; (depending on which environment drivers are getting installed) +; + +[DestinationDirs] +DefaultDestDir=66000 + +; +; Localizable Strings +; +[Strings] +MS="Microsoft DDK Sample" +OEMUISample="OEM DLL Print UI Samples" + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/res/uniuirep.gpd b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/res/uniuirep.gpd new file mode 100644 index 00000000..f376bfe7 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/res/uniuirep.gpd @@ -0,0 +1,559 @@ +*GPDFileName: "uniuirep.gpd" +*GPDFileVersion: "1.0" +*GPDSpecVersion: "1.0" +*Include: "StdNames.gpd" +*ModelName: "OEM Unidrv Full UI Replacement Sample" +*MasterUnits: PAIR(1200, 1200) +*ResourceDLL: "unires.dll" +*PrinterType: PAGE +*MaxCopies: 99 +*PrintRate: 16 +*PrintRateUnit: PPM +*PrintRatePPM: 16 + +*%****************************************************************************************** +*% Orientation +*%****************************************************************************************** +*Feature: Orientation +{ + *rcNameID: =ORIENTATION_DISPLAY + *DefaultOption: PORTRAIT + *Option: PORTRAIT + { + *rcNameID: =PORTRAIT_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.6 + *Cmd: "<1B>&l0O" + } + } + *Option: LANDSCAPE_CC90 + { + *rcNameID: =LANDSCAPE_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.8 + *Cmd: "<1B>&l1O" + } + } +} + +*%****************************************************************************************** +*% Input Bin +*%****************************************************************************************** +*Feature: InputBin +{ + *rcNameID: =PAPER_SOURCE_DISPLAY + *DefaultOption: AUTO + *Option: AUTO + { + *rcNameID: =AUTO_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.11 + *Cmd: "<1B>&l0H" + } + } + *Option: UPPER + { + *rcNameID: =UPPER_TRAY_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.11 + *Cmd: "<1B>&l1H" + } + } +} + +*%****************************************************************************************** +*% Resolution +*%****************************************************************************************** +*Feature: Resolution +{ + *rcNameID: =RESOLUTION_DISPLAY + *DefaultOption: 300dpi + *Option: 600dpi + { + *Name: "600 x 600" =DOTS_PER_INCH + *DPI: PAIR(600, 600) + *TextDPI: PAIR(600, 600) + *MinStripBlankPixels: 32 + EXTERN_GLOBAL: *StripBlanks: LIST(ENCLOSED,TRAILING) + *SpotDiameter: 100 + *Command: CmdBeginRaster { *Cmd : "<1B>*v7S<1B>*r1A" } + *Command: CmdEndRaster { *Cmd : "<1B>*rC" } + *Command: CmdSendBlockData { *Cmd : "<1B>*b" %d{NumOfDataBytes}"W" } + *Command: CmdSelect + { + *Order: DOC_SETUP.7 + *Cmd: "@PJL SET RESOLUTION=600<0A>@PJL ENTER LANGUAGE=PCL<0A0D1B>E<1B>*t600R" + } + } + *Option: 300dpi + { + *Name: "300 x 300" =DOTS_PER_INCH + *DPI: PAIR(300, 300) + *TextDPI: PAIR(300, 300) + *MinStripBlankPixels: 32 + EXTERN_GLOBAL: *StripBlanks: LIST(ENCLOSED, TRAILING) + *SpotDiameter: 100 + *Command: CmdBeginRaster { *Cmd : "<1B>*v7S<1B>*r1A" } + *Command: CmdEndRaster { *Cmd : "<1B>*rC" } + *Command: CmdSendBlockData { *Cmd : "<1B>*b" %d{NumOfDataBytes}"W" } + *Command: CmdSelect + { + *Order: DOC_SETUP.7 + *Cmd: "@PJL SET RESOLUTION=300<0A>@PJL ENTER LANGUAGE=PCL<0A0D1B>E<1B>*t300R" + } + } + *Option: 150dpi + { + *Name: "150 x 150" =DOTS_PER_INCH + *DPI: PAIR(150, 150) + *TextDPI: PAIR(150, 150) + *MinStripBlankPixels: 32 + EXTERN_GLOBAL: *StripBlanks: LIST(ENCLOSED, TRAILING) + *SpotDiameter: 100 + *Command: CmdBeginRaster { *Cmd : "<1B>*v7S<1B>*r1A" } + *Command: CmdEndRaster { *Cmd : "<1B>*rC" } + *Command: CmdSendBlockData { *Cmd : "<1B>*b" %d{NumOfDataBytes}"W" } + *Command: CmdSelect + { + *Order: DOC_SETUP.7 + *Cmd: "@PJL SET RESOLUTION=150<0A>@PJL ENTER LANGUAGE=PCL<0A0D1B>E<1B>*t150R" + } + } +} + +*%****************************************************************************************** +*% HP-GL/2 Graphics Support +*%****************************************************************************************** +*Ifdef: WINNT_51 +*Personality: =PERSONALITY_HPGL2 +*Feature: GraphicsMode +{ + *rcNameID: =GRAPHICSMODE_DISPLAY + *DefaultOption: HPGL2MODE + *Option: HPGL2MODE + { + *rcNameID: =GRAPHICSMODE_HPGL2_DISPLAY + } + *Option: RASTERMODE + { + *rcNameID: =GRAPHICSMODE_RASTER_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.5 + *Cmd: "@PJL SET LIMAGEENHANCE=OFF<0A>" + } + } +} +*Endif: + +*%****************************************************************************************** +*% Paper Size +*%****************************************************************************************** +*Feature: PaperSize +{ + *rcNameID: =PAPER_SIZE_DISPLAY + *DefaultOption: LETTER + *Option: LETTER + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *PageProtectMem: 1028 + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(9500, 12500) + *PrintableOrigin: PAIR(400, 400) + *CursorOrigin: PAIR(300, 300) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l2a8c1E<1B>*p0x0Y<1B>*c0t5260x7704Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(9500, 12200) + *PrintableOrigin: PAIR(450, 300) + *CursorOrigin: PAIR(200, 12900) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l2a8c1E<1B>*p0x0Y<1B>*c0t7332x5880Y" + } + } + } + } + *Option: LEGAL + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *PageProtectMem: 1692 + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(9000, 15500) + *PrintableOrigin: PAIR(400, 600) + *CursorOrigin: PAIR(180, 300) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l3a8c1E<1B>*p0x0Y<1B>*c0t5880x8900Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(9000, 15500) + *PrintableOrigin: PAIR(400, 900) + *CursorOrigin: PAIR(180, 16500) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l3a8c1E<1B>*p0x0Y<1B>*c0t8900x5880Y" + } + } + } + } + *Option: EXECUTIVE + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *PageProtectMem: 4109 + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(8100, 11500) + *PrintableOrigin: PAIR(300, 300) + *CursorOrigin: PAIR(300, 200) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l1a8c1E<1B>*p0x0Y<1B>*c0t4860x7344Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(8300, 11500) + *PrintableOrigin: PAIR(200, 300) + *CursorOrigin: PAIR(200, 12300) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l1a8c1E<1B>*p0x0Y<1B>*c0t7272x4980Y" + } + } + } + } + *Option: A4 + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *PageProtectMem: 4249 + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(9100, 13200) + *PrintableOrigin: PAIR(400, 300) + *CursorOrigin: PAIR(288, 180) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l26a8c1E<1B>*p0x0Y<1B>*c0t5594x8201Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(9100, 13200) + *PrintableOrigin: PAIR(400, 300) + *CursorOrigin: PAIR(204, 13824) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l26a8c1E<1B>*p0x0Y<1B>*c0t8129x5714Y" + } + } + } + } + *Option: B5 + { + *rcNameID: =RCID_DMPAPER_SYSTEM_NAME + *PageProtectMem: 3198 + *switch: Orientation + { + *case: PORTRAIT + { + *PrintableArea: PAIR(7900, 11140) + *PrintableOrigin: PAIR(352, 300) + *CursorOrigin: PAIR(300, 100) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l12a8c1E<1B>*p0x0Y<1B>*c0t4970x7040Y" + } + } + *case: LANDSCAPE_CC90 + { + *PrintableArea: PAIR(7760, 11140) + *PrintableOrigin: PAIR(300, 400) + *CursorOrigin: PAIR(100, 11940) + *Command: CmdSelect + { + *Order: DOC_SETUP.12 + *Cmd: "<1B>&l12a8c1E<1B>*p0x0Y<1B>*c0t6780x4970Y" + } + } + } + } +} + +*%****************************************************************************************** +*% Outputbin +*%****************************************************************************************** + + +*Feature: OutputBin +{ + *rcNameID: =OUTPUTBIN_DISPLAY + *HelpIndex: 12006 + *DefaultOption: Option1 + *Option: Option1 + { + *% Auto Select + *Name: "default" + *Command: CmdSelect + { + *Order: DOC_SETUP.4 + *Cmd: "@PJL SET OUTBIN=OPTIONALOUTBIN2<0A>@PJL SET FINISH=NONE<0A>" + } + } + *Option: Option14 + { + *% Stacker + *Name: "stacker" *% Stacker + *Command: CmdSelect + { + *Order: DOC_SETUP.4 + *Cmd: "@PJL SET OUTBIN=OPTIONALOUTBIN2<0A>@PJL SET FINISH=NONE<0A>" + } + } +} + + +*%****************************************************************************************** +*% Media Type +*%****************************************************************************************** +*Feature: MediaType +{ + *rcNameID: =MEDIA_TYPE_DISPLAY + *DefaultOption: PLAIN + *Option: PLAIN + { + *rcNameID: =PLAIN_PAPER_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.15 + *Cmd: "<1B>&n6WdPlain" + } + } + *Option: TRANSPARENCY + { + *rcNameID: =TRANSPARENCY_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.15 + *Cmd: "<1B>&n13WdTransparency" + } + } +} + + + +*%****************************************************************************************** +*% HalfTone +*%****************************************************************************************** +*Feature: Halftone +{ + *rcNameID: =HALFTONING_DISPLAY + *DefaultOption: HT_PATSIZE_AUTO + *Option: HT_PATSIZE_AUTO + { + *rcNameID: =HT_AUTO_SELECT_DISPLAY + } + *Option: HT_PATSIZE_SUPERCELL_M + { + *rcNameID: =HT_SUPERCELL_DISPLAY + } + *Option: HT_PATSIZE_6x6_M + { + *rcNameID: =HT_DITHER6X6_DISPLAY + } + *Option: HT_PATSIZE_8x8_M + { + *rcNameID: =HT_DITHER8X8_DISPLAY + } +} + +*%****************************************************************************************** +*% Memory +*% +*% Note: Unidrv uses the font memory information to estimate when it needs to stop +*% downloading fonts for a page, and thus driver writers should err on the conservative +*% side. Otherwise, printers will generate "out of memory" device errors for pages with +*% a large number of fonts / unique glyphs. +*%****************************************************************************************** +*Feature: Memory +{ + *rcNameID: =PRINTER_MEMORY_DISPLAY + *DefaultOption: 32768KB + *Option: 16384KB + { + *Name: "16MB" + *MemoryConfigKB: PAIR(16384, 13950) + } + *Option: 32768KB + { + *Name: "32MB" + *MemoryConfigKB: PAIR(32768, 28350) + } +} + +*%****************************************************************************************** +*% Page Protect +*%****************************************************************************************** +*Feature: PageProtect +{ + *rcNameID: =PAGE_PROTECTION_DISPLAY + *DefaultOption: OFF + *Option: ON + { + *rcNameID: =ON_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.1 + *Cmd: "<1B>%%-12345X@PJL SET PAGEPROTECT=LETTER<0A>" + } + } + *Option: OFF + { + *rcNameID: =OFF_DISPLAY + *Command: CmdSelect + { + *Order: DOC_SETUP.1 + *Cmd: "<1B>%%-12345X@PJL SET PAGEPROTECT=OFF<0A>" + } + } +} + +*%****************************************************************************************** +*% Doc setup commands +*%****************************************************************************************** +*Command: CmdStartDoc +{ + *Order: DOC_SETUP.7 + *Cmd: "<1B>&u1200D<1B>*r0F" +} +*Command: CmdStartPage +{ + *Order: PAGE_SETUP.1 + *Cmd: "<1B>*b0M<0D>" +} +*Command: CmdEndJob +{ + *Order: JOB_FINISH.1 + *Cmd: "<1B>E<1B>%%-12345X@PJL<20>LPORTROTATE<0A><1B>%%-12345X" +} +*Command: CmdCopies +{ + *Order: DOC_SETUP.13 + *Cmd: "<1B>&l" %d{NumOfCopies}"X" +} + +*%****************************************************************************************** +*% Cursor, Page and Color Commands +*%****************************************************************************************** +*RotateCoordinate?: TRUE +*RotateRaster?: TRUE +*RotateFont?: TRUE +*TextCaps: LIST(TC_CR_90,TC_UA_ABLE) +*MemoryUsage: LIST(FONT, RASTER, VECTOR) +*CursorXAfterCR: AT_PRINTABLE_X_ORIGIN +*BadCursorMoveInGrxMode: LIST(X_PORTRAIT,Y_LANDSCAPE) +*XMoveThreshold: 0 +*YMoveThreshold: 0 +*XMoveUnit: 300 +*YMoveUnit: 300 +*Command: CmdXMoveAbsolute { *Cmd : "<1B>*p" %d{(DestX) }"X" } +*Command: CmdXMoveRelRight { *Cmd : "<1B>*p+" %d[0,9600]{max_repeat((DestXRel) )}"X" } +*Command: CmdXMoveRelLeft { *Cmd : "<1B>*p-" %d[0,9600]{max_repeat((DestXRel) )}"X" } +*Command: CmdYMoveAbsolute { *Cmd : "<1B>*p" %d{(DestY) }"Y" } +*Command: CmdYMoveRelDown { *Cmd : "<1B>*p+" %d{(DestYRel) }"Y" } +*Command: CmdYMoveRelUp { *Cmd : "<1B>*p-" %d{(DestYRel) }"Y" } +*Command: CmdDefinePaletteEntry { *Cmd : "<1B>*v" %d{RedValue}"a" %d{GreenValue}"b" %d{BlueValue}"c" ++ %d{PaletteIndexToProgram} "I" } +*Command: CmdSelectPaletteEntry { *Cmd : "<1B>*v" %d{CurrentPaletteIndex}"S" } +*Command: CmdCR { *Cmd : "<0D>" } +*Command: CmdLF { *Cmd : "<0A>" } +*Command: CmdFF { *Cmd : "<0C>" } +*Command: CmdBackSpace { *Cmd : "<08>" } +*Command: CmdUniDirectionOn { *Cmd : "<00>" } +*Command: CmdUniDirectionOff { *Cmd : "<00>" } +*Command: CmdPushCursor { *Cmd : "<1B>&f0S" } +*Command: CmdPopCursor { *Cmd : "<1B>&f1S" } +*Command: CmdSetSimpleRotation { *Cmd : "<1B>&a" %d{PrintDirInCCDegrees}"P" } +*EjectPageWithFF?: TRUE +*Command: CmdEnableTIFF4 { *Cmd : "<1B>*b2M" } +*Command: CmdDisableCompression { *Cmd : "<1B>*b0M" } +*OutputDataFormat: H_BYTE +*OptimizeLeftBound?: TRUE +*CursorXAfterSendBlockData: AT_GRXDATA_ORIGIN +*CursorYAfterSendBlockData: AUTO_INCREMENT + +*%****************************************************************************************** +*% Font Descriptions and Commands +*%****************************************************************************************** +*DefaultFont: 136 +*DefaultCTT: 0 +*CharPosition: BASELINE +*DeviceFonts: LIST(136,138,146,147,148,149,150,151,152,153,154,155,156,157, ++ 163,164,165,166,196,197,198,199,200,201,202,203,209,210, ++ 211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226, ++ 227,228,229,230) +*MinFontID: 16534 +*MaxFontID: 32768 +*switch: Resolution +{ + *case: 600dpi + { + *FontFormat: HPPCL_OUTLINE + } + *case: 300dpi + { + *FontFormat: HPPCL_OUTLINE + } + *case: 150dpi + { + *FontFormat: HPPCL_RES + } +} +*Command: CmdSetFontID { *Cmd : "<1B>*c" %d{NextFontID}"D" } +*Command: CmdSelectFontID { *Cmd : "<1B>(" %d{CurrentFontID}"X" } +*Command: CmdSetCharCode { *Cmd : "<1B>*c" %d{NextGlyph}"E" } +*Command: CmdUnderlineOn { *Cmd : "<1B>&dD" } +*Command: CmdUnderlineOff { *Cmd : "<1B>&d@" } +*Command: CmdWhiteTextOn { *Cmd : "<1B>*v1o1T" } +*Command: CmdWhiteTextOff { *Cmd : "<1B>*v0o0T" } + + +*%******************************************************************************************** +*%* Vector Commands. +*%******************************************************************************************** +*MinGrayFill: 1 +*MaxGrayFill: 100 +*Command: CmdSetRectWidth { *Cmd : "<1B>*c" %d{(RectXSize) }"A" } +*Command: CmdSetRectHeight { *Cmd : "<1B>*c" %d{(RectYSize) }"B" } +*Command: CmdRectGrayFill { *Cmd : "<1B>*c" %d{GrayPercentage }"g2P" } +*Command: CmdRectWhiteFill { *Cmd : "<1B>*c1P" } +*Command: CmdRectBlackFill { *Cmd : "<1B>*c0P" } diff --git a/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/res/uniuirep.inf b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/res/uniuirep.inf new file mode 100644 index 00000000..df4505b6 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/res/uniuirep.inf @@ -0,0 +1,99 @@ + +; UNIUIREP.INF +; +; INF file for the base DDK sample +; +; Copyright 1999 - 2001 Microsoft Corporation + + +[Version] +Signature="$Windows NT$" +Provider=%MS% +LayoutFile=ntprint.inf +ClassGUID={4D36E979-E325-11CE-BFC1-08002BE10318} +Class=Printer +DriverVer=06/07/2001,1.0.0.1 + +; +; Manufacturer section. +; +; This section lists all of the manufacturers +; that we will display in the Dialog box +; +[Manufacturer] +"Microsoft"=Microsoft,NTx86,NTamd64,NTia64 + +; +; Model sections. +; +; Each section here corresponds with an entry listed in the +; [Manufacturer] section, above. The models will be displayed in the order +; that they appear in the INF file. +; + +[Microsoft.NTx86] +"Unidrv Full UI Replacement Sample" = UNIUIREP + +[Microsoft.NTamd64] +"Unidrv Full UI Replacement Sample" = UNIUIREP + +[Microsoft.NTia64] +"Unidrv Full UI Replacement Sample" = UNIUIREP + + +; +; Installer Sections +; +; These sections control file installation, and reference all files that +; need to be copied. The section name will be assumed to be the driver +; file, unless there is an explicit DriverFile section listed. +; + +[UNIUIREP] +DataFile=UNIUIREP.GPD +DataSection=UNIDRV_DATA +Include=NTPRINT.INF +Needs=UNIDRV.OEM,UNIDRV_DATA + + +; +; Location of source files not in Layout.inf. +; + +[SourceDisksNames] +100 = %OEMSample% + +[SourceDisksFiles.X86] +uniuirep.dll = 100,x86 + +[SourceDisksFiles.amd64] +uniuirep.dll = 100,amd64 + +[SourceDisksFiles.IA64] +uniuirep.dll = 100,ia64 + +[SourceDisksFiles] +uniuirep.GPD = 100 +uniuirep.INI = 100 + +; +; Call SetupSetDirectoryId with 66000 to set the target directory at runtime +; (depending on which environment drivers are getting installed) +; + +[DestinationDirs] +DefaultDestDir=66000 + +; +; Localizable Strings +; +[Strings] +MS="Microsoft DDK Sample" +OEMSample="Full UI Replacement Sample" + + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/res/uniuirep.ini b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/res/uniuirep.ini new file mode 100644 index 00000000..55701ada --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/res/uniuirep.ini @@ -0,0 +1,3 @@ +[OEMFiles] +OEMConfigFile1=UNIUIREP.DLL + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/Features.cpp b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/Features.cpp new file mode 100644 index 00000000..f2663bc0 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/Features.cpp @@ -0,0 +1,1991 @@ +//+-------------------------------------------------------------------------- +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2005 Microsoft Corporation. All Rights Reserved. +// +// FILE: Features.cpp +// +// PURPOSE: Implements wrapper classes for managing the features & +// options supported by the driver. +// +//-------------------------------------------------------------------------- + +#include "precomp.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +//////////////////////////////////////////////////////// +// Internal Defines and Macros +//////////////////////////////////////////////////////// + +// +// TAG the identifies feature OPTITEM data stuct. +// +#define FEATURE_OPTITEM_TAG 'FETR' + + +//////////////////////////////////////////////////////// +// Type Definitions +//////////////////////////////////////////////////////// +// +// Struct used to identify OPTITEM as feature OPTITEM and to map back +// from an OPTITEM to the feature. +// +typedef struct _tagFeatureOptItemData +{ + DWORD dwSize; + DWORD dwTag; + PCSTR pszFeatureKeyword; + CFeature *pFeature; + +} FEATUREOPTITEMDATA, *PFEATUREOPTITEMDATA; + +// +// Mapping of feature names to keywords +// +static CONST KEYWORDMAP gkmFeatureMap[] = +{ + {"RESDLL", NULL, IDS_RESDLL, OEMCUIP_PRNPROP}, + {"InputBin", TEXT("COMPSTUI.DLL"), IDS_CPSUI_SOURCE, OEMCUIP_DOCPROP}, + {"Orientation", TEXT("COMPSTUI.DLL"), IDS_CPSUI_ORIENTATION, OEMCUIP_DOCPROP}, + {"Resolution", TEXT("COMPSTUI.DLL"), IDS_CPSUI_RESOLUTION, OEMCUIP_DOCPROP}, + {"GraphicsMode", NULL, IDS_GRAPHICS_MODE, OEMCUIP_DOCPROP}, + {"PaperSize", TEXT("COMPSTUI.DLL"), IDS_CPSUI_FORMNAME, OEMCUIP_DOCPROP}, + {"MediaType", TEXT("COMPSTUI.DLL"), IDS_CPSUI_MEDIA, OEMCUIP_DOCPROP}, + {"ColorMode", TEXT("COMPSTUI.DLL"), IDS_CPSUI_COLOR_APPERANCE, OEMCUIP_DOCPROP}, + {"Halftone", TEXT("COMPSTUI.DLL"), IDS_CPSUI_HALFTONE, OEMCUIP_DOCPROP}, + {"DuplexUnit", NULL, IDS_DUPLEX_UNIT, OEMCUIP_PRNPROP}, + {"Duplex", TEXT("COMPSTUI.DLL"), IDS_CPSUI_DUPLEX, OEMCUIP_DOCPROP}, + {"Memory", NULL, IDS_INSTALLED_MEMORY, OEMCUIP_PRNPROP}, + {"OutputBin", TEXT("COMPSTUI.DLL"), IDS_CPSUI_OUTPUTBIN, OEMCUIP_DOCPROP}, + {"PageProtect", TEXT("COMPSTUI.DLL"), IDS_CPSUI_PAGEPROTECT, OEMCUIP_PRNPROP}, + {"%PagePerSheet", TEXT("COMPSTUI.DLL"), IDS_CPSUI_NUP, OEMCUIP_DOCPROP}, + {"%PageOrder", TEXT("COMPSTUI.DLL"), IDS_CPSUI_PAGEORDER, OEMCUIP_DOCPROP}, + {"%PagesPerSheetOrdering", TEXT("COMPSTUI.DLL"), IDS_CPSUI_NUP_DIRECTION, OEMCUIP_DOCPROP}, + {"%PagesPerSheetBorder", TEXT("COMPSTUI.DLL"), IDS_CPSUI_NUP_BORDER, OEMCUIP_DOCPROP}, + {"%TextAsGraphics", NULL, IDS_TEXT_ASGRX, OEMCUIP_DOCPROP}, + {"%MetafileSpooling", NULL, IDS_METAFILE_SPOOLING, OEMCUIP_DOCPROP} +}; + +// +// Number of elements in the feature map table. +// +static const NUM_FEATURE_MAP = (sizeof(gkmFeatureMap)/sizeof(gkmFeatureMap[0])); + +// +// Mapping of option names to resources. A more complete driver would parse +// this mapping from the GDL file, rather than use hard-coded mappings. +// +static CONST KEYWORDMAP gkmOptionMap[] = +{ + {"ON", TEXT("COMPSTUI.DLL"), IDS_CPSUI_ON, 0}, + {"OFF", TEXT("COMPSTUI.DLL"), IDS_CPSUI_OFF, 0}, + {"NONE", TEXT("COMPSTUI.DLL"), IDS_CPSUI_NONE, 0}, + {"None", TEXT("COMPSTUI.DLL"), IDS_CPSUI_NONE, 0}, + {"True", TEXT("COMPSTUI.DLL"), IDS_CPSUI_TRUE, 0}, + {"False", TEXT("COMPSTUI.DLL"), IDS_CPSUI_FALSE, 0,}, + {"PORTRAIT", TEXT("COMPSTUI.DLL"), IDS_CPSUI_PORTRAIT, 0}, + {"LANDSCAPE", TEXT("COMPSTUI.DLL"), IDS_CPSUI_LANDSCAPE, 0}, + {"LANDSCAPE_CC90", TEXT("COMPSTUI.DLL"), IDS_CPSUI_ROT_LAND, 0}, + {"FORMSOURCE", TEXT("COMPSTUI.DLL"), IDS_CPSUI_FORMSOURCE, 0}, + {"UPPER", TEXT("COMPSTUI.DLL"), IDS_CPSUI_UPPER_TRAY, 0}, + {"AUTO", TEXT("COMPSTUI.DLL"), IDS_CPSUI_PRINTFLDSETTING, 0}, + {"Auto", TEXT("COMPSTUI.DLL"), IDS_CPSUI_PRINTFLDSETTING, 0}, + {"PLAIN", TEXT("COMPSTUI.DLL"), IDS_CPSUI_STANDARD, 0}, + {"TRANSPARENCY", TEXT("COMPSTUI.DLL"), IDS_CPSUI_TRANSPARENCY, 0}, + {"HORIZONTAL", TEXT("COMPSTUI.DLL"), IDS_CPSUI_HORIZONTAL, 0}, + {"VERTICAL", TEXT("COMPSTUI.DLL"), IDS_CPSUI_VERTICAL, 0}, + {"FrontToBack", TEXT("COMPSTUI.DLL"), IDS_CPSUI_FRONTTOBACK, 0}, + {"BackToFront", TEXT("COMPSTUI.DLL"), IDS_CPSUI_BACKTOFRONT, 0}, + {"1", TEXT("COMPSTUI.DLL"), IDS_CPSUI_NUP_NORMAL, 0}, + {"2", TEXT("COMPSTUI.DLL"), IDS_CPSUI_NUP_TWOUP, 0}, + {"4", TEXT("COMPSTUI.DLL"), IDS_CPSUI_NUP_FOURUP, 0}, + {"6", TEXT("COMPSTUI.DLL"), IDS_CPSUI_NUP_SIXUP, 0}, + {"9", TEXT("COMPSTUI.DLL"), IDS_CPSUI_NUP_NINEUP, 0}, + {"16", TEXT("COMPSTUI.DLL"), IDS_CPSUI_NUP_SIXTEENUP, 0}, + {"Booklet", TEXT("COMPSTUI.DLL"), IDS_CPSUI_BOOKLET, 0}, + {"RightThenDown", TEXT("COMPSTUI.DLL"), IDS_CPSUI_RIGHT_THEN_DOWN, 0}, + {"DownThenRight", TEXT("COMPSTUI.DLL"), IDS_CPSUI_DOWN_THEN_RIGHT, 0}, + {"LeftThenDown", TEXT("COMPSTUI.DLL"), IDS_CPSUI_LEFT_THEN_DOWN, 0}, + {"DownThenLeft", TEXT("COMPSTUI.DLL"), IDS_CPSUI_DOWN_THEN_LEFT, 0}, + {"UniresDLL", NULL, IDS_UNIRESDLL, 0}, + {"600dpi", NULL, IDS_RESOLUTION_600_DPI, 0}, + {"300dpi", NULL, IDS_RESOLUTION_300_DPI, 0}, + {"150dpi", NULL, IDS_RESOLUTION_150_DPI, 0}, + {"RASTERMODE", NULL, IDS_RASTERMODE, 0}, + {"HPGL2MODE", NULL, IDS_HPGL2MODE, 0}, + {"LETTER", NULL, IDS_PAPERSIZE_LETTER, 0}, + {"LEGAL", NULL, IDS_PAPERSIZE_LEGAL, 0}, + {"EXECUTIVE", NULL, IDS_PAPERSIZE_EXECUTIVE, 0}, + {"A4", NULL, IDS_PAPERSIZE_A4, 0}, + {"B5", NULL, IDS_PAPERSIZE_B5, 0}, + {"Mono", NULL, IDS_COLORMODE_MONO, 0}, + {"Color", TEXT("COMPSTUI.DLL"), IDS_CPSUI_COLOR_APPERANCE, 0}, + {"24bpp", NULL, IDS_COLORMODE_24BPP, 0}, + {"8bpp", NULL, IDS_COLORMODE_8BPP, 0}, + {"HT_PATSIZE_AUTO", NULL, IDS_HALFTONE_AUTO, 0}, + {"HT_PATSIZE_SUPERCELL_M", NULL, IDS_HALFTONE_SUPERCELL_M, 0}, + {"HT_PATSIZE_6x6_M", NULL, IDS_HALFTONE_6x6_M, 0}, + {"HT_PATSIZE_8x8_M", NULL, IDS_HALFTONE_8x8_M, 0}, + {"Option1", NULL, IDS_OUTBIN_DEFAULT, 0}, + {"Option14", NULL, IDS_OUTBIN_STACKER, 0}, + {"EnvTray", NULL, IDS_UIREP_ENVTRAY, 0}, + {"Automatic", NULL, IDS_TTDL_DEFAULT, 0}, + {"Outline", NULL, IDS_TTDL_TYPE1, 0}, + {"Bitmap", NULL, IDS_TTDL_TYPE3, 0}, + {"NativeTrueType", NULL, IDS_TTDL_TYPE42, 0}, + {"16384KB", NULL, IDS_MEMORY_STD, 0}, + {"32768KB", NULL, IDS_MEMORY_UPGRADE, 0} +}; + +// +// Number of elements in the option map table. +// +static const NUM_OPTION_MAP = (sizeof(gkmOptionMap)/sizeof(gkmOptionMap[0])); + +// +// Fall-back mapping for any feature or option that doesn't +// have a pre-defined display name. +// +KEYWORDMAP gDefaultMapping = {"", NULL, IDS_MISSINGNAME, OEMCUIP_DOCPROP}; + + +//+--------------------------------------------------------------------------- +// +// Member: +// COption::Acquire +// +// Synopsis: +// Load the option information as described in the mapping. +// +// +//---------------------------------------------------------------------------- +HRESULT +COption::Acquire( + HANDLE hHeap, + PCKEYWORDMAP pMapping + ) +{ + m_pMapping = pMapping; + m_hHeap = hHeap; + + return GetDisplayNameFromMapping(hHeap, m_pMapping, &m_pszDisplayName); +} + +//+--------------------------------------------------------------------------- +// +// Member: +// CFeaturePairs::ClearPair( +// +// Synopsis: +// Remove a feature-option pair entry from the set of feature / option +// pairs. +// +// +//---------------------------------------------------------------------------- +VOID +CFeaturePairs::ClearPair( + size_t iIndex + // Index of the feature-option pair to be removed. + ) +{ + if (m_pData[iIndex].pszFeature) + { + free((VOID*)m_pData[iIndex].pszFeature); + m_pData[iIndex].pszFeature = NULL; + } + + if (m_pData[iIndex].pszOption) + { + free((VOID*)m_pData[iIndex].pszOption); + m_pData[iIndex].pszOption = NULL; + } +} + +//+--------------------------------------------------------------------------- +// +// Member: +// CFeaturePairs Constructor +// +// Synopsis: +// Create a feature-pairs object containing cElements entries, and +// initialize them all to NULL. +// +// +//---------------------------------------------------------------------------- +CFeaturePairs::CFeaturePairs( + size_t cElements + // number of elements to remove. + ) +{ + m_pData = NULL; + size_t cbFeatureOptions = 0; + m_cElements = 0; + + if (SUCCEEDED(SizeTMult(cElements, sizeof(PRINT_FEATURE_OPTION), &cbFeatureOptions))) + { + m_pData = new PRINT_FEATURE_OPTION[cElements]; + + if (m_pData) + { + m_cElements = cElements; + memset(m_pData, 0, cbFeatureOptions); + } + } +} + +//+--------------------------------------------------------------------------- +// +// Member: +// CFeaturePairs destructor +// +// Synopsis: +// Release any memory used by this object +// +// +//---------------------------------------------------------------------------- +CFeaturePairs::~CFeaturePairs() +{ + if (m_pData) + { + for (size_t iPair = 0; iPair < m_cElements; iPair++) + { + ClearPair(iPair); + } + + delete m_pData; + } +} + +//+--------------------------------------------------------------------------- +// +// Member: +// CFeaturePairs::SetPair +// +// Synopsis: +// Set the pair at the specified index to the specified value. Each +// pair represents a feature and a currently selected option for that +// feature. +// +// Returns: +// S_OK +// E_OUTOFMEMORY +// E_INVALIDARG if the index is out of of bounds. +// +// +//---------------------------------------------------------------------------- +HRESULT +CFeaturePairs::SetPair( + size_t iIndex, + // Index of the entry to set. + PCSTR pcszFeature, + // The name of the feature. This doesn't + // hold a pointer to the string passed in. + PCSTR pcszOption + // The name of the option. This doesn't + // hold a pointer to the string passed in. + ) +{ + + if (iIndex > m_cElements || !pcszFeature || !pcszOption) + { + return E_INVALIDARG; + } + + // + // Deferred error result from failed constructor... + // + if (!m_pData) + { + return E_OUTOFMEMORY; + } + + // + // Configure the data elements + // + m_pData[iIndex].pszFeature = new CHAR[strlen(pcszFeature)+1]; + m_pData[iIndex].pszOption = new CHAR[strlen(pcszOption)+1]; + + if (m_pData[iIndex].pszFeature && m_pData[iIndex].pszOption) + { + memcpy((PSTR)m_pData[iIndex].pszFeature, pcszFeature, (strlen(pcszFeature)+1)); + memcpy((PSTR)m_pData[iIndex].pszOption, pcszOption, (strlen(pcszOption)+1)); + return S_OK; + } + else + { + return E_OUTOFMEMORY; + } +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// CFeature::Clear +// +// Synopsis: +// Reset the option collection information to it's state before otions +// were acquired. +// +// +//---------------------------------------------------------------------------- + +VOID +CFeature::Clear() +{ + if (m_pOptions != NULL) + { + delete [] m_pOptions; + m_pOptions = NULL; + } + + if (m_pszDisplayName != NULL && !IS_INTRESOURCE(m_pszDisplayName)) + { + HeapFree(m_hHeap, 0, m_pszDisplayName); + } + + m_dwOptions = 0; + m_Sel = 0; + m_pszFeature = NULL; + m_hHeap = NULL; + m_pOptions = NULL; + m_pMapping = &gDefaultMapping; + m_pszDisplayName = NULL; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// CFeature (constructor) +// +// Synopsis: +// Initialize the option collection to a default state. Does +// not acquire the options from the GPD / helper. +// +// +//---------------------------------------------------------------------------- +CFeature::CFeature() : + m_dwOptions(0), + m_Sel(0), + m_pszFeature(NULL), + m_hHeap(NULL), + m_pOptions(NULL), + m_pMapping(&gDefaultMapping), + m_pszDisplayName(NULL) +{ +} + +//+--------------------------------------------------------------------------- +// +// Member: +// CFeature (destructor) +// +// Synopsis: +// Clean up any memory we're holding. +// +// +//---------------------------------------------------------------------------- +CFeature::~CFeature() +{ + Clear(); +} + +//+--------------------------------------------------------------------------- +// +// Member: +// CFeature::Acquire +// +// Synopsis: +// Populate the options in the collection using the +// supplied helper to acquire options for the specified +// feature. +// +// Returns: +// S_OK on success, else E_* +// +// +//---------------------------------------------------------------------------- +HRESULT +CFeature::Acquire( + _In_ HANDLE hHeap, + // The heap to make allocations from + _In_ IPrintCoreHelper* pHelper, + // Pointer to the Unidrv supplied helper object + _In_ PCSTR pszFeature + // The name of the feature to read settings for. + ) +{ + VERBOSE(DLLTEXT("CFeature::Acquire entry.")); + + HRESULT hrResult = S_OK; + PCSTR *ppszOptions = NULL; + + // + // Don't retreive the Options again if we already got them. + // + if ((m_dwOptions > 0) && + (m_pszFeature != NULL) && + !lstrcmpA(m_pszFeature, pszFeature)) + { + WARNING(DLLTEXT("CFeature::Acquire: Already have options for feature %hs. Returning S_OK.\r\n"), m_pszFeature); + return S_OK; + } + + // + // Save the heap handle for use later, such as freeing memory at destruction. + // + m_hHeap = hHeap; + + // + // Store Keyword string. + // + m_pszFeature = pszFeature; + + // + // Get or build a keyword mapping entry that + // maps from keyword to info such as display name & + // whether the feature is a device setting or document + // setting. + // + m_pMapping = GetKeywordMapping(gkmFeatureMap, NUM_FEATURE_MAP, pszFeature); + + // + // Get the display name for this feature + // + hrResult = GetDisplayNameFromMapping(hHeap, m_pMapping, &m_pszDisplayName); + + if (!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("CFeature::Acquire: Failed to get display name for feature %hs with error code 0x%x!\r\n"), + pszFeature, + hrResult); + goto Exit; + } + + // + // Enumerate Options. + // + hrResult = pHelper->EnumOptions(m_pszFeature, + &ppszOptions, + &m_dwOptions + ); + + // + // Make sure we got the option list. + // Can't do anything more with out it. + // + if (!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("CFeature::Acquire: Failed to enumerate options for feature %hs. (hrResult = 0x%x)\r\n"), m_pszFeature, hrResult); + goto Exit; + } + + // + // Build COption + // + m_pOptions = new COption[m_dwOptions]; + + if (m_pOptions == NULL) + { + ERR(ERRORTEXT("COption::Acquire: Failed to allocate memory for option info array!\r\n")); + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + // + // For each option, build and/or get useful info like display name etc. + // + for (DWORD dwIndex = 0; dwIndex < m_dwOptions; dwIndex++) + { + PCKEYWORDMAP pMapping = + GetKeywordMapping(gkmOptionMap, NUM_OPTION_MAP, ppszOptions[dwIndex]); + + // + // Get or build a keyword mapping entry that + // maps from keyword to info such as display name, + // icon, option type etc. which we can't get from + // the helper interface + // + hrResult = m_pOptions[dwIndex].Acquire(m_hHeap, + pMapping); + + if (!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("CFeature::Acquire: Failed to load information for option %hs of feature %hs with error code 0x%x!\r\n"), + ppszOptions[dwIndex], + m_pszFeature, + hrResult); + goto Exit; + } + } + + // + // Get current option selection. + // + if(SUCCEEDED(hrResult) && m_dwOptions > 0) + { + hrResult = RefreshSelection(pHelper); + } + +Exit: + + // + // Cleanup if weren't successful + // + if (!SUCCEEDED(hrResult)) + { + Clear(); + } + + return hrResult; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// CFeature::GetOption +// +// Synopsis: +// Get a reference to the description of the option at the specified index. +// +// Returns: +// A pointer to the requested option if available, otherwise NULL. +// +// +//---------------------------------------------------------------------------- +CONST COption * +CFeature::GetOption( + DWORD dwIndex + // Index of the option for which the display name is requested. + ) const +{ + VERBOSE(DLLTEXT("CFeature::GetOption entry.")); + + if ((dwIndex >= m_dwOptions) || (m_pOptions == NULL)) + { + ERR(ERRORTEXT("CFeature::GetOption: Invalid parameters!\r\n")); + return NULL; + } + + return &(m_pOptions[dwIndex]); +} + +//+--------------------------------------------------------------------------- +// +// Member: +// CFeature::FindOption +// +// Synopsis: +// Find the index of the option with the specified keyword. If no such +// option exists, this routine returns the specified result instead. +// +// +//---------------------------------------------------------------------------- +_Success_(return != FALSE) BOOL +CFeature::FindOption( + _In_ PCSTR pszOption, + // The name of the option to look for + _Out_ DWORD *pdwOption + // The index of the default option to use if the name isn't found + ) const +{ + VERBOSE(DLLTEXT("CFeature::FindOption entry.")); + + BOOL bFound = FALSE; + + // + // Validate parameters + // + if (pszOption == NULL || + pdwOption == NULL) + { + return FALSE; + } + + // + // Walk the option keyword looking for a match. + // + for(DWORD dwIndex = 0; !bFound && (dwIndex < m_dwOptions); dwIndex++) + { + bFound = !lstrcmpA(pszOption, m_pOptions[dwIndex].GetKeyword()); + + if(bFound) + { + *pdwOption = dwIndex; + } + } + + return bFound; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// CFeature::InitOptItem +// +// Synopsis: +// Configure the provided OPTITEM with the options in this collection. +// +// Returns: +// +// Notes: +// +// +//---------------------------------------------------------------------------- +HRESULT +CFeature::InitOptItem( + _In_ HANDLE hHeap, + // The heap to allocate memory from. + _Inout_ POPTITEM pOptItem + // The optitem struct being initialized. + ) +{ + VERBOSE(DLLTEXT("CFeature::InitOptItem entry.")); + + HRESULT hrResult = S_OK; + + // + // Add feature OPTITEM data to OPTITEM to facilitate saving + // selection changes + // + PFEATUREOPTITEMDATA pData = + (PFEATUREOPTITEMDATA)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(FEATUREOPTITEMDATA)); + + if (pData == NULL) + { + ERR(ERRORTEXT("CFeatureCollection::InitOptItem: Failed to allocated memory for feature OPTITEM data.")); + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + // + // Configure the callback data structure + // + pData->dwSize = sizeof(FEATUREOPTITEMDATA); + pData->dwTag = FEATURE_OPTITEM_TAG; + pData->pszFeatureKeyword = this->GetKeyword(); + pData->pFeature = this; + + // + // Configure the optitem + // + pOptItem->UserData = (ULONG_PTR)pData; + pOptItem->pName = const_cast<PWSTR>(this->GetDisplayName()); + pOptItem->Sel = m_Sel; + + // + // If there's only 1 option, mark the feature as disabled. + // + if (GetCount() > 1) + { + pOptItem->Flags = 0; + } + else + { + pOptItem->Flags |= OPTIF_DISABLED; + } + + // + // Only create options if there are options defined + // for this feature. + // + if (GetCount() > 0) + { + // + // Allocate memory for feature options. + // + pOptItem->pOptType = CreateOptType(hHeap, (WORD)GetCount()); + + if (pOptItem->pOptType == NULL) + { + ERR(ERRORTEXT("CFeature::InitOptItem: Failed to allocate OPTTYPEs for OPTITEM %hs!\r\n"), + this->GetKeyword()); + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + // + // Set OPTTYPE type & display string for each OPTPARAM in the ot + // + pOptItem->pOptType->Type = TVOT_COMBOBOX; + + for (DWORD dwIndex = 0; dwIndex < GetCount(); dwIndex++) + { + pOptItem->pOptType->pOptParam[dwIndex].pData = const_cast<PWSTR>(this->GetOption(dwIndex)->GetDisplayName()); + } + } + +Exit: + + return hrResult; + +} + +//+--------------------------------------------------------------------------- +// +// Member: +// CFeature::RefreshSelection +// +// Synopsis: +// Synchronize the currently selected option with the option +// that Unidrvui recognizes as being selected. +// +// Returns: +// S_OK on success, else E_* +// +// +//---------------------------------------------------------------------------- +HRESULT +CFeature::RefreshSelection( + _In_ IPrintCoreHelper *pHelper + // Pointer to the Unidrv supplied helper object + ) +{ + VERBOSE(DLLTEXT("CFeature::RefreshSelection entry.")); + + PCSTR pszSel = NULL; + HRESULT hrResult = S_OK; + + // + // Get current option selection. + // + hrResult = pHelper->GetOption(NULL, 0, m_pszFeature, &pszSel); + + if(SUCCEEDED(hrResult)) + { + if (!FindOption(pszSel, &m_Sel)) + { + // + // The option name should always match something in the option + // array. If for some reason that's not the case, default + // back to option 0. + // + WARNING(ERRORTEXT("CFeature::RefreshSelection: Failed to find selected option!\r\n")); + m_Sel = 0; + } + } + else if(hrResult == E_FAIL) + { + // + // GetOption fails with E_FAIL when trying to read document- + // sticky options if the printer preferences is being shown. + // Hide the error & default the selection. The feature won't + // be shown in the UI. + // + m_Sel = 0; + hrResult = S_OK; + } + + return hrResult; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// CFeatureCollection::Clear +// +// Synopsis: +// Release any memory associated with this feature collection and reset +// values to defaults. +// +// +//---------------------------------------------------------------------------- +VOID +CFeatureCollection::Clear() +{ + // + // feature info array allocated with new so + // that each of the constructors for CFeature + // will be called. + // + if (m_pFeatures) + { + delete [] m_pFeatures; + } + + // + // Re-initialize + // + m_dwFeatures = 0; + m_dwDocFeatures = 0; + m_dwPrintFeatures = 0; + m_hHeap = NULL; + m_pFeatures = NULL; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// CFeatureCollection::GetModelessIndex +// +// Synopsis: +// Get the absolute index of the feature, assuming the index provided is +// for the specified mode. This if there are three features, +// +// DocFeature1 +// DocFeature2 +// PrinterFeature1 +// +// If this routine is called with index 0, and mode OEMCUIP_PRNPROP, +// it will return the absolute index of the first printer-sticky feature, +// which in this case would be 2 (remember, the first index is 0). +// +// +//---------------------------------------------------------------------------- +DWORD +CFeatureCollection::GetModelessIndex( + DWORD dwIndex, + // The index relative to the specified mode. + DWORD dwMode + // The mode for which the index applies. See synopsis above for + // a more detailed explanation of mode. + ) const +{ + DWORD dwCount = 0; + + switch(dwMode) + { + // + // Number of features, all modes + // + case 0: + dwCount = dwIndex; + break; + + case OEMCUIP_DOCPROP: + case OEMCUIP_PRNPROP: + // + // Walk the feature list looking for the nth feature + // with matching mode + // + for (dwCount = 0; dwCount < m_dwFeatures; dwCount++) + { + // + // Count down to the feature we want + // Only countdown for matching modes + // + if (dwMode == m_pFeatures[dwCount].GetMode()) + { + if (dwIndex == 0) + { + break; + } + else + { + --dwIndex; + } + } + } + break; + } + + return dwCount; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// CFeatureCollection (constructor) +// +// Synopsis: +// +// +//---------------------------------------------------------------------------- +CFeatureCollection::CFeatureCollection() : + m_dwFeatures(0), + m_dwDocFeatures(0), + m_dwPrintFeatures(0), + m_hHeap(NULL), + m_pFeatures(NULL) +{ +} + +//+--------------------------------------------------------------------------- +// +// Member: +// CFeatureCollection (destructor) +// +// Synopsis: +// Release all resources held by this object +// +// +//---------------------------------------------------------------------------- +CFeatureCollection::~CFeatureCollection() +{ + // + // Clean up class. + // + Clear(); +} + +//+--------------------------------------------------------------------------- +// +// Member: +// CFeatureCollection::Acquire +// +// Synopsis: +// Load all of the features supported by unidrv as well as those specified +// in the GPD using the provided helper object +// +// Returns: +// S_OK on success else E_* +// +// +//---------------------------------------------------------------------------- +HRESULT +CFeatureCollection::Acquire( + HANDLE hHeap, + // The heap from which any allocations should be made + IPrintCoreHelper *pHelper + // The helper object that provides access to the core driver features. + ) +{ + VERBOSE(DLLTEXT("CFeatureCollection::Acquire entry.")); + + HRESULT hrResult = S_OK; + + PCSTR *ppszKeywords = NULL; + // String list that points to each feature keyword + + // + // Don't retreive the Features again if we already got them. + // + if (m_dwFeatures > 0) + { + WARNING(DLLTEXT("CFeatureCollection::Acquire: Features have already been enumerated. Returning S_OK.\r\n")); + return S_OK; + } + + // Save the heap handle for use later, such as freeing memory at destruction. + m_hHeap = hHeap; + + // Enumerate features. + hrResult = pHelper->EnumFeatures(&ppszKeywords, &m_dwFeatures); + + if (FAILED(hrResult)) + { + ERR(ERRORTEXT("CFeatureCollection::Acquire() failed to enumerate features. (hrResult = 0x%x)\r\n"), hrResult); + } + else + { + // + // Build Feature information + // + m_pFeatures = new CFeature[m_dwFeatures]; + + if (m_pFeatures == NULL) + { + ERR(ERRORTEXT("CFeatureCollection::Acquire: Failed to allocate feature info array!\r\n")); + hrResult = E_OUTOFMEMORY; + } + + // + // For each feature, build/get feature info + // + for (DWORD dwIndex = 0; SUCCEEDED(hrResult) && dwIndex < m_dwFeatures ; dwIndex++) + { + // + // Get options for each feature + // Note: Some features don't have options, the HRESULT will be E_NOTIMPL for these + // + hrResult = m_pFeatures[dwIndex].Acquire(hHeap, + pHelper, + ppszKeywords[dwIndex]); + + if (!SUCCEEDED(hrResult) && (hrResult != E_NOTIMPL)) + { + ERR(ERRORTEXT("CFeatureCollection::Acquire: Failed to get options for feature %hs with error code 0x%x!\r\n"), + ppszKeywords[dwIndex], + hrResult); + } + + // + // Keep track of mode counts + // + if (SUCCEEDED(hrResult)) + { + switch(m_pFeatures[dwIndex].GetMode()) + { + case OEMCUIP_DOCPROP: + ++m_dwDocFeatures; + break; + + case OEMCUIP_PRNPROP: + ++m_dwPrintFeatures; + break; + + default: + ERR(ERRORTEXT("CFeatureCollection::Acquire: Unknown stickiness for feature %hs!\r\n"), + ppszKeywords[dwIndex]); + break; + } + } + } + } + + // + // Clean up if we weren't successful + // + if (FAILED(hrResult)) + { + Clear(); + } + + return hrResult; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// CFeatureCollection::GetCount +// +// Synopsis: +// Get the number of features in the collection. +// +// +//---------------------------------------------------------------------------- +DWORD +CFeatureCollection::GetCount( + DWORD dwMode + // Should this routine count the doc-sticky features, printer sticky + // features, or both? + ) CONST +{ + DWORD dwCount = 0; + + switch(dwMode) + { + case 0: + dwCount = m_dwFeatures; + break; + + case OEMCUIP_DOCPROP: + dwCount = m_dwDocFeatures; + break; + + case OEMCUIP_PRNPROP: + dwCount = m_dwPrintFeatures; + break; + } + + return dwCount; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// CFeatureCollection::GetFeature +// +// Synopsis: +// Get the options for the feature at the specified index. +// +// +//---------------------------------------------------------------------------- +CFeature* +CFeatureCollection::GetFeature( + DWORD dwIndex, + // The index of the feature to look up. + DWORD dwMode + // The mode associated with the feature index. + ) const +{ + // + // Validate parameters + // + if ((dwIndex >= GetCount(dwMode)) || (m_pFeatures == NULL)) + { + return NULL; + } + + // + // Get internal index + // + dwIndex = GetModelessIndex(dwIndex, dwMode); + + // + // Return options pointer + // + return &(m_pFeatures[dwIndex]); +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// ::GetDisplayNameFromMapping +// +// Synopsis: +// Load the string resource associated with the specified mapping entry. +// +// Returns: +// S_OK on success, else E_* +// +// +//---------------------------------------------------------------------------- +HRESULT +GetDisplayNameFromMapping( + _In_ HANDLE hHeap, + // The heap to perform allocations from + _In_ PCKEYWORDMAP pMapping, + // The mapping element for the element. Could be a feature or option. + _Out_ PWSTR *ppszDisplayName + // The location where this routine supplies the display name to the + // caller. + ) +{ + HMODULE hModule = NULL; + HRESULT hrResult = S_OK; + + VERBOSE(DLLTEXT("GetDisplayNameFromMapping entry.")); + + if ((hHeap == NULL) || (pMapping == NULL) || (ppszDisplayName == NULL)) + { + return E_INVALIDARG; + } + + // + // Check for simple case of returning INT resource + // + if (pMapping->pwszModule == NULL) + { + // + // Just need to do MAKEINTRESOURCE on the resource ID and return + // + *ppszDisplayName = MAKEINTRESOURCE(pMapping->uDisplayNameID); + } + else + { + // + // We need to get the module name if we aren't loading the + // resource from this module (pwszModule != NULL). As an + // optimization, we assume that the module has already been loaded, + // since the only cases currently are this module, driver ui and compstui.dll. + // + hModule = GetModuleHandle(pMapping->pwszModule); + + if (hModule == NULL) + { + DWORD dwError = GetLastError(); + + ERR(ERRORTEXT("GetDisplayNameFromMapping: Failed to load module %s with error code %d!\r\n"), + pMapping->pwszModule, + dwError); + + hrResult = HRESULT_FROM_WIN32(dwError); + + // + // In case last error wasn't set correctly, force it to an error value. + // + if (SUCCEEDED(hrResult)) + { + hrResult = E_FAIL; + } + } + + // + // Get the string resource + // + if (SUCCEEDED(hrResult)) + { + hrResult = GetStringResource(hHeap, hModule, pMapping->uDisplayNameID, ppszDisplayName); + if (FAILED(hrResult)) + { + ERR(ERRORTEXT("GetDisplayNameFromMapping: Failed to load string with error code 0x%x!\r\n"), hrResult); + } + } + } + + return hrResult; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// ::GetKeywordMapping +// +// Synopsis: +// Find the mapping in the provided table associated with the specified +// keyword. This routine can be used to look up both feature & option +// mappings. +// +// Returns: +// The requested mapping on success, otherwise NULL. +// +// +//---------------------------------------------------------------------------- +PCKEYWORDMAP +GetKeywordMapping( + _In_reads_(dwMapSize) PCKEYWORDMAP pKeywordMap, + // The mapping table to search in + DWORD dwMapSize, + // Number of elements in the mapping table. + PCSTR pszKeyword + // Keyword to look for in the table. + ) +{ + BOOL bFound = FALSE; + PCKEYWORDMAP pMapping = &gDefaultMapping; + + if ((pKeywordMap != NULL) && (pszKeyword != NULL)) + { + // + // Walk mapping array for matching keyword + // + for (DWORD dwIndex = 0; !bFound && (dwIndex < dwMapSize); dwIndex++) + { + bFound = !lstrcmpA(pszKeyword, pKeywordMap[dwIndex].pszKeyword); + + if (bFound) + { + pMapping = pKeywordMap + dwIndex; + } + } + } + + return pMapping; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// ::IsFeatureOptItem +// +// Synopsis: +// Test if an OPTITEM is an OPTITEM for a feature. +// +// Returns: +// TRUE if the OPTITEM represents a feature, else FALSE. +// +// +//---------------------------------------------------------------------------- +BOOL +IsFeatureOptItem( + POPTITEM pOptItem + // The otitem to check + ) +{ + BOOL bRet = FALSE; + PFEATUREOPTITEMDATA pData = NULL; + + + // Make sure pointers are NULL. + if( (NULL == pOptItem) + || + (NULL == pOptItem->UserData) + ) + { + // + // INVARIANT: can't be feature OPTITEM, since one of + // the necessary pointer are NULL. + // + + return FALSE; + } + + // For convienience, assign to pointer to feature OPTITEM data. + pData = (PFEATUREOPTITEMDATA)(pOptItem->UserData); + + // Check size and tag. + bRet = (sizeof(FEATUREOPTITEMDATA) == pData->dwSize) + && + (FEATURE_OPTITEM_TAG == pData->dwTag); + + return bRet; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// ::SaveFeatureOptItems +// +// Synopsis: +// Walks array of OPTITEMs saving each feature OPTITEM +// that has changed. +// +// Returns: +// S_OK on success, else E_* +// +// +//---------------------------------------------------------------------------- +HRESULT +SaveFeatureOptItems( + HANDLE hHeap, + // The heap to perform allocations from + IPrintCoreHelper* pHelper, + // Pointer to the Unidrv supplied helper object + HWND hWnd, + // The current window object. Used as the parent of any model dialogs / + // message boxes displayed from this routine. + _In_reads_(dwItems) POPTITEM pOptItem, + // The option items to save + DWORD dwItems + // The number of optitems in the array + ) +{ + VERBOSE(DLLTEXT("SaveFeatureOptItems entry.")); + + DWORD dwPairsWritten = 0; + DWORD dwResult = 0; + HRESULT hrResult = S_OK; + CFeaturePairs *pPairs = NULL; + + // + // Validate parameters + // + if (!(hHeap && pHelper && pOptItem)) + { + ERR(ERRORTEXT("SaveFeatureOptItems: Invalid arguments!\r\n")); + return E_INVALIDARG; + } + + // + // Get feature option pairs to save + // + hrResult = GetChangedFeatureOptions(pOptItem, dwItems, &pPairs); + + if(FAILED(hrResult)) + { + ERR(ERRORTEXT("SaveFeatureOptItems: Failed to get changed feature option pairs! (error code 0x%x)\r\n"), + hrResult); + } + + // + // Only update options if something changed. + // + if (SUCCEEDED(hrResult) && + pPairs && + pPairs->GetElementCount() > 0) + { + + // + // Set the change feature options. + // For the first SetOptions() call, don't have the + // core driver UI resolve conflicts, so we can + // prompt user for automatic resolution or let + // them do the conflict resolving. + // + hrResult = pHelper->SetOptions(NULL, + 0, + FALSE, + pPairs->GetData(), + (DWORD)pPairs->GetElementCount(), + &dwPairsWritten, + &dwResult); + + if(FAILED(hrResult)) + { + ERR(ERRORTEXT("SaveFeatureOptItems: SetOptions failed with dwResult = %d! (hrResult = 0x%x)\r\n"), + dwResult, + hrResult); + } + else if(SETOPTIONS_RESULT_CONFLICT_REMAINED == dwResult) + { + // + // SetOptions succeeded, but there was a conflict in the selected + // options that was not resolved. Ask the user if they'd like the + // plug-in to resolve the conflict for them. + // + int nRet; + CONST PRINT_FEATURE_OPTION *pConflicts; + DWORD dwConflicts; + PWSTR pszMessage = NULL; + + hrResult = GetStringResource(hHeap, ghInstance, IDS_CONSTRAINT_CONFLICT, &pszMessage); + if(FAILED(hrResult)) + { + ERR(ERRORTEXT("SaveFeatureOptItems: Failed to load conflict resource string (error code 0x%x)\r\n"), + hrResult); + } + + // + // INVARIANT: constraint conflict, options weren't saved. + // + // Get list of all features that have conflict. + // + if (SUCCEEDED(hrResult)) + { + hrResult = GetFirstConflictingFeature(pHelper, + pOptItem, + dwItems, + &pConflicts, + &dwConflicts); + + if (SUCCEEDED(hrResult) && dwConflicts == 0) + { + hrResult = E_FAIL; + ERR(ERRORTEXT("SaveFeatureOptItems: Driver indicated conflict, but didn't provide conflicting options!\r\n")); + } + + if(FAILED(hrResult)) + { + ERR(ERRORTEXT("GetFirstConflictingFeature failed!")); + } + } + + if (SUCCEEDED(hrResult)) + { + // + // Display simple message box with prompt + // + nRet = MessageBox(hWnd, + pszMessage, + L"UI Replacement Test", + MB_YESNO | MB_ICONWARNING); + + // + // Check to see how user wants to resolve conflict + // + if(nRet == IDYES) + { + // + // Let core driver resolve conflict resolution + // + hrResult = pHelper->SetOptions(NULL, + 0, + TRUE, + pPairs->GetData(), + (DWORD)pPairs->GetElementCount(), + &dwPairsWritten, + &dwResult); + + // + // Conflict resolution requires refreshing current option + // selection for each feature, since selection may have + // changed because of conflict resolution. + // + if (SUCCEEDED(hrResult)) + { + RefreshOptItemSelection(pHelper, pOptItem, dwItems); + } + } + + // + // Return failure if there are still conflicts + // + if(dwResult == SETOPTIONS_RESULT_CONFLICT_REMAINED) + { + ERR(ERRORTEXT("SaveFeatureOptItems: Conflicts still exist even after calling core driver to resolve them!")); + hrResult = E_FAIL; + } + } + + if(pszMessage != NULL) + { + HeapFree(hHeap, 0, pszMessage); + } + } + } + + // + // Clean up + // + + if (pPairs) + { + delete pPairs; + } + + return hrResult; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// GetChangedFeatureOptions +// +// Synopsis: +// Creates a collection of all of the features that have changed in the +// provided collection of OPTITEMs +// +// Returns: +// S_OK on success, else E_*. +// +// Notes: +// if no settings have been changed, the routine may return S_OK +// and *ppPairs == NULL. +// +// +//---------------------------------------------------------------------------- +HRESULT +GetChangedFeatureOptions( + _In_reads_(dwItems) POPTITEM pOptItem, + // The array of optitems to search through + DWORD dwItems, + // The number of optitems in the provided array + _Outptr_result_maybenull_ CFeaturePairs **ppPairs + // feature / option keyword pairs describing the options that + // have changed. + ) +{ + VERBOSE(DLLTEXT("GetChangedFeatureOptions entry.")); + + DWORD dwCount = 0; + DWORD dwChanged = 0; + HRESULT hrResult = S_OK; + CFeaturePairs *pPairs; + + *ppPairs = NULL; + + // + // Walk OPTITEM array looking or changed options, + // and calculating size needed for multi-sz buffer. + // + for (dwCount = 0; dwCount < dwItems; dwCount++) + { + // + // Just go to next item if this OPTITEM hasn't + // changed or isn't a feature OPTITEM + // + if ((OPTIF_CHANGEONCE & pOptItem[dwCount].Flags) && + IsFeatureOptItem(&(pOptItem[dwCount])) + ) + { + ++dwChanged; + } + } + + // + // Don't need to do anything more if no feature options changed. + // + if(dwChanged != 0) + { + pPairs = new CFeaturePairs(dwChanged); + + if (pPairs == NULL || + pPairs->GetElementCount() == 0 + ) + { + ERR(ERRORTEXT("GetChangedFeatureOptions: Failed to allocate feature-option array!\r\n")); + hrResult = E_OUTOFMEMORY; + + if ( pPairs ) + { + delete pPairs; + pPairs = NULL; + } + + } + + // + // Build array of feature option pairs that changed + // + for (dwCount = 0; + SUCCEEDED(hrResult) && (dwCount < dwItems) && dwChanged; + dwCount++) + { + // + // Just go to next item if this OPTITEM hasn't + // changed or isn't a feature OPTITEM + // + if((OPTIF_CHANGEONCE & pOptItem[dwCount].Flags) && + IsFeatureOptItem(&(pOptItem[dwCount])) + ) + { + // + // For convienience, assign to pointer to feature OPTITEM data + // + PFEATUREOPTITEMDATA pData = (PFEATUREOPTITEMDATA)(pOptItem[dwCount].UserData); + + // + // Add feature option pair + // + PCSTR pszOption = GetOptionKeywordFromOptItem(&pOptItem[dwCount]); + + if (pszOption != NULL) + { + --dwChanged; + hrResult = pPairs->SetPair(dwChanged, pData->pszFeatureKeyword, pszOption); + } + } + } + + if(SUCCEEDED(hrResult)) + { + *ppPairs = pPairs; + } + else if (pPairs) + { + delete pPairs; + } + } + + return hrResult; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// ::GetOptionKeywordFromOptItem +// +// Synopsis: +// Returns pointer to option keyword for a feature OPTITEM +// +// Returns: +// The requested string on success, otherwise NULL +// +// +//---------------------------------------------------------------------------- +PCSTR +GetOptionKeywordFromOptItem( + POPTITEM pOptItem + // The opt item from which the keyword shoudl be read + ) +{ + VERBOSE(DLLTEXT("GetOptionKeywordFromOptItem entry.")); + + PCSTR pszOption = NULL; + + // + // Validate parameters + // + if(!IsFeatureOptItem(pOptItem)) + { + ERR(ERRORTEXT("GetOptionKeywordFromOptItem: Invalid parameter!\r\n")); + } + else if(pOptItem->pOptType->Type != TVOT_COMBOBOX) + { + ERR(ERRORTEXT("GetOptionKeywordFromOptItem: OPTTYPE type %d number of OPTPARAMS not handled!\r\n"), + pOptItem->pOptType->Type); + } + else + { + // + // Option selection is based on type of OPTTYPE + // + PFEATUREOPTITEMDATA pData = ((PFEATUREOPTITEMDATA)(pOptItem->UserData)); + CONST COption *pOption = pData->pFeature->GetOption((DWORD)pOptItem->Sel); + + if (pOption) + { + pszOption = pOption->GetKeyword(); + } + else + { + ERR(ERRORTEXT("GetOptionKeywordFromOptItem: Invalid option index %d!\r\n"), (DWORD)pOptItem->Sel); + } + } + + return pszOption; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// ::RefreshOptItemSelection +// +// Synopsis: +// For each feature update the currently selected option with the value +// that the core driver has selected. This is useful for updating the +// UI after resolving constraints. +// +// Returns: +// S_OK on success, else E_* +// +// +//---------------------------------------------------------------------------- +HRESULT +RefreshOptItemSelection( + IPrintCoreHelper *pHelper, + // Pointer to the Unidrv supplied helper object + _In_reads_(dwItems) POPTITEM pOptItems, + // An array of options to update + DWORD dwItems + // The number of options in the provided array + ) +{ + HRESULT hrResult = S_OK; + PFEATUREOPTITEMDATA pData = NULL; + + // + // Walk OPTITEM array refreshing feature OPTITEMs + // + for (DWORD dwCount = 0; dwCount < dwItems; dwCount++) + { + // + // Just go to next item if this OPTITEM isn't a feature OPTITEM + // + if (!IsFeatureOptItem(pOptItems + dwCount)) + { + continue; + } + + // + // For convienience, assign to pointer to feature OPTITEM data + // + pData = (PFEATUREOPTITEMDATA)(pOptItems[dwCount].UserData); + + // + // Refresh COption selection + // + pData->pFeature->RefreshSelection(pHelper); + + // + // Assign COption selection to OPTITEM selection + // + pOptItems[dwCount].Sel = pData->pFeature->GetSelection(); + } + + return hrResult; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// ::GetFirstConflictingFeature +// +// Synopsis: +// Finds the first features that it finds to be in conflict with one +// another and supplies those features in the ppConstraints parameter +// +// Returns: +// S_OK on success, else E_*. Note that this routine can succeed even +// if no features are in conflict. In that case, *ppConstraints will +// be NULL. +// +// +//---------------------------------------------------------------------------- +HRESULT +GetFirstConflictingFeature( + IPrintCoreHelper *pHelper, + // Pointer to the Unidrv supplied helper object + _In_reads_(dwItems) POPTITEM pOptItem, + // The array of options to look for a conflict in + DWORD dwItems, + // The number of options in the array + CONST PRINT_FEATURE_OPTION **ppConstraints, + // If any constraints are found, supplies pairs of + // feature / option keywords to the caller indicating + // which options cannot be used together. + DWORD *pdwConstraints + // The number of constrained options + ) +{ + VERBOSE(DLLTEXT("GetFirstConflictingFeature entry.")); + + DWORD dwCount = 0; + HRESULT hrResult = S_OK; + PCSTR pszOptionKeyword = NULL; + + *ppConstraints = NULL; + + // + // Walk OPTITEM array looking for changed options that are in conflict + // + for (dwCount = 0; dwCount < dwItems; dwCount++) + { + // + // Just go to next item if this OPTITEM hasn't + // changed or isn't a feature OPTITEM + // + if(!(OPTIF_CHANGEONCE & pOptItem[dwCount].Flags) || + !IsFeatureOptItem(&(pOptItem[dwCount])) + ) + { + continue; + } + + PFEATUREOPTITEMDATA pData = (PFEATUREOPTITEMDATA)(pOptItem[dwCount].UserData); + + // + // Init conflict record if this feature is in conflict + // + pszOptionKeyword = GetOptionKeywordFromOptItem(&pOptItem[dwCount]); + + if (pszOptionKeyword != NULL) + { + // + // Get reason for conflict + // + hrResult = pHelper->WhyConstrained(NULL, + 0, + pData->pszFeatureKeyword, + pszOptionKeyword, + ppConstraints, + pdwConstraints); + + if (FAILED(hrResult)) + { + ERR(ERRORTEXT("GetConflictingFeatures: Failed to get reason for feature %hs option %hs constraint! (hrResult = 0x%x)\r\n"), + pData->pszFeatureKeyword, + pszOptionKeyword, + hrResult); + break; + } + + if (*pdwConstraints > 0) + { + break; + } + } + } + + return hrResult; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// CreateOptType +// +// Synopsis: +// Allocates and initializes OptType for OptItem & OPTPARAMs for the +// options under that struct. +// +// Returns: +// A newly allocated POPTYPE from the specified heap on success, else +// NULL. +// +// +//---------------------------------------------------------------------------- +POPTTYPE +CreateOptType( + HANDLE hHeap, + // heap to allocate the type from. + WORD wOptParams + // The number of options available for this feature. + ) +{ + VERBOSE(DLLTEXT("CreateOptType entry.")); + + POPTTYPE pOptType = NULL; + // out parameter containing the allocated type struct & array of options. + + // + // Allocate memory from the heap for the OPTTYPE; the driver will take + // care of clean up. + // + pOptType = (POPTTYPE) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(OPTTYPE)); + + if(NULL != pOptType) + { + // Initialize OPTTYPE. + pOptType->cbSize = sizeof(OPTTYPE); + pOptType->Count = wOptParams; + + // Allocate memory from the heap for the OPTPARAMs for the OPTTYPE. + pOptType->pOptParam = (POPTPARAM) HeapAlloc(hHeap, + HEAP_ZERO_MEMORY, + wOptParams * sizeof(OPTPARAM)); + + if(NULL != pOptType->pOptParam) + { + // Initialize the OPTPARAMs. + for(WORD wCount = 0; wCount < wOptParams; wCount++) + { + pOptType->pOptParam[wCount].cbSize = sizeof(OPTPARAM); + } + } + else + { + // Free allocated memory and return NULL. + ERR(ERRORTEXT("CreateOptType() failed to allocated memory for OPTPARAMs!\r\n")); + HeapFree(hHeap, 0, pOptType); + pOptType = NULL; + } + } + else + { + ERR(ERRORTEXT("CreateOptType() failed to allocated memory for OPTTYPE!\r\n")); + } + + return pOptType; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// ::GetStringResource +// +// Synopsis: +// Load a string from the resource section of hte specied module. +// +// Returns: +// S_OK on failure, else E_* +// +// +//---------------------------------------------------------------------------- +HRESULT +GetStringResource( + _In_ HANDLE hHeap, + // Heap to allocate space for the resource from. + _In_ HMODULE hModule, + // Module to load the resource from + UINT uResource, + // resource ID + _Out_ PWSTR *ppszString + // out pointer to string resource loaded. + ) +{ + VERBOSE(DLLTEXT("GetStringResource entry.")); + + HRESULT hr = S_OK; + + // + // Allocate buffer for string resource from heap; + // let the driver clean it up. + // + *ppszString = NULL; + *ppszString = (PTSTR) HeapAlloc(hHeap, + HEAP_ZERO_MEMORY, + MAX_PATH * sizeof(TCHAR)); + + if(NULL != *ppszString) + { + // + // Load string resource; resize after loading so + // as not to waste memory. + // + INT nResult = LoadString(hModule, + uResource, + *ppszString, + MAX_PATH); + + if( nResult > 0) + { + PWSTR pszTemp = (PWSTR) HeapReAlloc(hHeap, HEAP_ZERO_MEMORY, *ppszString, (nResult + 1) * sizeof(WCHAR)); + + if (NULL != pszTemp) + { + *ppszString = pszTemp; + } + else + { + // + // a realloc failure doesn't free the original string, so + // re-alloc failing in this case is not critical. + // + VERBOSE(ERRORTEXT("GetStringResource() HeapReAlloc() of string retrieved failed! (Last Error was %d)\r\n"), GetLastError()); + } + } + else + { + ERR(ERRORTEXT("LoadString() returned %d! (Last Error was %d)\r\n"), nResult, GetLastError()); + ERR(ERRORTEXT("GetStringResource() failed to load string resource %d!\r\n"), uResource); + HeapFree(hHeap, 0, *ppszString); + *ppszString = NULL; + hr = E_FAIL; + } + } + else + { + ERR(ERRORTEXT("GetStringResource() failed to allocate string buffer!\r\n")); + hr = E_OUTOFMEMORY; + } + + return hr; +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/Features.h b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/Features.h new file mode 100644 index 00000000..adab6eec --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/Features.h @@ -0,0 +1,388 @@ +//+-------------------------------------------------------------------------- +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2005 Microsoft Corporation. All Rights Reserved. +// +// FILE: Features.h +// +// PURPOSE: Defines wrapper class for WinXP PS Features and Options. +// +//-------------------------------------------------------------------------- + +#pragma once + +//////////////////////////////////////////////////////// +// Type Definitions +//////////////////////////////////////////////////////// + +// +// Struct used to map keyword to information +// such as display name and stickiness. +// +typedef struct _tagKeywordMap +{ + PCSTR pszKeyword; + PCWSTR pwszModule; + UINT uDisplayNameID; + DWORD dwMode; + +} KEYWORDMAP, *PKEYWORDMAP; + +typedef CONST KEYWORDMAP *PCKEYWORDMAP; + + +//////////////////////////////////////////////////////// +// Class Definitions +//////////////////////////////////////////////////////// + + +// +// Option Infomation +// +class COption +{ +private: + PCKEYWORDMAP m_pMapping; + PWSTR m_pszDisplayName; + HANDLE m_hHeap; + +public: + COption() + : + m_pMapping(NULL), + m_pszDisplayName(NULL), + m_hHeap(NULL) + { + } + + virtual ~COption() + { + if (m_hHeap && m_pszDisplayName && !IS_INTRESOURCE(m_pszDisplayName)) + { + HeapFree(m_hHeap, 0, m_pszDisplayName); + } + } + + HRESULT + Acquire( + HANDLE hHeap, + PCKEYWORDMAP pMapping + ); + + CONST PCWSTR + GetDisplayName() CONST + { + return m_pszDisplayName; + } + + CONST PCSTR + GetKeyword() CONST + { + if (m_pMapping) + { + return m_pMapping->pszKeyword; + } + else + { + return NULL; + } + } +}; + + +// +// Class wrapper and container for Core Driver Feature +// Options. +// +class CFeature +{ +private: + + PCKEYWORDMAP m_pMapping; + + PWSTR m_pszDisplayName; + + DWORD m_dwOptions; + // Count of the number of options contained for an instance of the class. + + PCSTR m_pszFeature; + // Pointer to the feature for which the enumerated options belong. + + HANDLE m_hHeap; + // Heap to do allocations from. + + COption *m_pOptions; + // Array of info about each option for a feature + + DWORD m_Sel; + // An optitem selection is indicated either with a pointer or an + // index. Since combo-boxes use indices, and this custom UI only + // generates combo boxes, this class always uses an index to + // indicate the current selection. + +public: + + CFeature(); + + virtual ~CFeature(); + + // + // Populate Options list for specified keyword. + // + HRESULT + Acquire( + _In_ HANDLE hHeap, + _In_ IPrintCoreHelper* pHelper, + _In_ PCSTR pszFeature + ); + + // + // Returns number of feature options contained in class instance. + // + DWORD + GetCount() const {return m_dwOptions;} + + // + // Return nth option. + // + CONST COption * + GetOption( + DWORD dwIndex + ) const; + + + // + // Get the currently selected option index. + // + LONG + GetSelection() + { + return m_Sel; + } + + // + // Find option with matching keyword string. + // + _Success_(return != FALSE) BOOL + FindOption( + _In_ PCSTR pszOption, + _Out_ DWORD *pdwOption + ) const; + + // + // Initializes options portion of OPTITEM. + // + HRESULT + InitOptItem( + _In_ HANDLE hHeap, + _Inout_ POPTITEM pOptItem + ); + + // + // Refresh option selection. + // + HRESULT + RefreshSelection( + _In_ IPrintCoreHelper* pHelper + ); + + CONST PCWSTR + GetDisplayName() + { + return m_pszDisplayName; + } + + CONST PCSTR + GetKeyword() + { + return m_pszFeature; + } + + DWORD + GetMode() + { + return m_pMapping->dwMode; + } + +private: + + VOID + Clear(); +}; + + +// +// Class wrapper and container for Core Driver Features. +// +class CFeatureCollection +{ +private: + + DWORD m_dwFeatures; + // Count of the number of features. + + DWORD m_dwDocFeatures; + // Count of the number of document sticky features + + DWORD m_dwPrintFeatures; + // Count of the number of printer sticky features. + + HANDLE m_hHeap; + // Heap to do allocations from. + + CFeature *m_pFeatures; + // Array of feature information about each of the enumerate features. + +public: + + CFeatureCollection(); + virtual ~CFeatureCollection(); + + // + // Populates the Feature list + // + HRESULT Acquire( + HANDLE hHeap, + IPrintCoreHelper* pHelper + ); + + // + // Returns number of features contained in class instance. + // + DWORD GetCount( + DWORD dwMode = 0 + ) const; + + // Returns pointer to option class for nth feature. + // + CFeature* GetFeature( + DWORD wIndex, + DWORD dwMode = 0 + ) const; + +private: + + VOID Clear(); + + DWORD GetModelessIndex( + DWORD dwIndex, + DWORD dwMode + ) const; +}; + + +class CFeaturePairs +{ +private: + + PRINT_FEATURE_OPTION * m_pData; + size_t m_cElements; + + VOID + ClearPair( + size_t iIndex + ); + +public: + + CFeaturePairs(size_t cElements); + + ~CFeaturePairs(); + + HRESULT + SetPair( + size_t iIndex, + PCSTR pcszFeature, + PCSTR pcszOption + ); + + PRINT_FEATURE_OPTION * + GetData() + { + return m_pData; + } + + size_t + GetElementCount() + { + return m_cElements; + } +}; + +//////////////////////////////////////////////////////// +// Prototypes +//////////////////////////////////////////////////////// + +HRESULT +GetDisplayNameFromMapping( + _In_ HANDLE hHeap, + _In_ PCKEYWORDMAP pMapping, + _Out_ PWSTR *ppszDisplayName + ); + +PCKEYWORDMAP +GetKeywordMapping( + _In_reads_(dwMapSize) PCKEYWORDMAP pKeywordMap, + DWORD dwMapSize, + PCSTR pszKeyword + ); + +BOOL +IsFeatureOptItem( + POPTITEM pOptItem + ); + +HRESULT +SaveFeatureOptItems( + HANDLE hHeap, + IPrintCoreHelper* pHelper, + HWND hWnd, + _In_reads_(dwItems) POPTITEM pOptItem, + DWORD dwItems + ); + +HRESULT +GetChangedFeatureOptions( + _In_reads_(dwItems) POPTITEM pOptItem, + DWORD dwItems, + _Outptr_result_maybenull_ CFeaturePairs **ppPairs + ); + +PCSTR +GetOptionKeywordFromOptItem( + POPTITEM pOptItem + ); + +HRESULT +RefreshOptItemSelection( + IPrintCoreHelper* pHelper, + _In_reads_(dwItems) POPTITEM pOptItems, + DWORD dwItems + ); + +HRESULT +GetFirstConflictingFeature( + IPrintCoreHelper *pHelper, + _In_reads_(dwItems) POPTITEM pOptItem, + DWORD dwItems, + CONST PRINT_FEATURE_OPTION **pConstraints, + DWORD *pdwConstraints + ); + +POPTTYPE +CreateOptType( + HANDLE hHeap, + WORD wOptParams + ); + +HRESULT +GetStringResource( + _In_ HANDLE hHeap, + _In_ HMODULE hModule, + UINT uResource, + _Out_ PWSTR *ppszString + ); diff --git a/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/UNIUIREP.vcxproj b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/UNIUIREP.vcxproj new file mode 100644 index 00000000..e7dfa837 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/UNIUIREP.vcxproj @@ -0,0 +1,1066 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Win10 Debug|ARM64"> + <Configuration>Win10 Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|Win32"> + <Configuration>Win10 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|x64"> + <Configuration>Win10 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|ARM64"> + <Configuration>Win10 Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|Win32"> + <Configuration>Win10 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|x64"> + <Configuration>Win10 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|Win32"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|Win32"> + <Configuration>Win8 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|Win32"> + <Configuration>Win7 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|Win32"> + <Configuration>Win8.1 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|Win32"> + <Configuration>Win8 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|Win32"> + <Configuration>Win7 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|x64"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|x64"> + <Configuration>Win8 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|x64"> + <Configuration>Win7 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|x64"> + <Configuration>Win8.1 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|x64"> + <Configuration>Win8 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|x64"> + <Configuration>Win7 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{7C66BD86-A7CA-4F53-A5B2-9361A6B80E16}</ProjectGuid> + <RootNamespace>$(MSBuildProjectName)</RootNamespace> + <Configuration Condition="'$(Configuration)' == ''">Win10 Debug</Configuration> + <Platform Condition="'$(Platform)' == ''">Win32</Platform> + <SampleGuid>{B571A415-8077-4F31-891E-02760FE89ED2}</SampleGuid> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <PropertyGroup> + <OutDir>$(IntDir)</OutDir> + </PropertyGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ItemGroup Label="WrappedTaskItems" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetName>UNIUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetName>UNIUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetName>UNIUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <TargetName>UNIUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <TargetName>UNIUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetName>UNIUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetName>UNIUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetName>UNIUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <TargetName>UNIUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <TargetName>UNIUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetName>UNIUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetName>UNIUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetName>UNIUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <TargetName>UNIUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetName>UNIUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetName>UNIUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetName>UNIUIREP</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <TargetName>UNIUIREP</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);gdi32.lib;kernel32.lib;user32.lib;winspool.lib;ole32.lib;oleaut32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>UNIUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>UNIUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>UNIUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>UNIUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>UNIUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>UNIUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>UNIUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>UNIUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>UNIUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>UNIUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>UNIUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>UNIUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>UNIUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>UNIUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>UNIUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>UNIUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>UNIUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>UNIUIREP.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="debug.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="devmode.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="dllentry.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="features.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Create</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="uniuirep.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ResourceCompile Include="uniuirep.rc" /> + </ItemGroup> + <ItemGroup> + <Inf Exclude="@(Inf)" Include="*.inf" /> + <FilesToPackage Include="$(TargetPath)" Condition="'$(ConfigurationType)'=='Driver' or '$(ConfigurationType)'=='DynamicLibrary'" /> + </ItemGroup> + <ItemGroup> + <None Exclude="@(None)" Include="*.txt;*.htm;*.html" /> + <None Exclude="@(None)" Include="*.ico;*.cur;*.bmp;*.dlg;*.rct;*.gif;*.jpg;*.jpeg;*.wav;*.jpe;*.tiff;*.tif;*.png;*.rc2" /> + <None Exclude="@(None)" Include="*.def;*.bat;*.hpj;*.asmx" /> + </ItemGroup> + <ItemGroup> + <ClInclude Exclude="@(ClInclude)" Include="*.h;*.hpp;*.hxx;*.hm;*.inl;*.xsd" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/UNIUIREP.vcxproj.Filters b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/UNIUIREP.vcxproj.Filters new file mode 100644 index 00000000..359932e0 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/UNIUIREP.vcxproj.Filters @@ -0,0 +1,223 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;*</Extensions> + <UniqueIdentifier>{7212E25C-3AC4-4F4D-A600-63E91A451AD6}</UniqueIdentifier> + </Filter> + <Filter Include="Header Files"> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + <UniqueIdentifier>{72D49995-C0D7-4527-9A60-C2A300B80E2B}</UniqueIdentifier> + </Filter> + <Filter Include="Resource Files"> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms;man;xml</Extensions> + <UniqueIdentifier>{B53D0C7F-CD45-4EC5-893D-05FBEE34246B}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClCompile Include="debug.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="devmode.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="dllentry.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="features.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="uniuirep.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="uniuirep.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="uniuirep.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="uniuirep.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="uniuirep.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="uniuirep.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="uniuirep.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="uniuirep.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="uniuirep.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="uniuirep.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="uniuirep.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="uniuirep.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="uniuirep.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="uniuirep.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="uniuirep.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="uniuirep.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="uniuirep.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="uniuirep.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="uniuirep.h" /> + <ClInclude Include="debug.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="devmode.h" /> + <ClInclude Include="Features.h" /> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="uniuirep.h" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="uniuirep.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> + <ItemGroup> + <None Include="uniuirep.def"> + <Filter>Source Files</Filter> + </None> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/debug.cpp b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/debug.cpp new file mode 100644 index 00000000..f7a3d842 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/debug.cpp @@ -0,0 +1,405 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1996 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Debug.cpp +// +// PURPOSE: Debug functions. +// +// + +#include "precomp.h" +#include "debug.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +//////////////////////////////////////////////////////// +// INTERNAL DEFINES +//////////////////////////////////////////////////////// + +#define DEBUG_BUFFER_SIZE 1024 +#define PATH_SEPARATOR '\\' +#define MAX_LOOP 10 + +// Determine what level of debugging messages to eject. +#ifdef VERBOSE_MSG + #define DEBUG_LEVEL DBG_VERBOSE +#elif TERSE_MSG + #define DEBUG_LEVEL DBG_TERSE +#elif WARNING_MSG + #define DEBUG_LEVEL DBG_WARNING +#elif ERROR_MSG + #define DEBUG_LEVEL DBG_ERROR +#elif RIP_MSG + #define DEBUG_LEVEL DBG_RIP +#elif NO_DBG_MSG + #define DEBUG_LEVEL DBG_NONE +#else + #define DEBUG_LEVEL DBG_WARNING +#endif + + + +//////////////////////////////////////////////////////// +// EXTERNAL GLOBALS +//////////////////////////////////////////////////////// + +INT giDebugLevel = DEBUG_LEVEL; + + + + +//////////////////////////////////////////////////////// +// INTERNAL PROTOTYPES +//////////////////////////////////////////////////////// + +static BOOL DebugMessageV(LPCSTR lpszMessage, va_list arglist); +static BOOL DebugMessageV(DWORD dwSize, LPCWSTR lpszMessage, va_list arglist); + + + + +////////////////////////////////////////////////////////////////////////// +// Function: DebugMessageV +// +// Description: Outputs variable argument debug string. +// +// +// Parameters: +// +// dwSize Size of temp buffer to hold formated string. +// +// lpszMessage Format string. +// +// arglist Variable argument list.. +// +// +// Returns: +// +// +// Comments: +// +// +////////////////////////////////////////////////////////////////////////// + +static BOOL DebugMessageV(LPCSTR lpszMessage, va_list arglist) +{ + DWORD dwSize = DEBUG_BUFFER_SIZE; + DWORD dwLoop = 0; + LPSTR lpszMsgBuf = NULL; + HRESULT hr; + + + // Parameter checking. + if( (NULL == lpszMessage) + || + (0 == dwSize) + ) + { + return FALSE; + } + + do + { + // Allocate memory for message buffer. + if(NULL != lpszMsgBuf) + { + delete[] lpszMsgBuf; + dwSize *= 2; + } + lpszMsgBuf = new CHAR[dwSize + 1]; + if(NULL == lpszMsgBuf) + { + return FALSE; + } + + hr = StringCbVPrintfA(lpszMsgBuf, (dwSize + 1) * sizeof(CHAR), lpszMessage, arglist); + + // Pass the variable parameters to wvsprintf to be formated. + } while (FAILED(hr) && (STRSAFE_E_INSUFFICIENT_BUFFER == hr) && (++dwLoop < MAX_LOOP) ); + + // Dump string to Debug output. + OutputDebugStringA(lpszMsgBuf); + + // Cleanup. + delete[] lpszMsgBuf; + + return SUCCEEDED(hr); +} + + +////////////////////////////////////////////////////////////////////////// +// Function: DebugMessageV +// +// Description: Outputs variable argument debug string. +// +// +// Parameters: +// +// dwSize Size of temp buffer to hold formated string. +// +// lpszMessage Format string. +// +// arglist Variable argument list.. +// +// +// Returns: +// +// +// Comments: +// +// +////////////////////////////////////////////////////////////////////////// + +static BOOL DebugMessageV(DWORD dwSize, LPCWSTR lpszMessage, va_list arglist) +{ + LPWSTR lpszMsgBuf; + HRESULT hResult; + + + // Parameter checking. + if( (NULL == lpszMessage) + || + (0 == dwSize) + ) + { + return FALSE; + } + + // Allocate memory for message buffer. + lpszMsgBuf = new WCHAR[dwSize + 1]; + if(NULL == lpszMsgBuf) + return FALSE; + + // Pass the variable parameters to wvsprintf to be formated. + hResult = StringCbVPrintfW(lpszMsgBuf, (dwSize + 1) * sizeof(WCHAR), lpszMessage, arglist); + + // Dump string to debug output. + OutputDebugStringW(lpszMsgBuf); + + // Clean up. + delete[] lpszMsgBuf; + + return SUCCEEDED(hResult); +} + + +////////////////////////////////////////////////////////////////////////// +// Function: DebugMessage +// +// Description: Outputs variable argument debug string. +// +// +// Parameters: +// +// lpszMessage Format string. +// +// +// Returns: +// +// +// Comments: +// +// +////////////////////////////////////////////////////////////////////////// + +BOOL DebugMessage(LPCSTR lpszMessage, ...) +{ + BOOL bResult; + va_list VAList; + + + // Pass the variable parameters to DebugMessageV for processing. + va_start(VAList, lpszMessage); + bResult = DebugMessageV(lpszMessage, VAList); + va_end(VAList); + + return bResult; +} + + +////////////////////////////////////////////////////////////////////////// +// Function: DebugMessage +// +// Description: Outputs variable argument debug string. +// +// +// Parameters: +// +// lpszMessage Format string. +// +// +// Returns: +// +// +// Comments: +// +// +////////////////////////////////////////////////////////////////////////// + +BOOL DebugMessage(LPCWSTR lpszMessage, ...) +{ + BOOL bResult; + va_list VAList; + + + // Pass the variable parameters to DebugMessageV to be processed. + va_start(VAList, lpszMessage); + bResult = DebugMessageV(MAX_PATH, lpszMessage, VAList); + va_end(VAList); + + return bResult; +} + +void Dump(PPUBLISHERINFO pPublisherInfo) +{ + VERBOSE(TEXT("pPublisherInfo:\r\n")); + if(NULL == pPublisherInfo) + { + VERBOSE(TEXT("\tpPublisherInfo is NULL!\r\n")); + return; + } + VERBOSE(TEXT("\tdwMode = %#x\r\n"), pPublisherInfo->dwMode); + VERBOSE(TEXT("\twMinoutlinePPEM = %d\r\n"), pPublisherInfo->wMinoutlinePPEM); + VERBOSE(TEXT("\twMaxbitmapPPEM = %d\r\n"), pPublisherInfo->wMaxbitmapPPEM); +} + +void Dump(POEMDMPARAM pOemDMParam) +{ + VERBOSE(TEXT("pOemDMParam:\r\n")); + if(NULL == pOemDMParam) + { + VERBOSE(TEXT("\tpOemDMParam is NULL!\r\n")); + return; + } + VERBOSE(TEXT("\tcbSize = %d\r\n"), pOemDMParam->cbSize); + VERBOSE(TEXT("\tpdriverobj = %#x\r\n"), pOemDMParam->pdriverobj); + VERBOSE(TEXT("\thPrinter = %#x\r\n"), pOemDMParam->hPrinter); + VERBOSE(TEXT("\thModule = %#x\r\n"), pOemDMParam->hModule); + VERBOSE(TEXT("\tpPublicDMIn = %#x\r\n"), pOemDMParam->pPublicDMIn); + VERBOSE(TEXT("\tpPublicDMOut = %#x\r\n"), pOemDMParam->pPublicDMOut); + VERBOSE(TEXT("\tpOEMDMIn = %#x\r\n"), pOemDMParam->pOEMDMIn); + VERBOSE(TEXT("\tpOEMDMOut = %#x\r\n"), pOemDMParam->pOEMDMOut); + VERBOSE(TEXT("\tcbBufSize = %d\r\n"), pOemDMParam->cbBufSize); +} + +void Dump(PPROPSHEETUI_INFO pPSUIInfo) +{ + VERBOSE(TEXT("pPSUIInfo:\r\n")); + if(NULL == pPSUIInfo) + { + VERBOSE(TEXT("\tpPSUIInfo is NULL!\r\n")); + return; + } + VERBOSE(TEXT("\tcbSize = %d\r\n"), pPSUIInfo->cbSize); + VERBOSE(TEXT("\tVersion = %#x\r\n"), pPSUIInfo->Version); + VERBOSE(TEXT("\tFlags = %#x\r\n"), pPSUIInfo->Flags); + VERBOSE(TEXT("\tReason = %d\r\n"), pPSUIInfo->Reason); + VERBOSE(TEXT("\thComPropSheet = %#x\r\n"), pPSUIInfo->hComPropSheet); + VERBOSE(TEXT("\tpfnComPropSheet = %#x\r\n"), pPSUIInfo->pfnComPropSheet); + VERBOSE(TEXT("\tlParamInit = %#x\r\n"), pPSUIInfo->lParamInit); + VERBOSE(TEXT("\tUserData = %#x\r\n"), pPSUIInfo->UserData); + VERBOSE(TEXT("\tResult = %#x\r\n"), pPSUIInfo->Result); +} + +void Dump(POPTITEM pOptItem) +{ + VERBOSE(TEXT("pOptItem:\r\n")); + if(NULL == pOptItem) + { + VERBOSE(TEXT("\tpOptItem is NULL!\r\n")); + return; + } + VERBOSE(TEXT("\tcbSize = %d\r\n"), pOptItem->cbSize); + VERBOSE(TEXT("\tLevel = %d\r\n"), pOptItem->Level); + VERBOSE(TEXT("\tDlgPageIdx = %d\r\n"), pOptItem->DlgPageIdx); + VERBOSE(TEXT("\tFlags = 0x%x\r\n"), pOptItem->Flags); + VERBOSE(TEXT("\tUserData = 0x%p\r\n"), pOptItem->UserData); + VERBOSE(TEXT("\tpName = %s\r\n"), pOptItem->pName ? pOptItem->pName : TEXT("<NULL>")); + VERBOSE(TEXT("\tpSel = 0x%p\r\n"), pOptItem->pSel); + VERBOSE(TEXT("\tpExtChkBox = 0x%p\r\n"), pOptItem->pExtChkBox); + VERBOSE(TEXT("\tpExtChkBox = 0x%p\r\n"), pOptItem->pExtChkBox); + VERBOSE(TEXT("\tHelpIndex = 0x%x\r\n"), pOptItem->HelpIndex); + VERBOSE(TEXT("\tDMPubID = 0x%x\r\n"), pOptItem->DMPubID); + VERBOSE(TEXT("\tUserItemID = 0x%x\r\n"), pOptItem->UserItemID); + VERBOSE(TEXT("\twReserved = 0x%x\r\n"), pOptItem->wReserved); + VERBOSE(TEXT("\tpOIExt = 0x%p\r\n"), pOptItem->pOIExt); + + Dump(pOptItem->pOptType); +} + +void Dump(POPTTYPE pOptType) +{ + VERBOSE(TEXT("\tpOptType:\r\n")); + if(NULL == pOptType) + { + VERBOSE(TEXT("\t\tpOptType is NULL!\r\n")); + return; + } + VERBOSE(TEXT("\t\tcbSize = %d\r\n"), pOptType->cbSize); + VERBOSE(TEXT("\t\tType = 0x%x\r\n"), pOptType->Type); + VERBOSE(TEXT("\t\tFlags = 0x%x\r\n"), pOptType->Flags); + VERBOSE(TEXT("\t\tCount = %d\r\n"), pOptType->Count); + VERBOSE(TEXT("\t\tCount = 0x%x\r\n"), pOptType->BegCtrlID); + VERBOSE(TEXT("\t\tStyle = 0x%x\r\n"), pOptType->Style); + + Dump(pOptType->pOptParam, pOptType->Count); +} + +void Dump(POPTPARAM pOptParam, WORD wCount) +{ + if(NULL == pOptParam) + { + VERBOSE(TEXT("\t\tpOptParam is NULL!\r\n")); + return; + } + + for(WORD wIndex = 0; wIndex < wCount; ++wIndex) + { + VERBOSE(TEXT("\t\tpOptParam[wIndex]:\r\n")); + VERBOSE(TEXT("\t\t\tcbSize = %d\r\n"), pOptParam[wIndex].cbSize); + VERBOSE(TEXT("\t\t\tFlags = 0x%x\r\n"), pOptParam[wIndex].Flags); + VERBOSE(TEXT("\t\t\tStyle = 0x%x\r\n"), pOptParam[wIndex].Style); + VERBOSE(TEXT("\t\t\tpData = 0x%p\r\n"), pOptParam[wIndex].pData); + VERBOSE(TEXT("\t\t\tIconID = 0x%p\r\n"), pOptParam[wIndex].IconID); + VERBOSE(TEXT("\t\t\tlParam = 0x%p\r\n"), pOptParam[wIndex].lParam); + } +} + + +PCSTR +StripDirPrefixA( + IN PCSTR pstrFilename + ) + +/*++ + +Routine Description: + + Strip the directory prefix off a filename (ANSI version) + +Arguments: + + pstrFilename - Pointer to filename string + +Return Value: + + Pointer to the last component of a filename (without directory prefix) + +--*/ + +{ + PCSTR pstr; + + pstr = strrchr(pstrFilename, PATH_SEPARATOR); + if (pstr) + return pstr + 1; + + return pstrFilename; +} + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/debug.h b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/debug.h new file mode 100644 index 00000000..b4d57b0b --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/debug.h @@ -0,0 +1,166 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1996 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Debug.H +// +// +// PURPOSE: Define common data types, and external function prototypes +// for debugging functions. +// +// + +#pragma once + +// VC and Build use different debug defines. +// The following makes it so either will +// cause the inclusion of debugging code. +#if !defined(_DEBUG) && defined(DBG) + #define _DEBUG DBG +#elif defined(_DEBUG) && !defined(DBG) + #define DBG _DEBUG +#endif + + + +///////////////////////////////////////////////////////// +// Macros +///////////////////////////////////////////////////////// + +// +// These macros are used for debugging purposes. They expand +// to white spaces on a free build. Here is a brief description +// of what they do and how they are used: +// +// giDebugLevel +// Global variable which set the current debug level to control +// the amount of debug messages emitted. +// +// VERBOSE(msg) +// Display a message if the current debug level is <= DBG_VERBOSE. +// +// TERSE(msg) +// Display a message if the current debug level is <= DBG_TERSE. +// +// WARNING(msg) +// Display a message if the current debug level is <= DBG_WARNING. +// The message format is: WRN filename (linenumber): message +// +// ERR(msg) +// Similiar to WARNING macro above - displays a message +// if the current debug level is <= DBG_ERROR. +// +// ASSERT(cond) +// Verify a condition is true. If not, force a breakpoint. +// +// ASSERTMSG(cond, msg) +// Verify a condition is true. If not, display a message and +// force a breakpoint. +// +// RIP(msg) +// Display a message and force a breakpoint. +// +// Usage: +// These macros require extra parantheses for the msg argument +// example, ASSERTMSG(x > 0, ("x is less than 0\n")); +// WARNING(("App passed NULL pointer, ignoring...\n")); +// + +#define DBG_VERBOSE 1 +#define DBG_TERSE 2 +#define DBG_WARNING 3 +#define DBG_ERROR 4 +#define DBG_RIP 5 +#define DBG_NONE 6 + +#if DBG + + #define DebugMsg DebugMessage + + // + // Strip the directory prefix from a filename (ANSI version) + // + + PCSTR + StripDirPrefixA( + IN PCSTR pstrFilename + ); + + extern INT giDebugLevel; + + + #define DBGMSG(level, prefix, msg) { \ + if (giDebugLevel <= (level)) { \ + DebugMsg("%s %s (%d): ", prefix, StripDirPrefixA(__FILE__), __LINE__); \ + DebugMsg(msg); \ + } \ + } + + #define DBGPRINT(level, msg) { \ + if (giDebugLevel <= (level)) { \ + DebugMsg(msg); \ + } \ + } + + #define VERBOSE if(giDebugLevel <= DBG_VERBOSE) DebugMsg + #define TERSE if(giDebugLevel <= DBG_TERSE) DebugMsg + #define WARNING if(giDebugLevel <= DBG_WARNING) DebugMsg + #define ERR if(giDebugLevel <= DBG_ERROR) DebugMsg + + #define ASSERT(cond) { \ + if (! (cond)) { \ + RIP(("\n")); \ + } \ + } + + #define ASSERTMSG(cond, msg) { \ + if (! (cond)) { \ + RIP(msg); \ + } \ + } + + #define RIP(msg) { \ + DBGMSG(DBG_RIP, "RIP", msg); \ + DebugBreak(); \ + } + + +#else // !DBG + + #define DebugMsg NOP_FUNCTION + + #define VERBOSE NOP_FUNCTION + #define TERSE NOP_FUNCTION + #define WARNING NOP_FUNCTION + #define ERR NOP_FUNCTION + + #define ASSERT(cond) + + #define ASSERTMSG(cond, msg) + #define RIP(msg) + #define DBGMSG(level, prefix, msg) + #define DBGPRINT(level, msg) + +#endif + + + + +///////////////////////////////////////////////////////// +// ProtoTypes +///////////////////////////////////////////////////////// + +BOOL DebugMessage(LPCSTR, ...); +BOOL DebugMessage(LPCWSTR, ...); +void Dump(PPUBLISHERINFO pPublisherInfo); +void Dump(POEMDMPARAM pOemDMParam); +void Dump(PPROPSHEETUI_INFO pPSUIInfo); +void Dump(POPTITEM pOptItem); +void Dump(POPTTYPE pOptType); +void Dump(POPTPARAM pOptParam, WORD wCount); + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/devmode.cpp b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/devmode.cpp new file mode 100644 index 00000000..1f872cde --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/devmode.cpp @@ -0,0 +1,255 @@ +//+-------------------------------------------------------------------------- +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2005 Microsoft Corporation. All Rights Reserved. +// +// FILE: devmode.cpp +// +// PURPOSE: Implementation of Devmode functions shared with OEM UI and OEM rendering modules. +// +//-------------------------------------------------------------------------- + +#include "precomp.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +BOOL +ConvertOEMDevmode( + _In_ PCOEMDEV pOEMDevIn, + _Inout_ POEMDEV pOEMDevOut + ); + +BOOL +MakeOEMDevmodeValid( + _Out_ POEMDEV pOEMDevmode + ); + +//+--------------------------------------------------------------------------- +// +// Member: +// ::hrOEMDevMode +// +// Synopsis: +// Performs operation on UI Plugins Private DevMode Members. +// Called via IOemUI::DevMode +// +// Returns: +// S_OK or E_FAIL. For more detailed failure info, +// check GetLastError +// +// Last error: +// ERROR_INVALID_PARAMETER +// +// +//---------------------------------------------------------------------------- +HRESULT +hrOEMDevMode( + DWORD dwMode, + // Indicates which operation should be performed + _Inout_ POEMDMPARAM pOemDMParam + // contains various data structures needed by this + // routine. The usage of this struct is determined by + // the dwMode flag. + ) +{ + VERBOSE(DLLTEXT("hrOEMDevMode entry.")); + + HRESULT hr = S_OK; + // Return value. + + // + // Verify parameters. + // + if ((NULL == pOemDMParam) || + ((OEMDM_SIZE != dwMode) && + (OEMDM_DEFAULT != dwMode) && + (OEMDM_CONVERT != dwMode) && + (OEMDM_MERGE != dwMode))) + { + ERR(ERRORTEXT("DevMode() ERROR_INVALID_PARAMETER.\r\n")); + ERR(DLLTEXT("\tdwMode = %d, pOemDMParam = %#lx.\r\n"), dwMode, pOemDMParam); + + SetLastError(ERROR_INVALID_PARAMETER); + hr = E_FAIL; + } + else + { + POEMDEV pOEMDevIn = (POEMDEV) pOemDMParam->pOEMDMIn;; + // Pointer to the supplied OEM devmode data, if applicable + // based on dwMode. + + POEMDEV pOEMDevOut = (POEMDEV) pOemDMParam->pOEMDMOut;; + // Pointer to the DEVMODE data that this routine is + // expected to configure, if applicable based on dwMode. + + switch (dwMode) + { + // + // The Method should return the size of the memory allocation + // needed to store the UI plugin Private DEVMODE. + // + case OEMDM_SIZE: + pOemDMParam->cbBufSize = sizeof(OEMDEV); + break; + + // + //Should fill the Private DEVMODE with the default values. + // + case OEMDM_DEFAULT: + // + //OEM_DMEXTRAHEADER Members + // + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + break; + + // + // The method should convert private DEVMODE members to + // the current version, if necessary. + // + case OEMDM_CONVERT: + ConvertOEMDevmode(pOEMDevIn, pOEMDevOut); + break; + + // + // The method should validate the information contained in private + // DEVMODE members and merge validated values into a private + // DEVMODE structure containing default values + // + case OEMDM_MERGE: + ConvertOEMDevmode(pOEMDevIn, pOEMDevOut); + MakeOEMDevmodeValid(pOEMDevOut); + break; + } + } + + return hr; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// ::ConvertOEMDevmode +// +// Synopsis: +// confirm that the private DEVMODE being passed in is data that +// this driver recognizes, read the settings from the input +// OEM DEVMODE data, and write them to pOEMDevOut. +// +// Returns: +// True unless the routine was called with null pointers +// +// +//---------------------------------------------------------------------------- +BOOL +ConvertOEMDevmode( + _In_ PCOEMDEV pOEMDevIn, + // Caller supplied DEVMODE that we are attempting to read + _Inout_ POEMDEV pOEMDevOut + // OEM private DEVMODE configured by this routine based on the settings + // in pOEMDevIn + ) +{ + VERBOSE(DLLTEXT("ConvertOEMDevmode entry.")); + + if ((NULL == pOEMDevIn) || + (NULL == pOEMDevOut)) + { + ERR(ERRORTEXT("ConvertOEMDevmode() invalid parameters.\r\n")); + return FALSE; + } + + // + // Check OEM Signature, if it doesn't match ours, + // then just assume DMIn is bad and use defaults. + // + if(pOEMDevIn->dmOEMExtra.dwSignature == pOEMDevOut->dmOEMExtra.dwSignature) + { + VERBOSE(DLLTEXT("Converting private OEM Devmode.\r\n")); + + // + // Copy the old structure in to the new using which ever size is the + // smaller. Devmode maybe from newer Devmode (not likely since there + // is only one), or Devmode maybe a newer Devmode, in which case it + // maybe larger, but the first part of the structure should be the same. + // + // DESIGN ASSUMPTION: the private DEVMODE structure only gets added to; + // the fields that are in the DEVMODE never change only new fields get + // added to the end. + // + memcpy(pOEMDevOut, + pOEMDevIn, + __min(pOEMDevOut->dmOEMExtra.dwSize, pOEMDevIn->dmOEMExtra.dwSize)); + + // + // Re-fill in the size and version fields to indicated + // that the DEVMODE is the current private DEVMODE version. + // + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + + // + // If the plug-in is capable of recognizing multiple versions of it's + // private DEVMODE data add custom handling here to support it. + // + } + else + { + WARNING(DLLTEXT("Unknown DEVMODE signature, pOEMDMIn ignored.\r\n")); + + // + // The private DEVMODE data is not something that this plug-in understands, + // so use defaults. + // + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + } + + return TRUE; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// ::MakeOEMDevmodeValid +// +// Synopsis: +// Force the OEM devmode settings to valid values. +// +// Returns: +// True if the OEMDEV was configured, else FALSE. Only return false if +// the parameter is NULL. +// +// +//---------------------------------------------------------------------------- +BOOL +MakeOEMDevmodeValid( + _Out_ POEMDEV pOEMDevmode + // OEM DEVMODE data to modify + ) +{ + if(NULL == pOEMDevmode) + { + return FALSE; + } + + // + // Assumption: pOEMDevmode is large enough to contain OEMDEV structure. + // + pOEMDevmode->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevmode->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevmode->dmOEMExtra.dwVersion = OEM_VERSION; + + return TRUE; +} + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/devmode.h b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/devmode.h new file mode 100644 index 00000000..342ce190 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/devmode.h @@ -0,0 +1,48 @@ +//+-------------------------------------------------------------------------- +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2005 Microsoft Corporation. All Rights Reserved. +// +// FILE: devmode.h +// +// PURPOSE: Define common data types, and external function prototypes +// for devmode functions. +//-------------------------------------------------------------------------- + +#pragma once + +// +// OEM private DEVMODE data structure. This gets included in the DEVMODE +// used by Unidrv. +// +typedef struct tagOEMDEV +{ + OEM_DMEXTRAHEADER dmOEMExtra; + // This structure MUST be prefixed by OEM_DMEXTRAHEADER + + // + // Add private DevMode members here, after the standard header + // information. + // + +} OEMDEV, *POEMDEV; + +typedef const OEMDEV *PCOEMDEV; + + +// +// ProtoTypes +// + +HRESULT +hrOEMDevMode( + DWORD dwMode, + _Inout_ POEMDMPARAM pOemDMParam + ); + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/dllentry.cpp b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/dllentry.cpp new file mode 100644 index 00000000..3160dfb4 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/dllentry.cpp @@ -0,0 +1,82 @@ +//+-------------------------------------------------------------------------- +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2005 Microsoft Corporation. All Rights Reserved. +// +// FILE: dllentry.cpp +// +// PURPOSE: Source module for DLL entry function(s). +// +//-------------------------------------------------------------------------- + +#include "precomp.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + + +//+--------------------------------------------------------------------------- +// +// Member: +// ::DllMain +// +// Synopsis: +// Dll's main routine, called when new +// threads or processes reference the module +// +// Returns: +// TRUE. Currently has no failure paths. Return false if the module +// cannot be properly initialized. +// +// Notes: +// The caller of this routine holds a process-wide lock preventing more +// than one module from being initialized at a time. In general, +// plug-ins should do as little as possible in this routine to avoid +// stalling other threads that may need to load modules. Also, calling +// any function that would, in-turn, cause another module to be loaded +// could result in a deadlock. +// +// +//---------------------------------------------------------------------------- +BOOL +WINAPI DllMain( + HINSTANCE hInst, + WORD wReason, + LPVOID lpReserved + ) +{ + VERBOSE(DLLTEXT("DllMain entry.")); + + UNREFERENCED_PARAMETER(hInst); + UNREFERENCED_PARAMETER(lpReserved); + + switch(wReason) + { + case DLL_PROCESS_ATTACH: + VERBOSE(DLLTEXT("Process attach.\r\n")); + ghInstance = hInst; + break; + + case DLL_THREAD_ATTACH: + VERBOSE(DLLTEXT("Thread attach.\r\n")); + break; + + case DLL_PROCESS_DETACH: + VERBOSE(DLLTEXT("Process detach.\r\n")); + break; + + case DLL_THREAD_DETACH: + VERBOSE(DLLTEXT("Thread detach.\r\n")); + break; + } + + return TRUE; +} + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/intrface.cpp b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/intrface.cpp new file mode 100644 index 00000000..5513741e --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/intrface.cpp @@ -0,0 +1,1151 @@ +//+-------------------------------------------------------------------------- +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2005 Microsoft Corporation. All Rights Reserved. +// +// FILE: Intrface.cpp +// +// PURPOSE: Implementation of interface for PScript5, Unidrv5 UI plug-ins. +// +//-------------------------------------------------------------------------- + +#include "precomp.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +//-------------------------------------------------------------------------- +// Globals +//-------------------------------------------------------------------------- + +HINSTANCE ghInstance = NULL; + // Module's Instance handle from DLLEntry of process. + + +//-------------------------------------------------------------------------- +// Internal Globals +//-------------------------------------------------------------------------- + +static long g_cComponents = 0; + // Count of active components + +static long g_cServerLocks = 0; + // Count of locks + + +//-------------------------------------------------------------------------- +// Class factory for the Plug-In object +//-------------------------------------------------------------------------- +class COemCF : public IClassFactory +{ +public: + + // IUnknown methods + STDMETHOD(QueryInterface) (THIS_ + REFIID riid, + _COM_Outptr_ LPVOID FAR* ppvObj + ); + + STDMETHOD_(ULONG,AddRef) (THIS); + STDMETHOD_(ULONG,Release) (THIS); + + // IClassFactory methods + STDMETHOD(CreateInstance) (THIS_ + _In_opt_ LPUNKNOWN pUnkOuter, + _In_ REFIID riid, + _COM_Outptr_ LPVOID FAR* ppvObject + ); + + STDMETHOD(LockServer) (THIS_ + BOOL bLock + ); + + // Class-specific methods. + COemCF(): m_cRef(1) { }; + + ~COemCF() { }; + +protected: + LONG m_cRef; + +}; + + +//+--------------------------------------------------------------------------- +// +// Member: +// ::DllCanUnloadNow +// +// Synopsis: +// Can the DLL be unloaded from memory? Answers no if any objects are +// still allocated, or if the server has been locked. +// +// To avoid leaving OEM DLL still in memory when Unidrv or Pscript +// drivers are unloaded, Unidrv and Pscript driver ignore the return +// value of DllCanUnloadNow of the OEM DLL, and always call FreeLibrary +// on the OEMDLL. +// +// If the plug-in spins off a working thread that also uses this DLL, +// the thread needs to call LoadLibrary and FreeLibraryAndExitThread, +// otherwise it may crash after Unidrv or Pscript calls FreeLibrary. +// +// Returns: +// S_OK if the DLL can be unloaded safely, otherwise S_FALSE +// +// +//---------------------------------------------------------------------------- +STDAPI DllCanUnloadNow() +{ + if ((g_cComponents == 0) && (g_cServerLocks == 0)) + { + return S_OK; + } + else + { + return S_FALSE; + } +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// ::DllGetClassObject +// +// Synopsis: +// Retrieve the class factory object for the indicated class. +// +// Returns: +// CLASS_E_CLASSNOTAVAILABLE, E_OUTOFMEMORY, or S_OK. +// +// Notes: +// +// +//---------------------------------------------------------------------------- +STDAPI +DllGetClassObject( + _In_ CONST CLSID& clsid, + // GUID of the class object that the caller wants a class factory + // for + _In_ CONST IID& iid, + // Interface ID to provide in ppv + _Outptr_ VOID** ppv + // out pointer to the interface requested. + ) +{ + VERBOSE(DLLTEXT("DllGetClassObject:Create class factory.")); + + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // + // Can we create this component? + // + if (clsid != CLSID_OEMUI) + { + return CLASS_E_CLASSNOTAVAILABLE; + } + + // + // Create class factory. + // Reference count set to 1 in Constructor + // + COemCF* pUIReplacementCF = new COemCF; + if (pUIReplacementCF == NULL) + { + return E_OUTOFMEMORY; + } + + // + // Get requested interface. + // + HRESULT hr = pUIReplacementCF->QueryInterface(iid, ppv); + pUIReplacementCF->Release(); + + return hr; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// COemCF::QueryInterface +// +// Synopsis: +// Standard COM IUnknown implementation. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemCF::QueryInterface( + CONST IID& iid, + _COM_Outptr_ VOID** ppv + ) +{ + VERBOSE(DLLTEXT("COemCF::QueryInterface entry.")); + + if ((iid == IID_IUnknown) || (iid == IID_IClassFactory)) + { + *ppv = static_cast<COemCF*>(this); + } + else + { + *ppv = NULL; + return E_NOINTERFACE; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef(); + return S_OK; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// COemCF::AddRef +// +// Synopsis: +// Standard COM IUnknown implementation. +// +// +//---------------------------------------------------------------------------- +ULONG __stdcall +COemCF::AddRef() +{ + return InterlockedIncrement(&m_cRef); +} + +//+--------------------------------------------------------------------------- +// +// Member: +// COemCF::Release +// +// Synopsis: +// Standard COM IUnknown implementation. +// +// +//---------------------------------------------------------------------------- +ULONG __stdcall +COemCF::Release() +{ + assert(0 != m_cRef); + + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + } + return cRef; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// COemCF::CreateInstance +// +// Synopsis: +// Attempt to create an object that implements the specified interface. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemCF::CreateInstance( + _In_opt_ IUnknown* pUnknownOuter, + _In_ CONST IID& iid, + _COM_Outptr_ VOID** ppv + ) +{ + VERBOSE(DLLTEXT("COemCF::CreateInstance entry.")); + + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // + // Cannot aggregate. + // + if (pUnknownOuter != NULL) + { + return CLASS_E_NOAGGREGATION; + } + + HRESULT hr = S_OK; + + if (iid == IID_IUnknown || + iid == IID_IPrintOemUI2) + { + VERBOSE(DLLTEXT("COemCF::IID_IUnknown\r\n")); + + // + // Create component. + // + COemUI2* pOemCB = new COemUI2; + if (pOemCB == NULL) + { + hr = E_OUTOFMEMORY; + } + else + { + // + // Get the requested interface. + // + hr = pOemCB->QueryInterface(iid, ppv); + + // + // Release the IUnknown pointer. + // (If QueryInterface failed, component will delete itself.) + // + pOemCB->Release(); + } + } + else + { + hr = E_NOINTERFACE; + } + + return hr; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// COemCF::LockServer +// +// Synopsis: +// Locking the server holds the objects server in memory, so that new +// instances of objects can be created more quickly. +// +// Returns: +// S_OK +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemCF::LockServer( + BOOL bLock + // If true, increment the lock count, otherwise decrement the lock + // count. + ) +{ + if (bLock) + { + InterlockedIncrement(&g_cServerLocks); + } + else + { + InterlockedDecrement(&g_cServerLocks); + } + + return S_OK; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2 (destructor) +// +// Synopsis: +// Release the helper interface, as well as any other resources that +// the plug-in is holding onto. +// +// Returns: +// +// Notes: +// +// +//---------------------------------------------------------------------------- +COemUI2::~COemUI2() +{ + // + // Make sure that helper interface is released. + // + if(NULL != m_pCoreHelper) + { + m_pCoreHelper->Release(); + m_pCoreHelper = NULL; + } + + // + // If this instance of the object is being deleted, then the reference + // count should be zero. + // + assert(0 == m_cRef); +} + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2::QueryInterface +// +// Synopsis: +// Standard COM IUnknown implementation. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemUI2::QueryInterface( + CONST IID& iid, + _COM_Outptr_ VOID** ppv + ) +{ + VERBOSE(DLLTEXT("COemUI2::QueryInterface entry.")); + + if (iid == IID_IUnknown) + { + *ppv = static_cast<IUnknown*>(this); + VERBOSE(DLLTEXT("COemUI2::QueryInterface - Return pointer to IUnknown.\r\n")); + } + else if (iid == IID_IPrintOemUI2) + { + *ppv = static_cast<IPrintOemUI2*>(this); + VERBOSE(DLLTEXT("COemUI2::QueryInterface - Return pointer to IPrintOemUI.\r\n")); + } + else + { +#if DBG + TCHAR szOutput[80] = {0}; + StringFromGUID2(iid, szOutput, _countof(szOutput)); // can not fail! + VERBOSE(DLLTEXT("COemUI2::QueryInterface %s not supported.\r\n"), szOutput); +#endif + + *ppv = NULL; + return E_NOINTERFACE; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef(); + return S_OK; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2::AddRef +// +// Synopsis: +// Standard COM IUnknown implementation. +// +// +//---------------------------------------------------------------------------- +ULONG __stdcall +COemUI2::AddRef() +{ + VERBOSE(DLLTEXT("COemUI2::AddRef entry.")); + + return InterlockedIncrement(&m_cRef); +} + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2::Release +// +// Synopsis: +// Standard COM IUnknown implementation. +// +// +//---------------------------------------------------------------------------- +ULONG __stdcall +COemUI2::Release() +{ + VERBOSE(DLLTEXT("COemUI2::Release entry.")); + + assert(0 != m_cRef); + + ULONG cRef = InterlockedDecrement(&m_cRef); + + if (0 == cRef) + { + delete this; + return 0; + + } + + return cRef; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2::PublishDriverInterface +// +// Synopsis: +// This routine is called by the core driver to supply objects to the +// plug-in which the plug-in can use to implement various features. +// +// This implementation requires an object that IPrintCoreHelper interface +// from the core driver to implement full UI replacement. If the object +// passed in is the one desired, this routine will return S_OK, otherwise +// it will return E_FAIL. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemUI2::PublishDriverInterface( + IUnknown *pIUnknown + ) +{ + VERBOSE(DLLTEXT("COemUI2::PublishDriverInterface entry.")); + + HRESULT hrResult = S_OK; + + // + // Determine whether the published object is the helper interface + // introduced in Vista to support full UI replacement. + // + if (m_pCoreHelper == NULL) + { + hrResult = pIUnknown->QueryInterface(IID_IPrintCoreHelper, (VOID**) &(m_pCoreHelper)); + + if (!SUCCEEDED(hrResult)) + { + m_pCoreHelper = NULL; + hrResult = E_FAIL; + } + } + + return hrResult; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2::GetInfo +// +// Synopsis: +// Most of this routine is a standard implementation common to most +// plug-ins. Of particular note in this sample is that to get a handle +// the IPrintCoreHelper plug-in in the PublishDriverInterface callback, +// this routine must return OEMPUBLISH_IPRINTCOREHELPER in the out +// parameter when the mode is OEMGI_GETREQUESTEDHELPERINTERFACES. +// +// Returns: +// S_OK for supported modes, E_FAIL for everything else. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemUI2::GetInfo( + _In_ DWORD dwMode, + // The mode indicates what information is being requested by the + // core driver. + _Out_writes_bytes_to_(cbSize, *pcbNeeded) PVOID pBuffer, + // The output buffer is the location into which the requested info + // should be written + _In_ DWORD cbSize, + // The size of the output buffer. + _Out_ PDWORD pcbNeeded + // If the size of the buffer is insufficient, use this parameter + // to indicate to the core driver how much space is required. + ) +{ + HRESULT hrResult = S_OK; + +#if DBG + PWSTR pszTag; + + switch(dwMode) + { + case OEMGI_GETSIGNATURE: pszTag = L"COemUI2::GetInfo entry. [OEMGI_GETSIGNATURE]"; break; + case OEMGI_GETVERSION: pszTag = L"COemUI2::GetInfo entry. [OEMGI_GETVERSION]"; break; + case OEMGI_GETREQUESTEDHELPERINTERFACES: pszTag = L"COemUI2::GetInfo entry. [OEMGI_GETREQUESTEDHELPERINTERFACES]"; break; + default: pszTag = L"COemUI2::GetInfo entry."; break; + } + + VERBOSE(pszTag); +#endif + + // + // Validate parameters. OEMGI_GETPUBLISHERINFO is excluded from this + // list because that GetInfo mode applies only to PScript rendering plug-ins. + // + if ((NULL == pcbNeeded) || + ((OEMGI_GETSIGNATURE != dwMode) && + (OEMGI_GETVERSION != dwMode) && + (OEMGI_GETREQUESTEDHELPERINTERFACES != dwMode))) + { + WARNING(DLLTEXT("COemUI2::GetInfo() exit pcbNeeded is NULL or mode is not supported\r\n")); + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // + // Set expected buffer size and number of bytes written. + // + *pcbNeeded = sizeof(DWORD); + + // + // Check buffer size is sufficient. + // + if((cbSize < *pcbNeeded) || (NULL == pBuffer)) + { + WARNING(DLLTEXT("COemUI2::GetInfo() exit insufficient buffer!\r\n")); + SetLastError(ERROR_INSUFFICIENT_BUFFER); + hrResult = E_FAIL; + } + else + { + switch(dwMode) + { + // + // OEM DLL Signature + // + case OEMGI_GETSIGNATURE: + *(PDWORD)pBuffer = OEM_SIGNATURE; + break; + + // + // OEM DLL version + // + case OEMGI_GETVERSION: + *(PDWORD)pBuffer = OEM_VERSION; + break; + + // + // New core helper interface support + // + case OEMGI_GETREQUESTEDHELPERINTERFACES: + *(PDWORD)pBuffer = 0; + *(PDWORD)pBuffer |= OEMPUBLISH_IPRINTCOREHELPER; + break; + + // + // dwMode not supported. + // + default: + // Set written bytes to zero since nothing was written. + // + WARNING(DLLTEXT("COemUI2::GetInfo() exit mode not supported.\r\n")); + *pcbNeeded = 0; + SetLastError(ERROR_NOT_SUPPORTED); + hrResult = E_FAIL; + } + } + + return hrResult; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2::DevMode +// +// Synopsis: +// This routine operates in various modes to manage the private DEVMODE. +// This sample does not provide much by way of illustration of how to +// handle OEM settings in the private DEVMODE. See the sample OEMUI for +// a more in-depth look at this routine. The function hrOEMDevMode in +// devmode.cpp also provides more information on how to handle the various +// modes. +// +// Returns: +// S_OK on success, else E_* +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemUI2::DevMode( + DWORD dwMode, + // The operation that should be performed + POEMDMPARAM pOemDMParam + // The input & output DEVMODEs, including pointers to the public & + // private DEVMODE data. + ) +{ + VERBOSE(DLLTEXT("COemUI2::Devmode entry.")); + + return hrOEMDevMode(dwMode, pOemDMParam); +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2::HideStandardUI +// +// Synopsis: +// This routine is critical to supporting full UI replacement. This +// routine allows the plug-in to disable Unidrv's (or PScript's) standard +// UI panels. If this returns E_NOTIMPL, the panel isn't hidden. If +// this routine returns S_OK, Unidrv will not display any UI for the +// specified mode. If this returns E_NOTIMPL, Unidrv will display it's +// standard UI. +// +// Returns: +// S_OK to hide the indicated UI if desired, otherwise E_NOTIMPL. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemUI2::HideStandardUI( + DWORD dwMode + // document property sheets, printer property sheets, or possibly + // something not yet defined. + ) +{ + VERBOSE(DLLTEXT("COemUI2::HideStandardUI entry.")); + + HRESULT hrResult = E_NOTIMPL; + + switch(dwMode) + { + case OEMCUIP_DOCPROP: + case OEMCUIP_PRNPROP: + hrResult = S_OK; + break; + default: + // If we don't recognize the mode, assume that we don't want to hide + // the UI provided by Unidrv. + hrResult = E_NOTIMPL; + } + + return hrResult; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2::DocumentPropertySheets +// +// Synopsis: +// See function hrOEMDocumentPropertySheets in uniuirep.cpp. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemUI2::DocumentPropertySheets( + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam + ) +{ + VERBOSE(DLLTEXT("COemUI2::DocumentPropertySheets entry.")); + + return hrCommonPropSheetMethod(pPSUIInfo, lParam, m_pCoreHelper, &m_Features, OEMCUIP_DOCPROP); +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2::DevicePropertySheets +// +// Synopsis: +// See function hrOEMDevicePropertySheets in uniuirep.cpp +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemUI2::DevicePropertySheets( + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam + ) +{ + VERBOSE(DLLTEXT("COemUI2::DevicePropertySheets entry.")); + + return hrCommonPropSheetMethod(pPSUIInfo, lParam, m_pCoreHelper, &m_Features, OEMCUIP_PRNPROP); +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2::CommonUIProp +// +// Synopsis: +// This routine is used to interact with the Unidrv-supplied +// property sheet pages. Since this plug-in implements full-UI +// replacement, those property sheet pages are disabled, and this +// routine does not need to do anything. +// +// Returns: +// S_OK +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemUI2::CommonUIProp( + DWORD dwMode, + POEMCUIPPARAM pOemCUIPParam + ) +{ + VERBOSE(DLLTEXT("COemUI2::CommonUIProp entry.")); + + UNREFERENCED_PARAMETER(dwMode); + UNREFERENCED_PARAMETER(pOemCUIPParam); + + return S_OK; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2::DeviceCapabilities +// +// Synopsis: +// This routine can be used to replace the Unidrvs device capabilities +// handling. In this implementation, no custom capabilities handling is +// provided. +// +// Returns: +// E_FAIL +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemUI2::DeviceCapabilities( + _Inout_ POEMUIOBJ poemuiobj, + // OEM settings & information + _In_ HANDLE hPrinter, + // Handle to the printer that the capabilities are being requested for + _In_ PWSTR pDeviceName, + // Name of the device / driver + _In_ WORD wCapability, + // The DC_ ID indicating which capability was requested. + _Out_writes_(_Inexpressible_("varies with wCapability")) PVOID pOutput, + // Buffer to write requested information to. + _In_ PDEVMODE pPublicDM, + // Pointer to the public DEVMODE representing the settings to get + // capabilities with respect to. + _In_ PVOID pOEMDM, + // OEM private DEVMODE settings. + _In_ DWORD dwOld, + // Result from previous plug-in call to this routine. + _Out_ DWORD *dwResult + // Result of this call. If there are multiple UI plug-ins, this + // result is passed to the next one as dwOld + ) +{ + VERBOSE(DLLTEXT("COemUI2::DeviceCapabilities entry.")); + + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(pDeviceName); + UNREFERENCED_PARAMETER(wCapability); + UNREFERENCED_PARAMETER(pOutput); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + UNREFERENCED_PARAMETER(dwOld); + UNREFERENCED_PARAMETER(dwResult); + + // + // Do nothing. Let Unidrv handle the device capabilities processing. + // + + return E_NOTIMPL; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2::DevQueryPrintEx +// +// Synopsis: +// This routine is used to determine print job compatibility with the +// current driver. The plug-in can supplement Unidrv's handling of this +// routine. If Unidrv determines that a job can be printed on the current +// printer it will call this routine to ask the plug-in whether it can +// also handle the current job. If Unidrv determines that the job cannot +// be printed, it will not call the plug-in. Additionally, XPS drivers +// built on the Unidrv and PScript UI modules may not recieve this call- +// back. +// +// Implementation of this routine is optional. To indicate that the +// plug-in does not support this call, return E_NOTIMPL. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemUI2::DevQueryPrintEx( + POEMUIOBJ poemuiobj, + PDEVQUERYPRINT_INFO pDQPInfo, + PDEVMODE pPublicDM, + PVOID pOEMDM + ) +{ + VERBOSE(DLLTEXT("COemUI2::DevQueryPrintEx entry.")); + + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(pDQPInfo); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + + return E_NOTIMPL; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2::UpgradePrinter +// +// Synopsis: +// Use this callback to upgrade any settings from previous versions +// that are stored in the registry by the plug-in Not applicabe to +// this sample. +// +// Implementation of this routine is optional. To indicate that the +// plug-in does not support this call, return E_NOTIMPL. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemUI2::UpgradePrinter( + _In_ DWORD dwLevel, + _At_((PDRIVER_UPGRADE_INFO_1)pDriverUpgradeInfo, _In_) PBYTE pDriverUpgradeInfo + ) +{ + VERBOSE(DLLTEXT("COemUI2::UpgradePrinter entry.")); + + UNREFERENCED_PARAMETER(dwLevel); + UNREFERENCED_PARAMETER(pDriverUpgradeInfo); + + return E_NOTIMPL; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2::PrinterEvent +// +// Synopsis: +// Perform any special processing needed when various events occur to the +// print queue. +// +// Implementation of this routine is optional. To indicate that the +// plug-in does not support this call, return E_NOTIMPL. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemUI2::PrinterEvent( + _In_ PWSTR pPrinterName, + _In_ INT iDriverEvent, + _In_ DWORD dwFlags, + _In_ LPARAM lParam + ) +{ + VERBOSE(DLLTEXT("COemUI2::PrinterEvent entry.")); + + UNREFERENCED_PARAMETER(pPrinterName); + UNREFERENCED_PARAMETER(iDriverEvent); + UNREFERENCED_PARAMETER(dwFlags); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2::DriverEvent +// +// Synopsis: +// Notifies the plug-in of changes or events relevant to the driver, +// such as installing and upgrading. +// +// Implementation of this routine is optional. To indicate that the +// plug-in does not support this call, return E_NOTIMPL. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemUI2::DriverEvent( + _In_ DWORD dwDriverEvent, + _In_ DWORD dwLevel, + _In_reads_(_Inexpressible_("varies")) LPBYTE pDriverInfo, + _In_ LPARAM lParam + ) +{ + VERBOSE(DLLTEXT("COemUI2::DriverEvent entry.")); + + UNREFERENCED_PARAMETER(dwDriverEvent); + UNREFERENCED_PARAMETER(dwLevel); + UNREFERENCED_PARAMETER(pDriverInfo); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +}; + + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2::QueryColorProfile +// +// Synopsis: +// This routine can be implemented to provide a color profile from the +// driver. +// +// Implementation of this routine is optional. To indicate that the +// plug-in does not support this call, return E_NOTIMPL. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemUI2::QueryColorProfile( + HANDLE hPrinter, + POEMUIOBJ poemuiobj, + PDEVMODE pPublicDM, + PVOID pOEMDM, + ULONG ulQueryMode, + VOID *pvProfileData, + ULONG *pcbProfileData, + FLONG *pflProfileData + ) +{ + VERBOSE(DLLTEXT("COemUI2::QueryColorProfile entry.")); + + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + UNREFERENCED_PARAMETER(ulQueryMode); + UNREFERENCED_PARAMETER(pvProfileData); + UNREFERENCED_PARAMETER(pcbProfileData); + UNREFERENCED_PARAMETER(pflProfileData); + + return E_NOTIMPL; +}; + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2::FontInstallerDlgProc +// +// Synopsis: +// Plug-ins can use this method to replace Unidrv's provided soft-font +// installer dialog. +// +// Implementation of this routine is optional. To indicate that the +// plug-in does not support this call, return E_NOTIMPL. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemUI2::FontInstallerDlgProc( + HWND hWnd, + UINT usMsg, + WPARAM wParam, + LPARAM lParam + ) +{ + VERBOSE(DLLTEXT("COemUI2::FontInstallerDlgProc entry.")); + + UNREFERENCED_PARAMETER(hWnd); + UNREFERENCED_PARAMETER(usMsg); + UNREFERENCED_PARAMETER(wParam); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +}; + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2::UpdateExternalFonts +// +// Synopsis: +// This routine is used to notify the UI of any changes to installed +// font cartridges, primarily for supporting soft-font UI replacement. +// +// Implementation of this routine is optional. To indicate that the +// plug-in does not support this call, return E_NOTIMPL. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemUI2::UpdateExternalFonts( + _In_ HANDLE hPrinter, + _In_ HANDLE hHeap, + _In_ PWSTR pwstrCartridges + ) +{ + VERBOSE(DLLTEXT("COemUI2::UpdateExternalFonts entry.")); + + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(hHeap); + UNREFERENCED_PARAMETER(pwstrCartridges); + + return E_NOTIMPL; +} + +//+--------------------------------------------------------------------------- +// +// Member: +// +// Synopsis: +// +// Implementation of this routine is optional. To indicate that the +// plug-in does not support this call, return E_NOTIMPL. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemUI2::QueryJobAttributes( + _In_ HANDLE hPrinter, + _In_ PDEVMODE pDevmode, + _In_range_(1, 4) DWORD dwLevel, + _In_reads_(_Inexpressible_("varies")) LPBYTE lpAttributeInfo + ) +{ + VERBOSE(DLLTEXT("COemUI2::QueryJobAttributes entry.")); + + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(pDevmode); + UNREFERENCED_PARAMETER(dwLevel); + UNREFERENCED_PARAMETER(lpAttributeInfo); + + return E_NOTIMPL; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// COemUI2::DocumentEvent +// +// Synopsis: +// Perform any special processing needed at various points in time while +// a job is printing. +// +// Implementation of this routine is optional. To indicate that the +// plug-in does not support this call, return E_NOTIMPL. +// +// +//---------------------------------------------------------------------------- +HRESULT __stdcall +COemUI2::DocumentEvent( + HANDLE hPrinter, + HDC hdc, + INT iEsc, + ULONG cbIn, + PVOID pbIn, + ULONG cbOut, + PVOID pbOut, + PINT piResult + ) +{ + VERBOSE(DLLTEXT("COemUI2::DocumentEvent entry.")); + + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(hdc); + UNREFERENCED_PARAMETER(iEsc); + UNREFERENCED_PARAMETER(cbIn); + UNREFERENCED_PARAMETER(pbIn); + UNREFERENCED_PARAMETER(cbOut); + UNREFERENCED_PARAMETER(pbOut); + UNREFERENCED_PARAMETER(piResult); + + return E_NOTIMPL; +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/intrface.h b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/intrface.h new file mode 100644 index 00000000..09a61f4a --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/intrface.h @@ -0,0 +1,222 @@ +//+-------------------------------------------------------------------------- +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2005 Microsoft Corporation. All Rights Reserved. +// +// FILE: Intrface.h +// +// PURPOSE: Define COM interface for User Mode Printer Customization DLL. +// +//-------------------------------------------------------------------------- + +#pragma once + +/////////////////////////////////////// +// Globals +/////////////////////////////////////// + +extern HINSTANCE ghInstance; + // Module's Instance handle from DLLEntry of process. + +class COemUI2: public IPrintOemUI2 +{ +public: + // + // *** IUnknown methods *** + // + + STDMETHOD(QueryInterface) (THIS_ REFIID riid, _COM_Outptr_ LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + STDMETHOD_(ULONG,Release) (THIS); + + // + // Method for publishing Driver interface. + // + STDMETHOD(PublishDriverInterface)(THIS_ IUnknown *pIUnknown); + + // + // Get OEM dll related information + // + STDMETHOD(GetInfo) (THIS_ + _In_ DWORD dwMode, + _Out_writes_bytes_to_(cbSize, *pcbNeeded) PVOID pBuffer, + _In_ DWORD cbSize, + _Out_ PDWORD pcbNeeded); + + // + // OEMDevMode + // + STDMETHOD(DevMode) (THIS_ DWORD dwMode, POEMDMPARAM pOemDMParam); + + // + // OEMCommonUIProp + // + STDMETHOD(CommonUIProp) (THIS_ + DWORD dwMode, + POEMCUIPPARAM pOemCUIPParam + ); + + // + // OEMDocumentPropertySheets + // + STDMETHOD(DocumentPropertySheets) (THIS_ + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam + ); + + // + // OEMDevicePropertySheets + // + STDMETHOD(DevicePropertySheets) (THIS_ + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam + ); + + + // + // OEMDevQueryPrintEx + // + STDMETHOD(DevQueryPrintEx) (THIS_ + POEMUIOBJ poemuiobj, + PDEVQUERYPRINT_INFO pDQPInfo, + PDEVMODE pPublicDM, + PVOID pOEMDM + ); + + // + // OEMDeviceCapabilities + // + STDMETHOD(DeviceCapabilities) (THIS_ + _Inout_ POEMUIOBJ poemuiobj, + _In_ HANDLE hPrinter, + _In_ PWSTR pDeviceName, + _In_ WORD wCapability, + _Out_writes_(_Inexpressible_("varies with wCapability")) PVOID pOutput, + _In_ PDEVMODE pPublicDM, + _In_ PVOID pOEMDM, + _In_ DWORD dwOld, + _Out_ DWORD *dwResult + ); + + // + // OEMUpgradePrinter + // + STDMETHOD(UpgradePrinter) (THIS_ + _In_ DWORD dwLevel, + _At_((PDRIVER_UPGRADE_INFO_1)pDriverUpgradeInfo, _In_) PBYTE pDriverUpgradeInfo + ); + + // + // OEMPrinterEvent + // + STDMETHOD(PrinterEvent) (THIS_ + _In_ PWSTR pPrinterName, + _In_ INT iDriverEvent, + _In_ DWORD dwFlags, + _In_ LPARAM lParam + ); + + // + // OEMDriverEvent + // + STDMETHOD(DriverEvent)(THIS_ + _In_ DWORD dwDriverEvent, + _In_ DWORD dwLevel, + _In_reads_(_Inexpressible_("varies")) LPBYTE pDriverInfo, + _In_ LPARAM lParam + ); + + // + // OEMQueryColorProfile + // + STDMETHOD( QueryColorProfile) (THIS_ + HANDLE hPrinter, + POEMUIOBJ poemuiobj, + PDEVMODE pPublicDM, + PVOID pOEMDM, + ULONG ulReserved, + VOID *pvProfileData, + ULONG *pcbProfileData, + FLONG *pflProfileData); + + // + // OEMFontInstallerDlgProc + // + STDMETHOD(FontInstallerDlgProc) (THIS_ + HWND hWnd, + UINT usMsg, + WPARAM wParam, + LPARAM lParam + ); + // + // UpdateExternalFonts + // + STDMETHOD(UpdateExternalFonts) (THIS_ + _In_ HANDLE hPrinter, + _In_ HANDLE hHeap, + _In_ PWSTR pwstrCartridges + ); + + // + // IPrintOemUI2 methods + // + + // + // QueryJobAttributes + // + STDMETHOD(QueryJobAttributes) (THIS_ + _In_ HANDLE hPrinter, + _In_ PDEVMODE pDevmode, + _In_range_(1, 4) DWORD dwLevel, + _In_reads_(_Inexpressible_("varies")) LPBYTE lpAttributeInfo + ); + + // + // Hide Standard UI + // + STDMETHOD(HideStandardUI) (THIS_ + DWORD dwMode + ); + + // + // DocumentEvent + // + STDMETHOD(DocumentEvent) (THIS_ + HANDLE hPrinter, + HDC hdc, + INT iEsc, + ULONG cbIn, + PVOID pbIn, + ULONG cbOut, + PVOID pbOut, + PINT piResult + ); + + COemUI2() + { + m_cRef = 1; + m_pCoreHelper = NULL; + }; + + virtual ~COemUI2(); + +protected: + + LONG m_cRef; + // reference count of this object + + IPrintCoreHelper* m_pCoreHelper; + // Pointer to the helper interface introduced in Windows Vista. + + CFeatureCollection m_Features; + // Collection of features advertised as supported by the helper + // interface. +}; + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/precomp.h b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/precomp.h new file mode 100644 index 00000000..cf24303c --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/precomp.h @@ -0,0 +1,68 @@ +//+-------------------------------------------------------------------------- +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2005 Microsoft Corporation. All Rights Reserved. +// +// FILE: precomp.h +// +// PURPOSE: Header files that should be in the precompiled header. +// +//-------------------------------------------------------------------------- + +#pragma once + +// Necessary for compiling under VC. +#if(!defined(WINVER) || (WINVER < 0x0500)) + #undef WINVER + #define WINVER 0x0500 +#endif +#if(!defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500)) + #undef _WIN32_WINNT + #define _WIN32_WINNT 0x0500 +#endif + + +// Required header files that shouldn't change often. + + +#include <STDDEF.H> +#include <STDLIB.H> +#include <OBJBASE.H> +#include <STDARG.H> +#include <STDIO.H> +#include <INITGUID.H> +#include <WINDOWS.H> + +#include <WINDEF.H> +#include <WINERROR.H> +#include <WINBASE.H> +#include <WINGDI.H> +#include <commctrl.h> +#include <WINDDI.H> +#include <WINSPOOL.H> +#include <TCHAR.H> +#include <EXCPT.H> +#include <ASSERT.H> +#include <PRSHT.H> +#include <COMPSTUI.H> +#include <WINDDIUI.H> +#include <PRINTOEM.H> +#include <prcomoem.h> + +#include "resource.h" +#include "devmode.h" +#include "Features.h" +#include "uniuirep.h" +#include "debug.h" +#include "intrface.h" + +#include <intsafe.h> + +// Include this file after any other standard include files +// to disallow unsafe string handling functions. +#include <STRSAFE.H> + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/precompsrc.cpp b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/precompsrc.cpp new file mode 100644 index 00000000..5944cf51 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/precompsrc.cpp @@ -0,0 +1 @@ +#include "precomp.h"
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/resource.h b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/resource.h new file mode 100644 index 00000000..d7eda884 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/resource.h @@ -0,0 +1,57 @@ +//+-------------------------------------------------------------------------- +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2005 Microsoft Corporation. All Rights Reserved. +// +// Used by uirepplug.rc. Keep this in sync with the definitions in that file. +// +//-------------------------------------------------------------------------- + +// +//{{NO_DEPENDENCIES}} +// +#define IDS_SECTION 1 +#define IDS_NAME 3 +#define IDS_DEVICE_SETTINGS_NAME 4 +#define IDS_CONSTRAINT_CONFLICT 5 +#define IDD_DOC_PROPPAGE 107 +#define IDS_METAFILE_SPOOLING 419 +#define IDS_TEXT_ASGRX 431 +#define IDS_TTDL_DEFAULT 460 +#define IDS_TTDL_TYPE1 461 +#define IDS_TTDL_TYPE3 462 +#define IDS_TTDL_TYPE42 463 +#define IDS_MISSINGNAME 464 +#define IDS_RESDLL 700 +#define IDS_GRAPHICS_MODE 701 +#define IDS_DUPLEX_UNIT 702 +#define IDS_UNIRESDLL 707 +#define IDS_RESOLUTION_600_DPI 708 +#define IDS_RESOLUTION_300_DPI 709 +#define IDS_RESOLUTION_150_DPI 710 +#define IDS_RASTERMODE 711 +#define IDS_HPGL2MODE 712 +#define IDS_PAPERSIZE_LETTER 713 +#define IDS_PAPERSIZE_LEGAL 714 +#define IDS_PAPERSIZE_EXECUTIVE 715 +#define IDS_PAPERSIZE_A4 716 +#define IDS_PAPERSIZE_B5 717 +#define IDS_COLORMODE_MONO 718 +#define IDS_COLORMODE_24BPP 719 +#define IDS_COLORMODE_8BPP 720 +#define IDS_HALFTONE_AUTO 721 +#define IDS_HALFTONE_SUPERCELL_M 722 +#define IDS_HALFTONE_6x6_M 723 +#define IDS_HALFTONE_8x8_M 724 +#define IDS_UIREP_ENVTRAY 728 +#define IDS_OUTBIN_STACKER 735 +#define IDS_OUTBIN_DEFAULT 736 +#define IDS_MEMORY_STD 737 +#define IDS_MEMORY_UPGRADE 738 +#define IDS_INSTALLED_MEMORY 739 + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/uniuirep.cpp b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/uniuirep.cpp new file mode 100644 index 00000000..d75e3215 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/uniuirep.cpp @@ -0,0 +1,492 @@ +//+-------------------------------------------------------------------------- +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2005 Microsoft Corporation. All Rights Reserved. +// +// FILE: uniuirep.cpp +// +// PURPOSE: This module handles COMPSTUI initialization and +// callback behavior. +// +//-------------------------------------------------------------------------- + + +#include "precomp.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +//////////////////////////////////////////////////////// +// INTERNAL MACROS and DEFINES +//////////////////////////////////////////////////////// + +typedef struct _tagCBUserData +{ + HANDLE hComPropSheet; + HANDLE hPropPage; + POEMUIPSPARAM pOEMUIParam; + PFNCOMPROPSHEET pfnComPropSheet; + IPrintCoreHelper* pHelper; + BOOL bPermission; + +} CBUSERDATA, *PCBUSERDATA; + + +//////////////////////////////////////////////////////// +// INTERNAL PROTOTYPES +//////////////////////////////////////////////////////// + +LONG APIENTRY +OEMCommonUICallBack( + _In_ PCPSUICBPARAM pCallbackParam + ); + +POPTITEM +CreateOptItems( + HANDLE hHeap, + DWORD dwOptItems + ); + + +//+--------------------------------------------------------------------------- +// +// Member: +// ::hrCommonPropSheetMethod +// +// Synopsis: +// Adds property page to printer property sheet. +// +// Returns: +// S_OK on success, E_FAIL on failure. Sets LastError. +// +// +//---------------------------------------------------------------------------- +HRESULT +hrCommonPropSheetMethod( + PPROPSHEETUI_INFO pPSUIInfo, + // Property sheet information, including + // the reason for calling this function. + LPARAM lParam, + // Optional parameter. Value is determined + // by the reason member of pPSUIInfo. + IPrintCoreHelper* pHelper, + // Pointer to the helper interface used to control + // settings described in the GPD + CFeatureCollection* pFeatures, + // Collection of all features that we're supporting + // in our custom UI. + DWORD dwMode + // Should our sheet show device or document features? + ) +{ + LONG_PTR lResult = TRUE; + // result supplied to COMPSTUI via pPSUIInfo + + HRESULT hrResult = S_OK; + // Result returned to the immediate caller. + + VERBOSE(DLLTEXT("hrCommonPropSheetMethod entry.")); + + // + // Validate parameters. + // + if ((NULL == pPSUIInfo) || + (PROPSHEETUI_INFO_VERSION != pPSUIInfo->Version)) + { + ERR(ERRORTEXT("hrCommonPropSheetMethod() ERROR_INVALID_PARAMETER.\r\n")); + + // + // Return invalid parameter error. + // + SetLastError(ERROR_INVALID_PARAMETER); + hrResult = E_FAIL; + goto Exit; + } + + Dump(pPSUIInfo); + + // + // Do action. + // + switch(pPSUIInfo->Reason) + { + case PROPSHEETUI_REASON_INIT: + { + WORD wFeatures = 0; + DWORD dwSheets = 0; + PCBUSERDATA pUserData = NULL; + POEMUIPSPARAM pOEMUIParam = (POEMUIPSPARAM)pPSUIInfo->lParamInit; + BOOL bPermission = 0; + HANDLE hHeap = pOEMUIParam->hOEMHeap; + COMPROPSHEETUI Sheet; + + // + // If the user doesn't have permission to change settings, + // make a note of it so we can disable controls later. + // + if (dwMode == OEMCUIP_PRNPROP) + { + bPermission = ((pOEMUIParam->dwFlags & DPS_NOPERMISSION)==0); + } + else + { + bPermission = ((pOEMUIParam->dwFlags & DM_NOPERMISSION)==0); + } + + // + // Make sure that we have the core driver features + // + hrResult = pFeatures->Acquire(hHeap, pHelper); + if (!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("hrCommonPropSheetMethod: Failed to load core driver features! (hrResult = 0x%x)\r\n"), + hrResult); + goto Exit; + } + + // + // Wait until after the call to Acquire to read the number of features. + // + wFeatures = (WORD)pFeatures->GetCount(dwMode); + + // + // Init device settings replacement page + // + memset(&Sheet, 0, sizeof(COMPROPSHEETUI)); + Sheet.cbSize = sizeof(COMPROPSHEETUI); + Sheet.Flags = bPermission ? CPSUIF_UPDATE_PERMISSION : 0; + Sheet.hInstCaller = ghInstance; + Sheet.pHelpFile = NULL; + Sheet.pfnCallBack = OEMCommonUICallBack; + Sheet.cOptItem = wFeatures; + Sheet.IconID = IDI_CPSUI_PRINTER; + Sheet.CallerVersion = 0x100; + Sheet.OptItemVersion = 0x100; + + // + // Initialize mode-specific fields + // + if (dwMode == OEMCUIP_PRNPROP) + { + // + // Use a DlgPage structure to set the text in the tab + // in the printer propertues view. + // + DLGPAGE DlgPage; + memset(&DlgPage, 0, sizeof(DLGPAGE)); + DlgPage.cbSize = sizeof(DLGPAGE); + DlgPage.DlgTemplateID = DP_STD_TREEVIEWPAGE; + + // + // Get device settings display name + // + hrResult = GetStringResource(hHeap, ghInstance, IDS_DEVICE_SETTINGS_NAME, &DlgPage.pTabName); + + if (!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("hrCommonPropSheetMethod: Failed to get tab name! (hrResult = 0x%x)\r\n"), + hrResult); + goto Exit; + } + Sheet.pDlgPage = &DlgPage; + Sheet.cDlgPage = 1; + } + else + { + // + // printing preferences settings + // + Sheet.pDlgPage = CPSUI_PDLGPAGE_TREEVIEWONLY; + } + + // + // Get caller name + // + hrResult = GetStringResource(hHeap, ghInstance, IDS_NAME, &Sheet.pCallerName); + if (!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("hrCommonPropSheetMethod: Failed to get caller name! (hrResult = 0x%x)\r\n"), hrResult); + goto Exit; + } + + // + // Get section name + // + hrResult = GetStringResource(hHeap, ghInstance, IDS_SECTION, &Sheet.pOptItemName); + if (!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("hrCommonPropSheetMethod: Failed to get section name! (hrResult = 0x%x)\r\n"), hrResult); + goto Exit; + } + + // + // Init user data. + // + pUserData = (PCBUSERDATA)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(CBUSERDATA)); + + if (pUserData == NULL) + { + ERR(ERRORTEXT("hrCommonPropSheetMethod: Failed to allocate user data!\r\n")); + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + pUserData->hComPropSheet = pPSUIInfo->hComPropSheet; + pUserData->pfnComPropSheet = pPSUIInfo->pfnComPropSheet; + pUserData->pOEMUIParam = pOEMUIParam; + pUserData->pHelper = pHelper; + pUserData->bPermission = bPermission; + Sheet.UserData = (ULONG_PTR)pUserData; + + // + // Create OptItems for page. + // + Sheet.pOptItem = CreateOptItems(hHeap, Sheet.cOptItem); + + if (Sheet.pOptItem == NULL) + { + ERR(ERRORTEXT("hrCommonPropSheetMethod: Failed to allocate OPTITEMS!\r\n")); + hrResult = E_OUTOFMEMORY; + goto Exit; + } + + // + // Add core driver features + // + for (DWORD wIndex = 0; wIndex < wFeatures; wIndex++) + { + // + // Initialize level and basic state for feature + // + Sheet.pOptItem[wIndex].Level = 1; + Sheet.pOptItem[wIndex].Flags = OPTIF_COLLAPSE; + CFeature *pFeature = pFeatures->GetFeature(wIndex, dwMode); + + if (pFeature == NULL) + { + ERR(ERRORTEXT("hrCommonPropSheetMethod: Feature not found or features not initialized!\r\n")); + hrResult = E_UNEXPECTED; + goto Exit; + } + + // + // Get OPTITEM for this feature + // + hrResult = pFeature->InitOptItem(hHeap, Sheet.pOptItem + wIndex); + + if (!SUCCEEDED(hrResult)) + { + ERR(ERRORTEXT("hrCommonPropSheetMethod: Failed to get OPTITEM for feature %s\r\n"), pFeature->GetKeyword()); + goto Exit; + } + + } + + // + // Add property sheets. + // + lResult = pPSUIInfo->pfnComPropSheet(pPSUIInfo->hComPropSheet, + CPSFUNC_ADD_PCOMPROPSHEETUI, + (LPARAM)&Sheet, + (LPARAM)&dwSheets); + + + if (!lResult) + { + ERR(DLLTEXT("hrCommonPropSheetMethod() pfnComPropSheet returned %d.\r\n"), lResult); + ERR(ERRORTEXT("ComPropSheet failed! Failed to add device settings tab!\n")); + } + } + break; + + case PROPSHEETUI_REASON_GET_INFO_HEADER: + { + // + // Set header title + // + PPROPSHEETUI_INFO_HEADER pHeader = (PPROPSHEETUI_INFO_HEADER)lParam; + pHeader->pTitle = (LPTSTR)PROP_TITLE; + lResult = TRUE; + } + break; + + case PROPSHEETUI_REASON_GET_ICON: + // + // No icon + // + lResult = 0; + break; + + case PROPSHEETUI_REASON_SET_RESULT: + { + PSETRESULT_INFO pInfo = (PSETRESULT_INFO)lParam; + lResult = pInfo->Result; + } + break; + + case PROPSHEETUI_REASON_DESTROY: + lResult = TRUE; + break; + } + + pPSUIInfo->Result = lResult; + +Exit: + + return hrResult; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// OEMCommonUICallBack +// +// Synopsis: +// Callback function to handle changes to the feature list panel +// added by this plug-in to the document properties UI. +// +// Returns: +// CPSUICB_ACTION_NONE if nothing further needs done. +// CPSUICB_ACTION_NO_APPLY_EXIT if settings changes were aborted +// +// +//---------------------------------------------------------------------------- +LONG APIENTRY +OEMCommonUICallBack( + _In_ PCPSUICBPARAM pCallbackParam + // struct containing all of the relevant callback parameters, + // including the reason that the callback is being made. + ) +{ + VERBOSE(DLLTEXT("OEMCommonUICallBack entry.")); + + WORD wItems = pCallbackParam->cOptItem; + LONG lReturn = CPSUICB_ACTION_NONE; + POPTITEM pOptItem = pCallbackParam->pOptItem; + PCBUSERDATA pUserData = (PCBUSERDATA) pCallbackParam->UserData; + HANDLE hHeap = pUserData->pOEMUIParam->hOEMHeap; + HRESULT hrResult = S_OK; + + VERBOSE(DLLTEXT("Reason = %d"), pCallbackParam->Reason); + + // + // If user has no permission to change anything, then simply + // return without any action + // + if (!pUserData->bPermission && + (pCallbackParam->Reason != CPSUICB_REASON_ABOUT)) + { + WARNING(DLLTEXT("OEMCommonUICallBack: User does not have appropriate permission!\r\n")); + lReturn = CPSUICB_ACTION_NONE; + } + else + { + switch(pCallbackParam->Reason) + { + case CPSUICB_REASON_APPLYNOW: + if (wItems > 0) + { + // + // Save features if hiding std UI + // + hrResult = SaveFeatureOptItems(hHeap, + pUserData->pHelper, + pCallbackParam->hDlg, + pOptItem, + wItems); + + if (!SUCCEEDED(hrResult)) + { + // + // Return that we didn't save changes. + // NOTE: It is upto SaveFeatureOptItems() to display any + // UI for failure + // + lReturn = CPSUICB_ACTION_NO_APPLY_EXIT; + } + else + { + pUserData->pfnComPropSheet(pUserData->hComPropSheet, + CPSFUNC_SET_RESULT, + (LPARAM)pUserData->hPropPage, + (LPARAM)CPSUI_OK); + } + } + break; + + case CPSUICB_REASON_KILLACTIVE: + // + // This active property sheet page is changing, and this page is + // going inactive. + // + break; + + case CPSUICB_REASON_SETACTIVE: + // + // This property sheet page is about to become the active page. + // + default: + break; + } + } + + return lReturn; +} + + +//+--------------------------------------------------------------------------- +// +// Member: +// +// Synopsis: +// Creates and Initializes OptItems. +// +// Returns: +// Pointer to an array of optitems on success, else +// NULL on failure. +// +// +//---------------------------------------------------------------------------- +POPTITEM +CreateOptItems( + HANDLE hHeap, + // Heap to allocate data from + DWORD dwOptItems + // Number of opt items to allocate. + ) +{ + VERBOSE(DLLTEXT("CreateOptItems entry.")); + + POPTITEM pOptItems = NULL; + // OPTITEMs to be returned to caller. + + ULONG cbOptItems = 0; + // Number of bytes needed for optitems. + + // Allocate memory for OptItems. + if (SUCCEEDED(ULongMult( sizeof(OPTITEM), dwOptItems, &cbOptItems)) && + (pOptItems = (POPTITEM)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, cbOptItems)) != NULL) + { + // Zero out memory. + memset(pOptItems, 0, sizeof(OPTITEM) * dwOptItems); + + // Set each OptItem's size, and Public DM ID. + for (DWORD dwCount = 0; dwCount < dwOptItems; dwCount++) + { + pOptItems[dwCount].cbSize = sizeof(OPTITEM); + pOptItems[dwCount].DMPubID = DMPUB_NONE; + } + } + else + { + ERR(ERRORTEXT("CreateOptItems() failed to allocate memory for OPTITEMs!\r\n")); + } + + return pOptItems; +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/uniuirep.def b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/uniuirep.def new file mode 100644 index 00000000..bf87f4c2 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/uniuirep.def @@ -0,0 +1,18 @@ +; +; THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +; ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +; THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +; PARTICULAR PURPOSE. +; +; Copyright 1997 - 2005 Microsoft Corporation. All Rights Reserved. +; +; Abstract: +; +; This file contains a listing of all of the methods to be exported +; from the DLL, as well as rules for how to name the exports. +; + +LIBRARY UIREPPLUG + +EXPORTS DllGetClassObject PRIVATE + DllCanUnloadNow PRIVATE diff --git a/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/uniuirep.h b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/uniuirep.h new file mode 100644 index 00000000..52980245 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/uniuirep.h @@ -0,0 +1,55 @@ +//+-------------------------------------------------------------------------- +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2005 Microsoft Corporation. All Rights Reserved. +// +// FILE: UNIUIREP.H +// +// PURPOSE: Define common data types, and external function prototypes +// for UI replacement sample. +// +//-------------------------------------------------------------------------- + +#pragma once + +#define DLLTEXT(s) TEXT("[UIREPPLUG] ") TEXT(s) +#define FUNCTEXT(s) _T(__FUNCTION__) TEXT(s) +#define ERRORTEXT(s) TEXT("ERROR ") DLLTEXT(s) + +// +// OEM Signature is used to identify the +// private DEVMODE portion to mitigate against +// data corruption. Replace this with a unique string +// for your organization. +// +#define OEM_SIGNATURE 'UIRP' +#define OEM_VERSION 0x00000001L + +// +// OEM Signature and version. +// +#define PROP_TITLE L"UIRepPlug Page" + +// +// Printer registry keys where OEM data is stored. +// +#define UIREPPLUG_VALUE TEXT("UIREPPLUG_VALUE") +#define UIREPPLUG_DEVICE_VALUE TEXT("UIREPPLUG_DEVICE_VALUE") + +// +// Method prototypes +// + +HRESULT +hrCommonPropSheetMethod( + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam, + IPrintCoreHelper* pHelper, + CFeatureCollection* pFeatures, + DWORD dwMode + ); + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/uniuirep.rc b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/uniuirep.rc new file mode 100644 index 00000000..67cad8ae --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/uniuirep/src/uniuirep.rc @@ -0,0 +1,192 @@ +//+-------------------------------------------------------------------------- +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2005 Microsoft Corporation. All Rights Reserved. +// +// FILE: uniuirep.rc +// +// PURPOSE: Resource script containing all localizable strings for this +// module +// +//-------------------------------------------------------------------------- + +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "Written by Windows Printing & Imaging Team" + VALUE "CompanyName", "Microsoft Corp." + VALUE "FileDescription", "UI Replacement PrintTicket Plugin." + VALUE "FileVersion", "1, 0, 0, 1" + VALUE "InternalName", "UIREPPLUG" + VALUE "LegalCopyright", "Copyright � 1998 - 2005 Microsoft Corp." + VALUE "LegalTrademarks", "Microsoft� is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation" + VALUE "OriginalFilename", "UIREPPLUG.dll" + VALUE "ProductName", "Microsoft UIREPPLUG" + VALUE "ProductVersion", "1.1" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDS_SECTION "UIRepPlug Added Item" + IDS_NAME "UI Replacement PrintTicket Plugin" + IDS_DEVICE_SETTINGS_NAME "Device Settings" + IDS_CONSTRAINT_CONFLICT "There are one or more conflicting settings.\r\nDo you want driver to automatically resolve conflicts?" +END + +STRINGTABLE +BEGIN + IDS_RESDLL "Resource DLL" + IDS_GRAPHICS_MODE "Graphics Mode" + IDS_DUPLEX_UNIT "Duplex Unit" +END + +STRINGTABLE +BEGIN + IDS_UNIRESDLL "unires.dll" + IDS_RESOLUTION_600_DPI "600 x 600 dots per inch" + IDS_RESOLUTION_300_DPI "300 x 300 dots per inch" + IDS_RESOLUTION_150_DPI "150 x 150 dots per inch" + IDS_RASTERMODE "Raster mode" + IDS_HPGL2MODE "HPGL2 mode" + IDS_PAPERSIZE_LETTER "Letter" + IDS_PAPERSIZE_LEGAL "Legal" + IDS_PAPERSIZE_EXECUTIVE "Executive" + IDS_PAPERSIZE_A4 "A4" + IDS_PAPERSIZE_B5 "B5" + IDS_COLORMODE_MONO "Monochrome" + IDS_COLORMODE_24BPP "24 bits per pixel" + IDS_MISSINGNAME "<name missing>" +END + +STRINGTABLE +BEGIN + IDS_COLORMODE_8BPP "8 bits per pixel" + IDS_HALFTONE_AUTO "Auto Select" + IDS_HALFTONE_SUPERCELL_M "Super Cell" + IDS_HALFTONE_6x6_M "Dither 6x6" + IDS_HALFTONE_8x8_M "Dither 8x8" + IDS_UIREP_ENVTRAY "Envelope Feeder Tray" + IDS_INSTALLED_MEMORY "Device Memory" + IDS_MEMORY_STD "Standard Memory" + IDS_MEMORY_UPGRADE "16MB Upgrade" + +END + +STRINGTABLE +BEGIN + IDS_OUTBIN_STACKER "Stacker" + IDS_OUTBIN_DEFAULT "Default" +END + +STRINGTABLE +BEGIN + IDS_METAFILE_SPOOLING "Advanced Printing Features" + IDS_TEXT_ASGRX "Print Optimizations" +END + +STRINGTABLE +BEGIN + IDS_TTDL_DEFAULT "Automatic" + IDS_TTDL_TYPE1 "Outline" + IDS_TTDL_TYPE3 "Bitmap" + IDS_TTDL_TYPE42 "Native TrueType" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/common/debug.h b/print/OEM Printer Customization Plug-in Samples/C++/watermark/common/debug.h new file mode 100644 index 00000000..0414569c --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/common/debug.h @@ -0,0 +1,82 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1996 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Debug.H +// +// PURPOSE: Define common data types, and external function prototypes +// for debugging functions. Also defines the various debug macros. +// +// + +#pragma once + +///////////////////////////////////////////////////////// +// Macros +///////////////////////////////////////////////////////// +// +// These macros are used for debugging purposes. They expand +// to white spaces on a free build. Here is a brief description +// of what they do and how they are used: +// +// giDebugLevel +// Global variable which set the current debug level to control +// the amount of debug messages emitted. +// +// WARNING(msg) +// Display a message if the current debug level is <= DBG_WARNING. +// The message format is: WRN filename (linenumber): message +// +// ERR(msg) +// Similiar to WARNING macro above - displays a message +// if the current debug level is <= DBG_ERROR. +// +// ASSERT(cond) +// Verify a condition is true. If not, force a breakpoint. +// +// RIP(msg) +// Display a message and force a breakpoint. +// +// Usage: +// WARNING("App passed NULL pointer, ignoring...\n"); +// + +#define DBG_VERBOSE 0 +#define DBG_WARNING 1 +#define DBG_ERROR 2 +#define DBG_NONE 3 + +// VC and Build use different debug defines. +#if defined (DBG) || defined (_DEBUG) + + // __declspec(selectany) ensures that even if this is defined in multiple compilation + // modules, they will all resolve to the same symbol in the linked DLL + __declspec(selectany) INT giDebugLevel = 2; + + #define STRINGIZE(x) #x + #define QUOTE(x) STRINGIZE(x) + #define FILE_AND_LINE __FILE__ "@" QUOTE(__LINE__) + + #define VERBOSE(msg) { if(giDebugLevel <= DBG_VERBOSE) OutputDebugStringA( FILE_AND_LINE ": " msg); } + #define WARNING(msg) { if(giDebugLevel <= DBG_WARNING) OutputDebugStringA( FILE_AND_LINE ": Warning: " msg); } + #define ERR(msg) { if(giDebugLevel <= DBG_ERROR) OutputDebugStringA(FILE_AND_LINE ": Error:" msg); } + #define ASSERT(cond) { if (!(cond)) RIP("\n"); } + #define RIP(msg) { OutputDebugStringA(FILE_AND_LINE ": Error (not recoverable): " msg); DebugBreak(); } + +#else // !DBG + + #define VERBOSE(msg) + #define WARNING(msg) + #define ERR(msg) + #define ASSERT(cond) + #define RIP(msg) + +#endif + + + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/common/devmode.cpp b/print/OEM Printer Customization Plug-in Samples/C++/watermark/common/devmode.cpp new file mode 100644 index 00000000..71ffc11d --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/common/devmode.cpp @@ -0,0 +1,229 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Devmode.cpp +// +// PURPOSE: Implementation of Devmode functions shared with OEM UI and OEM rendering modules. +// + +// This file is wrapped in fdevmode.cpp in other parts of the watermark sample. +// The appropriate precompiled header should be included there. +// #include "precomp.h + +#include "debug.h" +#include "devmode.h" + +HRESULT hrOEMDevMode(DWORD dwMode, POEMDMPARAM pOemDMParam) +{ + HRESULT hResult = S_OK; + POEMDEV pOEMDevIn = NULL; + POEMDEV pOEMDevOut = NULL; + + + // Verify parameters. + if( (NULL == pOemDMParam) + || + ( (OEMDM_SIZE != dwMode) + && + (OEMDM_DEFAULT != dwMode) + && + (OEMDM_CONVERT != dwMode) + && + (OEMDM_MERGE != dwMode) + ) + ) + { + ERR(DLLTEXT("DevMode() ERROR_INVALID_PARAMETER.\r\n")); + + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Cast generic (i.e. PVOID) to OEM private devomode pointer type. + pOEMDevIn = (POEMDEV) pOemDMParam->pOEMDMIn; + pOEMDevOut = (POEMDEV) pOemDMParam->pOEMDMOut; + + switch(dwMode) + { + case OEMDM_SIZE: + pOemDMParam->cbBufSize = sizeof(OEMDEV); + break; + + case OEMDM_DEFAULT: + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + pOEMDevOut->bEnabled = WATER_MARK_DEFAULT_ENABLED; + pOEMDevOut->dfRotate = WATER_MARK_DEFAULT_ROTATION; + pOEMDevOut->dwFontSize = WATER_MARK_DEFAULT_FONTSIZE; + pOEMDevOut->crTextColor = WATER_MARK_DEFAULT_COLOR; + hResult = StringCbCopyW(pOEMDevOut->szWaterMark, sizeof(pOEMDevOut->szWaterMark), WATER_MARK_DEFAULT_TEXT); + break; + + case OEMDM_CONVERT: + ConvertOEMDevmode(pOEMDevIn, pOEMDevOut); + break; + + case OEMDM_MERGE: + ConvertOEMDevmode(pOEMDevIn, pOEMDevOut); + MakeOEMDevmodeValid(pOEMDevOut); + break; + } + + return hResult; +} + + +BOOL ConvertOEMDevmode(PCOEMDEV pOEMDevIn, POEMDEV pOEMDevOut) +{ + HRESULT hCopy = S_OK; + + + if( (NULL == pOEMDevIn) + || + (NULL == pOEMDevOut) + ) + { + ERR(DLLTEXT("ConvertOEMDevmode() invalid parameters.\r\n")); + return FALSE; + } + + // Check OEM Signature, if it doesn't match ours, + // then just assume DMIn is bad and use defaults. + if(pOEMDevIn->dmOEMExtra.dwSignature == pOEMDevOut->dmOEMExtra.dwSignature) + { + VERBOSE(DLLTEXT("Converting private OEM Devmode.\r\n")); + + // Set the devmode defaults so that anything the isn't copied over will + // be set to the default value. + pOEMDevOut->bEnabled = WATER_MARK_DEFAULT_ENABLED; + pOEMDevOut->dfRotate = WATER_MARK_DEFAULT_ROTATION; + pOEMDevOut->dwFontSize = WATER_MARK_DEFAULT_FONTSIZE; + pOEMDevOut->crTextColor = WATER_MARK_DEFAULT_COLOR; + hCopy = StringCbCopyW(pOEMDevOut->szWaterMark, sizeof(pOEMDevOut->szWaterMark), WATER_MARK_DEFAULT_TEXT); + + // Copy the old structure in to the new using which ever size is the smaller. + // Devmode maybe from newer Devmode (not likely since there is only one), or + // Devmode maybe a newer Devmode, in which case it maybe larger, + // but the first part of the structure should be the same. + + // DESIGN ASSUMPTION: the private DEVMODE structure only gets added to; + // the fields that are in the DEVMODE never change only new fields get added to the end. + + memcpy(pOEMDevOut, pOEMDevIn, __min(pOEMDevOut->dmOEMExtra.dwSize, pOEMDevIn->dmOEMExtra.dwSize)); + + // Re-fill in the size and version fields to indicated + // that the DEVMODE is the current private DEVMODE version. + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + } + else + { + WARNING(DLLTEXT("Unknown DEVMODE signature, pOEMDMIn ignored.\r\n")); + + // Don't know what the input DEVMODE is, so just use defaults. + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + pOEMDevOut->bEnabled = WATER_MARK_DEFAULT_ENABLED; + pOEMDevOut->dfRotate = WATER_MARK_DEFAULT_ROTATION; + pOEMDevOut->dwFontSize = WATER_MARK_DEFAULT_FONTSIZE; + pOEMDevOut->crTextColor = WATER_MARK_DEFAULT_COLOR; + hCopy = StringCbCopyW(pOEMDevOut->szWaterMark, sizeof(pOEMDevOut->szWaterMark), WATER_MARK_DEFAULT_TEXT); + } + + return SUCCEEDED(hCopy); +} + + +BOOL MakeOEMDevmodeValid(POEMDEV pOEMDevmode) +{ + if(NULL == pOEMDevmode) + { + return FALSE; + } + + // ASSUMPTION: pOEMDevmode is large enough to contain OEMDEV structure. + + // Make sure that dmOEMExtra indicates the current OEMDEV structure. + pOEMDevmode->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevmode->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevmode->dmOEMExtra.dwVersion = OEM_VERSION; + + // bEnable should be either TRUE or FALSE. + if( (TRUE != pOEMDevmode->bEnabled) + && + (FALSE != pOEMDevmode->bEnabled) + ) + { + pOEMDevmode->bEnabled = WATER_MARK_DEFAULT_ENABLED; + } + + // dfRotate should be between 0 and 360 inclusive. + if( (0 > pOEMDevmode->dfRotate) + || + (360 < pOEMDevmode->dfRotate) + ) + { + pOEMDevmode->dfRotate = WATER_MARK_DEFAULT_ROTATION; + } + + // dwFontSize should be 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, or 72. + if(!IsValidFontSize(pOEMDevmode->dwFontSize)) + { + pOEMDevmode->dwFontSize = WATER_MARK_DEFAULT_FONTSIZE; + } + + // The high byte of the hi word should be zero. + if(0 != HIBYTE(HIWORD(pOEMDevmode->crTextColor))) + { + pOEMDevmode->crTextColor = WATER_MARK_DEFAULT_COLOR; + } + + // Make sure that water mark string is terminated. + pOEMDevmode->szWaterMark[WATER_MARK_TEXT_SIZE - 1] = L'\0'; + + return TRUE; +} + + +BOOL IsValidFontSize(DWORD dwFontSize) +{ + BOOL bValid = FALSE; + + + switch(dwFontSize) + { + case 8: + case 9: + case 10: + case 11: + case 12: + case 14: + case 16: + case 18: + case 20: + case 22: + case 24: + case 26: + case 28: + case 36: + case 48: + case 72: + bValid = TRUE; + break; + + default: + ERR(DLLTEXT("IsValidFontSize() found invalid font size\r\n")); + break; + } + + return bValid; +} + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/common/devmode.h b/print/OEM Printer Customization Plug-in Samples/C++/watermark/common/devmode.h new file mode 100644 index 00000000..f9df1f26 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/common/devmode.h @@ -0,0 +1,56 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Devmode.h +// +// +// PURPOSE: Define common data types, and external function prototypes +// for devmode functions. +// +#pragma once + +//////////////////////////////////////////////////////// +// OEM Devmode Defines +//////////////////////////////////////////////////////// + +#define WATER_MARK_TEXT_SIZE 128 +#define WATER_MARK_DEFAULT_ENABLED TRUE +#define WATER_MARK_DEFAULT_ROTATION 30 +#define WATER_MARK_DEFAULT_FONTSIZE 28 +#define WATER_MARK_DEFAULT_COLOR RGB(230, 230, 230) +#define WATER_MARK_DEFAULT_TEXT L"WaterMark" + + + +//////////////////////////////////////////////////////// +// OEM Devmode Type Definitions +//////////////////////////////////////////////////////// + +typedef struct tagOEMDEV +{ + OEM_DMEXTRAHEADER dmOEMExtra; + BOOL bEnabled; + DOUBLE dfRotate; + DWORD dwFontSize; + COLORREF crTextColor; + WCHAR szWaterMark[WATER_MARK_TEXT_SIZE]; + +} OEMDEV, *POEMDEV; + +typedef const OEMDEV *PCOEMDEV; + + + +///////////////////////////////////////////////////////// +// ProtoTypes +///////////////////////////////////////////////////////// + +HRESULT hrOEMDevMode(DWORD dwMode, POEMDMPARAM pOemDMParam); +BOOL ConvertOEMDevmode(PCOEMDEV pOEMDevIn, POEMDEV pOEMDevOut); +BOOL MakeOEMDevmodeValid(POEMDEV pOEMDevmode); +BOOL IsValidFontSize(DWORD dwFontSize); + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/common/oem.h b/print/OEM Printer Customization Plug-in Samples/C++/watermark/common/oem.h new file mode 100644 index 00000000..f9615579 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/common/oem.h @@ -0,0 +1,24 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997- 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: oem.H +// +// +// PURPOSE: Define common data types, and external function prototypes +// for debug.cpp. +// + +#pragma once + + +//////////////////////////////////////////////////////// +// OEM Defines +//////////////////////////////////////////////////////// + +#define OEM_SIGNATURE 'MSFT' +#define OEM_VERSION 0x00000001L + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/WMARKPS.vcxproj b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/WMARKPS.vcxproj new file mode 100644 index 00000000..47a5db53 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/WMARKPS.vcxproj @@ -0,0 +1,1090 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Win10 Debug|ARM64"> + <Configuration>Win10 Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|Win32"> + <Configuration>Win10 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|x64"> + <Configuration>Win10 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|ARM64"> + <Configuration>Win10 Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|Win32"> + <Configuration>Win10 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|x64"> + <Configuration>Win10 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|Win32"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|Win32"> + <Configuration>Win8 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|Win32"> + <Configuration>Win7 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|Win32"> + <Configuration>Win8.1 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|Win32"> + <Configuration>Win8 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|Win32"> + <Configuration>Win7 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|x64"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|x64"> + <Configuration>Win8 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|x64"> + <Configuration>Win7 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|x64"> + <Configuration>Win8.1 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|x64"> + <Configuration>Win8 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|x64"> + <Configuration>Win7 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{4B90E6E4-34B2-460F-9BF7-D75B5334F2E5}</ProjectGuid> + <RootNamespace>$(MSBuildProjectName)</RootNamespace> + <Configuration Condition="'$(Configuration)' == ''">Win10 Debug</Configuration> + <Platform Condition="'$(Platform)' == ''">Win32</Platform> + <SampleGuid>{37DC3583-1F5D-4DB4-A930-535E9C096174}</SampleGuid> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <PropertyGroup> + <OutDir>$(IntDir)</OutDir> + </PropertyGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ItemGroup Label="WrappedTaskItems" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetName>WMARKPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetName>WMARKPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetName>WMARKPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <TargetName>WMARKPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <TargetName>WMARKPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetName>WMARKPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetName>WMARKPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetName>WMARKPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <TargetName>WMARKPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <TargetName>WMARKPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetName>WMARKPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetName>WMARKPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetName>WMARKPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <TargetName>WMARKPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetName>WMARKPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetName>WMARKPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetName>WMARKPS</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <TargetName>WMARKPS</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Link> + <ModuleDefinitionFile>WMARKPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Link> + <ModuleDefinitionFile>WMARKPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Link> + <ModuleDefinitionFile>WMARKPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <Link> + <ModuleDefinitionFile>WMARKPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <Link> + <ModuleDefinitionFile>WMARKPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Link> + <ModuleDefinitionFile>WMARKPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Link> + <ModuleDefinitionFile>WMARKPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Link> + <ModuleDefinitionFile>WMARKPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <Link> + <ModuleDefinitionFile>WMARKPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <Link> + <ModuleDefinitionFile>WMARKPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Link> + <ModuleDefinitionFile>WMARKPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Link> + <ModuleDefinitionFile>WMARKPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Link> + <ModuleDefinitionFile>WMARKPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <Link> + <ModuleDefinitionFile>WMARKPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>WMARKPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>WMARKPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>WMARKPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>WMARKPS.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="command.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="dllentry.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="fdevmode.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Create</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ResourceCompile Include="wmarkps.rc" /> + </ItemGroup> + <ItemGroup> + <Inf Exclude="@(Inf)" Include="*.inf" /> + <FilesToPackage Include="$(TargetPath)" Condition="'$(ConfigurationType)'=='Driver' or '$(ConfigurationType)'=='DynamicLibrary'" /> + </ItemGroup> + <ItemGroup> + <None Exclude="@(None)" Include="*.txt;*.htm;*.html" /> + <None Exclude="@(None)" Include="*.ico;*.cur;*.bmp;*.dlg;*.rct;*.gif;*.jpg;*.jpeg;*.wav;*.jpe;*.tiff;*.tif;*.png;*.rc2" /> + <None Exclude="@(None)" Include="*.def;*.bat;*.hpj;*.asmx" /> + </ItemGroup> + <ItemGroup> + <ClInclude Exclude="@(ClInclude)" Include="*.h;*.hpp;*.hxx;*.hm;*.inl;*.xsd" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/WMARKPS.vcxproj.Filters b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/WMARKPS.vcxproj.Filters new file mode 100644 index 00000000..7e7da8cc --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/WMARKPS.vcxproj.Filters @@ -0,0 +1,137 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;*</Extensions> + <UniqueIdentifier>{7E7CEB8F-7E3D-4FBB-AEBE-D62B0C9D9B2E}</UniqueIdentifier> + </Filter> + <Filter Include="Header Files"> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + <UniqueIdentifier>{88C3214E-2B6E-4482-A2B8-16CD0E6A9A3A}</UniqueIdentifier> + </Filter> + <Filter Include="Resource Files"> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms;man;xml</Extensions> + <UniqueIdentifier>{3A0703EF-8A1F-4955-8F7E-0765109DEBF0}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClCompile Include="command.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="dllentry.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="fdevmode.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkps.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkps.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkps.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkps.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkps.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkps.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkps.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkps.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkps.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkps.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkps.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkps.h" /> + <ClInclude Include="command.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkps.h" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="wmarkps.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> + <ItemGroup> + <None Include="WMarkPS.def"> + <Filter>Source Files</Filter> + </None> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/WMarkPS.def b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/WMarkPS.def new file mode 100644 index 00000000..fcfcd598 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/WMarkPS.def @@ -0,0 +1,3 @@ +LIBRARY WMARKPS +EXPORTS DllGetClassObject PRIVATE + DllCanUnloadNow PRIVATE
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/WMarkPS.rc b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/WMarkPS.rc new file mode 100644 index 00000000..9653478a --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/WMarkPS.rc @@ -0,0 +1,130 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// PSCRIPT +// + +IDR_WATERMARK_DRAW RC_PSCRIPT drawmark.ps +IDR_WATERMARK_PROLOGUE RC_PSCRIPT wmark.ps + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "Written by Windows Printing & Imaging Team\0" + VALUE "CompanyName", "Microsoft Corp.\0" + VALUE "FileDescription", "OEM Customization Water Mark Sample\0" + VALUE "FileVersion", "1, 0, 0, 1\0" + VALUE "InternalName", "WMarkPS\0" + VALUE "LegalCopyright", "Copyright � 1998-2003\0" + VALUE "LegalTrademarks", "Microsoft� is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation\0" + VALUE "OriginalFilename", "WMarkPS.DLL\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "Microsoft WaterMark\0" + VALUE "ProductVersion", "1.0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // !_MAC + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/command.cpp b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/command.cpp new file mode 100644 index 00000000..e4758d1c --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/command.cpp @@ -0,0 +1,410 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: command.cpp +// +// PURPOSE: Source module for OEM customized Command(s). +// + +#include "precomp.h" +#include "wmarkps.h" +#include "debug.h" +#include "command.h" +#include "resource.h" + + + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +///////////////////////////////////////////////////////// +// Internal Macros & Defines +///////////////////////////////////////////////////////// + +// Macros to convert from Windows RGB to PostScript RGB +#define GetPS2Color(dw) ((dw) / 255.0) +#define GetPS2RValue(cr) (GetPS2Color(GetRValue(cr))) +#define GetPS2GValue(cr) (GetPS2Color(GetGValue(cr))) +#define GetPS2BValue(cr) (GetPS2Color(GetBValue(cr))) + + +// Initial buffer size +#define INITIAL_BUFFER_SIZE 16 + + +// String format defines characters +#define FORMAT_DELIM '!' +#define FORMAT_STRING_ANSI 's' +#define FORMAT_STRING_UNICODE 'S' +#define FORMAT_CHAR '%' + + +// Loop limiter. +#define MAX_LOOP 10 + + +///////////////////////////////////////////////////////// +// Internal ProtoTypes +///////////////////////////////////////////////////////// + +static PSTR GetPostScriptResource(HMODULE hModule, LPCTSTR pszResource, PDWORD pdwSize); +static PSTR CreateWaterMarkProlog(HMODULE hModule, PDWORD pdwSize, _In_ LPWSTR pszWaterMark, + DWORD dwFontSize, _In_ LPSTR pszColor, _In_ LPSTR pszAngle); +static PSTR DoWaterMarkProlog(HMODULE hModule, POEMDEV pOemDevmode, PDWORD pdwSize); +static DWORD FormatResource(_In_ LPSTR pszResource, _Out_ LPSTR *ppszProlog, ...); + + +//////////////////////////////////////////////////////////////////////////////////// +// The PSCRIPT driver calls this OEM function at specific points during output +// generation. This gives the OEM DLL an opportunity to insert code fragments +// at specific injection points in the driver's code. It should use +// DrvWriteSpoolBuf for generating any output it requires. + +HRESULT PSCommand(PDEVOBJ pdevobj, DWORD dwIndex, PVOID pData, DWORD cbSize, + IPrintOemDriverPS* pOEMHelp, PDWORD pdwReturn) +{ + BOOL bFreeProcedure = FALSE; + PSTR pProcedure = NULL; + DWORD dwLen = 0; + DWORD dwSize = 0; + HRESULT hResult = E_FAIL; + + VERBOSE(DLLTEXT("Entering OEMCommand...\r\n")); + + UNREFERENCED_PARAMETER(pData); + UNREFERENCED_PARAMETER(cbSize); + + switch (dwIndex) + { + case PSINJECT_BEGINPROLOG: + { + POEMDEV pOemDevmode = (POEMDEV) pdevobj->pOEMDM; + + + VERBOSE(DLLTEXT("OEMCommand PSINJECT_BEGINPROLOG\r\n")); + + // Only do Water Mark PS prolog injection if Water Mark is enabled. + if(pOemDevmode->bEnabled) + { + pProcedure = DoWaterMarkProlog((HMODULE) pdevobj->hOEM, pOemDevmode, &dwSize); + bFreeProcedure = (NULL != pProcedure); + } + } + break; + + case PSINJECT_BEGINPAGESETUP: + { + POEMDEV pOemDevmode = (POEMDEV) pdevobj->pOEMDM; + + + VERBOSE(DLLTEXT("OEMCommand PSINJECT_BEGINPAGESETUP\r\n")); + + // Only do Water Mark PS page injection if Water Mark is enabled. + if(pOemDevmode->bEnabled) + { + pProcedure = GetPostScriptResource((HMODULE) pdevobj->hOEM, MAKEINTRESOURCE(IDR_WATERMARK_DRAW), &dwSize); + } + } + break; + + default: + VERBOSE(DLLTEXT("PSCommand Default...\r\n")); + *pdwReturn = ERROR_NOT_SUPPORTED; + return E_NOTIMPL; + } + + if(NULL != pProcedure) + { + // Write PostScript to spool file. + dwLen = (DWORD)strlen(pProcedure); + if (dwLen > 0) + { + hResult = pOEMHelp->DrvWriteSpoolBuf(pdevobj, pProcedure, dwLen, &dwSize); + } + + // Set return values. + if(SUCCEEDED(hResult) && (dwLen == dwSize)) + { + *pdwReturn = ERROR_SUCCESS; + } + else + { + // Try to return meaningful + // error value. + *pdwReturn = GetLastError(); + if(ERROR_SUCCESS == *pdwReturn) + { + *pdwReturn = ERROR_WRITE_FAULT; + } + + // Make sure we return failure + // if the write didn't succeded. + if(SUCCEEDED(hResult)) + { + hResult = HRESULT_FROM_WIN32(*pdwReturn); + } + } + + if(bFreeProcedure) + { + // INVARIANT: pProcedure was created with 'new' and needs to be freed. + delete[] pProcedure; + } + } + else + { + // pProcedure will be NULL if water mark isn't enabled. + *pdwReturn = ERROR_NOT_SUPPORTED; + hResult = E_NOTIMPL; + } + + // dwLen should always equal dwSize. + ASSERT(dwLen == dwSize); + + return hResult; +} + + +//////////////////////////////////////////////////////////////////////////////////// +// +// Retrieves pointer to a PostScript resource. +// +static PSTR GetPostScriptResource(HMODULE hModule, LPCTSTR pszResource, PDWORD pdwSize) +{ + PSTR pszPostScript = NULL; + HRSRC hFind = NULL; + HGLOBAL hResource = NULL; + + + VERBOSE(DLLTEXT("GetPostScriptResource() entered.\r\n")); + + // pszResource and pdwSize Parameters should not be NULL. + assert(NULL != pszResource); + assert(NULL != pdwSize); + + // Load PostScript resource. + hFind = FindResource(hModule, pszResource, MAKEINTRESOURCE(RC_PSCRIPT)); + //hFind = FindResource(hModule, pszResource, TEXT("PSCRIPT")); + if(NULL != hFind) + { + hResource = LoadResource(hModule, hFind); + if(NULL != hResource) + { + pszPostScript = (PSTR) LockResource(hResource); + *pdwSize = SizeofResource(hModule, hFind); + } + else + { + ERR(DLLTEXT("ERROR: Failed to load PSCRIPT resource!\r\n")); + } + } + else + { + ERR(DLLTEXT("ERROR: Failed to find PSCRIPT resource!\r\n")); + } + + // Should have found the PScript resource. + ASSERT(NULL != pszPostScript); + + return pszPostScript; +} + + +//////////////////////////////////////////////////////////////////////////////////// +// +// Formats Water Mark prolog with parameter. +// +static PSTR CreateWaterMarkProlog(HMODULE hModule, PDWORD pdwSize, _In_ LPWSTR pszWaterMark, + DWORD dwFontSize, _In_ LPSTR pszColor, _In_ LPSTR pszAngle) +{ + PSTR pszProlog = NULL; + PSTR pszResource = NULL; + + // Parameters that are pointers should not be NULL! + if (NULL == pdwSize || + NULL == pszWaterMark || + NULL == pszColor || + NULL == pszAngle) + { + ERR(DLLTEXT("CreateWaterMarkProlog: Invalid argument\r\n")); + return NULL; + } + + // Get Water Mark prolog resource. + pszResource = GetPostScriptResource(hModule, MAKEINTRESOURCE(IDR_WATERMARK_PROLOGUE), pdwSize); + + // Allocate and format the Water Mark Prolog with the correct values. + if(NULL != pszResource) + { + *pdwSize = FormatResource(pszResource, &pszProlog, pszWaterMark, dwFontSize, pszColor, pszAngle); + } + else + { + ERR(DLLTEXT("CreateWaterMarkProlog: Failed to get resource\r\n")); + } + + return pszProlog; +} + + +//////////////////////////////////////////////////////////////////////////////////// +// +// Does the pre-formating of parameters before calling the routine +// that creates the prolog. +// +static PSTR DoWaterMarkProlog(HMODULE hModule, POEMDEV pOemDevmode, PDWORD pdwSize) +{ + PSTR pszProlog = NULL; + + // Parameters should not be NULL. + if (NULL == hModule || + NULL == pOemDevmode || + NULL == pdwSize) + { + ERR(DLLTEXT("CreateWaterMarkProlog: Invalid argument\r\n")); + return NULL; + } + + // Only do prolog if Water Mark is enabled. + if(pOemDevmode->bEnabled) + { + CHAR szColor[INITIAL_BUFFER_SIZE] = "\0"; + DWORD dwAngleSize = INITIAL_BUFFER_SIZE; + LPSTR pszAngle = NULL; + + // Format angle as a string. + do + { + if(NULL != pszAngle) + { + delete[] pszAngle; + dwAngleSize *= 2; + } + pszAngle = new CHAR[dwAngleSize]; + + } while( (NULL != pszAngle) + && + (dwAngleSize < 1024) + && + (FAILED(StringCbPrintfA(pszAngle, dwAngleSize, "%.1f", pOemDevmode->dfRotate)) ) + ); + + if(NULL != pszAngle) + { + // Format text color as string. + if(FAILED(StringCbPrintfA(szColor, sizeof(szColor), + "%1.2f %1.2f %1.2f", + GetPS2RValue(pOemDevmode->crTextColor), + GetPS2GValue(pOemDevmode->crTextColor), + GetPS2BValue(pOemDevmode->crTextColor)))) + { + ERR(DLLTEXT("DoWaterMarkProlog() failed to create PostScript color string for water mark.")); + } + + // Create Water Mark prolog. + pszProlog = CreateWaterMarkProlog(hModule, pdwSize, pOemDevmode->szWaterMark, + pOemDevmode->dwFontSize, szColor, pszAngle); + + // Angle string is no longer needed. + delete[] pszAngle; + } + } + + return pszProlog; +} + + +//////////////////////////////////////////////////////////////////////////////////// +// +// Formats Resource. +// +static DWORD FormatResource(_In_ LPSTR pszResource, _Out_ LPSTR *ppszBuffer, ...) +{ + DWORD dwSize = (DWORD)strlen(pszResource) + MAX_PATH; + DWORD dwLoop = 0; + va_list vaList; + HRESULT hResult = E_FAIL; + + + va_start(vaList, ppszBuffer); + + // *ppszBuffer should be NULL when passed in. + *ppszBuffer = NULL; + + // Allocate and format the string. + do { + + if(NULL != *ppszBuffer) + { + delete[] *ppszBuffer; + } + *ppszBuffer = new CHAR[dwSize]; + if(NULL == *ppszBuffer) + { + goto Cleanup; + } + + hResult = StringCbVPrintfA(*ppszBuffer, dwSize, pszResource, vaList); + + if(STRSAFE_E_INSUFFICIENT_BUFFER == hResult) + { + dwSize *= 2; + } + + } while ( FAILED(hResult) && (dwLoop++ < MAX_LOOP)); + +Cleanup: + + // Check to see if we hit error. + if(FAILED(hResult)) + { + if(NULL != *ppszBuffer) + { + delete[] *ppszBuffer; + *ppszBuffer = NULL; + } + } + + va_end(vaList); + + if(*ppszBuffer) + { + DWORD dwToReturn = 0; + + if(SUCCEEDED(SIZETToDWord(strlen(*ppszBuffer), &dwToReturn))) + { + return dwToReturn; + } + } + return 0; +} + + +DWORD CharSize(DWORD dwValue, DWORD dwBase) +{ + DWORD dwSize = 1; + + + // Make sure taht base is more than 2. + if(dwBase < 2) + { + return dwSize; + } + + // Loop until dwValue is less than dwBase, + // dividing by dwBase each time. + while(dwValue >= dwBase) + { + dwValue /= dwBase; + ++dwSize; + } + + return dwSize; +} + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/command.h b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/command.h new file mode 100644 index 00000000..4b74bd77 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/command.h @@ -0,0 +1,22 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Command.h +// +// +// PURPOSE: Define common data types, and external function prototypes +// for OEM Command function(s). +// +#pragma once + + +///////////////////////////////////////////////////////// +// ProtoTypes +///////////////////////////////////////////////////////// + +HRESULT PSCommand(PDEVOBJ, DWORD, PVOID, DWORD, IPrintOemDriverPS*, PDWORD pdwReturn); + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/dllentry.cpp b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/dllentry.cpp new file mode 100644 index 00000000..3aa73908 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/dllentry.cpp @@ -0,0 +1,54 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: dllentry.cpp +// +// +// PURPOSE: Source module for DLL entry function(s). +// +// + +#include "precomp.h" +#include "wmarkps.h" +#include "debug.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +/////////////////////////////////////////////////////////// +// +// DLL entry point +// + +// DllMain isn't called/used for kernel mode version. +BOOL WINAPI DllMain(HINSTANCE hInst, WORD wReason, LPVOID lpReserved) +{ + UNREFERENCED_PARAMETER(hInst); + UNREFERENCED_PARAMETER(lpReserved); + + switch(wReason) + { + case DLL_PROCESS_ATTACH: + VERBOSE(DLLTEXT("Process attach.\r\n")); + break; + + case DLL_THREAD_ATTACH: + VERBOSE(DLLTEXT("Thread attach.\r\n")); + break; + + case DLL_PROCESS_DETACH: + VERBOSE(DLLTEXT("Process detach.\r\n")); + break; + + case DLL_THREAD_DETACH: + VERBOSE(DLLTEXT("Thread detach.\r\n")); + break; + } + + return TRUE; +} diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/drawmark.ps b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/drawmark.ps Binary files differnew file mode 100644 index 00000000..4e0fa74e --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/drawmark.ps diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/fdevmode.cpp b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/fdevmode.cpp new file mode 100644 index 00000000..e7e2d472 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/fdevmode.cpp @@ -0,0 +1,20 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: fDevmode.cpp +// +// +// PURPOSE: Place holder file for devmode functions. +// + +#include "precomp.h" +#include "wmarkps.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +#include <DEVMODE.CPP> diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/intrface.cpp b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/intrface.cpp new file mode 100644 index 00000000..5e892275 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/intrface.cpp @@ -0,0 +1,491 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Intrface.cpp +// +// +// PURPOSE: Interface for User Mode COM Customization DLL. +// +// +#pragma once + +#include "precomp.h" + +#include "wmarkps.h" +#include "debug.h" +#include "command.h" +#include "intrface.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +//////////////////////////////////////////////////////// +// Internal Globals +//////////////////////////////////////////////////////// + +static long g_cComponents = 0; // Count of active components +static long g_cServerLocks = 0; // Count of locks + + +//////////////////////////////////////////////////////////////////////////////// +// +// IWaterMarkPS body +// +IWaterMarkPS::~IWaterMarkPS() +{ + // Make sure that helper interface is released. + if(NULL != m_pOEMHelp) + { + m_pOEMHelp->Release(); + m_pOEMHelp = NULL; + } + + // If this instance of the object is being deleted, then the reference + // count should be zero. + assert(0 == m_cRef); +} + + +HRESULT __stdcall IWaterMarkPS::QueryInterface(const IID& iid, void** ppv) +{ + if (iid == IID_IUnknown) + { + *ppv = static_cast<IUnknown*>(this); + VERBOSE(DLLTEXT("IWaterMarkPS::QueryInterface IUnknown.\r\n")); + } + else if (iid == IID_IPrintOemPS) + { + *ppv = static_cast<IPrintOemPS*>(this); + VERBOSE(DLLTEXT("IWaterMarkPS::QueryInterface IPrintOemPs.\r\n")); + } + else + { +#if DBG && defined(USERMODE_DRIVER) + TCHAR szOutput[80] = {0}; + StringFromGUID2(iid, szOutput, _countof(szOutput)); // can not fail! + VERBOSE(DLLTEXT("IWaterMarkPS::QueryInterface interface not supported.\r\n")); +#endif + *ppv = NULL; + return E_NOINTERFACE; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef(); + return S_OK; +} + +ULONG __stdcall IWaterMarkPS::AddRef() +{ + VERBOSE(DLLTEXT("IWaterMarkPS::AddRef() entry.\r\n")); + return InterlockedIncrement(&m_cRef); +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall IWaterMarkPS::Release() +{ + VERBOSE(DLLTEXT("IWaterMarkPS::Release() entry.\r\n")); + ASSERT( 0 != m_cRef); + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + + } + return cRef; +} + + +HRESULT __stdcall IWaterMarkPS::GetInfo ( + DWORD dwMode, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded) +{ + VERBOSE(DLLTEXT("IWaterMarkPS::GetInfo entry.\r\n")); + + // Validate parameters. + if( (NULL == pcbNeeded) + || + ( (OEMGI_GETSIGNATURE != dwMode) + && + (OEMGI_GETVERSION != dwMode) + && + (OEMGI_GETPUBLISHERINFO != dwMode) + ) + ) + { + VERBOSE(DLLTEXT("IWaterMarkPS::GetInfo() exit pcbNeeded is NULL! ERROR_INVALID_PARAMETER\r\n")); + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Set expected buffer size. + if(OEMGI_GETPUBLISHERINFO != dwMode) + { + *pcbNeeded = sizeof(DWORD); + } + else + { + *pcbNeeded = sizeof(PUBLISHERINFO); + return E_FAIL; + } + + // Check buffer size is sufficient. + if((cbSize < *pcbNeeded) || (NULL == pBuffer)) + { + WARNING(DLLTEXT("IWaterMarkPS::GetInfo() exit insufficient buffer!\r\n")); + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return E_FAIL; + } + + switch(dwMode) + { + // OEM DLL Signature + case OEMGI_GETSIGNATURE: + *(PDWORD)pBuffer = OEM_SIGNATURE; + break; + + // OEM DLL version + case OEMGI_GETVERSION: + *(PDWORD)pBuffer = OEM_VERSION; + break; + + // dwMode not supported. + case OEMGI_GETPUBLISHERINFO: + default: + // Set written bytes to zero since nothing was written. + WARNING(DLLTEXT("IWaterMarkPS::GetInfo() exit mode not supported.\r\n")); + *pcbNeeded = 0; + SetLastError(ERROR_NOT_SUPPORTED); + return E_FAIL; + } + + return S_OK; +} + +HRESULT __stdcall IWaterMarkPS::PublishDriverInterface( + IUnknown *pIUnknown) +{ + VERBOSE(DLLTEXT("IWaterMarkPS::PublishDriverInterface() entry.\r\n")); + + // Need to store pointer to Driver Helper functions, if we already haven't. + if (this->m_pOEMHelp == NULL) + { + HRESULT hResult; + + + // Get Interface to Helper Functions. + hResult = pIUnknown->QueryInterface(IID_IPrintOemDriverPS, (void** ) &(this->m_pOEMHelp)); + + if(!SUCCEEDED(hResult)) + { + // Make sure that interface pointer reflects interface query failure. + this->m_pOEMHelp = NULL; + + return E_FAIL; + } + } + + return S_OK; +} + + +HRESULT __stdcall IWaterMarkPS::EnableDriver(DWORD dwDriverVersion, + DWORD cbSize, + PDRVENABLEDATA pded) +{ + VERBOSE(DLLTEXT("IWaterMarkPS::EnableDriver() entry.\r\n")); + + UNREFERENCED_PARAMETER(dwDriverVersion); + UNREFERENCED_PARAMETER(cbSize); + UNREFERENCED_PARAMETER(pded); + + // Need to return S_OK so that DisableDriver() will be called, which Releases + // the reference to the Printer Driver's interface. + // If error occurs, return E_FAIL. + return S_OK; +} + +HRESULT __stdcall IWaterMarkPS::DisableDriver(VOID) +{ + VERBOSE(DLLTEXT("IWaterMarkPS::DisaleDriver() entry.\r\n")); + + // Release reference to Printer Driver's interface. + if (this->m_pOEMHelp) + { + this->m_pOEMHelp->Release(); + this->m_pOEMHelp = NULL; + } + + return S_OK; +} + +HRESULT __stdcall IWaterMarkPS::DisablePDEV( + PDEVOBJ pdevobj) +{ + VERBOSE(DLLTEXT("IWaterMarkPS::DisablePDEV() entry.\r\n")); + + UNREFERENCED_PARAMETER(pdevobj); + + return E_NOTIMPL; +}; + +HRESULT __stdcall IWaterMarkPS::EnablePDEV( + PDEVOBJ pdevobj, + _In_ PWSTR pPrinterName, + ULONG cPatterns, + HSURF *phsurfPatterns, + ULONG cjGdiInfo, + GDIINFO *pGdiInfo, + ULONG cjDevInfo, + DEVINFO *pDevInfo, + DRVENABLEDATA *pded, + OUT PDEVOEM *pDevOem) +{ + VERBOSE(DLLTEXT("IWaterMarkPS::EnablePDEV() entry.\r\n")); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pPrinterName); + UNREFERENCED_PARAMETER(cPatterns); + UNREFERENCED_PARAMETER(phsurfPatterns); + UNREFERENCED_PARAMETER(cjGdiInfo); + UNREFERENCED_PARAMETER(pGdiInfo); + UNREFERENCED_PARAMETER(cjDevInfo); + UNREFERENCED_PARAMETER(pDevInfo); + UNREFERENCED_PARAMETER(pded); + UNREFERENCED_PARAMETER(pDevOem); + + return E_NOTIMPL; +} + + +HRESULT __stdcall IWaterMarkPS::ResetPDEV( + PDEVOBJ pdevobjOld, + PDEVOBJ pdevobjNew) +{ + VERBOSE(DLLTEXT("IWaterMarkPS::ResetPDEV() entry.\r\n")); + + UNREFERENCED_PARAMETER(pdevobjOld); + UNREFERENCED_PARAMETER(pdevobjNew); + + return E_NOTIMPL; +} + +HRESULT __stdcall IWaterMarkPS::DevMode( + DWORD dwMode, + POEMDMPARAM pOemDMParam) +{ + VERBOSE(DLLTEXT("IWaterMarkPS:DevMode entry.\n")); + return hrOEMDevMode(dwMode, pOemDMParam); +} + +HRESULT __stdcall IWaterMarkPS::Command( + PDEVOBJ pdevobj, + DWORD dwIndex, + PVOID pData, + DWORD cbSize, + OUT DWORD *pdwResult) +{ + HRESULT hResult = E_NOTIMPL; + + + VERBOSE(DLLTEXT("IWaterMarkPS::Command() entry.\r\n")); + hResult = PSCommand(pdevobj, dwIndex, pData, cbSize, m_pOEMHelp, pdwResult); + + return hResult; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// oem class factory +// +class IOemCF : public IClassFactory +{ +public: + // *** IUnknown methods *** + + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release) (THIS); + + // *** IClassFactory methods *** + STDMETHOD(CreateInstance) (THIS_ + LPUNKNOWN pUnkOuter, + REFIID riid, + LPVOID FAR* ppvObject); + STDMETHOD(LockServer) (THIS_ BOOL bLock); + + + // Constructor + IOemCF(): m_cRef(1) { }; + ~IOemCF() { }; + +protected: + LONG m_cRef; + +}; + +/////////////////////////////////////////////////////////// +// +// Class factory body +// +HRESULT __stdcall IOemCF::QueryInterface(const IID& iid, void** ppv) +{ + if ((iid == IID_IUnknown) || (iid == IID_IClassFactory)) + { + *ppv = static_cast<IOemCF*>(this); + } + else + { + VERBOSE(DLLTEXT("IOemCF::QueryInterface interface not supported.\r\n")); + *ppv = NULL; + return E_NOINTERFACE; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef(); + return S_OK; +} + +ULONG __stdcall IOemCF::AddRef() +{ + return InterlockedIncrement(&m_cRef); +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall IOemCF::Release() +{ + ASSERT( 0 != m_cRef); + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + + } + return cRef; +} + +// IClassFactory implementation +HRESULT __stdcall IOemCF::CreateInstance(IUnknown* pUnknownOuter, + const IID& iid, + void** ppv) +{ + //VERBOSE(DLLTEXT("Class factory:\t\tCreate component.")); + + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Cannot aggregate. + if (pUnknownOuter != NULL) + { + return CLASS_E_NOAGGREGATION; + } + + // Create component. + IWaterMarkPS* pOemCP = new IWaterMarkPS; + if (pOemCP == NULL) + { + return E_OUTOFMEMORY; + } + + // Get the requested interface. + HRESULT hr = pOemCP->QueryInterface(iid, ppv); + + // Release the IUnknown pointer. + // (If QueryInterface failed, component will delete itself.) + pOemCP->Release(); + return hr; +} + +// LockServer +HRESULT __stdcall IOemCF::LockServer(BOOL bLock) +{ + if (bLock) + { + InterlockedIncrement(&g_cServerLocks); + } + else + { + InterlockedDecrement(&g_cServerLocks); + } + return S_OK; +} + + +// +// Registration functions +// + +// +// Can DLL unload now? +// +STDAPI DllCanUnloadNow() +{ + // + // To avoid leaving OEM DLL still in memory when Unidrv or Pscript drivers + // are unloaded, Unidrv and Pscript driver ignore the return value of + // DllCanUnloadNow of the OEM DLL, and always call FreeLibrary on the OEMDLL. + // + // If OEM DLL spins off a working thread that also uses the OEM DLL, the + // thread needs to call LoadLibrary and FreeLibraryAndExitThread, otherwise + // it may crash after Unidrv or Pscript calls FreeLibrary. + // + + VERBOSE(DLLTEXT("DllCanUnloadNow entered.\r\n")); + + if ((g_cComponents == 0) && (g_cServerLocks == 0)) + { + return S_OK; + } + else + { + return S_FALSE; + } +} + +// +// Get class factory +// +STDAPI DllGetClassObject( + _In_ REFCLSID clsid, + _In_ REFIID iid, + _Outptr_ LPVOID* ppv) +{ + VERBOSE(DLLTEXT("DllGetClassObject:\tCreate class factory.\r\n")); + + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Can we create this component? + if (clsid != CLSID_OEMRENDER) + { + return CLASS_E_CLASSNOTAVAILABLE; + } + + // Create class factory. + IOemCF* pFontCF = new IOemCF; // Reference count set to 1 + // in constructor + if (pFontCF == NULL) + { + return E_OUTOFMEMORY; + } + + // Get requested interface. + HRESULT hr = pFontCF->QueryInterface(iid, ppv); + pFontCF->Release(); + + return hr; +} diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/intrface.h b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/intrface.h new file mode 100644 index 00000000..7a4a3c84 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/intrface.h @@ -0,0 +1,116 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Intrface.H +// +// +// PURPOSE: Define COM interface for User Mode Printer Customization DLL. +// +#pragma once + +//////////////////////////////////////////////////////////////////////////////// +// +// IWaterMarkPS +// +// Interface for PostScript OEM sample rendering module +// +class IWaterMarkPS : public IPrintOemPS +{ +public: + // *** IUnknown methods *** + + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release) (THIS); + + // + // Method for publishing Driver interface. + // + STDMETHOD(PublishDriverInterface)(THIS_ IUnknown *pIUnknown); + + // + // Method for OEM to specify DDI hook out + // + + STDMETHOD(EnableDriver) (THIS_ DWORD DriverVersion, + DWORD cbSize, + PDRVENABLEDATA pded); + + // + // Method to notify OEM plugin that it is no longer required + // + + STDMETHOD(DisableDriver) (THIS); + + // + // Method for OEM to contruct its own PDEV + // + + STDMETHOD(EnablePDEV) (THIS_ PDEVOBJ pdevobj, + _In_ PWSTR pPrinterName, + ULONG cPatterns, + HSURF *phsurfPatterns, + ULONG cjGdiInfo, + GDIINFO *pGdiInfo, + ULONG cjDevInfo, + DEVINFO *pDevInfo, + DRVENABLEDATA *pded, + OUT PDEVOEM *pDevOem); + + // + // Method for OEM to free any resource associated with its PDEV + // + + STDMETHOD(DisablePDEV) (THIS_ PDEVOBJ pdevobj); + + // + // Method for OEM to transfer from old PDEV to new PDEV + // + + STDMETHOD(ResetPDEV) (THIS_ PDEVOBJ pdevobjOld, + PDEVOBJ pdevobjNew); + + + // + // Get OEM dll related information + // + + STDMETHOD(GetInfo) (THIS_ DWORD dwMode, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded); + // + // OEMDevMode + // + + STDMETHOD(DevMode) (THIS_ DWORD dwMode, + POEMDMPARAM pOemDMParam); + + // + // OEMCommand - PSCRIPT only, return E_NOTIMPL on Unidrv + // + + STDMETHOD(Command) (THIS_ PDEVOBJ pdevobj, + DWORD dwIndex, + PVOID pData, + DWORD cbSize, + OUT DWORD *pdwResult); + + // + + IWaterMarkPS() { m_cRef = 1; m_pOEMHelp = NULL; }; + ~IWaterMarkPS(); + +protected: + LONG m_cRef; + IPrintOemDriverPS* m_pOEMHelp; +}; diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/precomp.h b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/precomp.h new file mode 100644 index 00000000..1c44a730 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/precomp.h @@ -0,0 +1,51 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: precomp.h +// +// PURPOSE: Header files that should be in the precompiled header. + +#pragma once + +// Necessary for compiling under VC. +#if(!defined(WINVER) || (WINVER < 0x0500)) + #undef WINVER + #define WINVER 0x0500 +#endif +#if(!defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500)) + #undef _WIN32_WINNT + #define _WIN32_WINNT 0x0500 +#endif + + +// Required header files that shouldn't change often. + + +#include <STDDEF.H> +#include <STDLIB.H> +#include <OBJBASE.H> +#include <STDARG.H> +#include <STDIO.H> +#include <WINDEF.H> +#include <WINERROR.H> +#include <WINBASE.H> +#include <WINGDI.H> +#include <WINDDI.H> +#include <TCHAR.H> +#include <EXCPT.H> +#include <ASSERT.H> +#include <PRINTOEM.H> +#include <INITGUID.H> +#include <PRCOMOEM.H> + +// Safe integer functions to detect integer overflow/underflow conditions: +#include <intsafe.h> + +// StrSafe.h needs to be included last +// to disallow unsafe string functions. +#include <STRSAFE.H> + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/precompsrc.cpp b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/precompsrc.cpp new file mode 100644 index 00000000..5944cf51 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/precompsrc.cpp @@ -0,0 +1 @@ +#include "precomp.h"
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/resource.h b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/resource.h new file mode 100644 index 00000000..819dbd98 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/resource.h @@ -0,0 +1,18 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by WMarkPS.rc +// +#define IDR_WATERMARK_PROLOGUE 1 +#define IDR_WATERMARK_DRAW 2 +#define RC_PSCRIPT 0x5053 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 105 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 102 +#endif +#endif diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/wmark.ps b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/wmark.ps new file mode 100644 index 00000000..e9200e65 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/wmark.ps @@ -0,0 +1,33 @@ +userdict /DrawWaterMark { +userdict begin +/Watermark (%ls) def +/FontSize %d def +/Font /Helvetica def +/WaterMarkColor {%s setrgbcolor} bind def +/Angle %s def + +gsave +initgraphics + +Angle rotate + +clippath +pathbbox /MaxY exch def /MaxX exch def /MinY exch def /MinX exch def + +Font findfont FontSize scalefont setfont +/MarkLen Watermark stringwidth pop 1.20 mul def +WaterMarkColor + +MinY FontSize MaxY +{ + MinX MarkLen MaxX + { + 1 index moveto Watermark show + } for + pop +} bind for +grestore +end +} bind put + +
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/wmarkps.h b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/wmarkps.h new file mode 100644 index 00000000..d16c6581 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkps/wmarkps.h @@ -0,0 +1,25 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: WMarkPS.H +// +// PURPOSE: Define common data types, and external function prototypes +// for debug.cpp. +// +#pragma once + +#include <OEM.H> +#include <DEVMODE.H> + + +//////////////////////////////////////////////////////// +// OEM Defines +//////////////////////////////////////////////////////// + +#define DLLTEXT(s) "WMARKPS: " s + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/WMARKUI.vcxproj b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/WMARKUI.vcxproj new file mode 100644 index 00000000..323f5446 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/WMARKUI.vcxproj @@ -0,0 +1,1096 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Win10 Debug|ARM64"> + <Configuration>Win10 Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|Win32"> + <Configuration>Win10 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|x64"> + <Configuration>Win10 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|ARM64"> + <Configuration>Win10 Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|Win32"> + <Configuration>Win10 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|x64"> + <Configuration>Win10 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|Win32"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|Win32"> + <Configuration>Win8 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|Win32"> + <Configuration>Win7 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|Win32"> + <Configuration>Win8.1 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|Win32"> + <Configuration>Win8 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|Win32"> + <Configuration>Win7 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|x64"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|x64"> + <Configuration>Win8 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|x64"> + <Configuration>Win7 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|x64"> + <Configuration>Win8.1 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|x64"> + <Configuration>Win8 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|x64"> + <Configuration>Win7 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{BE3E261C-4EF8-4BC2-AAD2-49F1292512CE}</ProjectGuid> + <RootNamespace>$(MSBuildProjectName)</RootNamespace> + <Configuration Condition="'$(Configuration)' == ''">Win10 Debug</Configuration> + <Platform Condition="'$(Platform)' == ''">Win32</Platform> + <SampleGuid>{975265B8-77E8-4C62-AD5A-C554605BE6DF}</SampleGuid> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <PropertyGroup> + <OutDir>$(IntDir)</OutDir> + </PropertyGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ItemGroup Label="WrappedTaskItems" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetName>WMARKUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetName>WMARKUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetName>WMARKUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <TargetName>WMARKUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <TargetName>WMARKUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetName>WMARKUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetName>WMARKUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetName>WMARKUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <TargetName>WMARKUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <TargetName>WMARKUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetName>WMARKUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetName>WMARKUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetName>WMARKUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <TargetName>WMARKUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetName>WMARKUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetName>WMARKUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetName>WMARKUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <TargetName>WMARKUI</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Link> + <ModuleDefinitionFile>WMARKUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Link> + <ModuleDefinitionFile>WMARKUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Link> + <ModuleDefinitionFile>WMARKUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <Link> + <ModuleDefinitionFile>WMARKUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <Link> + <ModuleDefinitionFile>WMARKUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Link> + <ModuleDefinitionFile>WMARKUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Link> + <ModuleDefinitionFile>WMARKUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Link> + <ModuleDefinitionFile>WMARKUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <Link> + <ModuleDefinitionFile>WMARKUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <Link> + <ModuleDefinitionFile>WMARKUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Link> + <ModuleDefinitionFile>WMARKUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Link> + <ModuleDefinitionFile>WMARKUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Link> + <ModuleDefinitionFile>WMARKUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <Link> + <ModuleDefinitionFile>WMARKUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>WMARKUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>WMARKUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>WMARKUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>WMARKUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="dllentry.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="fdevmode.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="globals.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Create</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="WMARKUI.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ResourceCompile Include="WMARKUI.rc" /> + </ItemGroup> + <ItemGroup> + <Inf Exclude="@(Inf)" Include="*.inf" /> + <FilesToPackage Include="$(TargetPath)" Condition="'$(ConfigurationType)'=='Driver' or '$(ConfigurationType)'=='DynamicLibrary'" /> + </ItemGroup> + <ItemGroup> + <None Exclude="@(None)" Include="*.txt;*.htm;*.html" /> + <None Exclude="@(None)" Include="*.ico;*.cur;*.bmp;*.dlg;*.rct;*.gif;*.jpg;*.jpeg;*.wav;*.jpe;*.tiff;*.tif;*.png;*.rc2" /> + <None Exclude="@(None)" Include="*.def;*.bat;*.hpj;*.asmx" /> + </ItemGroup> + <ItemGroup> + <ClInclude Exclude="@(ClInclude)" Include="*.h;*.hpp;*.hxx;*.hm;*.inl;*.xsd" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/WMARKUI.vcxproj.Filters b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/WMARKUI.vcxproj.Filters new file mode 100644 index 00000000..d5115804 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/WMARKUI.vcxproj.Filters @@ -0,0 +1,140 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;*</Extensions> + <UniqueIdentifier>{0B03BE39-8181-4B6F-B5BE-004CA8F13B55}</UniqueIdentifier> + </Filter> + <Filter Include="Header Files"> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + <UniqueIdentifier>{F94EBF1D-EB81-461D-9960-95F6ABDC92C2}</UniqueIdentifier> + </Filter> + <Filter Include="Resource Files"> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms;man;xml</Extensions> + <UniqueIdentifier>{43EA5B9C-BE86-4C59-BE80-7DAF38D33EEE}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClCompile Include="dllentry.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="fdevmode.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="globals.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="WMARKUI.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="globals.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkui.h" /> + <ClInclude Include="globals.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkui.h" /> + <ClInclude Include="globals.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkui.h" /> + <ClInclude Include="globals.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkui.h" /> + <ClInclude Include="globals.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkui.h" /> + <ClInclude Include="globals.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkui.h" /> + <ClInclude Include="globals.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkui.h" /> + <ClInclude Include="globals.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkui.h" /> + <ClInclude Include="globals.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkui.h" /> + <ClInclude Include="globals.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkui.h" /> + <ClInclude Include="globals.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkui.h" /> + <ClInclude Include="globals.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkui.h" /> + <ClInclude Include="globals.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkui.h" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="WMARKUI.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> + <ItemGroup> + <None Include="wmarkui.def"> + <Filter>Source Files</Filter> + </None> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/dllentry.cpp b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/dllentry.cpp new file mode 100644 index 00000000..ae16c921 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/dllentry.cpp @@ -0,0 +1,52 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: dllentry.cpp +// +// +// PURPOSE: Source module for DLL entry function(s). +// + + +#include "precomp.h" +#include "wmarkui.h" +#include "debug.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +/////////////////////////////////////////////////////////// +// +// DLL entry point +// +BOOL WINAPI DllMain(HINSTANCE hInst, WORD wReason, LPVOID lpReserved) +{ + UNREFERENCED_PARAMETER(lpReserved); + + switch(wReason) + { + case DLL_PROCESS_ATTACH: + VERBOSE(DLLTEXT("Process attach.\r\n")); + ghInstance = hInst; + break; + + case DLL_THREAD_ATTACH: + VERBOSE(DLLTEXT("Thread attach.\r\n")); + break; + + case DLL_PROCESS_DETACH: + VERBOSE(DLLTEXT("Process detach.\r\n")); + break; + + case DLL_THREAD_DETACH: + VERBOSE(DLLTEXT("Thread detach.\r\n")); + break; + } + + return TRUE; +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/fdevmode.cpp b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/fdevmode.cpp new file mode 100644 index 00000000..bc8d4b6e --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/fdevmode.cpp @@ -0,0 +1,21 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: fDevmode.cpp +// +// +// PURPOSE: Place holder file for devmode functions. +// + + +#include "precomp.h" +#include "wmarkui.h" + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +#include <DEVMODE.CPP> diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/globals.cpp b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/globals.cpp new file mode 100644 index 00000000..39f8e57a --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/globals.cpp @@ -0,0 +1,27 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Globals.cpp +// +// +// PURPOSE: File that contains all the globals. +// + +#pragma once +#include "precomp.h" +#include "wmarkui.h" + + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +/////////////////////////////////////// +// Globals +/////////////////////////////////////// + +// Module's Instance handle from DLLEntry of process. +HINSTANCE ghInstance = NULL; diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/globals.h b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/globals.h new file mode 100644 index 00000000..5472f514 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/globals.h @@ -0,0 +1,22 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Globals.h +// +// +// PURPOSE: Lists of globals declared in Globals.cpp. +// + +#pragma once + +/////////////////////////////////////// +// Globals +/////////////////////////////////////// + +// Module's Instance handle from DLLEntry of process. +extern HINSTANCE ghInstance; + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/intrface.cpp b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/intrface.cpp new file mode 100644 index 00000000..d610f46d --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/intrface.cpp @@ -0,0 +1,522 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: intrface.cpp +// +// PURPOSE: Implement the UI interface plug-in +// + +#include "precomp.h" + +#include "wmarkui.h" +#include "debug.h" +#include "intrface.h" + + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +//////////////////////////////////////////////////////// +// Internal Globals +//////////////////////////////////////////////////////// + +static long g_cComponents = 0 ; // Count of active components +static long g_cServerLocks = 0 ; // Count of locks + + + +//////////////////////////////////////////////////////////////////////////////// +// +// IWaterMarkUI body +// +HRESULT __stdcall IWaterMarkUI::QueryInterface(const IID& iid, void** ppv) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:QueryInterface entry.\r\n\r\n")); + if (iid == IID_IUnknown) + { + *ppv = static_cast<IUnknown*>(this); + VERBOSE(DLLTEXT("IWaterMarkUI:Return pointer to IUnknown.\r\n\r\n")); + } + else if (iid == IID_IPrintOemUI) + { + *ppv = static_cast<IPrintOemUI*>(this) ; + VERBOSE(DLLTEXT("IWaterMarkUI:Return pointer to IPrintOemUI.\r\n")); + } + else + { + VERBOSE(DLLTEXT("IWaterMarkUI::QueryInterface: interface not supported.\r\n")); + *ppv = NULL ; + return E_NOINTERFACE ; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef() ; + return S_OK ; +} + +ULONG __stdcall IWaterMarkUI::AddRef() +{ + VERBOSE(DLLTEXT("IWaterMarkUI:AddRef entry.\r\n")); + return InterlockedIncrement(&m_cRef) ; +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall IWaterMarkUI::Release() +{ + VERBOSE(DLLTEXT("IWaterMarkUI:Release entry.\r\n")); + ASSERT( 0 != m_cRef); + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + + } + return cRef; +} + +HRESULT __stdcall IWaterMarkUI::PublishDriverInterface( + IUnknown *pIUnknown) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:PublishDriverInterface entry.\r\n")); + + UNREFERENCED_PARAMETER(pIUnknown); + + // Don't use the DriverInterface, so don't store it. + + return S_OK; +} + +HRESULT __stdcall IWaterMarkUI::GetInfo( + DWORD dwMode, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded) +{ + VERBOSE(DLLTEXT("IWaterMarkUI::GetInfo entry.\r\r\n")); + + // Validate parameters. + if( (NULL == pcbNeeded) + || + ( (OEMGI_GETSIGNATURE != dwMode) + && + (OEMGI_GETVERSION != dwMode) + && + (OEMGI_GETPUBLISHERINFO != dwMode) + ) + ) + { + VERBOSE(DLLTEXT("IWaterMarkUI::GetInfo() exit pcbNeeded is NULL!\r\r\n")); + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Set expected buffer size and number of bytes written. + *pcbNeeded = sizeof(DWORD); + + // Check buffer size is sufficient. + if((cbSize < *pcbNeeded) || (NULL == pBuffer)) + { + WARNING(DLLTEXT("IWaterMarkUI::GetInfo() exit insufficient buffer!\r\r\n")); + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return E_FAIL; + } + + switch(dwMode) + { + // OEM DLL Signature + case OEMGI_GETSIGNATURE: + *(PDWORD)pBuffer = OEM_SIGNATURE; + break; + + // OEM DLL version + case OEMGI_GETVERSION: + *(PDWORD)pBuffer = OEM_VERSION; + break; + + // dwMode not supported. + default: + // Set written bytes to zero since nothing was written. + WARNING(DLLTEXT("IWaterMarkUI::GetInfo() exit mode not supported.\r\r\n")); + *pcbNeeded = 0; + SetLastError(ERROR_NOT_SUPPORTED); + return E_FAIL; + } + + VERBOSE(DLLTEXT("IWaterMarkUI::GetInfo() exit S_OK.\r\r\n")); + return S_OK; +} + +HRESULT __stdcall IWaterMarkUI::DevMode( + DWORD dwMode, + POEMDMPARAM pOemDMParam) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:DevMode entry.\r\n")); + + return hrOEMDevMode(dwMode, pOemDMParam); +} + +HRESULT __stdcall IWaterMarkUI::CommonUIProp( + DWORD dwMode, + POEMCUIPPARAM pOemCUIPParam) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:CommonUIProp entry.\r\n")); + + return hrOEMPropertyPage(dwMode, pOemCUIPParam); +} + + +HRESULT __stdcall IWaterMarkUI::DocumentPropertySheets( + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:DocumentPropertySheets entry.\r\n")); + + UNREFERENCED_PARAMETER(pPSUIInfo); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +} + +HRESULT __stdcall IWaterMarkUI::DevicePropertySheets( + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:DevicePropertySheets entry.\r\n")); + + UNREFERENCED_PARAMETER(pPSUIInfo); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +} + +HRESULT __stdcall IWaterMarkUI::DeviceCapabilities( + POEMUIOBJ poemuiobj, + HANDLE hPrinter, + _In_ PWSTR pDeviceName, + WORD wCapability, + PVOID pOutput, + PDEVMODE pPublicDM, + PVOID pOEMDM, + DWORD dwOld, + DWORD *dwResult) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:DeviceCapabilities entry.\r\n")); + + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(pDeviceName); + UNREFERENCED_PARAMETER(wCapability); + UNREFERENCED_PARAMETER(pOutput); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + UNREFERENCED_PARAMETER(dwOld); + UNREFERENCED_PARAMETER(dwResult); + + return E_NOTIMPL; +} + +HRESULT __stdcall IWaterMarkUI::DevQueryPrintEx( + POEMUIOBJ poemuiobj, + PDEVQUERYPRINT_INFO pDQPInfo, + PDEVMODE pPublicDM, + PVOID pOEMDM) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:DevQueryPrintEx entry.\r\n")); + + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(pDQPInfo); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + + return E_NOTIMPL; +} + +HRESULT __stdcall IWaterMarkUI::UpgradePrinter( + DWORD dwLevel, + PBYTE pDriverUpgradeInfo) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:UpgradePrinter entry.\r\n")); + + UNREFERENCED_PARAMETER(dwLevel); + UNREFERENCED_PARAMETER(pDriverUpgradeInfo); + + return E_NOTIMPL; +} + +HRESULT __stdcall IWaterMarkUI::PrinterEvent( + _In_ PWSTR pPrinterName, + INT iDriverEvent, + DWORD dwFlags, + LPARAM lParam) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:PrinterEvent entry.\r\n")); + + UNREFERENCED_PARAMETER(pPrinterName); + UNREFERENCED_PARAMETER(iDriverEvent); + UNREFERENCED_PARAMETER(dwFlags); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +} + +HRESULT __stdcall IWaterMarkUI::DriverEvent( + DWORD dwDriverEvent, + DWORD dwLevel, + LPBYTE pDriverInfo, + LPARAM lParam) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:DriverEvent entry.\r\n")); + + UNREFERENCED_PARAMETER(dwDriverEvent); + UNREFERENCED_PARAMETER(dwLevel); + UNREFERENCED_PARAMETER(pDriverInfo); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +}; + + +HRESULT __stdcall IWaterMarkUI::QueryColorProfile( + HANDLE hPrinter, + POEMUIOBJ poemuiobj, + PDEVMODE pPublicDM, + PVOID pOEMDM, + ULONG ulQueryMode, + VOID *pvProfileData, + ULONG *pcbProfileData, + FLONG *pflProfileData) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:QueryColorProfile entry.\r\n")); + + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + UNREFERENCED_PARAMETER(ulQueryMode); + UNREFERENCED_PARAMETER(pvProfileData); + UNREFERENCED_PARAMETER(pcbProfileData); + UNREFERENCED_PARAMETER(pflProfileData); + + return E_NOTIMPL; +}; + +HRESULT __stdcall IWaterMarkUI::FontInstallerDlgProc( + HWND hWnd, + UINT usMsg, + WPARAM wParam, + LPARAM lParam) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:FontInstallerDlgProc entry.\r\n")); + + UNREFERENCED_PARAMETER(hWnd); + UNREFERENCED_PARAMETER(usMsg); + UNREFERENCED_PARAMETER(wParam); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +}; + +HRESULT __stdcall IWaterMarkUI::UpdateExternalFonts( + HANDLE hPrinter, + HANDLE hHeap, + _In_ PWSTR pwstrCartridges) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:UpdateExternalFonts entry.\r\n")); + + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(hHeap); + UNREFERENCED_PARAMETER(pwstrCartridges); + + return E_NOTIMPL; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// oem class factory +// +class IOemCF : public IClassFactory +{ +public: + // *** IUnknown methods *** + + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release) (THIS); + + // *** IClassFactory methods *** + STDMETHOD(CreateInstance) (THIS_ + LPUNKNOWN pUnkOuter, + REFIID riid, + LPVOID FAR* ppvObject); + STDMETHOD(LockServer) (THIS_ BOOL bLock); + + + // Constructor + IOemCF(): m_cRef(1) { }; + ~IOemCF() { }; + +protected: + LONG m_cRef; + +}; + +/////////////////////////////////////////////////////////// +// +// Class factory body +// +HRESULT __stdcall IOemCF::QueryInterface(const IID& iid, void** ppv) +{ + if ((iid == IID_IUnknown) || (iid == IID_IClassFactory)) + { + *ppv = static_cast<IOemCF*>(this) ; + } + else + { + WARNING(DLLTEXT("IOemCF::QueryInterface: interface not supported.\r\n")); + *ppv = NULL ; + return E_NOINTERFACE ; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef() ; + return S_OK ; +} + +ULONG __stdcall IOemCF::AddRef() +{ + return InterlockedIncrement(&m_cRef) ; +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall IOemCF::Release() +{ + ASSERT( 0 != m_cRef); + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + + } + return cRef; +} + +// IClassFactory implementation +HRESULT __stdcall IOemCF::CreateInstance(IUnknown* pUnknownOuter, + const IID& iid, + void** ppv) +{ + //DbgPrint(DLLTEXT("Class factory:\t\tCreate component.")) ; + + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Cannot aggregate. + if (pUnknownOuter != NULL) + { + return CLASS_E_NOAGGREGATION ; + } + + // Create component. + IWaterMarkUI* pOemCB = new IWaterMarkUI ; + if (pOemCB == NULL) + { + return E_OUTOFMEMORY ; + } + // Get the requested interface. + HRESULT hr = pOemCB->QueryInterface(iid, ppv) ; + + // Release the IUnknown pointer. + // (If QueryInterface failed, component will delete itself.) + pOemCB->Release() ; + return hr ; +} + +// LockServer +HRESULT __stdcall IOemCF::LockServer(BOOL bLock) +{ + if (bLock) + { + InterlockedIncrement(&g_cServerLocks) ; + } + else + { + InterlockedDecrement(&g_cServerLocks) ; + } + return S_OK ; +} + +/////////////////////////////////////////////////////////// +// +// Exported functions +// + + +// Can DLL unload now? +// +STDAPI DllCanUnloadNow() +{ + // + // To avoid leaving OEM DLL still in memory when Unidrv or Pscript drivers + // are unloaded, Unidrv and Pscript driver ignore the return value of + // DllCanUnloadNow of the OEM DLL, and always call FreeLibrary on the OEMDLL. + // + // If OEM DLL spins off a working thread that also uses the OEM DLL, the + // thread needs to call LoadLibrary and FreeLibraryAndExitThread, otherwise + // it may crash after Unidrv or Pscript calls FreeLibrary. + // + + if ((g_cComponents == 0) && (g_cServerLocks == 0)) + { + return S_OK ; + } + else + { + return S_FALSE; + } +} + +// +// Get class factory +// +STDAPI DllGetClassObject( + _In_ REFCLSID clsid, + _In_ REFIID iid, + _Outptr_ LPVOID* ppv) +{ + VERBOSE(DLLTEXT("DllGetClassObject:Create class factory.\r\n")); + + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Can we create this component? + if (clsid != CLSID_OEMUI) + { + return CLASS_E_CLASSNOTAVAILABLE ; + } + + // Create class factory. + IOemCF* pFontCF = new IOemCF ; // Reference count set to 1 + // in constructor + if (pFontCF == NULL) + { + return E_OUTOFMEMORY ; + } + + // Get requested interface. + HRESULT hr = pFontCF->QueryInterface(iid, ppv) ; + pFontCF->Release() ; + + return hr ; +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/intrface.h b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/intrface.h new file mode 100644 index 00000000..cccfce7d --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/intrface.h @@ -0,0 +1,177 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: intrface.H +// +// PURPOSE: Define the UI interface plug-in +// +#pragma once + +//////////////////////////////////////////////////////////////////////////////// +// +// IWaterMarkUI +// +class IWaterMarkUI: public IPrintOemUI +{ +public: + // *** IUnknown methods *** + + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release) (THIS); + + // + // Method for publishing Driver interface. + // + STDMETHOD(PublishDriverInterface)(THIS_ IUnknown *pIUnknown); + + // + // Get OEM dll related information + // + + STDMETHOD(GetInfo) (THIS_ DWORD dwMode, PVOID pBuffer, DWORD cbSize, + PDWORD pcbNeeded); + + // + // OEMDevMode + // + + STDMETHOD(DevMode) (THIS_ DWORD dwMode, POEMDMPARAM pOemDMParam) ; + + // + // OEMCommonUIProp + // + + STDMETHOD(CommonUIProp) (THIS_ + DWORD dwMode, + POEMCUIPPARAM pOemCUIPParam + ); + + // + // OEMDocumentPropertySheets + // + + STDMETHOD(DocumentPropertySheets) (THIS_ + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam + ); + + // + // OEMDevicePropertySheets + // + + STDMETHOD(DevicePropertySheets) (THIS_ + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam + ); + + + // + // OEMDevQueryPrintEx + // + + STDMETHOD(DevQueryPrintEx) (THIS_ + POEMUIOBJ poemuiobj, + PDEVQUERYPRINT_INFO pDQPInfo, + PDEVMODE pPublicDM, + PVOID pOEMDM + ); + + // + // OEMDeviceCapabilities + // + + STDMETHOD(DeviceCapabilities) (THIS_ + POEMUIOBJ poemuiobj, + HANDLE hPrinter, + _In_ PWSTR pDeviceName, + WORD wCapability, + PVOID pOutput, + PDEVMODE pPublicDM, + PVOID pOEMDM, + DWORD dwOld, + DWORD *dwResult + ); + + // + // OEMUpgradePrinter + // + + STDMETHOD(UpgradePrinter) (THIS_ + DWORD dwLevel, + PBYTE pDriverUpgradeInfo + ); + + // + // OEMPrinterEvent + // + + STDMETHOD(PrinterEvent) (THIS_ + _In_ PWSTR pPrinterName, + INT iDriverEvent, + DWORD dwFlags, + LPARAM lParam + ); + + // + // OEMDriverEvent + // + + STDMETHOD(DriverEvent)(THIS_ + DWORD dwDriverEvent, + DWORD dwLevel, + LPBYTE pDriverInfo, + LPARAM lParam + ); + + // + // OEMQueryColorProfile + // + + STDMETHOD(QueryColorProfile) (THIS_ + HANDLE hPrinter, + POEMUIOBJ poemuiobj, + PDEVMODE pPublicDM, + PVOID pOEMDM, + ULONG ulReserved, + VOID *pvProfileData, + ULONG *pcbProfileData, + FLONG *pflProfileData); + + // + // OEMFontInstallerDlgProc + // + + STDMETHOD(FontInstallerDlgProc) (THIS_ + HWND hWnd, + UINT usMsg, + WPARAM wParam, + LPARAM lParam + ); + // + // UpdateExternalFonts + // + + STDMETHOD(UpdateExternalFonts) (THIS_ + HANDLE hPrinter, + HANDLE hHeap, + _In_ PWSTR pwstrCartridges + ); + + + IWaterMarkUI() { m_cRef = 1; }; + ~IWaterMarkUI() { }; + +protected: + LONG m_cRef; +}; + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/precomp.h b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/precomp.h new file mode 100644 index 00000000..e861cd21 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/precomp.h @@ -0,0 +1,50 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: precomp.h +// +// PURPOSE: Header files that should be in the precompiled header. + +#pragma once + +// Necessary for compiling under VC. +#if(!defined(WINVER) || (WINVER < 0x0500)) + #undef WINVER + #define WINVER 0x0500 +#endif +#if(!defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500)) + #undef _WIN32_WINNT + #define _WIN32_WINNT 0x0500 +#endif + +// Required header files that shouldn't change often. + + +#include <STDDEF.H> +#include <STDLIB.H> +#include <OBJBASE.H> +#include <STDARG.H> +#include <STDIO.H> +#include <WINDEF.H> +#include <WINERROR.H> +#include <WINBASE.H> +#include <WINGDI.H> +#include <WINDDI.H> +#include <TCHAR.H> +#include <EXCPT.H> +#include <ASSERT.H> +#include <PRSHT.H> +#include <COMPSTUI.H> +#include "WINDDIUI.H" +#include <PRINTOEM.H> +#include <INITGUID.H> +#include <PRCOMOEM.H> + +// StrSafe.h needs to be included last +// to disallow unsafe string functions. +#include <STRSAFE.H> + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/precompsrc.cpp b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/precompsrc.cpp new file mode 100644 index 00000000..5944cf51 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/precompsrc.cpp @@ -0,0 +1 @@ +#include "precomp.h"
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/resource.h b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/resource.h new file mode 100644 index 00000000..5993d40c --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/resource.h @@ -0,0 +1,24 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by wmarkui.rc +// +#define IDS_WATERMARK 1 +#define IDS_TEXT 2 +#define IDS_FONTSIZE 3 +#define IDS_ANGLE 4 +#define IDS_COLOR 5 +#define IDS_GRAY 6 +#define IDS_RED 7 +#define IDS_GREEN 8 +#define IDS_BLUE 9 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 103 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/wmarkui.cpp b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/wmarkui.cpp new file mode 100644 index 00000000..c09e47c6 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/wmarkui.cpp @@ -0,0 +1,590 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: WMarkUI.cpp +// +// +// PURPOSE: Main file for OEM UI test module. +// +// + +#include "precomp.h" +#include "resource.h" +#include "debug.h" +#include "wmarkui.h" + + +// This indicates to Prefast that this is a usermode driver file. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +//////////////////////////////////////////////////////// +// INTERNAL MACROS and DEFINES +//////////////////////////////////////////////////////// + + + +//////////////////////////////////////////////////////// +// INTERNAL PROTOTYPES +//////////////////////////////////////////////////////// + +LONG APIENTRY OEMUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam); +static HRESULT hrDocumentPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam); +static void InitOptItems(POPTITEM pOptItems, DWORD dwOptItems); +static POPTTYPE CreateOptType(HANDLE hHeap, WORD wOptParams); +static DWORD FontSizeToIndex(DWORD dwFontSize); +static DWORD FontIndexToSize(DWORD dwIndex); +static DWORD TextColorToIndex(COLORREF crTextColor); +static COLORREF IndexToTextColor(DWORD dwIndex); +static PTSTR GetStringResource(HANDLE hHeap, HMODULE hModule, UINT uResource); + + + +//////////////////////////////////////////////////////////////////////////////// +// +// Initializes OptItems to display OEM device or document property UI. +// +HRESULT hrOEMPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam) +{ + HRESULT hResult = S_OK; + + + VERBOSE(DLLTEXT("hrOEMPropertyPage entry.\r\n")); + + // Validate parameters. + if( (OEMCUIP_DOCPROP != dwMode) + && + (OEMCUIP_PRNPROP != dwMode) + ) + { + ERR(DLLTEXT("hrOEMPropertyPage() ERROR_INVALID_PARAMETER.\r\n")); + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + switch(dwMode) + { + case OEMCUIP_DOCPROP: + hResult = hrDocumentPropertyPage(dwMode, pOEMUIParam); + break; + + case OEMCUIP_PRNPROP: + // Don't have any Printer Proptery UI. + hResult = E_NOTIMPL; + break; + + default: + // Should never reach this! + ERR(DLLTEXT("hrOEMPropertyPage() Invalid dwMode")); + SetLastError(ERROR_INVALID_PARAMETER); + hResult = E_FAIL; + break; + } + + return hResult; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// OptItems call back for OEM device or document property UI. +// +LONG APIENTRY OEMUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam) +{ + LONG lReturn = CPSUICB_ACTION_NONE; + POEMDEV pOEMDev = (POEMDEV) pOEMUIParam->pOEMDM; + + + VERBOSE(DLLTEXT("OEMUICallBack() entry.\r\n")); + + switch(pCallbackParam->Reason) + { + case CPSUICB_REASON_APPLYNOW: + // Store OptItems state in DEVMODE. + pOEMDev->bEnabled = !pOEMUIParam->pOEMOptItems[0].Sel; + if(FAILED(StringCbCopyW(pOEMDev->szWaterMark, sizeof(pOEMDev->szWaterMark), (LPWSTR)pOEMUIParam->pOEMOptItems[1].pSel))) + { + ERR(DLLTEXT("OEMUICallBack() failed to copy water mark text\r\n")); + } + pOEMDev->dwFontSize = FontIndexToSize(pOEMUIParam->pOEMOptItems[2].Sel); + pOEMDev->dfRotate = (DOUBLE) pOEMUIParam->pOEMOptItems[3].Sel; + pOEMDev->crTextColor = IndexToTextColor(pOEMUIParam->pOEMOptItems[4].Sel); + break; + + default: + break; + } + + return lReturn; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Initializes OptItems to display OEM document property UI. +// +static HRESULT hrDocumentPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam) +{ + if(NULL == pOEMUIParam->pOEMOptItems) + { + // Fill in the number of OptItems to create for OEM document property UI. + pOEMUIParam->cOEMOptItems = 5; + + VERBOSE(DLLTEXT("hrDocumentPropertyPage() requesting items.\r\n")); + } + else if(dwMode == OEMCUIP_DOCPROP) + { + POEMDEV pOEMDev = (POEMDEV) pOEMUIParam->pOEMDM; + + + VERBOSE(DLLTEXT("hrDocumentPropertyPage() fill out items.\r\n")); + + // Init UI Callback reference. + pOEMUIParam->OEMCUIPCallback = OEMUICallBack; + + // Init OEMOptItmes. + InitOptItems(pOEMUIParam->pOEMOptItems, pOEMUIParam->cOEMOptItems); + + // Fill out tree view items. + + // Water Mark Section Name. + pOEMUIParam->pOEMOptItems[0].Level = 1; + pOEMUIParam->pOEMOptItems[0].Flags = OPTIF_COLLAPSE; + pOEMUIParam->pOEMOptItems[0].pName = GetStringResource(pOEMUIParam->hOEMHeap, ghInstance, IDS_WATERMARK); + pOEMUIParam->pOEMOptItems[0].Sel = pOEMDev->bEnabled ? 0 : 1; + + pOEMUIParam->pOEMOptItems[0].pOptType = CreateOptType(pOEMUIParam->hOEMHeap, 2); + + pOEMUIParam->pOEMOptItems[0].pOptType->Type = TVOT_COMBOBOX; + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[0].pData = L"Enabled"; + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[0].IconID = IDI_CPSUI_ON; + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].pData = L"Disabled"; + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].IconID = IDI_CPSUI_OFF; + + + // WaterMark Text. + pOEMUIParam->pOEMOptItems[1].Level = 2; + pOEMUIParam->pOEMOptItems[1].Flags = 0; + pOEMUIParam->pOEMOptItems[1].pName = GetStringResource(pOEMUIParam->hOEMHeap, ghInstance, IDS_TEXT); + pOEMUIParam->pOEMOptItems[1].pSel = (LPTSTR) HeapAlloc(pOEMUIParam->hOEMHeap, HEAP_ZERO_MEMORY, MAX_PATH * sizeof(WCHAR)); + if (pOEMUIParam->pOEMOptItems[1].pSel == NULL) + { + ERR(DLLTEXT("hrDocumentPropertyPage() failed to copy water mark text\r\n")); + return E_OUTOFMEMORY; + } + + if(FAILED(StringCbCopyW((LPWSTR)pOEMUIParam->pOEMOptItems[1].pSel, MAX_PATH * sizeof(WCHAR), pOEMDev->szWaterMark))) + { + ERR(DLLTEXT("hrDocumentPropertyPage() failed to copy water mark text\r\n")); + } + + pOEMUIParam->pOEMOptItems[1].pOptType = CreateOptType(pOEMUIParam->hOEMHeap, 2); + + pOEMUIParam->pOEMOptItems[1].pOptType->Type = TVOT_EDITBOX; + pOEMUIParam->pOEMOptItems[1].pOptType->pOptParam[1].IconID = sizeof(((POEMDEV)NULL)->szWaterMark)/sizeof(WCHAR); + + + // WaterMark Font Size. + pOEMUIParam->pOEMOptItems[2].Level = 2; + pOEMUIParam->pOEMOptItems[2].Flags = 0; + pOEMUIParam->pOEMOptItems[2].pName = GetStringResource(pOEMUIParam->hOEMHeap, ghInstance, IDS_FONTSIZE); + pOEMUIParam->pOEMOptItems[2].Sel = FontSizeToIndex(pOEMDev->dwFontSize); + + pOEMUIParam->pOEMOptItems[2].pOptType = CreateOptType(pOEMUIParam->hOEMHeap, 16); + + pOEMUIParam->pOEMOptItems[2].pOptType->Type = TVOT_COMBOBOX; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[0].pData = L"8"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[1].pData = L"9"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[2].pData = L"10"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[3].pData = L"11"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[4].pData = L"12"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[5].pData = L"14"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[6].pData = L"16"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[7].pData = L"18"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[8].pData = L"20"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[9].pData = L"22"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[10].pData = L"24"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[11].pData = L"26"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[12].pData = L"28"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[13].pData = L"36"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[14].pData = L"48"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[15].pData = L"72"; + + + // WaterMark Angle. + pOEMUIParam->pOEMOptItems[3].Level = 2; + pOEMUIParam->pOEMOptItems[3].Flags = 0; + pOEMUIParam->pOEMOptItems[3].pName = GetStringResource(pOEMUIParam->hOEMHeap, ghInstance, IDS_ANGLE); + pOEMUIParam->pOEMOptItems[3].Sel = (LONG) pOEMDev->dfRotate; + + pOEMUIParam->pOEMOptItems[3].pOptType = CreateOptType(pOEMUIParam->hOEMHeap, 2); + + pOEMUIParam->pOEMOptItems[3].pOptType->Type = TVOT_UDARROW; + pOEMUIParam->pOEMOptItems[3].pOptType->pOptParam[1].IconID = 0; + pOEMUIParam->pOEMOptItems[3].pOptType->pOptParam[1].lParam = 360; + + + // WaterMark Color. + pOEMUIParam->pOEMOptItems[4].Level = 2; + pOEMUIParam->pOEMOptItems[4].Flags = 0; + pOEMUIParam->pOEMOptItems[4].pName = GetStringResource(pOEMUIParam->hOEMHeap, ghInstance, IDS_COLOR); + pOEMUIParam->pOEMOptItems[4].Sel = TextColorToIndex(pOEMDev->crTextColor); + + pOEMUIParam->pOEMOptItems[4].pOptType = CreateOptType(pOEMUIParam->hOEMHeap, 4); + + pOEMUIParam->pOEMOptItems[4].pOptType->Type = TVOT_COMBOBOX; + pOEMUIParam->pOEMOptItems[4].pOptType->pOptParam[0].pData = GetStringResource(pOEMUIParam->hOEMHeap, ghInstance, IDS_GRAY); + pOEMUIParam->pOEMOptItems[4].pOptType->pOptParam[1].pData = GetStringResource(pOEMUIParam->hOEMHeap, ghInstance, IDS_RED); + pOEMUIParam->pOEMOptItems[4].pOptType->pOptParam[2].pData = GetStringResource(pOEMUIParam->hOEMHeap, ghInstance, IDS_GREEN); + pOEMUIParam->pOEMOptItems[4].pOptType->pOptParam[3].pData = GetStringResource(pOEMUIParam->hOEMHeap, ghInstance, IDS_BLUE); + } + + return S_OK; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// Initializes OptItems. +// +static void InitOptItems(POPTITEM pOptItems, DWORD dwOptItems) +{ + VERBOSE(DLLTEXT("InitOptItems() entry.\r\n")); + + // Zero out memory. + memset(pOptItems, 0, sizeof(OPTITEM) * dwOptItems); + + // Set each OptItem's size, and Public DM ID. + for(DWORD dwCount = 0; dwCount < dwOptItems; dwCount++) + { + pOptItems[dwCount].cbSize = sizeof(OPTITEM); + pOptItems[dwCount].DMPubID = DMPUB_NONE; + } +} + +//////////////////////////////////////////////////////////////////////////////// +// +// Allocates and initializes OptType for OptItem. +// +static POPTTYPE CreateOptType(HANDLE hHeap, WORD wOptParams) +{ + POPTTYPE pOptType = NULL; + + + VERBOSE(DLLTEXT("CreateOptType() entry.\r\n")); + + // Allocate memory from the heap for the OPTTYPE; the driver will take care of clean up. + pOptType = (POPTTYPE) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(OPTTYPE)); + if(NULL != pOptType) + { + // Initialize OPTTYPE. + pOptType->cbSize = sizeof(OPTTYPE); + pOptType->Count = wOptParams; + + // Allocate memory from the heap for the OPTPARAMs for the OPTTYPE. + pOptType->pOptParam = (POPTPARAM) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, wOptParams * sizeof(OPTPARAM)); + if(NULL != pOptType->pOptParam) + { + // Initialize the OPTPARAMs. + for(WORD wCount = 0; wCount < wOptParams; wCount++) + { + pOptType->pOptParam[wCount].cbSize = sizeof(OPTPARAM); + } + } + else + { + ERR(DLLTEXT("CreateOptType() failed to allocated memory for OPTPARAMs!\r\n")); + + // Free allocated memory and return NULL. + HeapFree(hHeap, 0, pOptType); + pOptType = NULL; + } + } + else + { + ERR(DLLTEXT("CreateOptType() failed to allocated memory for OPTTYPE!\r\n")); + } + + return pOptType; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// Converts Font point size to index in combo box. +// +static DWORD FontSizeToIndex(DWORD dwFontSize) +{ + DWORD dwIndex; + + + switch(dwFontSize) + { + case 8: + dwIndex = 0; + break; + + case 9: + dwIndex = 1; + break; + + case 10: + dwIndex = 2; + break; + + case 11: + dwIndex = 3; + break; + + case 12: + dwIndex = 4; + break; + + case 14: + dwIndex = 5; + break; + + case 16: + dwIndex = 6; + break; + + case 18: + dwIndex = 7; + break; + + case 20: + dwIndex = 8; + break; + + case 22: + dwIndex = 9; + break; + + case 24: + dwIndex = 10; + break; + + case 26: + dwIndex = 11; + break; + + default: + case 28: + dwIndex = 12; + break; + + case 36: + dwIndex = 13; + break; + + case 48: + dwIndex = 14; + break; + + case 72: + dwIndex = 15; + break; + } + + + return dwIndex; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Converts Font combo box index to font point size. +// +static DWORD FontIndexToSize(DWORD dwIndex) +{ + DWORD dwFontSize = 0; + + + switch(dwIndex) + { + case 0: + dwFontSize = 8; + break; + + case 1: + dwFontSize = 9; + break; + + case 2: + dwFontSize = 10; + break; + + case 3: + dwFontSize = 11; + break; + + case 4: + dwFontSize = 12; + break; + + case 5: + dwFontSize = 14; + break; + + case 6: + dwFontSize = 16; + break; + + case 7: + dwFontSize = 18; + break; + + case 8: + dwFontSize = 20; + break; + + case 9: + dwFontSize = 22; + break; + + case 10: + dwFontSize = 24; + break; + + case 11: + dwFontSize = 26; + break; + + case 12: + dwFontSize = 28; + break; + + case 13: + dwFontSize = 36; + break; + + case 14: + dwFontSize = 48; + break; + + case 15: + dwFontSize = 72; + break; + } + + return dwFontSize; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Converts text color to combo box index. +// +static DWORD TextColorToIndex(COLORREF crTextColor) +{ + DWORD dwIndex; + + + // The color is what ever color is dominate. If none are, then it is gray. + if( (GetRValue(crTextColor) > GetGValue(crTextColor)) + && + (GetGValue(crTextColor) >= GetBValue(crTextColor)) + ) + { + // Set index to red. + dwIndex = 1; + } + else if( (GetRValue(crTextColor) < GetGValue(crTextColor)) + && + (GetGValue(crTextColor) > GetBValue(crTextColor)) + ) + { + // Set index to green. + dwIndex = 2; + } + else if( (GetRValue(crTextColor) <= GetGValue(crTextColor)) + && + (GetGValue(crTextColor) < GetBValue(crTextColor)) + ) + { + // Set index to blue. + dwIndex = 3; + } + else + { + // Set index to gray. + dwIndex = 0; + } + + return dwIndex; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// Converts text combo box index to text color. +// +static COLORREF IndexToTextColor(DWORD dwIndex) +{ + COLORREF crTextColor; + + // Map index to desired text color. + // We just support 4 colors in the UI: Red, Green, Blue, and gray. + // The rendering module is capable of using any color for the Water Mark Text. + switch(dwIndex) + { + case 1: + // Color is red. + crTextColor = RGB(255, 216, 216); + break; + + case 2: + // Color is green. + crTextColor = RGB(216, 255, 216); + break; + + case 3: + // Color is blue. + crTextColor = RGB(216, 216, 255); + break; + + default: + case 0: + // Color is gray. + crTextColor = WATER_MARK_DEFAULT_COLOR; + break; + } + + return crTextColor; +} + +//////////////////////////////////////////////////////////////////////////////////// +// +// Retrieves pointer to a String resource. +// +static PTSTR GetStringResource(HANDLE hHeap, HMODULE hModule, UINT uResource) +{ + int nResult; + DWORD dwSize = MAX_PATH; + PTSTR pszString = NULL; + + + VERBOSE(DLLTEXT("GetStringResource() entered.\r\n")); + + // Allocate buffer for string resource from heap; let the driver clean it up. + pszString = (PTSTR) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwSize * sizeof(TCHAR)); + if(NULL != pszString) + { + PTSTR pTemp; + + // Load string resource; resize after loading so as not to waste memory. + nResult = LoadString(hModule, uResource, pszString, dwSize); + pTemp = (PTSTR) HeapReAlloc(hHeap, HEAP_ZERO_MEMORY, pszString, (nResult + 1) * sizeof(TCHAR)); + if(NULL != pTemp) + { + pszString = pTemp; + } + } + else + { + ERR(DLLTEXT("GetStringResource() failed to allocate string buffer!\r\n")); + } + + return pszString; +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/wmarkui.def b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/wmarkui.def new file mode 100644 index 00000000..8bea2782 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/wmarkui.def @@ -0,0 +1,3 @@ +LIBRARY WMARKUI +EXPORTS DllGetClassObject PRIVATE + DllCanUnloadNow PRIVATE
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/wmarkui.h b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/wmarkui.h new file mode 100644 index 00000000..909056be --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/wmarkui.h @@ -0,0 +1,35 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: WMarkUI.H +// +// PURPOSE: Define common data types, and external function prototypes +// for WaterMark UI. +// +#pragma once + +#include <OEM.H> +#include <DEVMODE.H> +#include "globals.h" + + +//////////////////////////////////////////////////////// +// OEM UI Defines +//////////////////////////////////////////////////////// + + +// OEM Signature and version. +#define PROP_TITLE L"WaterMark UI Page" +#define DLLTEXT(s) "WMARKUI: " s + +//////////////////////////////////////////////////////// +// Prototypes +//////////////////////////////////////////////////////// + +HRESULT hrOEMPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam); + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/wmarkui.rc b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/wmarkui.rc new file mode 100644 index 00000000..3ac11d52 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermark/wmarkui/wmarkui.rc @@ -0,0 +1,128 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "Written by Windows Printing & Imaging Team\0" + VALUE "CompanyName", "Microsoft Corp.\0" + VALUE "FileDescription", "WaterMark UI\0" + VALUE "FileVersion", "1, 0, 0, 1\0" + VALUE "InternalName", "WMarkUI\0" + VALUE "LegalCopyright", "Copyright � 1998-2003\0" + VALUE "LegalTrademarks", "Microsoft� is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation\0" + VALUE "OriginalFilename", "WMarkUI.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "Microsoft WaterMark\0" + VALUE "ProductVersion", "1.0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // !_MAC + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_WATERMARK "Water Mark" + IDS_TEXT "Text" + IDS_FONTSIZE "Font Size" + IDS_ANGLE "Angle" + IDS_COLOR "Color" + IDS_GRAY "Gray" + IDS_RED "Red" + IDS_GREEN "Green" + IDS_BLUE "Blue" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/common/debug.h b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/common/debug.h new file mode 100644 index 00000000..0414569c --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/common/debug.h @@ -0,0 +1,82 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1996 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Debug.H +// +// PURPOSE: Define common data types, and external function prototypes +// for debugging functions. Also defines the various debug macros. +// +// + +#pragma once + +///////////////////////////////////////////////////////// +// Macros +///////////////////////////////////////////////////////// +// +// These macros are used for debugging purposes. They expand +// to white spaces on a free build. Here is a brief description +// of what they do and how they are used: +// +// giDebugLevel +// Global variable which set the current debug level to control +// the amount of debug messages emitted. +// +// WARNING(msg) +// Display a message if the current debug level is <= DBG_WARNING. +// The message format is: WRN filename (linenumber): message +// +// ERR(msg) +// Similiar to WARNING macro above - displays a message +// if the current debug level is <= DBG_ERROR. +// +// ASSERT(cond) +// Verify a condition is true. If not, force a breakpoint. +// +// RIP(msg) +// Display a message and force a breakpoint. +// +// Usage: +// WARNING("App passed NULL pointer, ignoring...\n"); +// + +#define DBG_VERBOSE 0 +#define DBG_WARNING 1 +#define DBG_ERROR 2 +#define DBG_NONE 3 + +// VC and Build use different debug defines. +#if defined (DBG) || defined (_DEBUG) + + // __declspec(selectany) ensures that even if this is defined in multiple compilation + // modules, they will all resolve to the same symbol in the linked DLL + __declspec(selectany) INT giDebugLevel = 2; + + #define STRINGIZE(x) #x + #define QUOTE(x) STRINGIZE(x) + #define FILE_AND_LINE __FILE__ "@" QUOTE(__LINE__) + + #define VERBOSE(msg) { if(giDebugLevel <= DBG_VERBOSE) OutputDebugStringA( FILE_AND_LINE ": " msg); } + #define WARNING(msg) { if(giDebugLevel <= DBG_WARNING) OutputDebugStringA( FILE_AND_LINE ": Warning: " msg); } + #define ERR(msg) { if(giDebugLevel <= DBG_ERROR) OutputDebugStringA(FILE_AND_LINE ": Error:" msg); } + #define ASSERT(cond) { if (!(cond)) RIP("\n"); } + #define RIP(msg) { OutputDebugStringA(FILE_AND_LINE ": Error (not recoverable): " msg); DebugBreak(); } + +#else // !DBG + + #define VERBOSE(msg) + #define WARNING(msg) + #define ERR(msg) + #define ASSERT(cond) + #define RIP(msg) + +#endif + + + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/common/devmode.cpp b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/common/devmode.cpp new file mode 100644 index 00000000..328d6fb4 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/common/devmode.cpp @@ -0,0 +1,216 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Devmode.cpp +// +// PURPOSE: Implementation of Devmode functions shared with OEM UI and OEM rendering modules. +// + +// This file is wrapped in fdebug.cpp in other parts of the watermark sample. +// The appropriate precompiled header should be included there. +// #include "precomp.h +#include "debug.h" +#include "devmode.h" + +// indicate to prefast that this is a user-mode component. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +HRESULT hrOEMDevMode(DWORD dwMode, POEMDMPARAM pOemDMParam) +{ + HRESULT hResult = S_OK; + POEMDEV pOEMDevIn = NULL; + POEMDEV pOEMDevOut = NULL; + + + // Verify parameters. + if( (NULL == pOemDMParam) + || + ( (OEMDM_SIZE != dwMode) + && + (OEMDM_DEFAULT != dwMode) + && + (OEMDM_CONVERT != dwMode) + && + (OEMDM_MERGE != dwMode) + ) + ) + { + ERR(DLLTEXT("DevMode() ERROR_INVALID_PARAMETER.\r\n")); + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Cast generic (i.e. PVOID) to OEM private devomode pointer type. + pOEMDevIn = (POEMDEV) pOemDMParam->pOEMDMIn; + pOEMDevOut = (POEMDEV) pOemDMParam->pOEMDMOut; + + switch(dwMode) + { + case OEMDM_SIZE: + pOemDMParam->cbBufSize = sizeof(OEMDEV); + break; + + case OEMDM_DEFAULT: + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + pOEMDevOut->bWmarkEnabled = WATER_MARK_DEFAULT_ENABLED; + pOEMDevOut->dwWmarkFontSize = WATER_MARK_DEFAULT_FONTSIZE; + pOEMDevOut->crWmarkTextColor = WATER_MARK_DEFAULT_COLOR; + hResult = StringCbCopyW(pOEMDevOut->szWaterMark, sizeof(pOEMDevOut->szWaterMark), WATER_MARK_DEFAULT_TEXT); + break; + + case OEMDM_CONVERT: + ConvertOEMDevmode(pOEMDevIn, pOEMDevOut); + break; + + case OEMDM_MERGE: + ConvertOEMDevmode(pOEMDevIn, pOEMDevOut); + MakeOEMDevmodeValid(pOEMDevOut); + break; + } + + return hResult; +} + + +BOOL ConvertOEMDevmode(PCOEMDEV pOEMDevIn, POEMDEV pOEMDevOut) +{ + HRESULT hCopy = S_OK; + + + if( (NULL == pOEMDevIn) + || + (NULL == pOEMDevOut) + ) + { + ERR(DLLTEXT("ConvertOEMDevmode() invalid parameters.\r\n")); + return FALSE; + } + + // Check OEM Signature, if it doesn't match ours, + // then just assume DMIn is bad and use defaults. + if(pOEMDevIn->dmOEMExtra.dwSignature == pOEMDevOut->dmOEMExtra.dwSignature) + { + VERBOSE(DLLTEXT("Converting private OEM Devmode.\r\n")); + + // Set the devmode defaults so that anything the isn't copied over will + // be set to the default value. + pOEMDevOut->bWmarkEnabled = WATER_MARK_DEFAULT_ENABLED; + pOEMDevOut->dwWmarkFontSize = WATER_MARK_DEFAULT_FONTSIZE; + pOEMDevOut->crWmarkTextColor = WATER_MARK_DEFAULT_COLOR; + hCopy = StringCbCopyW(pOEMDevOut->szWaterMark, sizeof(pOEMDevOut->szWaterMark), WATER_MARK_DEFAULT_TEXT); + + // Copy the old structure in to the new using which ever size is the smaller. + // Devmode maybe from newer Devmode (not likely since there is only one), or + // Devmode maybe a newer Devmode, in which case it maybe larger, + // but the first part of the structure should be the same. + + // DESIGN ASSUMPTION: the private DEVMODE structure only gets added to; + // the fields that are in the DEVMODE never change only new fields get added to the end. + + memcpy(pOEMDevOut, pOEMDevIn, __min(pOEMDevOut->dmOEMExtra.dwSize, pOEMDevIn->dmOEMExtra.dwSize)); + + // Re-fill in the size and version fields to indicated + // that the DEVMODE is the current private DEVMODE version. + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + } + else + { + WARNING(DLLTEXT("Unknown DEVMODE signature, pOEMDMIn ignored.\r\n")); + + // Don't know what the input DEVMODE is, so just use defaults. + pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; + pOEMDevOut->bWmarkEnabled = WATER_MARK_DEFAULT_ENABLED; + pOEMDevOut->dwWmarkFontSize = WATER_MARK_DEFAULT_FONTSIZE; + pOEMDevOut->crWmarkTextColor = WATER_MARK_DEFAULT_COLOR; + hCopy = StringCbCopyW(pOEMDevOut->szWaterMark, sizeof(pOEMDevOut->szWaterMark), WATER_MARK_DEFAULT_TEXT); + } + + return SUCCEEDED(hCopy); +} + + +BOOL MakeOEMDevmodeValid(POEMDEV pOEMDevmode) +{ + if(NULL == pOEMDevmode) + { + return FALSE; + } + + // ASSUMPTION: pOEMDevmode is large enough to contain OEMDEV structure. + + // Make sure that dmOEMExtra indicates the current OEMDEV structure. + pOEMDevmode->dmOEMExtra.dwSize = sizeof(OEMDEV); + pOEMDevmode->dmOEMExtra.dwSignature = OEM_SIGNATURE; + pOEMDevmode->dmOEMExtra.dwVersion = OEM_VERSION; + + // bEnable should be either TRUE or FALSE. + if( (TRUE != pOEMDevmode->bWmarkEnabled) + && + (FALSE != pOEMDevmode->bWmarkEnabled) + ) + { + pOEMDevmode->bWmarkEnabled = WATER_MARK_DEFAULT_ENABLED; + } + + + // dwWmarkFontSize should be 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, or 72. + if(!IsValidFontSize(pOEMDevmode->dwWmarkFontSize)) + { + pOEMDevmode->dwWmarkFontSize = WATER_MARK_DEFAULT_FONTSIZE; + } + + // The high byte of the hi word should be zero. + if(0 != HIBYTE(HIWORD(pOEMDevmode->crWmarkTextColor))) + { + pOEMDevmode->crWmarkTextColor = WATER_MARK_DEFAULT_COLOR; + } + + // Make sure that water mark string is terminated. + pOEMDevmode->szWaterMark[WATER_MARK_TEXT_SIZE - 1] = L'\0'; + + return TRUE; +} + + +BOOL IsValidFontSize(DWORD dwWmarkFontSize) +{ + BOOL bValid = FALSE; + + + switch(dwWmarkFontSize) + { + case 8: + case 9: + case 10: + case 11: + case 12: + case 14: + case 16: + case 18: + case 20: + case 22: + case 24: + case 26: + case 28: + case 36: + case 48: + case 72: + bValid = TRUE; + break; + + default: + ERR(DLLTEXT("IsValidFontSize() found invalid font size\r\n")); + break; + } + + return bValid; +} diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/common/devmode.h b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/common/devmode.h new file mode 100644 index 00000000..de7ee919 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/common/devmode.h @@ -0,0 +1,52 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Devmode.h +// +// PURPOSE: Define common data types, and external function prototypes +// for devmode functions. +// +#pragma once + +//////////////////////////////////////////////////////// +// OEM Devmode Defines +//////////////////////////////////////////////////////// + +#define WATER_MARK_TEXT_SIZE 128 +#define WATER_MARK_DEFAULT_ENABLED TRUE +#define WATER_MARK_DEFAULT_FONTSIZE 28 +#define WATER_MARK_DEFAULT_COLOR RGB(230, 230, 230) +#define WATER_MARK_DEFAULT_TEXT L"WaterMark" + + + +//////////////////////////////////////////////////////// +// OEM Devmode Type Definitions +//////////////////////////////////////////////////////// + +typedef struct tagOEMDEV +{ + OEM_DMEXTRAHEADER dmOEMExtra; + BOOL bWmarkEnabled; + DWORD dwWmarkFontSize; + COLORREF crWmarkTextColor; + WCHAR szWaterMark[WATER_MARK_TEXT_SIZE]; + +} OEMDEV, *POEMDEV; + +typedef const OEMDEV *PCOEMDEV; + + + +///////////////////////////////////////////////////////// +// ProtoTypes +///////////////////////////////////////////////////////// + +HRESULT hrOEMDevMode(DWORD dwMode, POEMDMPARAM pOemDMParam); +BOOL ConvertOEMDevmode(PCOEMDEV pOEMDevIn, POEMDEV pOEMDevOut); +BOOL MakeOEMDevmodeValid(POEMDEV pOEMDevmode); +BOOL IsValidFontSize(DWORD dwWmarkFontSize); diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/common/oem.h b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/common/oem.h new file mode 100644 index 00000000..d63814ad --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/common/oem.h @@ -0,0 +1,23 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997- 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: oem.H +// +// PURPOSE: Define common data types, and external function prototypes +// for debug.cpp. +// +#pragma once + +//////////////////////////////////////////////////////// +// OEM Defines +//////////////////////////////////////////////////////// + +#define OEM_SIGNATURE 'MSFT' +#define OEM_VERSION 0x00000001L + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/WMARKUNIUI.vcxproj b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/WMARKUNIUI.vcxproj new file mode 100644 index 00000000..4e88c6a9 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/WMARKUNIUI.vcxproj @@ -0,0 +1,1150 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Win10 Debug|ARM64"> + <Configuration>Win10 Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|Win32"> + <Configuration>Win10 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|x64"> + <Configuration>Win10 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|ARM64"> + <Configuration>Win10 Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|Win32"> + <Configuration>Win10 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|x64"> + <Configuration>Win10 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|Win32"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|Win32"> + <Configuration>Win8 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|Win32"> + <Configuration>Win7 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|Win32"> + <Configuration>Win8.1 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|Win32"> + <Configuration>Win8 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|Win32"> + <Configuration>Win7 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|x64"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|x64"> + <Configuration>Win8 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|x64"> + <Configuration>Win7 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|x64"> + <Configuration>Win8.1 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|x64"> + <Configuration>Win8 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|x64"> + <Configuration>Win7 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{1D0BAFC7-C244-4EC1-9DE3-5AC3937DDD62}</ProjectGuid> + <RootNamespace>$(MSBuildProjectName)</RootNamespace> + <Configuration Condition="'$(Configuration)' == ''">Win10 Debug</Configuration> + <Platform Condition="'$(Platform)' == ''">Win32</Platform> + <SampleGuid>{39C728EB-3DCE-45B1-BC93-76678BB2A0A6}</SampleGuid> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <PropertyGroup> + <OutDir>$(IntDir)</OutDir> + </PropertyGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ItemGroup Label="WrappedTaskItems" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetName>WMARKUNIUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetName>WMARKUNIUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetName>WMARKUNIUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <TargetName>WMARKUNIUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <TargetName>WMARKUNIUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetName>WMARKUNIUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetName>WMARKUNIUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetName>WMARKUNIUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <TargetName>WMARKUNIUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <TargetName>WMARKUNIUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetName>WMARKUNIUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetName>WMARKUNIUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetName>WMARKUNIUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <TargetName>WMARKUNIUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetName>WMARKUNIUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetName>WMARKUNIUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetName>WMARKUNIUI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <TargetName>WMARKUNIUI</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);USERMODE_DRIVER;_UNICODE;UNICODE</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;.</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);kernel32.lib;user32.lib;ole32.lib;advapi32.lib;uuid.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>WMARKUNIUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>WMARKUNIUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>WMARKUNIUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>WMARKUNIUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>WMARKUNIUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>WMARKUNIUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>WMARKUNIUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>WMARKUNIUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>WMARKUNIUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>WMARKUNIUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>WMARKUNIUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>WMARKUNIUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>WMARKUNIUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>WMARKUNIUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>WMARKUNIUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>WMARKUNIUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>WMARKUNIUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <Link> + <AdditionalOptions>%(AdditionalOptions) /ignore:4070</AdditionalOptions> + <ModuleDefinitionFile>WMARKUNIUI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="dllentry.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="fdevmode.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="globals.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Create</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="WMARKUI.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ResourceCompile Include="WMARKUI.rc" /> + </ItemGroup> + <ItemGroup> + <Inf Exclude="@(Inf)" Include="*.inf" /> + <FilesToPackage Include="$(TargetPath)" Condition="'$(ConfigurationType)'=='Driver' or '$(ConfigurationType)'=='DynamicLibrary'" /> + </ItemGroup> + <ItemGroup> + <None Exclude="@(None)" Include="*.txt;*.htm;*.html" /> + <None Exclude="@(None)" Include="*.ico;*.cur;*.bmp;*.dlg;*.rct;*.gif;*.jpg;*.jpeg;*.wav;*.jpe;*.tiff;*.tif;*.png;*.rc2" /> + <None Exclude="@(None)" Include="*.def;*.bat;*.hpj;*.asmx" /> + </ItemGroup> + <ItemGroup> + <ClInclude Exclude="@(ClInclude)" Include="*.h;*.hpp;*.hxx;*.hm;*.inl;*.xsd" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/WMARKUNIUI.vcxproj.Filters b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/WMARKUNIUI.vcxproj.Filters new file mode 100644 index 00000000..660c3ddf --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/WMARKUNIUI.vcxproj.Filters @@ -0,0 +1,140 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;*</Extensions> + <UniqueIdentifier>{6078E9AC-04DC-4263-AA1A-9501916D09D2}</UniqueIdentifier> + </Filter> + <Filter Include="Header Files"> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + <UniqueIdentifier>{0E5A51EE-1609-4F50-8955-63F7D0C1A20E}</UniqueIdentifier> + </Filter> + <Filter Include="Resource Files"> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms;man;xml</Extensions> + <UniqueIdentifier>{C5E399CF-1AAE-4A3D-B806-84CCA8D9930D}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClCompile Include="dllentry.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="fdevmode.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="globals.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="WMARKUI.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="globals.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkui.h" /> + <ClInclude Include="globals.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkui.h" /> + <ClInclude Include="globals.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkui.h" /> + <ClInclude Include="globals.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkui.h" /> + <ClInclude Include="globals.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkui.h" /> + <ClInclude Include="globals.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkui.h" /> + <ClInclude Include="globals.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkui.h" /> + <ClInclude Include="globals.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkui.h" /> + <ClInclude Include="globals.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkui.h" /> + <ClInclude Include="globals.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkui.h" /> + <ClInclude Include="globals.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkui.h" /> + <ClInclude Include="globals.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkui.h" /> + <ClInclude Include="globals.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="intrface.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkui.h" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="WMARKUI.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> + <ItemGroup> + <None Include="wmarkuniui.def"> + <Filter>Source Files</Filter> + </None> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/dllentry.cpp b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/dllentry.cpp new file mode 100644 index 00000000..f4769ff4 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/dllentry.cpp @@ -0,0 +1,52 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: dllentry.cpp +// +// PURPOSE: Source module for DLL entry function(s). +// + +#include "precomp.h" +#include "wmarkui.h" +#include "debug.h" + +// indicate to prefast that this is a user-mode component. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +/////////////////////////////////////////////////////////// +// +// DLL entry point +// +BOOL WINAPI DllMain(HINSTANCE hInst, WORD wReason, LPVOID lpReserved) +{ + UNREFERENCED_PARAMETER(lpReserved); + + switch(wReason) + { + case DLL_PROCESS_ATTACH: + VERBOSE(DLLTEXT("Process attach.\r\n")); + ghInstance = hInst; + break; + + case DLL_THREAD_ATTACH: + VERBOSE(DLLTEXT("Thread attach.\r\n")); + break; + + case DLL_PROCESS_DETACH: + VERBOSE(DLLTEXT("Process detach.\r\n")); + break; + + case DLL_THREAD_DETACH: + VERBOSE(DLLTEXT("Thread detach.\r\n")); + break; + } + + return TRUE; +} + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/fdevmode.cpp b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/fdevmode.cpp new file mode 100644 index 00000000..c82072c5 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/fdevmode.cpp @@ -0,0 +1,21 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: fDevmode.cpp +// +// +// PURPOSE: Place holder file for devmode functions. +// + +#include "precomp.h" +#include "wmarkui.h" + +// indicate to prefast that this is a user-mode component. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +#include <DEVMODE.CPP> + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/globals.cpp b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/globals.cpp new file mode 100644 index 00000000..dd0ea334 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/globals.cpp @@ -0,0 +1,26 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Globals.cpp +// +// +// PURPOSE: File that contains all the globals. +// + +#include "precomp.h" +#include "wmarkui.h" + +// indicate to prefast that this is a user-mode component. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +/////////////////////////////////////// +// Globals +/////////////////////////////////////// + +// Module's Instance handle from DLLEntry of process. +HINSTANCE ghInstance = NULL; + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/globals.h b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/globals.h new file mode 100644 index 00000000..eac586c2 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/globals.h @@ -0,0 +1,21 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Globals.h +// +// +// PURPOSE: Lists of globals declared in Globals.cpp. +// +// +#pragma once + +/////////////////////////////////////// +// Globals +/////////////////////////////////////// + +// Module's Instance handle from DLLEntry of process. +extern HINSTANCE ghInstance; diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/intrface.cpp b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/intrface.cpp new file mode 100644 index 00000000..cc8cceae --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/intrface.cpp @@ -0,0 +1,525 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Intrface.cpp +// +// +// PURPOSE: Interface for User Mode COM Customization DLL. +// + +#include "precomp.h" + +#include "wmarkui.h" +#include "debug.h" +#include "intrface.h" + +// indicate to prefast that this is a user-mode component. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + + +//////////////////////////////////////////////////////// +// Internal Globals +//////////////////////////////////////////////////////// + +static long g_cComponents = 0 ; // Count of active components +static long g_cServerLocks = 0 ; // Count of locks + + + +//////////////////////////////////////////////////////////////////////////////// +// +// IWaterMarkUI body +// +HRESULT __stdcall IWaterMarkUI::QueryInterface(const IID& iid, void** ppv) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:QueryInterface entry.\r\n\r\n")); + if (iid == IID_IUnknown) + { + *ppv = static_cast<IUnknown*>(this); + VERBOSE(DLLTEXT("IWaterMarkUI:Return pointer to IUnknown.\r\n\r\n")); + } + else if (iid == IID_IPrintOemUI) + { + *ppv = static_cast<IPrintOemUI*>(this) ; + VERBOSE(DLLTEXT("IWaterMarkUI:Return pointer to IPrintOemUI.\r\n")); + } + else + { + VERBOSE(DLLTEXT("IWaterMarkUI::QueryInterface: interface not supported.\r\n")); + *ppv = NULL ; + return E_NOINTERFACE ; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef() ; + return S_OK ; +} + +ULONG __stdcall IWaterMarkUI::AddRef() +{ + VERBOSE(DLLTEXT("IWaterMarkUI:AddRef entry.\r\n")); + return InterlockedIncrement(&m_cRef) ; +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall IWaterMarkUI::Release() +{ + VERBOSE(DLLTEXT("IWaterMarkUI:Release entry.\r\n")); + ASSERT( 0 != m_cRef); + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + + } + return cRef; +} + +HRESULT __stdcall IWaterMarkUI::PublishDriverInterface( + IUnknown *pIUnknown) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:PublishDriverInterface entry.\r\n")); + + UNREFERENCED_PARAMETER(pIUnknown); + + // Don't use the DriverInterface, so don't store it. + + return S_OK; +} + +HRESULT __stdcall IWaterMarkUI::GetInfo( + DWORD dwMode, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded) +{ + VERBOSE(DLLTEXT("IWaterMarkUI::GetInfo entry.\r\r\n")); + + // Validate parameters. + if( (NULL == pcbNeeded) + || + ( (OEMGI_GETSIGNATURE != dwMode) + && + (OEMGI_GETVERSION != dwMode) + && + (OEMGI_GETPUBLISHERINFO != dwMode) + ) + ) + { + VERBOSE(DLLTEXT("IWaterMarkUI::GetInfo() exit pcbNeeded is NULL!\r\r\n")); + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Set expected buffer size and number of bytes written. + *pcbNeeded = sizeof(DWORD); + + // Check buffer size is sufficient. + if((cbSize < *pcbNeeded) || (NULL == pBuffer)) + { + WARNING(DLLTEXT("IWaterMarkUI::GetInfo() exit insufficient buffer!\r\r\n")); + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return E_FAIL; + } + + switch(dwMode) + { + // OEM DLL Signature + case OEMGI_GETSIGNATURE: + *(PDWORD)pBuffer = OEM_SIGNATURE; + break; + + // OEM DLL version + case OEMGI_GETVERSION: + *(PDWORD)pBuffer = OEM_VERSION; + break; + + // dwMode not supported. + default: + // Set written bytes to zero since nothing was written. + WARNING(DLLTEXT("IWaterMarkUI::GetInfo() exit mode not supported.\r\r\n")); + *pcbNeeded = 0; + SetLastError(ERROR_NOT_SUPPORTED); + return E_FAIL; + } + + VERBOSE(DLLTEXT("IWaterMarkUI::GetInfo() exit S_OK.\r\r\n")); + return S_OK; +} + +HRESULT __stdcall IWaterMarkUI::DevMode( + DWORD dwMode, + POEMDMPARAM pOemDMParam) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:DevMode entry.\r\n")); + + return hrOEMDevMode(dwMode, pOemDMParam); +} + +HRESULT __stdcall IWaterMarkUI::CommonUIProp( + DWORD dwMode, + POEMCUIPPARAM pOemCUIPParam) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:CommonUIProp entry.\r\n")); + + return hrOEMPropertyPage(dwMode, pOemCUIPParam); +} + + +HRESULT __stdcall IWaterMarkUI::DocumentPropertySheets( + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:DocumentPropertySheets entry.\r\n")); + + UNREFERENCED_PARAMETER(pPSUIInfo); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +} + +HRESULT __stdcall IWaterMarkUI::DevicePropertySheets( + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:DevicePropertySheets entry.\r\n")); + + UNREFERENCED_PARAMETER(pPSUIInfo); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +} + +HRESULT __stdcall IWaterMarkUI::DeviceCapabilities( + POEMUIOBJ poemuiobj, + HANDLE hPrinter, + _In_ PWSTR pDeviceName, + WORD wCapability, + PVOID pOutput, + PDEVMODE pPublicDM, + PVOID pOEMDM, + DWORD dwOld, + DWORD *dwResult) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:DeviceCapabilities entry.\r\n")); + + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(pDeviceName); + UNREFERENCED_PARAMETER(wCapability); + UNREFERENCED_PARAMETER(pOutput); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + UNREFERENCED_PARAMETER(dwOld); + UNREFERENCED_PARAMETER(dwResult); + + return E_NOTIMPL; +} + +HRESULT __stdcall IWaterMarkUI::DevQueryPrintEx( + POEMUIOBJ poemuiobj, + PDEVQUERYPRINT_INFO pDQPInfo, + PDEVMODE pPublicDM, + PVOID pOEMDM) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:DevQueryPrintEx entry.\r\n")); + + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(pDQPInfo); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + + return E_NOTIMPL; +} + +HRESULT __stdcall IWaterMarkUI::UpgradePrinter( + DWORD dwLevel, + PBYTE pDriverUpgradeInfo) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:UpgradePrinter entry.\r\n")); + + UNREFERENCED_PARAMETER(dwLevel); + UNREFERENCED_PARAMETER(pDriverUpgradeInfo); + + return E_NOTIMPL; +} + +HRESULT __stdcall IWaterMarkUI::PrinterEvent( + _In_ PWSTR pPrinterName, + INT iDriverEvent, + DWORD dwFlags, + LPARAM lParam) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:PrinterEvent entry.\r\n")); + + UNREFERENCED_PARAMETER(pPrinterName); + UNREFERENCED_PARAMETER(iDriverEvent); + UNREFERENCED_PARAMETER(dwFlags); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +} + +HRESULT __stdcall IWaterMarkUI::DriverEvent( + DWORD dwDriverEvent, + DWORD dwLevel, + LPBYTE pDriverInfo, + LPARAM lParam) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:DriverEvent entry.\r\n")); + + UNREFERENCED_PARAMETER(dwDriverEvent); + UNREFERENCED_PARAMETER(dwLevel); + UNREFERENCED_PARAMETER(pDriverInfo); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +}; + + +HRESULT __stdcall IWaterMarkUI::QueryColorProfile( + HANDLE hPrinter, + POEMUIOBJ poemuiobj, + PDEVMODE pPublicDM, + PVOID pOEMDM, + ULONG ulQueryMode, + VOID *pvProfileData, + ULONG *pcbProfileData, + FLONG *pflProfileData) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:QueryColorProfile entry.\r\n")); + + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(poemuiobj); + UNREFERENCED_PARAMETER(pPublicDM); + UNREFERENCED_PARAMETER(pOEMDM); + UNREFERENCED_PARAMETER(ulQueryMode); + UNREFERENCED_PARAMETER(pvProfileData); + UNREFERENCED_PARAMETER(pcbProfileData); + UNREFERENCED_PARAMETER(pflProfileData); + + return E_NOTIMPL; +}; + +HRESULT __stdcall IWaterMarkUI::FontInstallerDlgProc( + HWND hWnd, + UINT usMsg, + WPARAM wParam, + LPARAM lParam) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:FontInstallerDlgProc entry.\r\n")); + + UNREFERENCED_PARAMETER(hWnd); + UNREFERENCED_PARAMETER(usMsg); + UNREFERENCED_PARAMETER(wParam); + UNREFERENCED_PARAMETER(lParam); + + return E_NOTIMPL; +}; + +HRESULT __stdcall IWaterMarkUI::UpdateExternalFonts( + HANDLE hPrinter, + HANDLE hHeap, + _In_ PWSTR pwstrCartridges) +{ + VERBOSE(DLLTEXT("IWaterMarkUI:UpdateExternalFonts entry.\r\n")); + + UNREFERENCED_PARAMETER(hPrinter); + UNREFERENCED_PARAMETER(hHeap); + UNREFERENCED_PARAMETER(pwstrCartridges); + + return E_NOTIMPL; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// oem class factory +// +class IOemCF : public IClassFactory +{ +public: + // *** IUnknown methods *** + + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release) (THIS); + + // *** IClassFactory methods *** + STDMETHOD(CreateInstance) (THIS_ + LPUNKNOWN pUnkOuter, + REFIID riid, + LPVOID FAR* ppvObject); + STDMETHOD(LockServer) (THIS_ BOOL bLock); + + + // Constructor + IOemCF(): m_cRef(1) { }; + ~IOemCF() { }; + +protected: + LONG m_cRef; + +}; + +/////////////////////////////////////////////////////////// +// +// Class factory body +// +HRESULT __stdcall IOemCF::QueryInterface(const IID& iid, void** ppv) +{ + if ((iid == IID_IUnknown) || (iid == IID_IClassFactory)) + { + *ppv = static_cast<IOemCF*>(this) ; + } + else + { + WARNING(DLLTEXT("IOemCF::QueryInterface: interface not supported.\r\n")); + *ppv = NULL ; + return E_NOINTERFACE ; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef() ; + return S_OK ; +} + +ULONG __stdcall IOemCF::AddRef() +{ + return InterlockedIncrement(&m_cRef) ; +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall IOemCF::Release() +{ + ASSERT( 0 != m_cRef); + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + + } + return cRef; +} + +// IClassFactory implementation +HRESULT __stdcall IOemCF::CreateInstance(IUnknown* pUnknownOuter, + const IID& iid, + void** ppv) +{ + //DbgPrint(DLLTEXT("Class factory:\t\tCreate component.")) ; + + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Cannot aggregate. + if (pUnknownOuter != NULL) + { + return CLASS_E_NOAGGREGATION ; + } + + // Create component. + IWaterMarkUI* pOemCB = new IWaterMarkUI ; + if (pOemCB == NULL) + { + return E_OUTOFMEMORY ; + } + // Get the requested interface. + HRESULT hr = pOemCB->QueryInterface(iid, ppv) ; + + // Release the IUnknown pointer. + // (If QueryInterface failed, component will delete itself.) + pOemCB->Release() ; + return hr ; +} + +// LockServer +HRESULT __stdcall IOemCF::LockServer(BOOL bLock) +{ + if (bLock) + { + InterlockedIncrement(&g_cServerLocks) ; + } + else + { + InterlockedDecrement(&g_cServerLocks) ; + } + return S_OK ; +} + +/////////////////////////////////////////////////////////// +// +// Exported functions +// + + +// Can DLL unload now? +// +STDAPI DllCanUnloadNow() +{ + // + // To avoid leaving OEM DLL still in memory when Unidrv or Pscript drivers + // are unloaded, Unidrv and Pscript driver ignore the return value of + // DllCanUnloadNow of the OEM DLL, and always call FreeLibrary on the OEMDLL. + // + // If OEM DLL spins off a working thread that also uses the OEM DLL, the + // thread needs to call LoadLibrary and FreeLibraryAndExitThread, otherwise + // it may crash after Unidrv or Pscript calls FreeLibrary. + // + + if ((g_cComponents == 0) && (g_cServerLocks == 0)) + { + return S_OK ; + } + else + { + return S_FALSE; + } +} + +// +// Get class factory +// +STDAPI DllGetClassObject( + _In_ REFCLSID clsid, + _In_ REFIID iid, + _Outptr_ LPVOID* ppv) +{ + VERBOSE(DLLTEXT("DllGetClassObject:Create class factory.\r\n")); + + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Can we create this component? + if (clsid != CLSID_OEMUI) + { + return CLASS_E_CLASSNOTAVAILABLE ; + } + + // Create class factory. + IOemCF* pFontCF = new IOemCF ; // Reference count set to 1 + // in constructor + if (pFontCF == NULL) + { + return E_OUTOFMEMORY ; + } + + // Get requested interface. + HRESULT hr = pFontCF->QueryInterface(iid, ppv) ; + pFontCF->Release() ; + + return hr ; +} + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/intrface.h b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/intrface.h new file mode 100644 index 00000000..7f1ebad8 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/intrface.h @@ -0,0 +1,178 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Intrface.H +// +// PURPOSE: Define COM interface for User Mode Printer UI plug-in. +// +#pragma once + +//////////////////////////////////////////////////////////////////////////////// +// +// IWaterMarkUI +// +class IWaterMarkUI: public IPrintOemUI +{ +public: + // *** IUnknown methods *** + + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release) (THIS); + + // + // Method for publishing Driver interface. + // + STDMETHOD(PublishDriverInterface)(THIS_ IUnknown *pIUnknown); + + // + // Get OEM dll related information + // + + STDMETHOD(GetInfo) (THIS_ DWORD dwMode, PVOID pBuffer, DWORD cbSize, + PDWORD pcbNeeded); + + // + // OEMDevMode + // + + STDMETHOD(DevMode) (THIS_ DWORD dwMode, POEMDMPARAM pOemDMParam) ; + + // + // OEMCommonUIProp + // + + STDMETHOD(CommonUIProp) (THIS_ + DWORD dwMode, + POEMCUIPPARAM pOemCUIPParam + ); + + // + // OEMDocumentPropertySheets + // + + STDMETHOD(DocumentPropertySheets) (THIS_ + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam + ); + + // + // OEMDevicePropertySheets + // + + STDMETHOD(DevicePropertySheets) (THIS_ + PPROPSHEETUI_INFO pPSUIInfo, + LPARAM lParam + ); + + + // + // OEMDevQueryPrintEx + // + + STDMETHOD(DevQueryPrintEx) (THIS_ + POEMUIOBJ poemuiobj, + PDEVQUERYPRINT_INFO pDQPInfo, + PDEVMODE pPublicDM, + PVOID pOEMDM + ); + + // + // OEMDeviceCapabilities + // + + STDMETHOD(DeviceCapabilities) (THIS_ + POEMUIOBJ poemuiobj, + HANDLE hPrinter, + _In_ PWSTR pDeviceName, + WORD wCapability, + PVOID pOutput, + PDEVMODE pPublicDM, + PVOID pOEMDM, + DWORD dwOld, + DWORD *dwResult + ); + + // + // OEMUpgradePrinter + // + + STDMETHOD(UpgradePrinter) (THIS_ + DWORD dwLevel, + PBYTE pDriverUpgradeInfo + ); + + // + // OEMPrinterEvent + // + + STDMETHOD(PrinterEvent) (THIS_ + _In_ PWSTR pPrinterName, + INT iDriverEvent, + DWORD dwFlags, + LPARAM lParam + ); + + // + // OEMDriverEvent + // + + STDMETHOD(DriverEvent)(THIS_ + DWORD dwDriverEvent, + DWORD dwLevel, + LPBYTE pDriverInfo, + LPARAM lParam + ); + + // + // OEMQueryColorProfile + // + + STDMETHOD(QueryColorProfile) (THIS_ + HANDLE hPrinter, + POEMUIOBJ poemuiobj, + PDEVMODE pPublicDM, + PVOID pOEMDM, + ULONG ulReserved, + VOID *pvProfileData, + ULONG *pcbProfileData, + FLONG *pflProfileData); + + // + // OEMFontInstallerDlgProc + // + + STDMETHOD(FontInstallerDlgProc) (THIS_ + HWND hWnd, + UINT usMsg, + WPARAM wParam, + LPARAM lParam + ); + // + // UpdateExternalFonts + // + + STDMETHOD(UpdateExternalFonts) (THIS_ + HANDLE hPrinter, + HANDLE hHeap, + _In_ PWSTR pwstrCartridges + ); + + + IWaterMarkUI() { m_cRef = 1; }; + ~IWaterMarkUI() { }; + +protected: + LONG m_cRef; +}; + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/precomp.h b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/precomp.h new file mode 100644 index 00000000..644d21cd --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/precomp.h @@ -0,0 +1,54 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: precomp.H +// +// +// PURPOSE: Optimize compilation of headers that don't change frequently. +// +#pragma once + +// Necessary for compiling under VC. +#if(!defined(WINVER) || (WINVER < 0x0500)) + #undef WINVER + #define WINVER 0x0500 +#endif +#if(!defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500)) + #undef _WIN32_WINNT + #define _WIN32_WINNT 0x0500 +#endif + + + +// Required header files that shouldn't change often. + + +#include <STDDEF.H> +#include <STDLIB.H> +#include <OBJBASE.H> +#include <STDARG.H> +#include <STDIO.H> +#include <WINDEF.H> +#include <WINERROR.H> +#include <WINBASE.H> +#include <WINGDI.H> +#include <WINDDI.H> +#include <TCHAR.H> +#include <EXCPT.H> +#include <ASSERT.H> +#include <PRSHT.H> +#include <COMPSTUI.H> +#include "WINDDIUI.H" +#include <PRINTOEM.H> +#include <INITGUID.H> +#include <PRCOMOEM.H> + + +// StrSafe.h needs to be included last +// to disallow unsafe string functions. +#include <STRSAFE.H> + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/precompsrc.cpp b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/precompsrc.cpp new file mode 100644 index 00000000..5944cf51 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/precompsrc.cpp @@ -0,0 +1 @@ +#include "precomp.h"
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/resource.h b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/resource.h new file mode 100644 index 00000000..22c03be5 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/resource.h @@ -0,0 +1,26 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by wmarkui.rc +// +#define IDS_WATERMARK 1 +#define IDS_TEXT 2 +#define IDS_FONTSIZE 3 +#define IDS_COLOR 5 +#define IDS_GRAY 6 +#define IDS_RED 7 +#define IDS_GREEN 8 +#define IDS_BLUE 9 +#define IDS_ENBLED 10 +#define IDS_ENABLED 10 +#define IDS_DISABLED 11 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 103 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/wmarkui.cpp b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/wmarkui.cpp new file mode 100644 index 00000000..fb875d30 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/wmarkui.cpp @@ -0,0 +1,594 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: WMarkUI.cpp +// +// +// PURPOSE: Main file for OEM UI test module. +// +// + +#include "precomp.h" +#include "resource.h" +#include "debug.h" +#include "wmarkui.h" + +// indicate to prefast that this is a user-mode component. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + + +//////////////////////////////////////////////////////// +// INTERNAL MACROS and DEFINES +//////////////////////////////////////////////////////// + + + +//////////////////////////////////////////////////////// +// INTERNAL PROTOTYPES +//////////////////////////////////////////////////////// + +LONG APIENTRY OEMUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam); +static HRESULT hrDocumentPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam); +static void InitOptItems(POPTITEM pOptItems, DWORD dwOptItems); +static POPTTYPE CreateOptType(HANDLE hHeap, WORD wOptParams); +static DWORD FontSizeToIndex(DWORD dwWmarkFontSize); +static DWORD FontIndexToSize(DWORD dwIndex); +static DWORD TextColorToIndex(COLORREF crWmarkTextColor); +static COLORREF IndexToTextColor(DWORD dwIndex); +static PTSTR GetStringResource(HANDLE hHeap, HMODULE hModule, UINT uResource); + + + +//////////////////////////////////////////////////////////////////////////////// +// +// Initializes OptItems to display OEM device or document property UI. +// +HRESULT hrOEMPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam) +{ + HRESULT hResult = S_OK; + + + VERBOSE(DLLTEXT("hrOEMPropertyPage entry.\r\n")); + + // Validate parameters. + if( (OEMCUIP_DOCPROP != dwMode) + && + (OEMCUIP_PRNPROP != dwMode) + ) + { + ERR(DLLTEXT("hrOEMPropertyPage() ERROR_INVALID_PARAMETER.\r\n")); + + // Return invalid parameter error. + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + switch(dwMode) + { + case OEMCUIP_DOCPROP: + hResult = hrDocumentPropertyPage(dwMode, pOEMUIParam); + break; + + case OEMCUIP_PRNPROP: + // Don't have any Printer Proptery UI. + hResult = E_NOTIMPL; + break; + + default: + // Should never reach this! + ERR(DLLTEXT("hrOEMPropertyPage() Invalid dwMode")); + SetLastError(ERROR_INVALID_PARAMETER); + hResult = E_FAIL; + break; + } + + return hResult; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// OptItems call back for OEM device or document property UI. +// +LONG APIENTRY OEMUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam) +{ + LONG lReturn = CPSUICB_ACTION_NONE; + POEMDEV pOEMDev = (POEMDEV) pOEMUIParam->pOEMDM; + + + VERBOSE(DLLTEXT("OEMUICallBack() entry.\r\n")); + + switch(pCallbackParam->Reason) + { + case CPSUICB_REASON_APPLYNOW: + // Store OptItems state in DEVMODE. + pOEMDev->bWmarkEnabled = !pOEMUIParam->pOEMOptItems[0].Sel; + if(FAILED(StringCbCopyW(pOEMDev->szWaterMark, sizeof(pOEMDev->szWaterMark), (LPWSTR)pOEMUIParam->pOEMOptItems[1].pSel))) + { + ERR(DLLTEXT("OEMUICallBack() failed to copy water mark text\r\n")); + } + pOEMDev->dwWmarkFontSize = FontIndexToSize(pOEMUIParam->pOEMOptItems[2].Sel); + pOEMDev->crWmarkTextColor = IndexToTextColor(pOEMUIParam->pOEMOptItems[3].Sel); + break; + + default: + break; + } + + return lReturn; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Initializes OptItems to display OEM document property UI. +// +static HRESULT hrDocumentPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam) +{ + if ( NULL == pOEMUIParam || NULL == pOEMUIParam->pOEMDM ) + { + ERR(DLLTEXT("hrDocumentPropertyPage() ERROR_INVALID_PARAMETER.\r\n")); + // Return invalid parameter error. + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + if(NULL == pOEMUIParam->pOEMOptItems) + { + // Fill in the number of OptItems to create for OEM document property UI. + pOEMUIParam->cOEMOptItems = 4; + + VERBOSE(DLLTEXT("hrDocumentPropertyPage() requesting items.\r\n")); + } + else if(dwMode == OEMCUIP_DOCPROP) + { + POEMDEV pOEMDev = (POEMDEV) pOEMUIParam->pOEMDM; + + + VERBOSE(DLLTEXT("hrDocumentPropertyPage() fill out items.\r\n")); + + // Init UI Callback reference. + pOEMUIParam->OEMCUIPCallback = OEMUICallBack; + + // Init OEMOptItmes. + InitOptItems(pOEMUIParam->pOEMOptItems, pOEMUIParam->cOEMOptItems); + + // Fill out tree view items. + + // Water Mark Section Name. + pOEMUIParam->pOEMOptItems[0].Level = 1; + pOEMUIParam->pOEMOptItems[0].Flags = OPTIF_COLLAPSE; + pOEMUIParam->pOEMOptItems[0].pName = GetStringResource(pOEMUIParam->hOEMHeap, ghInstance, IDS_WATERMARK); + pOEMUIParam->pOEMOptItems[0].Sel = pOEMDev->bWmarkEnabled ? 0 : 1; + + pOEMUIParam->pOEMOptItems[0].pOptType = CreateOptType(pOEMUIParam->hOEMHeap, 2); + + pOEMUIParam->pOEMOptItems[0].pOptType->Type = TVOT_COMBOBOX; + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[0].pData = GetStringResource(pOEMUIParam->hOEMHeap, ghInstance, IDS_ENABLED); + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[0].IconID = IDI_CPSUI_ON; + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].pData = GetStringResource(pOEMUIParam->hOEMHeap, ghInstance, IDS_DISABLED); + pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].IconID = IDI_CPSUI_OFF; + + + // WaterMark Text. + pOEMUIParam->pOEMOptItems[1].Level = 2; + pOEMUIParam->pOEMOptItems[1].Flags = 0; + pOEMUIParam->pOEMOptItems[1].pName = GetStringResource(pOEMUIParam->hOEMHeap, ghInstance, IDS_TEXT); + pOEMUIParam->pOEMOptItems[1].pSel = (LPTSTR) HeapAlloc(pOEMUIParam->hOEMHeap, HEAP_ZERO_MEMORY, MAX_PATH * sizeof(WCHAR)); + if (pOEMUIParam->pOEMOptItems[1].pSel == NULL) + { + ERR(DLLTEXT("hrDocumentPropertyPage() failed to copy water mark text\r\n")); + return E_OUTOFMEMORY; + } + + if(FAILED(StringCbCopyW((LPWSTR)pOEMUIParam->pOEMOptItems[1].pSel, MAX_PATH * sizeof(WCHAR), pOEMDev->szWaterMark))) + { + ERR(DLLTEXT("hrDocumentPropertyPage() failed to copy water mark text \r\n")); + } + + pOEMUIParam->pOEMOptItems[1].pOptType = CreateOptType(pOEMUIParam->hOEMHeap, 2); + + pOEMUIParam->pOEMOptItems[1].pOptType->Type = TVOT_EDITBOX; + pOEMUIParam->pOEMOptItems[1].pOptType->pOptParam[1].IconID = sizeof(((POEMDEV)NULL)->szWaterMark)/sizeof(WCHAR); + + + // WaterMark Font Size. + pOEMUIParam->pOEMOptItems[2].Level = 2; + pOEMUIParam->pOEMOptItems[2].Flags = 0; + pOEMUIParam->pOEMOptItems[2].pName = GetStringResource(pOEMUIParam->hOEMHeap, ghInstance, IDS_FONTSIZE); + pOEMUIParam->pOEMOptItems[2].Sel = FontSizeToIndex(pOEMDev->dwWmarkFontSize); + + pOEMUIParam->pOEMOptItems[2].pOptType = CreateOptType(pOEMUIParam->hOEMHeap, 16); + + pOEMUIParam->pOEMOptItems[2].pOptType->Type = TVOT_COMBOBOX; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[0].pData = L"8"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[1].pData = L"9"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[2].pData = L"10"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[3].pData = L"11"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[4].pData = L"12"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[5].pData = L"14"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[6].pData = L"16"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[7].pData = L"18"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[8].pData = L"20"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[9].pData = L"22"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[10].pData = L"24"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[11].pData = L"26"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[12].pData = L"28"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[13].pData = L"36"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[14].pData = L"48"; + pOEMUIParam->pOEMOptItems[2].pOptType->pOptParam[15].pData = L"72"; + + + // WaterMark Color. + pOEMUIParam->pOEMOptItems[3].Level = 2; + pOEMUIParam->pOEMOptItems[3].Flags = 0; + pOEMUIParam->pOEMOptItems[3].pName = GetStringResource(pOEMUIParam->hOEMHeap, ghInstance, IDS_COLOR); + pOEMUIParam->pOEMOptItems[3].Sel = TextColorToIndex(pOEMDev->crWmarkTextColor); + + pOEMUIParam->pOEMOptItems[3].pOptType = CreateOptType(pOEMUIParam->hOEMHeap, 4); + + pOEMUIParam->pOEMOptItems[3].pOptType->Type = TVOT_COMBOBOX; + pOEMUIParam->pOEMOptItems[3].pOptType->pOptParam[0].pData = GetStringResource(pOEMUIParam->hOEMHeap, ghInstance, IDS_GRAY); + pOEMUIParam->pOEMOptItems[3].pOptType->pOptParam[1].pData = GetStringResource(pOEMUIParam->hOEMHeap, ghInstance, IDS_RED); + pOEMUIParam->pOEMOptItems[3].pOptType->pOptParam[2].pData = GetStringResource(pOEMUIParam->hOEMHeap, ghInstance, IDS_GREEN); + pOEMUIParam->pOEMOptItems[3].pOptType->pOptParam[3].pData = GetStringResource(pOEMUIParam->hOEMHeap, ghInstance, IDS_BLUE); + } + + return S_OK; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// Initializes OptItems. +// +static void InitOptItems(POPTITEM pOptItems, DWORD dwOptItems) +{ + VERBOSE(DLLTEXT("InitOptItems() entry.\r\n")); + + // Zero out memory. + memset(pOptItems, 0, sizeof(OPTITEM) * dwOptItems); + + // Set each OptItem's size, and Public DM ID. + for(DWORD dwCount = 0; dwCount < dwOptItems; dwCount++) + { + pOptItems[dwCount].cbSize = sizeof(OPTITEM); + pOptItems[dwCount].DMPubID = DMPUB_NONE; + } +} + +//////////////////////////////////////////////////////////////////////////////// +// +// Allocates and initializes OptType for OptItem. +// +static POPTTYPE CreateOptType(HANDLE hHeap, WORD wOptParams) +{ + POPTTYPE pOptType = NULL; + + + VERBOSE(DLLTEXT("CreateOptType() entry.\r\n")); + + // Allocate memory from the heap for the OPTTYPE; the driver will take care of clean up. + pOptType = (POPTTYPE) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(OPTTYPE)); + if(NULL != pOptType) + { + // Initialize OPTTYPE. + pOptType->cbSize = sizeof(OPTTYPE); + pOptType->Count = wOptParams; + + // Allocate memory from the heap for the OPTPARAMs for the OPTTYPE. + pOptType->pOptParam = (POPTPARAM) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, wOptParams * sizeof(OPTPARAM)); + if(NULL != pOptType->pOptParam) + { + // Initialize the OPTPARAMs. + for(WORD wCount = 0; wCount < wOptParams; wCount++) + { + pOptType->pOptParam[wCount].cbSize = sizeof(OPTPARAM); + } + } + else + { + ERR(DLLTEXT("CreateOptType() failed to allocated memory for OPTPARAMs!\r\n")); + + // Free allocated memory and return NULL. + HeapFree(hHeap, 0, pOptType); + pOptType = NULL; + } + } + else + { + ERR(DLLTEXT("CreateOptType() failed to allocated memory for OPTTYPE!\r\n")); + } + + return pOptType; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// Converts Font point size to index in combo box. +// +static DWORD FontSizeToIndex(DWORD dwWmarkFontSize) +{ + DWORD dwIndex; + + + switch(dwWmarkFontSize) + { + case 8: + dwIndex = 0; + break; + + case 9: + dwIndex = 1; + break; + + case 10: + dwIndex = 2; + break; + + case 11: + dwIndex = 3; + break; + + case 12: + dwIndex = 4; + break; + + case 14: + dwIndex = 5; + break; + + case 16: + dwIndex = 6; + break; + + case 18: + dwIndex = 7; + break; + + case 20: + dwIndex = 8; + break; + + case 22: + dwIndex = 9; + break; + + case 24: + dwIndex = 10; + break; + + case 26: + dwIndex = 11; + break; + + case 36: + dwIndex = 13; + break; + + case 48: + dwIndex = 14; + break; + + case 72: + dwIndex = 15; + break; + + case 28: + default: + dwIndex = 12; + break; + } + + return dwIndex; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Converts Font combo box index to font point size. +// +static DWORD FontIndexToSize(DWORD dwIndex) +{ + DWORD dwWmarkFontSize; + + switch(dwIndex) + { + case 0: + dwWmarkFontSize = 8; + break; + + case 1: + dwWmarkFontSize = 9; + break; + + case 2: + dwWmarkFontSize = 10; + break; + + case 3: + dwWmarkFontSize = 11; + break; + + case 4: + dwWmarkFontSize = 12; + break; + + case 5: + dwWmarkFontSize = 14; + break; + + case 6: + dwWmarkFontSize = 16; + break; + + case 7: + dwWmarkFontSize = 18; + break; + + case 8: + dwWmarkFontSize = 20; + break; + + case 9: + dwWmarkFontSize = 22; + break; + + case 10: + dwWmarkFontSize = 24; + break; + + case 11: + dwWmarkFontSize = 26; + break; + + case 13: + dwWmarkFontSize = 36; + break; + + case 14: + dwWmarkFontSize = 48; + break; + + case 15: + dwWmarkFontSize = 72; + break; + + case 12: + default: + dwWmarkFontSize = 28; + break; + } + + return dwWmarkFontSize; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// Converts text color to combo box index. +// +static DWORD TextColorToIndex(COLORREF crWmarkTextColor) +{ + DWORD dwIndex; + + + // The color is what ever color is dominate. If none are, then it is gray. + if( (GetRValue(crWmarkTextColor) > GetGValue(crWmarkTextColor)) + && + (GetGValue(crWmarkTextColor) >= GetBValue(crWmarkTextColor)) + ) + { + // Set index to red. + dwIndex = 1; + } + else if( (GetRValue(crWmarkTextColor) < GetGValue(crWmarkTextColor)) + && + (GetGValue(crWmarkTextColor) > GetBValue(crWmarkTextColor)) + ) + { + // Set index to green. + dwIndex = 2; + } + else if( (GetRValue(crWmarkTextColor) <= GetGValue(crWmarkTextColor)) + && + (GetGValue(crWmarkTextColor) < GetBValue(crWmarkTextColor)) + ) + { + // Set index to blue. + dwIndex = 3; + } + else + { + // Set index to gray. + dwIndex = 0; + } + + return dwIndex; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// Converts text combo box index to text color. +// +static COLORREF IndexToTextColor(DWORD dwIndex) +{ + COLORREF crWmarkTextColor; + + // Map index to desired text color. + // We just support 4 colors in the UI: Red, Green, Blue, and gray. + // The rendering module is capable of using any color for the Water Mark Text. + switch(dwIndex) + { + case 1: + // Color is red. + crWmarkTextColor = RGB(255, 216, 216); + break; + + case 2: + // Color is green. + crWmarkTextColor = RGB(216, 255, 216); + break; + + case 3: + // Color is blue. + crWmarkTextColor = RGB(216, 216, 255); + break; + + default: + case 0: + // Color is gray. + crWmarkTextColor = WATER_MARK_DEFAULT_COLOR; + break; + } + + return crWmarkTextColor; +} + +//////////////////////////////////////////////////////////////////////////////////// +// +// Retrieves pointer to a String resource. +// +static PTSTR GetStringResource(HANDLE hHeap, HMODULE hModule, UINT uResource) +{ + int nResult; + DWORD dwSize = MAX_PATH; + PTSTR pszString = NULL; + + + VERBOSE(DLLTEXT("GetStringResource() entered.\r\n")); + + // Allocate buffer for string resource from heap; let the driver clean it up. + pszString = (PTSTR) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwSize * sizeof(TCHAR)); + if(NULL != pszString) + { + PTSTR pTemp; + + // Load string resource; resize after loading so as not to waste memory. + nResult = LoadString(hModule, uResource, pszString, dwSize); + if (0 == nResult) + { + ERR(DLLTEXT("GetStringResource() failed to load the the string resource!\r\n")); + HeapFree(hHeap, 0, pszString); + pszString=NULL; + } + else + { + pTemp = (PTSTR) HeapReAlloc(hHeap, HEAP_ZERO_MEMORY, pszString, (nResult + 1) * sizeof(TCHAR)); + if(NULL != pTemp) + { + pszString = pTemp; + } + } + } + else + { + ERR(DLLTEXT("GetStringResource() failed to allocate string buffer!\r\n")); + } + + return pszString; +} + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/wmarkui.h b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/wmarkui.h new file mode 100644 index 00000000..ca19064a --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/wmarkui.h @@ -0,0 +1,37 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: WMarkUI.H +// +// +// PURPOSE: Define common data types, and external function prototypes +// for WaterMark UI. +// +#pragma once + +#include <OEM.H> +#include <DEVMODE.H> +#include "globals.h" + + +//////////////////////////////////////////////////////// +// OEM UI Defines +//////////////////////////////////////////////////////// + + +// OEM Signature and version. +#define PROP_TITLE L"WaterMark UI Page" +#define DLLTEXT(s) "WMARKUI: " s + +//////////////////////////////////////////////////////// +// Prototypes +//////////////////////////////////////////////////////// + +HRESULT hrOEMPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam); + + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/wmarkui.rc b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/wmarkui.rc new file mode 100644 index 00000000..44358b9a --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/wmarkui.rc @@ -0,0 +1,124 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "Written by Windows Printing & Imaging Team" + VALUE "CompanyName", "Microsoft Corp." + VALUE "FileDescription", "WaterMarkUni UI" + VALUE "FileVersion", "1, 0, 0, 1" + VALUE "InternalName", "WMarkUniUI" + VALUE "LegalCopyright", "Copyright � 1998-2003" + VALUE "LegalTrademarks", "Microsoft� is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation" + VALUE "OriginalFilename", "WMarkUniUI.dll" + VALUE "ProductName", "Microsoft WaterMark" + VALUE "ProductVersion", "1.0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDS_WATERMARK "Water Mark" + IDS_TEXT "Text" + IDS_FONTSIZE "Font Size" + IDS_COLOR "Color" + IDS_GRAY "Gray" + IDS_RED "Red" + IDS_GREEN "Green" + IDS_BLUE "Blue" + IDS_ENABLED "Enabled" + IDS_DISABLED "Disabled" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/wmarkuniui.def b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/wmarkuniui.def new file mode 100644 index 00000000..26c192f9 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkui/wmarkuniui.def @@ -0,0 +1,3 @@ +LIBRARY WMARKUI +EXPORTS DllGetClassObject PRIVATE + DllCanUnloadNow PRIVATE diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/WMARKUNI.vcxproj b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/WMARKUNI.vcxproj new file mode 100644 index 00000000..0ad2b890 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/WMARKUNI.vcxproj @@ -0,0 +1,1090 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Win10 Debug|ARM64"> + <Configuration>Win10 Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|Win32"> + <Configuration>Win10 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Debug|x64"> + <Configuration>Win10 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|ARM64"> + <Configuration>Win10 Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|Win32"> + <Configuration>Win10 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win10 Release|x64"> + <Configuration>Win10 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|Win32"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|Win32"> + <Configuration>Win8 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|Win32"> + <Configuration>Win7 Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|Win32"> + <Configuration>Win8.1 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|Win32"> + <Configuration>Win8 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|Win32"> + <Configuration>Win7 Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Debug|x64"> + <Configuration>Win8.1 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Debug|x64"> + <Configuration>Win8 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Debug|x64"> + <Configuration>Win7 Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8.1 Release|x64"> + <Configuration>Win8.1 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win8 Release|x64"> + <Configuration>Win8 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Win7 Release|x64"> + <Configuration>Win7 Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{866141A6-4989-41D7-9409-4A5A73B535B0}</ProjectGuid> + <RootNamespace>$(MSBuildProjectName)</RootNamespace> + <Configuration Condition="'$(Configuration)' == ''">Win10 Debug</Configuration> + <Platform Condition="'$(Platform)' == ''">Win32</Platform> + <SampleGuid>{FF810DA7-AF7F-4167-9078-A43C6CA46E83}</SampleGuid> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>False</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetVersion>Win7</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetVersion>Win8</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetVersion>WindowsV6.3</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers8.1</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>True</UseDebugLibraries> + <DriverType /> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <PropertyGroup> + <OutDir>$(IntDir)</OutDir> + </PropertyGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> + </ImportGroup> + <ItemGroup Label="WrappedTaskItems" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <TargetName>WMARKUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <TargetName>WMARKUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <TargetName>WMARKUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <TargetName>WMARKUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <TargetName>WMARKUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <TargetName>WMARKUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <TargetName>WMARKUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <TargetName>WMARKUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <TargetName>WMARKUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <TargetName>WMARKUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <TargetName>WMARKUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <TargetName>WMARKUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <TargetName>WMARKUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <TargetName>WMARKUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <TargetName>WMARKUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <TargetName>WMARKUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <TargetName>WMARKUNI</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <TargetName>WMARKUNI</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <TreatWarningAsError>true</TreatWarningAsError> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol> + <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <ClCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ClCompile> + <Midl> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </Midl> + <ResourceCompile> + <PreprocessorDefinitions>%(PreprocessorDefinitions);KERNEL_MODE;_UNICODE;UNICODE;OEMCOM;USERMODE_DRIVER</PreprocessorDefinitions> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\common;..</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);uuid.lib;kernel32.lib;user32.lib;ole32.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0603</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x06030000</NTDDI_VERSION> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <WIN32_WINNT_VERSION>0x0A00</WIN32_WINNT_VERSION> + <NTDDI_VERSION>0x0A000000</NTDDI_VERSION> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'"> + <Link> + <ModuleDefinitionFile>WMARKUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'"> + <Link> + <ModuleDefinitionFile>WMARKUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'"> + <Link> + <ModuleDefinitionFile>WMARKUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|x64'"> + <Link> + <ModuleDefinitionFile>WMARKUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|ARM64'"> + <Link> + <ModuleDefinitionFile>WMARKUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'"> + <Link> + <ModuleDefinitionFile>WMARKUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'"> + <Link> + <ModuleDefinitionFile>WMARKUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'"> + <Link> + <ModuleDefinitionFile>WMARKUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|x64'"> + <Link> + <ModuleDefinitionFile>WMARKUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|ARM64'"> + <Link> + <ModuleDefinitionFile>WMARKUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'"> + <Link> + <ModuleDefinitionFile>WMARKUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'"> + <Link> + <ModuleDefinitionFile>WMARKUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'"> + <Link> + <ModuleDefinitionFile>WMARKUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Release|Win32'"> + <Link> + <ModuleDefinitionFile>WMARKUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>WMARKUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>WMARKUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>WMARKUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win10 Debug|Win32'"> + <Link> + <ModuleDefinitionFile>WMARKUNI.def</ModuleDefinitionFile> + </Link> + <ClCompile> + <ExceptionHandling> + </ExceptionHandling> + </ClCompile> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="ddihook.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="dllentry.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="fdevmode.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Use</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreCompiledHeaderFile>precomp.h</PreCompiledHeaderFile> + <PreCompiledHeader>Create</PreCompiledHeader> + <PreCompiledHeaderOutputFile>$(IntDir)\precomp.h.pch</PreCompiledHeaderOutputFile> + </ClCompile> + <ResourceCompile Include="wmarkuni.rc" /> + </ItemGroup> + <ItemGroup> + <Inf Exclude="@(Inf)" Include="*.inf" /> + <FilesToPackage Include="$(TargetPath)" Condition="'$(ConfigurationType)'=='Driver' or '$(ConfigurationType)'=='DynamicLibrary'" /> + </ItemGroup> + <ItemGroup> + <None Exclude="@(None)" Include="*.txt;*.htm;*.html" /> + <None Exclude="@(None)" Include="*.ico;*.cur;*.bmp;*.dlg;*.rct;*.gif;*.jpg;*.jpeg;*.wav;*.jpe;*.tiff;*.tif;*.png;*.rc2" /> + <None Exclude="@(None)" Include="*.def;*.bat;*.hpj;*.asmx" /> + </ItemGroup> + <ItemGroup> + <ClInclude Exclude="@(ClInclude)" Include="*.h;*.hpp;*.hxx;*.hm;*.inl;*.xsd" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/WMARKUNI.vcxproj.Filters b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/WMARKUNI.vcxproj.Filters new file mode 100644 index 00000000..480c5f75 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/WMARKUNI.vcxproj.Filters @@ -0,0 +1,137 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;*</Extensions> + <UniqueIdentifier>{0906BEFF-05C5-43D6-A8A8-56287C3F1FDD}</UniqueIdentifier> + </Filter> + <Filter Include="Header Files"> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + <UniqueIdentifier>{33052901-7C1C-4E06-A9A5-0FDB9BE8B947}</UniqueIdentifier> + </Filter> + <Filter Include="Resource Files"> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms;man;xml</Extensions> + <UniqueIdentifier>{F0995942-2A83-43B2-B61A-69B8DFE2E12D}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClCompile Include="ddihook.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="dllentry.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="fdevmode.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="intrface.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="precompsrc.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="intrface.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="name.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkuni.h" /> + <ClInclude Include="intrface.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="name.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkuni.h" /> + <ClInclude Include="intrface.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="name.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkuni.h" /> + <ClInclude Include="intrface.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="name.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkuni.h" /> + <ClInclude Include="intrface.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="name.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkuni.h" /> + <ClInclude Include="intrface.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="name.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkuni.h" /> + <ClInclude Include="intrface.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="name.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkuni.h" /> + <ClInclude Include="intrface.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="name.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkuni.h" /> + <ClInclude Include="intrface.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="name.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkuni.h" /> + <ClInclude Include="intrface.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="name.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkuni.h" /> + <ClInclude Include="intrface.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="name.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkuni.h" /> + <ClInclude Include="intrface.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="name.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkuni.h" /> + <ClInclude Include="intrface.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="name.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="wmarkuni.h" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="wmarkuni.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> + <ItemGroup> + <None Include="wmarkuni.def"> + <Filter>Source Files</Filter> + </None> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/ddihook.cpp b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/ddihook.cpp new file mode 100644 index 00000000..36615fac --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/ddihook.cpp @@ -0,0 +1,1226 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: DDIHook.cpp +// +// +// PURPOSE: DDI Hook routines for User Mode COM Customization DLL. +// +// + +#include "precomp.h" +#include "debug.h" +#include "wmarkuni.h" + +// indicate to prefast that this is a user-mode component. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +// Loop limiter. +#define MAX_LOOP 10 + +void RenderWaterMark(PDEVOBJ pdevobj); +static DWORD FormatResource(_In_ LPSTR pszResource, _Out_ LPSTR *ppszBuffer, ...); +// +// OEMBitBlt +// + + + +BOOL APIENTRY +OEMBitBlt( + SURFOBJ *psoTrg, + SURFOBJ *psoSrc, + SURFOBJ *psoMask, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + RECTL *prclTrg, + POINTL *pptlSrc, + POINTL *pptlMask, + BRUSHOBJ *pbo, + POINTL *pptlBrush, + ROP4 rop4 + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMBitBlt() entry.\r\n")); + + pdevobj = (PDEVOBJ)psoTrg->dhpdev; + + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call Unidrv + // + + return (((PFN_DrvBitBlt)(poempdev->pfnUnidrv[UD_DrvBitBlt])) ( + psoTrg, + psoSrc, + psoMask, + pco, + pxlo, + prclTrg, + pptlSrc, + pptlMask, + pbo, + pptlBrush, + rop4)); + +} + +// +// OEMStretchBlt +// + +BOOL APIENTRY +OEMStretchBlt( + SURFOBJ *psoDest, + SURFOBJ *psoSrc, + SURFOBJ *psoMask, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + COLORADJUSTMENT *pca, + POINTL *pptlHTOrg, + RECTL *prclDest, + RECTL *prclSrc, + POINTL *pptlMask, + ULONG iMode + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMStretchBlt() entry.\r\n")); + + pdevobj = (PDEVOBJ)psoDest->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + + // + // turn around to call Unidrv + // + + return (((PFN_DrvStretchBlt)(poempdev->pfnUnidrv[UD_DrvStretchBlt])) ( + psoDest, + psoSrc, + psoMask, + pco, + pxlo, + pca, + pptlHTOrg, + prclDest, + prclSrc, + pptlMask, + iMode)); + +} + +// +// OEMCopyBits +// + +BOOL APIENTRY +OEMCopyBits( + SURFOBJ *psoDest, + SURFOBJ *psoSrc, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + RECTL *prclDest, + POINTL *pptlSrc + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMCopyBits() entry.\r\n")); + + pdevobj = (PDEVOBJ)psoDest->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call Unidrv + // + + return (((PFN_DrvCopyBits)(poempdev->pfnUnidrv[UD_DrvCopyBits])) ( + psoDest, + psoSrc, + pco, + pxlo, + prclDest, + pptlSrc)); + +} + +// +// OEMTextOut +// + +BOOL APIENTRY +OEMTextOut( + SURFOBJ *pso, + STROBJ *pstro, + FONTOBJ *pfo, + CLIPOBJ *pco, + RECTL *prclExtra, + RECTL *prclOpaque, + BRUSHOBJ *pboFore, + BRUSHOBJ *pboOpaque, + POINTL *pptlOrg, + MIX mix + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMTextOut() entry.\r\n")); + + pdevobj = (PDEVOBJ)pso->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call Unidrv + // + + return (((PFN_DrvTextOut)(poempdev->pfnUnidrv[UD_DrvTextOut])) ( + pso, + pstro, + pfo, + pco, + prclExtra, + prclOpaque, + pboFore, + pboOpaque, + pptlOrg, + mix)); + +} + +// +// OEMStrokePath +// + +BOOL APIENTRY +OEMStrokePath( + SURFOBJ *pso, + PATHOBJ *ppo, + CLIPOBJ *pco, + XFORMOBJ *pxo, + BRUSHOBJ *pbo, + POINTL *pptlBrushOrg, + LINEATTRS *plineattrs, + MIX mix + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMStokePath() entry.\r\n")); + + pdevobj = (PDEVOBJ)pso->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call Unidrv + // + + return (((PFN_DrvStrokePath)(poempdev->pfnUnidrv[UD_DrvStrokePath])) ( + pso, + ppo, + pco, + pxo, + pbo, + pptlBrushOrg, + plineattrs, + mix)); + +} + +// +// OEMFillPath +// + +BOOL APIENTRY +OEMFillPath( + SURFOBJ *pso, + PATHOBJ *ppo, + CLIPOBJ *pco, + BRUSHOBJ *pbo, + POINTL *pptlBrushOrg, + MIX mix, + FLONG flOptions + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMFillPath() entry.\r\n")); + + pdevobj = (PDEVOBJ)pso->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call Unidrv + // + + return (((PFN_DrvFillPath)(poempdev->pfnUnidrv[UD_DrvFillPath])) ( + pso, + ppo, + pco, + pbo, + pptlBrushOrg, + mix, + flOptions)); + +} + +// +// OEMStrokeAndFillPath +// + +BOOL APIENTRY +OEMStrokeAndFillPath( + SURFOBJ *pso, + PATHOBJ *ppo, + CLIPOBJ *pco, + XFORMOBJ *pxo, + BRUSHOBJ *pboStroke, + LINEATTRS *plineattrs, + BRUSHOBJ *pboFill, + POINTL *pptlBrushOrg, + MIX mixFill, + FLONG flOptions + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMStrokeAndFillPath() entry.\r\n")); + + pdevobj = (PDEVOBJ)pso->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call Unidrv + // + + return (((PFN_DrvStrokeAndFillPath)(poempdev->pfnUnidrv[UD_DrvStrokeAndFillPath])) ( + pso, + ppo, + pco, + pxo, + pboStroke, + plineattrs, + pboFill, + pptlBrushOrg, + mixFill, + flOptions)); + +} + +// +// OEMRealizeBrush +// + +BOOL APIENTRY +OEMRealizeBrush( + BRUSHOBJ *pbo, + SURFOBJ *psoTarget, + SURFOBJ *psoPattern, + SURFOBJ *psoMask, + XLATEOBJ *pxlo, + ULONG iHatch + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMRealizeBrush() entry.\r\n")); + + pdevobj = (PDEVOBJ)psoTarget->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call Unidrv + // + + return (((PFN_DrvRealizeBrush)(poempdev->pfnUnidrv[UD_DrvRealizeBrush])) ( + pbo, + psoTarget, + psoPattern, + psoMask, + pxlo, + iHatch)); +} + +// +// OEMStartPage +// + +BOOL APIENTRY +OEMStartPage( + SURFOBJ *pso + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMStartPage() entry.\r\n")); + + pdevobj = (PDEVOBJ)pso->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // turn around to call Unidrv + // + + return (((PFN_DrvStartPage)(poempdev->pfnUnidrv[UD_DrvStartPage]))(pso)); + +} + +#define OEM_TESTSTRING "The DDICMDCB DLL adds this line of text." + +// +// OEMSendPage +// + +BOOL APIENTRY +OEMSendPage( + SURFOBJ *pso + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMSendPage() entry.\r\n")); + + pdevobj = (PDEVOBJ)pso->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + POEMDEV pOemDevmode = (POEMDEV) pdevobj->pOEMDM; + if(pOemDevmode && pOemDevmode->bWmarkEnabled) + { + RenderWaterMark(pdevobj); + } + // + // print a line of text, just for testing + // + if (pso->iType == STYPE_BITMAP) + { + pdevobj->pDrvProcs->DrvXMoveTo(pdevobj, 0, 0); + pdevobj->pDrvProcs->DrvYMoveTo(pdevobj, 0, 0); + pdevobj->pDrvProcs->DrvWriteSpoolBuf(pdevobj, OEM_TESTSTRING, + sizeof(OEM_TESTSTRING)); + } + + // + // turn around to call Unidrv + // + + return (((PFN_DrvSendPage)(poempdev->pfnUnidrv[UD_DrvSendPage]))(pso)); + +} + +// +// OEMEscape +// + +ULONG APIENTRY +OEMEscape( + SURFOBJ *pso, + ULONG iEsc, + ULONG cjIn, + _In_reads_bytes_(cjIn) PVOID pvIn, + ULONG cjOut, + _Out_writes_bytes_(cjOut) PVOID pvOut + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMEscape() entry.\r\n")); + + pdevobj = (PDEVOBJ)pso->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call Unidrv + // + + return (((PFN_DrvEscape)(poempdev->pfnUnidrv[UD_DrvEscape])) ( + pso, + iEsc, + cjIn, + pvIn, + cjOut, + pvOut)); + +} + +// +// OEMStartDoc +// + +BOOL APIENTRY +OEMStartDoc( + SURFOBJ *pso, + _In_ PWSTR pwszDocName, + DWORD dwJobId + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMStartDoc() entry.\r\n")); + + pdevobj = (PDEVOBJ)pso->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call Unidrv + // + + return (((PFN_DrvStartDoc)(poempdev->pfnUnidrv[UD_DrvStartDoc])) ( + pso, + pwszDocName, + dwJobId)); + +} + +// +// OEMEndDoc +// + +BOOL APIENTRY +OEMEndDoc( + SURFOBJ *pso, + FLONG fl + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMEndDoc() entry.\r\n")); + + pdevobj = (PDEVOBJ)pso->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call Unidrv + // + + return (((PFN_DrvEndDoc)(poempdev->pfnUnidrv[UD_DrvEndDoc])) ( + pso, + fl)); + +} + +//////// +// NOTE: +// OEM DLL needs to hook out the following six font related DDI calls only +// if it enumerates additional fonts beyond what's in the GPD file. +// And if it does, it needs to take care of its own fonts for all font DDI +// calls and DrvTextOut call. +/////// + +// +// OEMQueryFont +// + +PIFIMETRICS APIENTRY +OEMQueryFont( + DHPDEV dhpdev, + ULONG_PTR iFile, + ULONG iFace, + ULONG_PTR *pid + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMQueryFont() entry.\r\n")); + + pdevobj = (PDEVOBJ)dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call Unidrv + // + + return (((PFN_DrvQueryFont)(poempdev->pfnUnidrv[UD_DrvQueryFont])) ( + dhpdev, + iFile, + iFace, + pid)); + +} + +// +// OEMQueryFontTree +// + +PVOID APIENTRY +OEMQueryFontTree( + DHPDEV dhpdev, + ULONG_PTR iFile, + ULONG iFace, + ULONG iMode, + ULONG_PTR *pid + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMQueryFontTree() entry.\r\n")); + + pdevobj = (PDEVOBJ)dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call Unidrv + // + + return (((PFN_DrvQueryFontTree)(poempdev->pfnUnidrv[UD_DrvQueryFontTree])) ( + dhpdev, + iFile, + iFace, + iMode, + pid)); + +} + +// +// OEMQueryFontData +// + +LONG APIENTRY +OEMQueryFontData( + DHPDEV dhpdev, + FONTOBJ *pfo, + ULONG iMode, + HGLYPH hg, + GLYPHDATA *pgd, + _Out_writes_bytes_(cjSize) PVOID pv, + ULONG cjSize + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMQueryFontData() entry.\r\n")); + + pdevobj = (PDEVOBJ)dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call Unidrv if this is not the font that OEM enumerated. + // + + return (((PFN_DrvQueryFontData)(poempdev->pfnUnidrv[UD_DrvQueryFontData])) ( + dhpdev, + pfo, + iMode, + hg, + pgd, + pv, + cjSize)); + +} + +// +// OEMQueryAdvanceWidths +// + +BOOL APIENTRY +OEMQueryAdvanceWidths( + DHPDEV dhpdev, + FONTOBJ *pfo, + ULONG iMode, + _In_reads_(cGlyphs) HGLYPH *phg, + _Out_writes_bytes_(cGlyphs*sizeof(USHORT)) PVOID pvWidths, + ULONG cGlyphs + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMQueryAdvanceWidths() entry.\r\n")); + + pdevobj = (PDEVOBJ)dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call Unidrv if this is not the font that OEM enumerated. + // + + return (((PFN_DrvQueryAdvanceWidths) + (poempdev->pfnUnidrv[UD_DrvQueryAdvanceWidths])) ( + dhpdev, + pfo, + iMode, + phg, + pvWidths, + cGlyphs)); + +} + +// +// OEMFontManagement +// + +ULONG APIENTRY +OEMFontManagement( + SURFOBJ *pso, + FONTOBJ *pfo, + ULONG iMode, + ULONG cjIn, + _In_reads_bytes_(cjIn) PVOID pvIn, + ULONG cjOut, + _Out_writes_bytes_(cjOut) PVOID pvOut + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMFontManagement() entry.\r\n")); + + // + // Note that Unidrv will not call OEM DLL for iMode==QUERYESCSUPPORT. + // So pso is not NULL for sure. + // + pdevobj = (PDEVOBJ)pso->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call Unidrv if this is not the font that OEM enumerated. + // + + return (((PFN_DrvFontManagement)(poempdev->pfnUnidrv[UD_DrvFontManagement])) ( + pso, + pfo, + iMode, + cjIn, + pvIn, + cjOut, + pvOut)); + +} + +// +// OEMGetGlyphMode +// + +ULONG APIENTRY +OEMGetGlyphMode( + DHPDEV dhpdev, + FONTOBJ *pfo + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMGetGlyphMode() entry.\r\n")); + + pdevobj = (PDEVOBJ)dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call Unidrv if this is not the font that OEM enumerated. + // + + return (((PFN_DrvGetGlyphMode)(poempdev->pfnUnidrv[UD_DrvGetGlyphMode])) ( + dhpdev, + pfo)); + +} + +BOOL APIENTRY +OEMNextBand( + SURFOBJ *pso, + POINTL *pptl + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMNextBand() entry.\r\n")); + + pdevobj = (PDEVOBJ)pso->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call Unidrv + // + + return (((PFN_DrvNextBand)(poempdev->pfnUnidrv[UD_DrvNextBand])) ( + pso, + pptl)); + +} + +BOOL APIENTRY +OEMStartBanding( + SURFOBJ *pso, + POINTL *pptl + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMStartBanding() entry.\r\n")); + + pdevobj = (PDEVOBJ)pso->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + POEMDEV pOemDevmode = (POEMDEV) pdevobj->pOEMDM; + if(pOemDevmode->bWmarkEnabled) + { + RenderWaterMark(pdevobj); + } + + // + // turn around to call Unidrv + // + + return (((PFN_DrvStartBanding)(poempdev->pfnUnidrv[UD_DrvStartBanding])) ( + pso, + pptl)); + + +} + +ULONG APIENTRY +OEMDitherColor( + DHPDEV dhpdev, + ULONG iMode, + ULONG rgbColor, + ULONG *pulDither + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMDitherColor() entry.\r\n")); + + pdevobj = (PDEVOBJ)dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call Unidrv + // + + return (((PFN_DrvDitherColor)(poempdev->pfnUnidrv[UD_DrvDitherColor])) ( + dhpdev, + iMode, + rgbColor, + pulDither)); + +} + +BOOL APIENTRY +OEMPaint( + SURFOBJ *pso, + CLIPOBJ *pco, + BRUSHOBJ *pbo, + POINTL *pptlBrushOrg, + MIX mix + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMPaint() entry.\r\n")); + + pdevobj = (PDEVOBJ)pso->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call Unidrv + // + + return (((PFN_DrvPaint)(poempdev->pfnUnidrv[UD_DrvPaint])) ( + pso, + pco, + pbo, + pptlBrushOrg, + mix)); + +} + +BOOL APIENTRY +OEMLineTo( + SURFOBJ *pso, + CLIPOBJ *pco, + BRUSHOBJ *pbo, + LONG x1, + LONG y1, + LONG x2, + LONG y2, + RECTL *prclBounds, + MIX mix + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMLineTo() entry.\r\n")); + + pdevobj = (PDEVOBJ)pso->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call Unidrv + // + + return (((PFN_DrvLineTo)(poempdev->pfnUnidrv[UD_DrvLineTo])) ( + pso, + pco, + pbo, + x1, + y1, + x2, + y2, + prclBounds, + mix)); + +} + + +// +// OEMStretchBltROP +// + +BOOL APIENTRY +OEMStretchBltROP( + SURFOBJ *psoDest, + SURFOBJ *psoSrc, + SURFOBJ *psoMask, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + COLORADJUSTMENT *pca, + POINTL *pptlHTOrg, + RECTL *prclDest, + RECTL *prclSrc, + POINTL *pptlMask, + ULONG iMode, + BRUSHOBJ *pbo, + ROP4 rop4 + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMStretchBltROP() entry.\r\n")); + + pdevobj = (PDEVOBJ)psoDest->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call Unidrv + // + + return (((PFN_DrvStretchBltROP)(poempdev->pfnUnidrv[UD_DrvStretchBltROP])) ( + psoDest, + psoSrc, + psoMask, + pco, + pxlo, + pca, + pptlHTOrg, + prclDest, + prclSrc, + pptlMask, + iMode, + pbo, + rop4 + )); + + +} + +// +// OEMPlgBlt +// + +BOOL APIENTRY +OEMPlgBlt( + SURFOBJ *psoDst, + SURFOBJ *psoSrc, + SURFOBJ *psoMask, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + COLORADJUSTMENT *pca, + POINTL *pptlBrushOrg, + POINTFIX *pptfixDest, + RECTL *prclSrc, + POINTL *pptlMask, + ULONG iMode + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMPlgBlt() entry.\r\n")); + + pdevobj = (PDEVOBJ)psoDst->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call Unidrv + // + + return (((PFN_DrvPlgBlt)(poempdev->pfnUnidrv[UD_DrvPlgBlt])) ( + psoDst, + psoSrc, + psoMask, + pco, + pxlo, + pca, + pptlBrushOrg, + pptfixDest, + prclSrc, + pptlMask, + iMode)); + +} + +// +// OEMAlphaBlend +// + +BOOL APIENTRY +OEMAlphaBlend( + SURFOBJ *psoDest, + SURFOBJ *psoSrc, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + RECTL *prclDest, + RECTL *prclSrc, + BLENDOBJ *pBlendObj + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMAlphaBlend() entry.\r\n")); + + pdevobj = (PDEVOBJ)psoDest->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call Unidrv + // + + return (((PFN_DrvAlphaBlend)(poempdev->pfnUnidrv[UD_DrvAlphaBlend])) ( + psoDest, + psoSrc, + pco, + pxlo, + prclDest, + prclSrc, + pBlendObj + )); + +} + +// +// OEMGradientFill +// + +BOOL APIENTRY +OEMGradientFill( + SURFOBJ *psoDest, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + TRIVERTEX *pVertex, + ULONG nVertex, + PVOID pMesh, + ULONG nMesh, + RECTL *prclExtents, + POINTL *pptlDitherOrg, + ULONG ulMode + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMGradientFill() entry.\r\n")); + + pdevobj = (PDEVOBJ)psoDest->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call Unidrv + // + + return (((PFN_DrvGradientFill)(poempdev->pfnUnidrv[UD_DrvGradientFill])) ( + psoDest, + pco, + pxlo, + pVertex, + nVertex, + pMesh, + nMesh, + prclExtents, + pptlDitherOrg, + ulMode + )); + +} + +BOOL APIENTRY +OEMTransparentBlt( + SURFOBJ *psoDst, + SURFOBJ *psoSrc, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + RECTL *prclDst, + RECTL *prclSrc, + ULONG iTransColor, + ULONG ulReserved + ) +{ + PDEVOBJ pdevobj; + POEMPDEV poempdev; + + VERBOSE(DLLTEXT("OEMTransparentBlt() entry.\r\n")); + + pdevobj = (PDEVOBJ)psoDst->dhpdev; + poempdev = (POEMPDEV)pdevobj->pdevOEM; + + // + // turn around to call Unidrv + // + + return (((PFN_DrvTransparentBlt)(poempdev->pfnUnidrv[UD_DrvTransparentBlt])) ( + psoDst, + psoSrc, + pco, + pxlo, + prclDst, + prclSrc, + iTransColor, + ulReserved + )); + +} + +void RenderWaterMark(PDEVOBJ pdevobj) +{ + POEMDEV pOemDevmode = (POEMDEV) pdevobj->pOEMDM; + // We have a programmable palette. See GPD file for PaletteProgrammable option. + // We are programming color index 8 to the new color and selectiing it with the PJL code "\xv%da%db%dc8I\xib*v8S". + // In the font selection code, we are selecting the arial font (4148)"\x1b(19U\x1b(s4148t0b0s%dv1P" + // Cursor position is hard coded to <x,y> but you it can also be made dependent on user input. + // PCL5 can print in 0,90,180 and 270 degrees. So Vertical can also be supported. + // The \x1b*v7S after the watermark sets the foreground color back to black + + /* + //Note we can push and pop the cursor position if needed. + Push/Pop Cursor position + \x1b&f0S //push + \x1b&f1S //pop + */ + + PSTR pszBuffer = NULL; + char str_wmark[]="\x1b*v%da%db%dc8I\x1b*v8S\x1b(19U\x1b(s4148t0b0s%dv1P\x1b*p1000Y\x1b*p750X%ls\x1b*v7S"; + DWORD dwLen= FormatResource (str_wmark, + &pszBuffer, + GetRValue(pOemDevmode->crWmarkTextColor), + GetGValue(pOemDevmode->crWmarkTextColor), + GetBValue(pOemDevmode->crWmarkTextColor), + pOemDevmode->dwWmarkFontSize,pOemDevmode->szWaterMark); + + if ( dwLen != 0 ) + { + pdevobj->pDrvProcs->DrvWriteSpoolBuf(pdevobj, pszBuffer, dwLen); + } + + if ( pszBuffer ) + { + delete[]pszBuffer; + pszBuffer = NULL; + } +} + + +DWORD +FormatResource( + _In_ LPSTR pszResource, + _Out_ LPSTR *ppszBuffer, + ...) +{ + DWORD dwBufferSize = 0; + DWORD dwLoop = 0; + va_list vaList; + HRESULT hResult = S_OK; + + if ( NULL == pszResource || + NULL == ppszBuffer ) + { + hResult = E_INVALIDARG; + return 0; + } + + + if ( SUCCEEDED(hResult) ) + { + dwBufferSize = (DWORD)strlen(pszResource) + MAX_PATH; + + va_start(vaList, ppszBuffer); + + // *ppszBuffer should be NULL when passed in. + *ppszBuffer = NULL; + + // Allocate and format the string. + do { + + if(NULL != *ppszBuffer) + { + delete[] *ppszBuffer; + } + *ppszBuffer = new CHAR[dwBufferSize]; + if(NULL == *ppszBuffer) + { + hResult = E_OUTOFMEMORY; + goto Cleanup; + } + + hResult = StringCbVPrintfA(*ppszBuffer, dwBufferSize, pszResource, vaList); + + if(STRSAFE_E_INSUFFICIENT_BUFFER == hResult) + { + dwBufferSize *= 2; + } + + } while ( FAILED(hResult) && (dwLoop++ < MAX_LOOP)); + } + +Cleanup: + + // Check to see if we hit error. + if(FAILED(hResult)) + { + if(NULL != *ppszBuffer) + { + delete[] *ppszBuffer; + *ppszBuffer = NULL; + } + } + + va_end(vaList); + + if ( *ppszBuffer ) + { + DWORD dwToReturn = 0; + + if (SUCCEEDED(SIZETToDWord(strlen(*ppszBuffer), &dwToReturn))) + { + return dwToReturn; + } + } + return 0; +} diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/dllentry.cpp b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/dllentry.cpp new file mode 100644 index 00000000..5230f243 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/dllentry.cpp @@ -0,0 +1,51 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: dllentry.cpp +// +// PURPOSE: Source module for DLL entry function(s). +// + +#include "precomp.h" +#include "wmarkuni.h" +#include "debug.h" + +// indicate to prefast that this is a user-mode component. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +/////////////////////////////////////////////////////////// +// +// DLL entry point +// +BOOL WINAPI DllMain(HINSTANCE hInst, WORD wReason, LPVOID lpReserved) +{ + UNREFERENCED_PARAMETER(hInst); + UNREFERENCED_PARAMETER(lpReserved); + + switch(wReason) + { + case DLL_PROCESS_ATTACH: + VERBOSE(DLLTEXT("Process attach.\r\n")); + break; + + case DLL_THREAD_ATTACH: + VERBOSE(DLLTEXT("Thread attach.\r\n")); + break; + + case DLL_PROCESS_DETACH: + VERBOSE(DLLTEXT("Process detach.\r\n")); + break; + + case DLL_THREAD_DETACH: + VERBOSE(DLLTEXT("Thread detach.\r\n")); + break; + } + + return TRUE; +} + + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/fdevmode.cpp b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/fdevmode.cpp new file mode 100644 index 00000000..c32e0bcb --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/fdevmode.cpp @@ -0,0 +1,22 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: fDevmode.cpp +// +// +// PURPOSE: Place holder file for devmode functions. +// + +#include "precomp.h" +#include "wmarkuni.h" + +// indicate to prefast that this is a user-mode component. +_Analysis_mode_(_Analysis_code_type_user_driver_); + + +#include <DEVMODE.CPP> + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/intrface.cpp b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/intrface.cpp new file mode 100644 index 00000000..5688cb8d --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/intrface.cpp @@ -0,0 +1,950 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Intrface.cpp +// +// +// PURPOSE: Interface for User Mode COM Customization DLL. +// + +#include "precomp.h" + +#include "wmarkuni.h" +#include "debug.h" +#include "intrface.h" +#include "name.h" + +// indicate to prefast that this is a user-mode component. +_Analysis_mode_(_Analysis_code_type_user_driver_); + +//////////////////////////////////////////////////////// +// Internal Globals +//////////////////////////////////////////////////////// + +static long g_cComponents = 0; // Count of active components +static long g_cServerLocks = 0; // Count of locks + +//////////////////////////////////////////////////////// +// Internal Constants +//////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////// +// Warning: the following array order must match the +// order in enum ENUMHOOKS. +/////////////////////////////////////////////////////// + +static const DRVFN OEMHookFuncs[] = +{ + { INDEX_DrvRealizeBrush, (PFN) OEMRealizeBrush }, + { INDEX_DrvDitherColor, (PFN) OEMDitherColor }, + { INDEX_DrvCopyBits, (PFN) OEMCopyBits }, + { INDEX_DrvBitBlt, (PFN) OEMBitBlt }, + { INDEX_DrvStretchBlt, (PFN) OEMStretchBlt }, + { INDEX_DrvTextOut, (PFN) OEMTextOut }, + { INDEX_DrvStrokePath, (PFN) OEMStrokePath }, + { INDEX_DrvFillPath, (PFN) OEMFillPath }, + { INDEX_DrvStrokeAndFillPath, (PFN) OEMStrokeAndFillPath }, + { INDEX_DrvPaint, (PFN) OEMPaint }, + { INDEX_DrvLineTo, (PFN) OEMLineTo }, + { INDEX_DrvStartPage, (PFN) OEMStartPage }, + { INDEX_DrvSendPage, (PFN) OEMSendPage }, + { INDEX_DrvEscape, (PFN) OEMEscape }, + { INDEX_DrvStartDoc, (PFN) OEMStartDoc }, + { INDEX_DrvEndDoc, (PFN) OEMEndDoc }, + { INDEX_DrvNextBand, (PFN) OEMNextBand }, + { INDEX_DrvStartBanding, (PFN) OEMStartBanding }, + { INDEX_DrvQueryFont, (PFN) OEMQueryFont }, + { INDEX_DrvQueryFontTree, (PFN) OEMQueryFontTree }, + { INDEX_DrvQueryFontData, (PFN) OEMQueryFontData }, + { INDEX_DrvQueryAdvanceWidths, (PFN) OEMQueryAdvanceWidths }, + { INDEX_DrvFontManagement, (PFN) OEMFontManagement }, + { INDEX_DrvGetGlyphMode, (PFN) OEMGetGlyphMode }, + { INDEX_DrvStretchBltROP, (PFN) OEMStretchBltROP }, + { INDEX_DrvPlgBlt, (PFN) OEMPlgBlt }, + { INDEX_DrvTransparentBlt, (PFN) OEMTransparentBlt }, + { INDEX_DrvAlphaBlend, (PFN) OEMAlphaBlend }, + { INDEX_DrvGradientFill, (PFN) OEMGradientFill }, +}; + +//////////////////////////////////////////////////////////////////////////////// +// +// IWmarkUni body +// +IWmarkUni::~IWmarkUni() +{ + // Make sure that helper interface is released. + if(NULL != m_pOEMHelp) + { + m_pOEMHelp->Release(); + m_pOEMHelp = NULL; + } + + // If this instance of the object is being deleted, then the reference + // count should be zero. + assert(0 == m_cRef); +} + + +HRESULT __stdcall IWmarkUni::QueryInterface(const IID& iid, void** ppv) +{ + if (iid == IID_IUnknown) + { + *ppv = static_cast<IUnknown*>(this); + VERBOSE(DLLTEXT("IWmarkUni::QueryInterface IUnknown.\r\n")); + } + else if (iid == IID_IPrintOemUni) + { + *ppv = static_cast<IPrintOemUni*>(this); + VERBOSE(DLLTEXT("IWmarkUni::QueryInterface IPrintOemUni.\r\n")); + } + else + { + *ppv = NULL; + VERBOSE(DLLTEXT("IWmarkUni::QueryInterface interface not supported.\r\n")); + return E_NOINTERFACE; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef(); + return S_OK; +} + +ULONG __stdcall IWmarkUni::AddRef() +{ + VERBOSE(DLLTEXT("IWmarkUni::AddRef() entry.\r\n")); + return InterlockedIncrement(&m_cRef); +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall IWmarkUni::Release() +{ + VERBOSE(DLLTEXT("IWmarkUni::Release() entry.\r\n")); + ASSERT( 0 != m_cRef); + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + + } + return cRef; +} + + +HRESULT __stdcall IWmarkUni::GetInfo ( + DWORD dwMode, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded) +{ + VERBOSE(DLLTEXT("IWmarkUni::GetInfo entry.\r\n")); + + // Validate parameters. + if( (NULL == pcbNeeded) + || + ( (OEMGI_GETSIGNATURE != dwMode) + && + (OEMGI_GETVERSION != dwMode) + && + (OEMGI_GETPUBLISHERINFO != dwMode) + ) + ) + { + WARNING(DLLTEXT("IWmarkUni::GetInfo() exit pcbNeeded is NULL! ERROR_INVALID_PARAMETER.\r\n")); + SetLastError(ERROR_INVALID_PARAMETER); + return E_FAIL; + } + + // Set expected buffer size. + if(OEMGI_GETPUBLISHERINFO != dwMode) + { + *pcbNeeded = sizeof(DWORD); + } + else + { + *pcbNeeded = sizeof(PUBLISHERINFO); + return E_FAIL; + } + + // Check buffer size is sufficient. + if((cbSize < *pcbNeeded) || (NULL == pBuffer)) + { + VERBOSE(DLLTEXT("IWmarkUni::GetInfo() exit insufficient buffer!\r\n")); + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return E_FAIL; + } + + switch(dwMode) + { + // OEM DLL Signature + case OEMGI_GETSIGNATURE: + *(PDWORD)pBuffer = OEM_SIGNATURE; + break; + + // OEM DLL version + case OEMGI_GETVERSION: + *(PDWORD)pBuffer = OEM_VERSION; + break; + + // dwMode not supported. + case OEMGI_GETPUBLISHERINFO: + default: + // Set written bytes to zero since nothing was written. + WARNING(DLLTEXT("IWmarkUni::GetInfo() exit mode not supported.\r\n")); + *pcbNeeded = 0; + SetLastError(ERROR_NOT_SUPPORTED); + return E_FAIL; + } + + VERBOSE(DLLTEXT("IWmarkUni::GetInfo() exit S_OK.\r\n")); + + return S_OK; +} + +HRESULT __stdcall IWmarkUni::PublishDriverInterface( + IUnknown *pIUnknown) +{ + VERBOSE(DLLTEXT("IWmarkUni::PublishDriverInterface() entry.\r\n")); + + // Need to store pointer to Driver Helper functions, if we already haven't. + if (this->m_pOEMHelp == NULL) + { + HRESULT hResult; + + + // Get Interface to Helper Functions. + hResult = pIUnknown->QueryInterface(IID_IPrintOemDriverUni, (void** ) &(this->m_pOEMHelp)); + + if(!SUCCEEDED(hResult)) + { + // Make sure that interface pointer reflects interface query failure. + this->m_pOEMHelp = NULL; + + return E_FAIL; + } + } + + return S_OK; +} + + +HRESULT __stdcall IWmarkUni::EnableDriver( + DWORD dwDriverVersion, + DWORD cbSize, + PDRVENABLEDATA pded) +{ + VERBOSE(DLLTEXT("IWmarkUni::EnableDriver() entry.\r\n")); + + UNREFERENCED_PARAMETER(dwDriverVersion); + UNREFERENCED_PARAMETER(cbSize); + + // List DDI functions that are hooked. + pded->iDriverVersion = PRINTER_OEMINTF_VERSION; + pded->c = sizeof(OEMHookFuncs) / sizeof(DRVFN); + pded->pdrvfn = (DRVFN *) OEMHookFuncs; + + // Even if nothing is done, need to return S_OK so + // that DisableDriver() will be called, which releases + // the reference to the Printer Driver's interface. + // If error occurs, return E_FAIL. + return S_OK; +} + +HRESULT __stdcall IWmarkUni::DisableDriver(VOID) +{ + VERBOSE(DLLTEXT("IWmarkUni::DisaleDriver() entry.\r\n")); + + // Release reference to Printer Driver's interface. + if (this->m_pOEMHelp) + { + this->m_pOEMHelp->Release(); + this->m_pOEMHelp = NULL; + } + + return S_OK; +} + +HRESULT __stdcall IWmarkUni::DisablePDEV( + PDEVOBJ pdevobj) +{ + VERBOSE(DLLTEXT("IWmarkUni::DisablePDEV() entry.\r\n")); + + assert(NULL != pdevobj->pdevOEM); + delete pdevobj->pdevOEM; + + return S_OK; +}; + +HRESULT __stdcall IWmarkUni::EnablePDEV( + PDEVOBJ pdevobj, + _In_ PWSTR pPrinterName, + ULONG cPatterns, + HSURF *phsurfPatterns, + ULONG cjGdiInfo, + GDIINFO *pGdiInfo, + ULONG cjDevInfo, + DEVINFO *pDevInfo, + DRVENABLEDATA *pded, + OUT PDEVOEM *pDevOem) +{ + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pPrinterName); + UNREFERENCED_PARAMETER(cPatterns); + UNREFERENCED_PARAMETER(phsurfPatterns); + UNREFERENCED_PARAMETER(cjGdiInfo); + UNREFERENCED_PARAMETER(pGdiInfo); + UNREFERENCED_PARAMETER(cjDevInfo); + UNREFERENCED_PARAMETER(pDevInfo); + + VERBOSE(DLLTEXT("IWmarkUni::EnablePDEV() entry.\r\n")); + + POEMPDEV poempdev; + INT i, j; + DWORD dwDDIIndex; + PDRVFN pdrvfn; + + // + // Allocate the OEMDev + // + poempdev = new OEMPDEV; + if (NULL == poempdev) + { + return NULL; + } + + // + // Fill in OEMDEV + // + + for (i = 0; i < MAX_DDI_HOOKS; i++) + { + // + // search through Unidrv's hooks and locate the function ptr + // + dwDDIIndex = OEMHookFuncs[i].iFunc; + for (j = pded->c, pdrvfn = pded->pdrvfn; j > 0; j--, pdrvfn++) + { + if (dwDDIIndex == pdrvfn->iFunc) + { + poempdev->pfnUnidrv[i] = pdrvfn->pfn; + break; + } + } + if (j == 0) + { + // + // Didn't find the hook. This could mean Unidrv doesn't hook this DDI but allows OEMs to hook it out. + // + poempdev->pfnUnidrv[i] = NULL; + } + + } + + *pDevOem = (POEMPDEV) poempdev; + + return (NULL != *pDevOem ? S_OK : E_FAIL); +} + + +HRESULT __stdcall IWmarkUni::ResetPDEV( + PDEVOBJ pdevobjOld, + PDEVOBJ pdevobjNew) +{ + VERBOSE(DLLTEXT("IWmarkUni::ResetPDEV() entry.\r\n")); + + UNREFERENCED_PARAMETER(pdevobjOld); + UNREFERENCED_PARAMETER(pdevobjNew); + + return S_OK; +} + + +HRESULT __stdcall IWmarkUni::DevMode( + DWORD dwMode, + POEMDMPARAM pOemDMParam) +{ + VERBOSE(DLLTEXT("IWmarkUni:DevMode entry.\n")); + return hrOEMDevMode(dwMode, pOemDMParam); +} + +HRESULT __stdcall IWmarkUni::GetImplementedMethod(_In_ PSTR pMethodName) +{ + HRESULT Result = S_FALSE; + + + VERBOSE(DLLTEXT("IWmarkUni::GetImplementedMethod() entry.\r\n")); + + // Unidrv only calls GetImplementedMethod for optional + // methods. The required methods are assumed to be + // supported. + + // Return S_OK for supported function (i.e. implemented), + // and S_FALSE for functions that aren't supported (i.e. not implemented). + switch (*pMethodName) + { + case 'C': + if (!strcmp(NAME_CommandCallback, pMethodName)) + { + Result = S_OK; + } + else if (!strcmp(NAME_Compression, pMethodName)) + { + Result = S_FALSE; + } + break; + + case 'D': + if (!strcmp(NAME_DownloadFontHeader, pMethodName)) + { + Result = S_FALSE; + } + else if (!strcmp(NAME_DownloadCharGlyph, pMethodName)) + { + Result = S_FALSE; + } + break; + + case 'F': + if (!strcmp(NAME_FilterGraphics, pMethodName)) + { + Result = S_OK; + } + break; + + case 'H': + if (!strcmp(NAME_HalftonePattern, pMethodName)) + { + Result = S_FALSE; + } + break; + + case 'I': + if (!strcmp(NAME_ImageProcessing, pMethodName)) + { + Result = S_OK; + } + break; + + case 'M': + if (!strcmp(NAME_MemoryUsage, pMethodName)) + { + Result = S_FALSE; + } + break; + + case 'O': + if (!strcmp(NAME_OutputCharStr, pMethodName)) + { + Result = S_FALSE; + } + break; + + case 'S': + if (!strcmp(NAME_SendFontCmd, pMethodName)) + { + Result = S_FALSE; + } + break; + + case 'T': + if (!strcmp(NAME_TextOutAsBitmap, pMethodName)) + { + Result = S_FALSE; + } + else if (!strcmp(NAME_TTDownloadMethod, pMethodName)) + { + Result = S_FALSE; + } + else if (!strcmp(NAME_TTYGetInfo, pMethodName)) + { + Result = S_FALSE; + } + break; + + case 'W': + if(!strcmp(NAME_WritePrinter, pMethodName)) + { + Result = S_FALSE; + } + break; + } + + return Result; +} + +HRESULT __stdcall IWmarkUni::CommandCallback( + PDEVOBJ pdevobj, + DWORD dwCallbackID, + DWORD dwCount, + PDWORD pdwParams, + OUT INT *piResult) +{ + VERBOSE(DLLTEXT("IWmarkUni::CommandCallback() entry.\r\n")); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(dwCallbackID); + UNREFERENCED_PARAMETER(dwCount); + UNREFERENCED_PARAMETER(pdwParams); + + *piResult = 0; + + return S_OK; +} + +HRESULT __stdcall IWmarkUni::ImageProcessing( + PDEVOBJ pdevobj, + PBYTE pSrcBitmap, + PBITMAPINFOHEADER pBitmapInfoHeader, + PBYTE pColorTable, + DWORD dwCallbackID, + PIPPARAMS pIPParams, + OUT PBYTE *ppbResult) +{ + VERBOSE(DLLTEXT("IWmarkUni::ImageProcessing() entry.\r\n")); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pSrcBitmap); + UNREFERENCED_PARAMETER(pBitmapInfoHeader); + UNREFERENCED_PARAMETER(pColorTable); + UNREFERENCED_PARAMETER(dwCallbackID); + UNREFERENCED_PARAMETER(pIPParams); + UNREFERENCED_PARAMETER(ppbResult); + + return S_OK; +} + +HRESULT __stdcall IWmarkUni::FilterGraphics( + PDEVOBJ pdevobj, + PBYTE pBuf, + DWORD dwLen) +{ + DWORD dwResult; + VERBOSE(DLLTEXT("IWmarkUni::FilterGraphis() entry.\r\n")); + m_pOEMHelp->DrvWriteSpoolBuf(pdevobj, pBuf, dwLen, &dwResult); + + if (dwResult == dwLen) + return S_OK; + else + return E_FAIL; +} + +HRESULT __stdcall IWmarkUni::Compression( + PDEVOBJ pdevobj, + PBYTE pInBuf, + PBYTE pOutBuf, + DWORD dwInLen, + DWORD dwOutLen, + OUT INT *piResult) +{ + VERBOSE(DLLTEXT("IWmarkUni::Compression() entry.\r\n")); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pInBuf); + UNREFERENCED_PARAMETER(pOutBuf); + UNREFERENCED_PARAMETER(dwInLen); + UNREFERENCED_PARAMETER(dwOutLen); + UNREFERENCED_PARAMETER(piResult); + + // When implemented, the return from GetImplementedMethod + // for this method name must be S_OK. + + return E_NOTIMPL; +} + + +HRESULT __stdcall IWmarkUni::HalftonePattern( + PDEVOBJ pdevobj, + PBYTE pHTPattern, + DWORD dwHTPatternX, + DWORD dwHTPatternY, + DWORD dwHTNumPatterns, + DWORD dwCallbackID, + PBYTE pResource, + DWORD dwResourceSize) +{ + VERBOSE(DLLTEXT("IWmarkUni::HalftonePattern() entry.\r\n")); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pHTPattern); + UNREFERENCED_PARAMETER(dwHTPatternX); + UNREFERENCED_PARAMETER(dwHTPatternY); + UNREFERENCED_PARAMETER(dwHTNumPatterns); + UNREFERENCED_PARAMETER(dwCallbackID); + UNREFERENCED_PARAMETER(pResource); + UNREFERENCED_PARAMETER(dwResourceSize); + + // When implemented, the return from GetImplementedMethod + // for this method name must be S_OK. + + return E_NOTIMPL; +} + +HRESULT __stdcall IWmarkUni::MemoryUsage( + PDEVOBJ pdevobj, + POEMMEMORYUSAGE pMemoryUsage) +{ + VERBOSE(DLLTEXT("IWmarkUni::MemoryUsage() entry.\r\n")); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pMemoryUsage); + + // When implemented, the return from GetImplementedMethod + // for this method name must be S_OK. + + return E_NOTIMPL; +} + +HRESULT __stdcall IWmarkUni::DownloadFontHeader( + PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + OUT DWORD *pdwResult) +{ + VERBOSE(DLLTEXT("IWmarkUni::DownloadFontHeader() entry.\r\n")); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pUFObj); + UNREFERENCED_PARAMETER(pdwResult); + + // When implemented, the return from GetImplementedMethod + // for this method name must be S_OK. + + return E_NOTIMPL; +} + +HRESULT __stdcall IWmarkUni::DownloadCharGlyph( + PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + HGLYPH hGlyph, + PDWORD pdwWidth, + OUT DWORD *pdwResult) +{ + VERBOSE(DLLTEXT("IWmarkUni::DownloadCharGlyph() entry.\r\n")); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pUFObj); + UNREFERENCED_PARAMETER(hGlyph); + UNREFERENCED_PARAMETER(pdwWidth); + UNREFERENCED_PARAMETER(pdwResult); + + // When implemented, the return from GetImplementedMethod + // for this method name must be S_OK. + + return E_NOTIMPL; +} + +HRESULT __stdcall IWmarkUni::TTDownloadMethod( + PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + OUT DWORD *pdwResult) +{ + VERBOSE(DLLTEXT("IWmarkUni::TTDownloadMethod() entry.\r\n")); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pUFObj); + UNREFERENCED_PARAMETER(pdwResult); + + // When implemented, the return from GetImplementedMethod + // for this method name must be S_OK. + + return E_NOTIMPL; +} + +HRESULT __stdcall IWmarkUni::OutputCharStr( + PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + DWORD dwType, + DWORD dwCount, + PVOID pGlyph) +{ + VERBOSE(DLLTEXT("IWmarkUni::OutputCharStr() entry.\r\n")); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pUFObj); + UNREFERENCED_PARAMETER(dwType); + UNREFERENCED_PARAMETER(dwCount); + UNREFERENCED_PARAMETER(pGlyph); + + // When implemented, the return from GetImplementedMethod + // for this method name must be S_OK. + + return E_NOTIMPL; +} + +HRESULT __stdcall IWmarkUni::SendFontCmd( + PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + PFINVOCATION pFInv) +{ + VERBOSE(DLLTEXT("IWmarkUni::SendFontCmd() entry.\r\n")); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(pUFObj); + UNREFERENCED_PARAMETER(pFInv); + + // When implemented, the return from GetImplementedMethod + // for this method name must be S_OK. + + return E_NOTIMPL; +} + +HRESULT __stdcall IWmarkUni::DriverDMS( + PVOID pDevObj, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded) +{ + VERBOSE(DLLTEXT("IWmarkUni::DriverDMS() entry.\r\n")); + + UNREFERENCED_PARAMETER(pDevObj); + UNREFERENCED_PARAMETER(pBuffer); + UNREFERENCED_PARAMETER(cbSize); + UNREFERENCED_PARAMETER(pcbNeeded); + + return E_NOTIMPL; +} + +HRESULT __stdcall IWmarkUni::TextOutAsBitmap( + SURFOBJ *pso, + STROBJ *pstro, + FONTOBJ *pfo, + CLIPOBJ *pco, + RECTL *prclExtra, + RECTL *prclOpaque, + BRUSHOBJ *pboFore, + BRUSHOBJ *pboOpaque, + POINTL *pptlOrg, + MIX mix) +{ + VERBOSE(DLLTEXT("IWmarkUni::TextOutAsBitmap() entry.\r\n")); + + UNREFERENCED_PARAMETER(pso); + UNREFERENCED_PARAMETER(pstro); + UNREFERENCED_PARAMETER(pfo); + UNREFERENCED_PARAMETER(pco); + UNREFERENCED_PARAMETER(prclExtra); + UNREFERENCED_PARAMETER(prclOpaque); + UNREFERENCED_PARAMETER(pboFore); + UNREFERENCED_PARAMETER(pboOpaque); + UNREFERENCED_PARAMETER(pptlOrg); + UNREFERENCED_PARAMETER(mix); + + // When implemented, the return from GetImplementedMethod + // for this method name must be S_OK. + + return E_NOTIMPL; +} + +HRESULT __stdcall IWmarkUni::TTYGetInfo( + PDEVOBJ pdevobj, + DWORD dwInfoIndex, + PVOID pOutputBuf, + DWORD dwSize, + DWORD *pcbcNeeded) +{ + VERBOSE(DLLTEXT("IWmarkUni::TTYGetInfo() entry.\r\n")); + + UNREFERENCED_PARAMETER(pdevobj); + UNREFERENCED_PARAMETER(dwInfoIndex); + UNREFERENCED_PARAMETER(pOutputBuf); + UNREFERENCED_PARAMETER(dwSize); + UNREFERENCED_PARAMETER(pcbcNeeded); + + // When implemented, the return from GetImplementedMethod + // for this method name must be S_OK. + + return E_NOTIMPL; +} + + +//////////////////////////////////////////////////////////////////////////////// +// +// oem class factory +// +class IOemCF : public IClassFactory +{ +public: + // *** IUnknown methods *** + + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release) (THIS); + + // *** IClassFactory methods *** + STDMETHOD(CreateInstance) (THIS_ + LPUNKNOWN pUnkOuter, + REFIID riid, + LPVOID FAR* ppvObject); + STDMETHOD(LockServer) (THIS_ BOOL bLock); + + + // Constructor + IOemCF(): m_cRef(1) { }; + ~IOemCF() { }; + +protected: + LONG m_cRef; + +}; + +/////////////////////////////////////////////////////////// +// +// Class factory body +// +HRESULT __stdcall IOemCF::QueryInterface(const IID& iid, void** ppv) +{ + if ((iid == IID_IUnknown) || (iid == IID_IClassFactory)) + { + *ppv = static_cast<IOemCF*>(this); + } + else + { + *ppv = NULL; + VERBOSE(DLLTEXT("IOemCF::QueryInterface interface not supported.\r\n")); + return E_NOINTERFACE; + } + reinterpret_cast<IUnknown*>(*ppv)->AddRef(); + return S_OK; +} + +ULONG __stdcall IOemCF::AddRef() +{ + return InterlockedIncrement(&m_cRef); +} + +_At_(this, __drv_freesMem(object)) +ULONG __stdcall IOemCF::Release() +{ + ASSERT( 0 != m_cRef); + ULONG cRef = InterlockedDecrement(&m_cRef); + if (0 == cRef) + { + delete this; + + } + return cRef; +} + +// IClassFactory implementation +HRESULT __stdcall IOemCF::CreateInstance(IUnknown* pUnknownOuter, + const IID& iid, + void** ppv) +{ + //VERBOSE(DLLTEXT("Class factory:\t\tCreate component.")); + + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Cannot aggregate. + if (pUnknownOuter != NULL) + { + return CLASS_E_NOAGGREGATION; + } + + // Create component. + IWmarkUni* pOemCP = new IWmarkUni; + if (pOemCP == NULL) + { + return E_OUTOFMEMORY; + } + + // Get the requested interface. + HRESULT hr = pOemCP->QueryInterface(iid, ppv); + + // Release the IUnknown pointer. + // (If QueryInterface failed, component will delete itself.) + pOemCP->Release(); + return hr; +} + +// LockServer +HRESULT __stdcall IOemCF::LockServer(BOOL bLock) +{ + if (bLock) + { + InterlockedIncrement(&g_cServerLocks); + } + else + { + InterlockedDecrement(&g_cServerLocks); + } + return S_OK; +} + + +// +// Registration functions +// + +// +// Can DLL unload now? +// +STDAPI DllCanUnloadNow() +{ + // + // To avoid leaving OEM DLL still in memory when Unidrv or Pscript drivers + // are unloaded, Unidrv and Pscript driver ignore the return value of + // DllCanUnloadNow of the OEM DLL, and always call FreeLibrary on the OEMDLL. + // + // If OEM DLL spins off a working thread that also uses the OEM DLL, the + // thread needs to call LoadLibrary and FreeLibraryAndExitThread, otherwise + // it may crash after Unidrv or Pscript calls FreeLibrary. + // + + VERBOSE(DLLTEXT("DllCanUnloadNow entered.\r\n")); + + if ((g_cComponents == 0) && (g_cServerLocks == 0)) + { + return S_OK; + } + else + { + return S_FALSE; + } +} + +// +// Get class factory +// +STDAPI DllGetClassObject( + _In_ REFCLSID clsid, + _In_ REFIID iid, + _Outptr_ LPVOID* ppv) +{ + VERBOSE(DLLTEXT("DllGetClassObject:\tCreate class factory.\r\n")); + + if (ppv == NULL) + { + return E_POINTER; + } + *ppv = NULL; + + // Can we create this component? + if (clsid != CLSID_OEMRENDER) + { + return CLASS_E_CLASSNOTAVAILABLE; + } + + // Create class factory. + IOemCF* pFontCF = new IOemCF; // Reference count set to 1 + // in constructor + if (pFontCF == NULL) + { + return E_OUTOFMEMORY; + } + + // Get requested interface. + HRESULT hr = pFontCF->QueryInterface(iid, ppv); + pFontCF->Release(); + + return hr; +} + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/intrface.h b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/intrface.h new file mode 100644 index 00000000..a87f5ba4 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/intrface.h @@ -0,0 +1,254 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Intrface.H +// +// +// PURPOSE: Define COM interface for User Mode Printer Customization DLL. +// +#pragma once + + +//////////////////////////////////////////////////////////////////////////////// +// +// IWmarkUni +// +// Interface for Unidrv OEM sample rendering module +// +class IWmarkUni : public IPrintOemUni +{ +public: +public: + // *** IUnknown methods *** + + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); + + STDMETHOD_(ULONG,AddRef) (THIS); + + // the _At_ tag here tells prefast that once release + // is called, the memory should not be considered leaked + _At_(this, __drv_freesMem(object)) + STDMETHOD_(ULONG,Release) (THIS); + + // + // Method for publishing Driver interface. + // + STDMETHOD(PublishDriverInterface)(THIS_ IUnknown *pIUnknown); + + // + // Method for getting the implemented methods. + // Returns S_OK if the given method is implemneted. + // Returns S_FALSE if the given method is notimplemneted. + // + + STDMETHOD(GetImplementedMethod)(THIS_ _In_ PSTR pMethodName); + + // + // Method for OEM to specify DDI hook out + // + + STDMETHOD(EnableDriver) (THIS_ DWORD DriverVersion, + DWORD cbSize, + PDRVENABLEDATA pded); + + // + // Method to notify OEM plugin that it is no longer required + // + + STDMETHOD(DisableDriver) (THIS); + + // + // Method for OEM to contruct its own PDEV + // + + STDMETHOD(EnablePDEV) (THIS_ PDEVOBJ pdevobj, + _In_ PWSTR pPrinterName, + ULONG cPatterns, + HSURF *phsurfPatterns, + ULONG cjGdiInfo, + GDIINFO *pGdiInfo, + ULONG cjDevInfo, + DEVINFO *pDevInfo, + DRVENABLEDATA *pded, + OUT PDEVOEM *pDevOem); + + // + // Method for OEM to free any resource associated with its PDEV + // + + STDMETHOD(DisablePDEV) (THIS_ PDEVOBJ pdevobj); + + // + // Method for OEM to transfer from old PDEV to new PDEV + // + + STDMETHOD(ResetPDEV) (THIS_ PDEVOBJ pdevobjOld, + PDEVOBJ pdevobjNew); + + // + // Get OEM dll related information + // + + STDMETHOD(GetInfo) (THIS_ DWORD dwMode, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded); + + // + // OEMDriverDMS - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(DriverDMS)(THIS_ PVOID pDevObj, + PVOID pBuffer, + DWORD cbSize, + PDWORD pcbNeeded); + + // + // OEMDevMode + // + + STDMETHOD(DevMode) (THIS_ DWORD dwMode, + POEMDMPARAM pOemDMParam); + + // + // OEMCommandCallback - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(CommandCallback)(THIS_ PDEVOBJ pdevobj, + DWORD dwCallbackID, + DWORD dwCount, + PDWORD pdwParams, + OUT INT *piResult); + + // + // OEMImageProcessing - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(ImageProcessing)(THIS_ PDEVOBJ pdevobj, + PBYTE pSrcBitmap, + PBITMAPINFOHEADER pBitmapInfoHeader, + PBYTE pColorTable, + DWORD dwCallbackID, + PIPPARAMS pIPParams, + OUT PBYTE *ppbResult); + + // + // OEMFilterGraphics - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(FilterGraphics) (THIS_ PDEVOBJ pdevobj, + PBYTE pBuf, + DWORD dwLen); + // + // OEMCompression - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(Compression)(THIS_ PDEVOBJ pdevobj, + PBYTE pInBuf, + PBYTE pOutBuf, + DWORD dwInLen, + DWORD dwOutLen, + OUT INT *piResult); + + // + // OEMHalftone - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(HalftonePattern) (THIS_ PDEVOBJ pdevobj, + PBYTE pHTPattern, + DWORD dwHTPatternX, + DWORD dwHTPatternY, + DWORD dwHTNumPatterns, + DWORD dwCallbackID, + PBYTE pResource, + DWORD dwResourceSize); + + // + // OEMMemoryUsage - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(MemoryUsage) (THIS_ PDEVOBJ pdevobj, + POEMMEMORYUSAGE pMemoryUsage); + + // + // OEMTTYGetInfo - UNIDRV only, return E_NOTIMPL on Pscript + // + + STDMETHOD(TTYGetInfo)(THIS_ PDEVOBJ pdevobj, + DWORD dwInfoIndex, + PVOID pOutputBuf, + DWORD dwSize, + DWORD *pcbcNeeded); + + // + // OEMDownloadFontheader - UNIDRV only + // + + STDMETHOD(DownloadFontHeader)(THIS_ PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + OUT DWORD *pdwResult); + + // + // OEMDownloadCharGlyph - UNIDRV only + // + + STDMETHOD(DownloadCharGlyph)(THIS_ PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + HGLYPH hGlyph, + PDWORD pdwWidth, + OUT DWORD *pdwResult); + + // + // OEMTTDownloadMethod - UNIDRV only + // + + STDMETHOD(TTDownloadMethod)(THIS_ PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + OUT DWORD *pdwResult); + + // + // OEMOutputCharStr - UNIDRV only + // + + STDMETHOD(OutputCharStr)(THIS_ PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + DWORD dwType, + DWORD dwCount, + PVOID pGlyph); + + // + // OEMSendFontCmd - UNIDRV only + // + + + STDMETHOD(SendFontCmd)(THIS_ PDEVOBJ pdevobj, + PUNIFONTOBJ pUFObj, + PFINVOCATION pFInv); + + // + // OEMTextOutAsBitmap - UNIDRV only + // + + STDMETHOD(TextOutAsBitmap)(THIS_ SURFOBJ *pso, + STROBJ *pstro, + FONTOBJ *pfo, + CLIPOBJ *pco, + RECTL *prclExtra, + RECTL *prclOpaque, + BRUSHOBJ *pboFore, + BRUSHOBJ *pboOpaque, + POINTL *pptlOrg, + MIX mix); + + + IWmarkUni() { m_cRef = 1; m_pOEMHelp = NULL; }; + ~IWmarkUni(); + +protected: + LONG m_cRef; + IPrintOemDriverUni* m_pOEMHelp; +}; diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/name.h b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/name.h new file mode 100644 index 00000000..3018823b --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/name.h @@ -0,0 +1,34 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1996 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: Name.H +// +// +// PURPOSE: Define string literals for interface funcion names. +// +#pragma once + +///////////////////////////////////////////////////////// +// String Leterals +///////////////////////////////////////////////////////// + + +CONST CHAR NAME_CommandCallback[] = "CommandCallback"; +CONST CHAR NAME_Compression[] = "Compression"; +CONST CHAR NAME_DownloadCharGlyph[] = "DownloadCharGlyph"; +CONST CHAR NAME_DownloadFontHeader[] = "DownloadFontHeader"; +CONST CHAR NAME_FilterGraphics[] = "FilterGraphics"; +CONST CHAR NAME_HalftonePattern[] = "HalftonePattern"; +CONST CHAR NAME_ImageProcessing[] = "ImageProcessing"; +CONST CHAR NAME_MemoryUsage[] = "MemoryUsage"; +CONST CHAR NAME_OutputCharStr[] = "OutputCharStr"; +CONST CHAR NAME_SendFontCmd[] = "SendFontCmd"; +CONST CHAR NAME_TextOutAsBitmap[] = "TextOutAsBitmap"; +CONST CHAR NAME_TTDownloadMethod[] = "TTDownloadMethod"; +CONST CHAR NAME_TTYGetInfo[] = "TTYGetInfo"; +CONST CHAR NAME_WritePrinter[] = "WritePrinter"; + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/precomp.h b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/precomp.h new file mode 100644 index 00000000..48078a7d --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/precomp.h @@ -0,0 +1,53 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: precomp.H +// +// +// PURPOSE: Optimize compilation of headers that don't change frequently. +// +#pragma once + +// Necessary for compiling under VC. +#if(!defined(WINVER) || (WINVER < 0x0500)) + #undef WINVER + #define WINVER 0x0500 +#endif +#if(!defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500)) + #undef _WIN32_WINNT + #define _WIN32_WINNT 0x0500 +#endif + + + +// Required header files that shouldn't change often. + + +#include <STDDEF.H> +#include <STDLIB.H> +#include <OBJBASE.H> +#include <STDARG.H> +#include <STDIO.H> +#include <WINDEF.H> +#include <WINERROR.H> +#include <WINBASE.H> +#include <WINGDI.H> +#include <WINDDI.H> +#include <TCHAR.H> +#include <EXCPT.H> +#include <ASSERT.H> +#include <PRINTOEM.H> +#include <INITGUID.H> +#include <PRCOMOEM.H> + +// Safe integer functions to detect integer overflow/underflow conditions: +#include <intsafe.h> + +// StrSafe.h needs to be included last +// to disallow unsafe string functions. +#include <STRSAFE.H> + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/precompsrc.cpp b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/precompsrc.cpp new file mode 100644 index 00000000..5944cf51 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/precompsrc.cpp @@ -0,0 +1 @@ +#include "precomp.h"
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/resource.h b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/resource.h new file mode 100644 index 00000000..35637c60 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/resource.h @@ -0,0 +1,17 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by WMARKUNI.rc +// + + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 103 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/wmarkuni.def b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/wmarkuni.def new file mode 100644 index 00000000..86e376e8 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/wmarkuni.def @@ -0,0 +1,3 @@ +LIBRARY WMARKUNI +EXPORTS DllGetClassObject PRIVATE + DllCanUnloadNow PRIVATE diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/wmarkuni.h b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/wmarkuni.h new file mode 100644 index 00000000..87415a42 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/wmarkuni.h @@ -0,0 +1,82 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved. +// +// FILE: WMARKUNI.H +// +// +// PURPOSE: Define common data types, and external function prototypes +// for debug.cpp. +// +#pragma once + +#include "OEM.H" +#include "DEVMODE.H" + + +//////////////////////////////////////////////////////// +// OEM Defines +//////////////////////////////////////////////////////// + +#define DLLTEXT(s) "WMARKUNI: " s + +/////////////////////////////////////////////////////// +// Warning: the following enum order must match the +// order in OEMHookFuncs[]. +/////////////////////////////////////////////////////// +typedef enum tag_Hooks { + UD_DrvRealizeBrush, + UD_DrvDitherColor, + UD_DrvCopyBits, + UD_DrvBitBlt, + UD_DrvStretchBlt, + UD_DrvTextOut, + UD_DrvStrokePath, + UD_DrvFillPath, + UD_DrvStrokeAndFillPath, + UD_DrvPaint, + UD_DrvLineTo, + UD_DrvStartPage, + UD_DrvSendPage, + UD_DrvEscape, + UD_DrvStartDoc, + UD_DrvEndDoc, + UD_DrvNextBand, + UD_DrvStartBanding, + UD_DrvQueryFont, + UD_DrvQueryFontTree, + UD_DrvQueryFontData, + UD_DrvQueryAdvanceWidths, + UD_DrvFontManagement, + UD_DrvGetGlyphMode, + UD_DrvStretchBltROP, + UD_DrvPlgBlt, + UD_DrvTransparentBlt, + UD_DrvAlphaBlend, + UD_DrvGradientFill, + + MAX_DDI_HOOKS, + +} ENUMHOOKS; + + +typedef struct _OEMPDEV { + // + // define whatever needed, such as working buffers, tracking information, + // etc. + // + // This test DLL hooks out every drawing DDI. So it needs to remember + // Unidrv's hook function pointer so it call back. + // + PFN pfnUnidrv[MAX_DDI_HOOKS]; + + // + // define whatever needed, such as working buffers, tracking information, + // etc. + // + DWORD dwReserved[1]; + +} OEMPDEV, *POEMPDEV; diff --git a/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/wmarkuni.rc b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/wmarkuni.rc new file mode 100644 index 00000000..54b0f627 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/watermarkuni/wmarkuni/wmarkuni.rc @@ -0,0 +1,104 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "Written by Printing & Imaging Team" + VALUE "CompanyName", "Microsoft Corp." + VALUE "FileDescription", "Watermark Unidriver Sample" + VALUE "FileVersion", "1, 0, 0, 1" + VALUE "InternalName", "OEMPS" + VALUE "LegalCopyright", "Copyright � 1998-2003" + VALUE "LegalTrademarks", "Microsoft� is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation" + VALUE "OriginalFilename", "WMARKUNI.DLL" + VALUE "ProductName", "Microsoft WMARKUNI" + VALUE "ProductVersion", "1.0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/print/OEM Printer Customization Plug-in Samples/C++/winxp.inf b/print/OEM Printer Customization Plug-in Samples/C++/winxp.inf new file mode 100644 index 00000000..43fe3e21 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/C++/winxp.inf @@ -0,0 +1,139 @@ +; Winxp.INF +; +; INF file for OEM DLL Print UI Replacement sample +; +; Copyright 2001-2003 Microsoft Corporation + + +[Version] +Signature="$Windows NT$" +Provider=%MS% +LayoutFile=ntprint.inf +ClassGUID={4D36E979-E325-11CE-BFC1-08002BE10318} +Class=Printer +DriverVer=6/07/2001,1.0.0.1 + +; +; Manufacturer section. +; +; This section lists all of the manufacturers +; that we will display in the Dialog box +; +[Manufacturer] +"Microsoft"=Microsoft, NTamd64, NTia64 + +; +; Model sections. +; +; Each section here corresponds with an entry listed in the +; [Manufacturer] section, above. The models will be displayed in the order +; that they appear in the INF file. +; + +[Microsoft] +"Themed OEM UI (Unidrv)" = THEMEUI.UNI +"Themed OEM UI (PScript5)" = THEMEUI.PS +"PS Standard UI Replacement" = PSUIREP.PS + +[Microsoft.NTamd64] +"Themed OEM UI (Unidrv)" = THEMEUI.UNI +"Themed OEM UI (PScript5)" = THEMEUI.PS +"PS Standard UI Replacement" = PSUIREP.PS + +[Microsoft.NTia64] +"Themed OEM UI (Unidrv)" = THEMEUI.UNI +"Themed OEM UI (PScript5)" = THEMEUI.PS +"PS Standard UI Replacement" = PSUIREP.PS + +; +; Installer Sections +; +; These sections control file installation, and reference all files that +; need to be copied. The section name will be assumed to be the driver +; file, unless there is an explicit DriverFile section listed. +; + +[THEMEUI.UNI] +CopyFiles=THEMEUI +DataFile=OEM.GPD +DataSection=UNIDRV_DATA +Include=NTPRINT.INF +Needs=UNIDRV.OEM,TTFSUB.OEM,UNIDRV_DATA + +[THEMEUI.PS] +CopyFiles=THEMEUI +DataFile=OEM.PPD +DataSection=PSCRIPT_DATA +Include=NTPRINT.INF +Needs=PSCRIPT.OEM,PSCRIPT_DATA + +[PSUIREP.PS] +CopyFiles=PSUIREP +DataFile=OEM.PPD +DataSection=PSCRIPT_DATA +Include=NTPRINT.INF +Needs=PSCRIPT.OEM,PSCRIPT_DATA + + +; Copy Sections +; +; Lists of files that are actually copied. These sections are referenced +; from the installer sections, above. Only create a section if it contains +; two or more files (if we only copy a single file, identify it in the +; installer section, using the @filename notation) or if it's a color +; profile (since the DestinationDirs can only handle sections, and not +; individual files). +; + +[THEMEUI] +ThemeUISmpl.DLL + +[PSUIREP] +PSUIREP.DLL + + +; +; Location of source files not in Layout.inf. +; + +[SourceDisksNames] +100 = %OEMRepUISample% + +[SourceDisksFiles.x86] +THEMEUISmpl.DLL = 100,ThemeUI\x86 +PSUIREP.DLL = 100,PSUIRep\x86 + +[SourceDisksFiles.amd64] +THEMEUISmpl.DLL = 100,ThemeUI\amd64 +PSUIREP.DLL = 100,PSUIRep\amd64 + +[SourceDisksFiles.ia64] +THEMEUISmpl.DLL = 100,ThemeUI\ia64 +PSUIREP.DLL = 100,PSUIRep\ia64 + +[SourceDisksFiles] +OEM.PPD = 100 +OEM.GPD = 100 +THEMEUI.INI = 100 +PSUIREP.INI = 100 + +; +; Call SetupSetDirectoryId with 66000 to set the target directory at runtime +; (depending on which environment drivers are getting installed) +; + +[DestinationDirs] +DefaultDestDir=66000 + +; +; Localizable Strings +; +[Strings] +MS="Microsoft DDK Sample" +OEMRepUISample="OEM DLL Print UI Replacement sample" diff --git a/print/OEM Printer Customization Plug-in Samples/README.md b/print/OEM Printer Customization Plug-in Samples/README.md new file mode 100644 index 00000000..1d6a8ac5 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/README.md @@ -0,0 +1,87 @@ +# OEM Printer Customization Plug-in Samples + +The OEMDLL samples are an illustration of OEM customization plug-ins. The BITMAP, OEMPS, OEMUI, OEMUNI, OEMPREAN, CUSTHLP, SyncSet, ThemeUI, PSUIRep, and Watermark samples do not affect the printer output. They are only examples of how to build OEM Customization DLLs of various types. + +The following samples are included as part of this sample set: + +| Sample | Description | +|--------|-------------| +| BITMAP | a Unidrv-based bitmap rendering plug-in. This sample demonstrates how to write a Unidrv-based rendering plug-in that functions as a bitmap driver. The sample is based on the redesigned version of the OEMUNI sample. | +| CUSTHLP | An OEM help-customization plug-in. This sample demonstrates adding OEM help to your customization plug-in and how to replace standard Microsoft supplied help with customized help. | +| OEMPREAN | illustrates how you can leverage the pre-analysis feature in Unidrv. This sample is built on the redesigned version of the OEMUNI sample. | +| OEMPS | A PostScript rendering plug-in. This sample demonstrates how to write a PostScript-based rendering plug-in. | +| OEMUI | A user interface plug-in (both PostScript and Unidrv flavors are available). The OEMUI sample demonstrates common UI tasks such as adding additional elements to the UI (that is, items and pages). | +| OEMUNI | A user interface plug-in (both PostScript and Unidrv flavors are available). The OEMUI sample demonstrates common UI tasks such as adding additional elements to the UI (that is, items and pages). | +| PSUIREP | A PostScript UI replacement sample. This sample demonstrates how to completely replace the standard printer driver UI for PostScript driver plug-ins. | +| PTPCPIPR | The Unidrv Plug-in for Print Ticket Provider Interface sample contains a functional Unidrv configuration plug-in that implements the IPrintOemPrintTicketProvider interface. You can use this code as a starting point for developing new driver plug-ins that support PrintTicket functionality. | +| SYNCSET | A synchronization plug-in. This sample demonstrates how to synchronize driver settings between the OEM customization page and the standard device settings page. | +| THEMEUI | A theming plug-in. This sample demonstrates how to use theming (that is, comctl v6) for printer driver UI. | +| UNIUIREP | This Universal Printer Driver (Unidrv) UI plugin sample shows how to fully replace Unidrv's standard UI and how to use the new IPrintCoreHelper interface to enumerate GDP features/options, enumerate constraints, get/set Unidrv settings, and create a GDL snapshot. | +| WATERMARK | Demonstrates how to produce customizable watermark page simulation by controlling PostScript injected in the printing stream. The components of the sample include a PostScript-based rendering module in conjunction with a UI module. The rendering module is responsible for the injection of the modified PostScript into the printing stream. This sample demonstrates the required COM interfaces, required functions with sample code and how to use the OEM's private DEVMODE section to communicate between the UI and rendering modules. | +| WATERMARKUNI | Demonstrates how to produce customizable watermark page simulation by controlling PCL data injected in the printing stream. The components of the sample include a UNIDRV-based rendering module in conjunction with a UI module. The rendering module is responsible for the injection of the PCL data into the printing stream. This sample demonstrates the required COM interfaces, required functions with sample code and how to use the OEM's private DEVMODE section to communicate between the UI and rendering modules. This sample works only if you have a page printer that has its own fonts. It doesn't download any fonts nor convert fonts to bitmap. | + +For information about how to develop a plug-in for customizing the print driver UI, see COM Interfaces for UI Plug-Ins. +**Note** The OEMDLL samples are for the v3 print driver model only. +**Note** +To build this sample, you can use Microsoft Visual Studio 2013 (Express, Professional, or Ultimate) and Windows Driver Kit (WDK) 8.1 Update. You can get Visual Studio 2013 and WDK 8.1 Update here. +You can also build this sample with Visual Studio 2013 (Professional or Ultimate) and Windows Driver Kit (WDK) 8.1. +For Windows Driver Kit (WDK) 8 samples, download the WDK 8 samples pack. The samples in the WDK 8 samples pack will build only with Microsoft Visual Studio Professional 2012 (Professional or Ultimate) and WDK 8. + +Operating system requirements +Client +Windows 7 +Server +Windows Server 2008 R2 +Build the sample +To build a driver solution using Windows 8.1 driver kit (Windows Driver Kit (WDK)) and Visual Studio 2013, perform the following steps. +1. Open the solution file in Visual Studio 2013 +2. Add all non-binary files (usually located in the \install directory of the sample) to the Package project +a. In the Solution Explorer, right click Driver Files +b. Select Add, then click Existing Item +c. Navigate to the location to which you downloaded the sample, and select all the files in the install directory, or the equivalent set of non-binary files such as INFs, INIs, GPD, PPD files, etc. +d. Click Add +3. Configure these files to be added into the driver package +a. In the Solution Explorer, right click the Package project and select Properties +b. In the left pane, click Configuration Properties > Driver Install > Package Files. +c. In the right pane, use the ellipsis button (...) to browse to the set of files that needs to be added to the driver package. All the data files that you added in Step 2-c, except the INF file, should be added. +Note This configuration is per-architecture, so this configuration must be repeated for each architecture that will be built. +d. Click OK +4. Open the INF file and edit it to match the built output +a. Open the INF file +b. In the Version section, add a reference to a catalog file like this: CatalogFile=XpsDrvSmpl.cat +c. In the SourceDisksFiles section, change the location of the DLL files you are building, to =1. This indicates that there is no architecture specific directory in this driver. If you ship multiple architectures simultaneously, you will need to collate the driver INF manually. + +At this point, Visual Studio 2013 will be able to build a driver package and output the files to disk. In order to configure driver signing and deployment, see Developing, Testing, and Deploying Drivers. +For more information about how to build a driver solution using Microsoft Visual Studio, see Building a Driver. +Run the sample +Installation +After building the samples, you can install them by using the Add Printer Wizard. Select the local printer, click Have Disk, and point to the directory that contains the relevant INF (oemdll.inf, bitmap.inf, oemprean.inf, and so on) file. +Design and Operation +BITMAP + +This sample includes the following features: +The supported ColorMode options in the bitmap driver's GPD are monochrome, 4bpp, 8bpp, and 24bpp. +The bitmap driver implements the IPrintOemUni::ImageProcessing callback to access bitmap data one band at a time. The driver's implementation of ImageProcessing buffers the band data every time it is called. The function is also responsible for filling the BITMAPINFOHEADER and COLORTABLE structures that are necessary for dumping the data out to a bitmap file. +The bitmap driver implements the OEMEndDoc DDI hook to dump the buffered bitmap data to the spooler at the end of the print job. The driver's implementation of OEMEndDoc dumps the headers first and then the buffered data. +The GrowBuffer helper function is called every time the buffer needs to be enlarged to hold the bitmap data. +The bitmap driver renders multi-page documents into a single large output bitmap file. +This sample has the following limitations: +The plug-in does not support landscape orientation although the option exists in the GPD. +In 24bpp mode, documents larger than three pages will produce an extremely large bitmap (.bmp) file. Although the output is correct, you might not be able to view it because of memory limitations in the bitmap viewer. + +OEMPREAN +When preanalysis is enabled in the GPD (for more details about preanalysis, see the WDK documentation), Unidrv defines the surface as a banding surface but causes the first playback (that is, the first band) to be of the entire page. Unidrv performs this definition by setting the GDI clip window to the entire page. Unidrv enables all drawing commands to be hooked but returns before any drawing can be done. On the subsequent passes, Unidrv resets the clip window back to the original band size and bands normally. +In order for plugins to also take part in preanalysis, they can enable OEM preanalysis by specifying the "*PreAnalysisOptions: 8" parameter in the GPD. The OEM rendering plug-in must hook both DrvStartBanding and DrvNextBand when this mode is enabled in the GPD. The OEM rendering plug-in must test the pptl parameter of the OEMStartBanding call to determine whether preanalysis has been enabled on this page. If the pptl parameter is NULL, preanalysis has been enabled, and the OEM rendering plug-in should consider all drawing calls up to the first call to OEMNextBand to be part of preanalysis. +During these preanalysis phase drawing calls, the plug-in should not draw on the surface. The plug-in should also not call back into unidrv. You should use this phase only for analysis of the objects on the page. For example, certain printers need to handle black objects that intersect with color objects differently from black objects that appear by themselves. Other printers might need to halftone StretchBlt objects differently from BitBlt objects. +You should be aware that after preanalysis, you might get more calls than you saw in the normal rendering, because primitives that cross band boundaries yield two or more DDI calls after the preanalysis pass. +The sample uses the bPreAnalysis flag in the OEMPDEV structure to denote whether a particular pass is the preanalysis pass or the actual rendering pass. If the bPreAnalysis flag is set, it indicates that the current pass is the preanalysis pass. The sample implements all of the drawing function hooks in Ddihook.cpp. The sample uses the OEMStartBanding and OEMNextBand functions to respectively set and reset the bPreAnalysis flag. The sample also uses the DBG_CLIPOBJ debug macro function to dump the bounds of the clipping rectangle available for preanalysis in each of the drawing functions during the preanalysis pass. To view all of the debug output in the debugger, you must set the debug level to VERBOSE. The rest of the sample is identical to the Oemuni sample that illustrates a basic OEM rendering plug-in. +Note that the surface used during preanalysis might differ from the surface passed in during the rendering pass. +PTPCPIPR +This sample is an educational example that illustrates the basic functionality that a Unidrv plug-in for the IPrintOemPrintTicketProvider interface should implement. +The primary functionality of the plug-in is to support the PhotoPrintingIntent PrintSchema keyword. The PhotoPrintingIntent keyword is designed to provide a mechanism for photo printers to support enhancements that are specific to photo printing. An application or the user (through the print UI) can then specify whether a particular print job is a photo-printing job, in which case the device can apply appropriate enhancements. +The intent setting is communicated to the device driver in a PrintTicket. The actual enhancements made are device-specific, and as such, the driver has to map the high-level intent setting into specific output settings, like resolution or bpp. This plug-in sample demonstrates the conversion. +The plug-in implements the ExpandIntentOptions method of the IPrintOemPrintTicketProvider interface. This method is called with an input print-ticket. The plug-in checks if the print-ticket contains a photo-printing intent setting, and if so, removes the setting, while instead adding to the print-ticket output settings as mentioned above. The code sample uses MSXML6 for all PrintTicket XML handling. +UINUIREP +This sample shows how a plug-in for a Unidrv-based driver can replace the default UI. It provides new property sheets for the printer property and printing preferences pages. +Use this sample as an example of implementing full UI replacement in a Unidrv-based plugin. It also demonstrates the use of the new IPrintCoreHelper interface. +This sample is only provided for educational purposes and should not be used in a production environment.
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/description.html b/print/OEM Printer Customization Plug-in Samples/description.html new file mode 100644 index 00000000..4f819aa9 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/description.html @@ -0,0 +1,430 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html> + <head><link rel="stylesheet" type="text/css" href="description/Combined.css,0:sprite;/Areas/Epx/Themes/Windows/Content:0&amp;hashKey=B5E5F4F4AE5278BDA2ADB3607072DA9C" xmlns="http://www.w3.org/1999/xhtml" /> +<link rel="stylesheet" type="text/css" href="description/dc96e5d0-205a-4f07-963c-0adecf31d9c1Combined.css,0:sprite,1:LinkList;/Areas/Epx/Themes/Windows/Content:0,/Areas/Epx/Themes/Base/Content:1&amp;hashKey=3985696AFC623BD5CCF8BE823D027701" xmlns="http://www.w3.org/1999/xhtml" /> + + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <title>OEM Printer Customization Plug-in Samples</title> + <link href="description/Galleries.css" type="text/css" rel="Stylesheet" /><link href="description/Layout.css" type="text/css" rel="Stylesheet" /><link href="description/Brand.css" type="text/css" rel="Stylesheet" /><link href="description/19eccd10-9a4c-4ebc-a240-2680a581332eBrand.css" type="text/css" rel="Stylesheet" /> + <link href="description/iframedescription.css" rel="Stylesheet" type="text/css" /> + <script src="description/offline.js" type="text/javascript"></script> + <style type="text/css"> + #projectInfo { + overflow: auto; + } + #longDesc { + clear:both; + margin: 25px 0 10px 0; + } + + #SampleIndexList{ + margin-left: 15px; + } + </style> + </head> +<body> + <div id="offlineDescription"> + <h1>OEM Printer Customization Plug-in Samples</h1> + <br/> + <div id="projectInfo"> + <div class="section"> + <div class="itemBarLong tagsContainer"> + <label for="Technologies">Technologies</label> + <div id="Technologies"> + printer, Windows Driver + </div> + </div> + <div class="itemBarLong tagsContainer"> + <label for="Topics">Topics</label> + <div id="Topics"> + Printing + </div> + </div> + <div class="itemBarLong"> + <label for="Platforms">Platforms</label> + <div id="Platforms"> + Desktop + </div> + </div> + <div class="itemBarLong"> + <label for="Requirements">Requirements</label> + <div id="Requirements"> + + </div> + </div> + <div class="itemBar"> + <label for="LastUpdated">Primary language</label> + <div id="LastUpdated">en-US</div> + </div> + <div class="itemBar"> + <label for="LastUpdated">Updated</label> + <div id="LastUpdated">4/2/2014</div> + </div> + <div class="itemBarLong"> + <label for="License">License</label> + <div id="License"> + <a href="license.rtf">MS-LPL</a></div> + </div> + <div class="itemBar"> + <div class="viewonlinecont"> + <a data-link="online" href="http://code.msdn.microsoft.com/windowshardware/OEMDLL-Samples-71364d95">View this sample online</a> + </div> + </div> + </div> + </div> + + +<script type="text/javascript"> + function initializePage() { + var otherTabClass = 'otherTab'; + var hiddenPreClass = 'hidden'; + + var htmlDecode = function(encodedData) { + var decodedData = ""; + if (encodedData) { + var div = document.createElement('div'); + div.innerHTML = encodedData; + decodedData = div.firstChild.nodeValue.replace( /\\r\\n/ig , '\r\n'); + } + return decodedData; + }; + + Galleries.iterateElem(Galleries.findElem(null, 'div', 'scriptcode'), function (index, scriptBlock) { + var titleElem = Galleries.findElem(scriptBlock, 'div', 'title')[0]; + var labelElems = Galleries.findElem(titleElem, 'span'); + if (labelElems.length == 0) { + labelElems = titleElem; + } + var languageSpans = Galleries.findElem(scriptBlock, 'span', 'hidden'); + var pres = Galleries.findElem(scriptBlock, 'pre'); + if (languageSpans.length > 0 && pres.length > 1) { + Galleries.iterateElem(labelElems, function(index, elem) { + var codePre = pres[index]; + var labelSpan = elem; + var languageSpan = languageSpans[index]; + + elem.code = codePre.innerHTML.replace( /(\r(\n)?)|((\r)?\n)/ig , '\\r\\n'); + + codePre.className = codePre.className.replace(hiddenPreClass, ''); + + languageSpan.parentNode.removeChild(languageSpan); + }); + + pres = Galleries.findElem(scriptBlock, 'pre'); + Galleries.iterateElem(labelElems, function(index, elem) { + var codePre = pres[index]; + var labelSpan = elem; + if (index == 0) { + scriptBlock.activeTab = 0; + } + else { + labelSpan.className += otherTabClass; + codePre.className += hiddenPreClass; + } + Galleries.attachEventHandler(labelSpan, 'click', function(e) { + var activeTab = scriptBlock.activeTab; + labelElems[activeTab].className += otherTabClass; + pres[activeTab].className += hiddenPreClass; + + codePre.className = codePre.className.replace(hiddenPreClass, ''); + labelSpan.className = labelSpan.className.replace(otherTabClass, ''); + scriptBlock.activeTab = index; + }); + }); + + var preview = Galleries.findElem(scriptBlock, 'div', 'preview'); + if (preview.length == 0) { + preview.push(pres[pres.length - 1]); + } + Galleries.iterateElem(preview, function(index, elem) { + elem.parentNode.removeChild(elem); + }); + + if (window.clipboardData && clipboardData.setData) { + var copyLink = document.createElement('a'); + copyLink.href = 'javascript:void(0);'; + copyLink.className = 'copyCode'; + copyLink.innerHTML = 'Copy code'; + Galleries.attachEventHandler(copyLink, 'click', function (e) { + clipboardData.setData("Text", htmlDecode(labelElems[scriptBlock.activeTab].code)); + return false; + }); + scriptBlock.insertBefore(copyLink, scriptBlock.childNodes[0]); + } + } + }); + } + + Galleries.onWindowLoad(function(){ + initializePage(); + }); + +</script> +<div id="longDesc"> + +<div id="mainSection"> +<p>The OEMDLL samples are an illustration of OEM customization plug-ins. The BITMAP, OEMPS, OEMUI, OEMUNI, OEMPREAN, CUSTHLP, SyncSet, ThemeUI, PSUIRep, and Watermark samples do not affect the printer output. They are only examples of how to build OEM Customization + DLLs of various types. </p> +<p>The following samples are included as part of this sample set:</p> +<table> +<tbody> +<tr> +<th>Sample</th> +<th>Description</th> +</tr> +<tr> +<td> +<p>BITMAP</p> +</td> +<td> +<p>a Unidrv-based bitmap rendering plug-in. This sample demonstrates how to write a Unidrv-based rendering plug-in that functions as a bitmap driver. The sample is based on the redesigned version of the OEMUNI sample. +</p> +</td> +</tr> +<tr> +<td> +<p>CUSTHLP</p> +</td> +<td> +<p>An OEM help-customization plug-in. This sample demonstrates adding OEM help to your customization plug-in and how to replace standard Microsoft supplied help with customized help. +</p> +</td> +</tr> +<tr> +<td> +<p>OEMPREAN</p> +</td> +<td> +<p>illustrates how you can leverage the pre-analysis feature in Unidrv. This sample is built on the redesigned version of the OEMUNI sample. +</p> +</td> +</tr> +<tr> +<td> +<p>OEMPS</p> +</td> +<td> +<p>A PostScript rendering plug-in. This sample demonstrates how to write a PostScript-based rendering plug-in.</p> +</td> +</tr> +<tr> +<td> +<p>OEMUI</p> +</td> +<td> +<p>A user interface plug-in (both PostScript and Unidrv flavors are available). The OEMUI sample demonstrates common UI tasks such as adding additional elements to the UI (that is, items and pages). +</p> +</td> +</tr> +<tr> +<td> +<p>OEMUNI</p> +</td> +<td> +<p>A user interface plug-in (both PostScript and Unidrv flavors are available). The OEMUI sample demonstrates common UI tasks such as adding additional elements to the UI (that is, items and pages). +</p> +</td> +</tr> +<tr> +<td> +<p>PSUIREP</p> +</td> +<td> +<p>A PostScript UI replacement sample. This sample demonstrates how to completely replace the standard printer driver UI for PostScript driver plug-ins. +</p> +</td> +</tr> +<tr> +<td> +<p>PTPCPIPR</p> +</td> +<td> +<p>The Unidrv Plug-in for Print Ticket Provider Interface sample contains a functional Unidrv configuration plug-in that implements the IPrintOemPrintTicketProvider interface. You can use this code as a starting point for developing new driver plug-ins that + support PrintTicket functionality. </p> +</td> +</tr> +<tr> +<td> +<p>SYNCSET</p> +</td> +<td> +<p>A synchronization plug-in. This sample demonstrates how to synchronize driver settings between the OEM customization page and the standard device settings page. +</p> +</td> +</tr> +<tr> +<td> +<p>THEMEUI</p> +</td> +<td> +<p>A theming plug-in. This sample demonstrates how to use theming (that is, comctl v6) for printer driver UI.</p> +</td> +</tr> +<tr> +<td> +<p>UNIUIREP</p> +</td> +<td> +<p>This Universal Printer Driver (Unidrv) UI plugin sample shows how to fully replace Unidrv's standard UI and how to use the new IPrintCoreHelper interface to enumerate GDP features/options, enumerate constraints, get/set Unidrv settings, and create a GDL + snapshot.</p> +</td> +</tr> +<tr> +<td> +<p>WATERMARK</p> +</td> +<td> +<p>Demonstrates how to produce customizable watermark page simulation by controlling PostScript injected in the printing stream. The components of the sample include a PostScript-based rendering module in conjunction with a UI module. The rendering module is + responsible for the injection of the modified PostScript into the printing stream. This sample demonstrates the required COM interfaces, required functions with sample code and how to use the OEM's private DEVMODE section to communicate between the UI and + rendering modules. </p> +</td> +</tr> +<tr> +<td> +<p>WATERMARKUNI</p> +</td> +<td> +<p>Demonstrates how to produce customizable watermark page simulation by controlling PCL data injected in the printing stream. The components of the sample include a UNIDRV-based rendering module in conjunction with a UI module. The rendering module is responsible + for the injection of the PCL data into the printing stream. This sample demonstrates the required COM interfaces, required functions with sample code and how to use the OEM's private DEVMODE section to communicate between the UI and rendering modules. This + sample works only if you have a page printer that has its own fonts. It doesn't download any fonts nor convert fonts to bitmap. +</p> +</td> +</tr> +</tbody> +</table> +<p>For information about how to develop a plug-in for customizing the print driver UI, see +<a href="http://msdn.microsoft.com/en-us/library/windows/hardware/ff546237(v=vs.85).aspx"> +COM Interfaces for UI Plug-Ins</a>.</p> +<p class="note"><b>Note</b> The OEMDLL samples are for the v3 print driver model only.</p> +<p class="note"><b>Note</b> </p> +<p class="note">To build this sample, you can use Microsoft Visual Studio 2013 (Express, Professional, or Ultimate) and Windows Driver Kit (WDK) 8.1 Update. You can get Visual Studio 2013 and WDK 8.1 Update +<a href="http://go.microsoft.com/fwlink/p/?LInkID=239721">here</a>.</p> +<p class="note">You can also build this sample with Visual Studio 2013 (Professional or Ultimate) and +<a href="http://go.microsoft.com/fwlink/p/?LInkID=391348">Windows Driver Kit (WDK) 8.1</a>.</p> +<p class="note">For Windows Driver Kit (WDK) 8 samples, download the <a href="http://code.msdn.microsoft.com/windowshardware/OEMDLL-Samples-71364d95/ http://go.microsoft.com/fwlink/?LinkId=317090"> +WDK 8 samples pack</a>. The samples in the WDK 8 samples pack will build only with Microsoft Visual Studio Professional 2012 (Professional or Ultimate) and WDK 8.</p> +<p></p> +<h2>Operating system requirements</h2> +<table> +<tbody> +<tr> +<th>Client</th> +<td><dt>Windows 7 </dt></td> +</tr> +<tr> +<th>Server</th> +<td><dt>Windows Server 2008 R2 </dt></td> +</tr> +</tbody> +</table> +<h2>Build the sample</h2> +<p>To build a driver solution using Windows 8.1 driver kit (Windows Driver Kit (WDK)) and Visual Studio 2013, perform the following steps.</p> +<dl><dd> +<p>1. Open the solution file in Visual Studio 2013</p> +</dd><dd> +<p>2. Add all non-binary files (usually located in the \install directory of the sample) to the Package project</p> +<dl><dd> +<p>a. In the <b>Solution Explorer</b>, right click <b>Driver Files</b></p> +</dd><dd> +<p>b. Select <b>Add</b>, then click <b>Existing Item</b></p> +</dd><dd> +<p>c. Navigate to the location to which you downloaded the sample, and select all the files in the install directory, or the equivalent set of non-binary files such as INFs, INIs, GPD, PPD files, etc.</p> +</dd><dd> +<p>d. Click <b>Add</b></p> +</dd></dl> +</dd><dd> +<p>3. Configure these files to be added into the driver package</p> +<dl><dd> +<p>a. In the <b>Solution Explorer</b>, right click the Package project and select +<b>Properties</b></p> +</dd><dd> +<p>b. In the left pane, click <b>Configuration Properties</b> > <b>Driver Install</b> > +<b>Package Files</b>.</p> +</dd><dd> +<p>c. In the right pane, use the ellipsis button (...) to browse to the set of files that needs to be added to the driver package. All the data files that you added in +<b>Step 2-c</b>, except the INF file, should be added.</p> +<p class="note"><b>Note</b> This configuration is per-architecture, so this configuration must be repeated for each architecture that will be built.</p> +</dd><dd>d. Click <b>OK</b> </dd></dl> +</dd><dd> +<p>4. Open the INF file and edit it to match the built output</p> +<dl><dd> +<p>a. Open the INF file</p> +</dd><dd> +<p>b. In the Version section, add a reference to a catalog file like this: CatalogFile=XpsDrvSmpl.cat +</p> +</dd><dd> +<p>c. In the SourceDisksFiles section, change the location of the DLL files you are building, to =1. This indicates that there is no architecture specific directory in this driver. If you ship multiple architectures simultaneously, you will need to collate + the driver INF manually. </p> +</dd></dl> +</dd></dl> +<p></p> +<p>At this point, Visual Studio 2013 will be able to build a driver package and output the files to disk. In order to configure driver signing and deployment, see +<a href="http://msdn.microsoft.com/en-us/library/windows/hardware/ff554651(v=vs.85).aspx"> +Developing, Testing, and Deploying Drivers</a>.</p> +<p>For more information about how to build a driver solution using Microsoft Visual Studio, see +<a href="http://msdn.microsoft.com/en-us/library/windows/hardware/ff554644">Building a Driver</a>.</p> +<h2>Run the sample</h2> +<h2><a id="Installation"></a><a id="installation"></a><a id="INSTALLATION"></a>Installation</h2> +<p>After building the samples, you can install them by using the <b>Add Printer Wizard</b>. Select the local printer, click +<b>Have Disk</b>, and point to the directory that contains the relevant INF (oemdll.inf, bitmap.inf, oemprean.inf, and so on) file. +</p> +<h2><a id="Design_and_Operation"></a><a id="design_and_operation"></a><a id="DESIGN_AND_OPERATION"></a>Design and Operation</h2> +<h3><a id="BITMAP"></a><a id="bitmap"></a>BITMAP</h3> +<p></p> +<p>This sample includes the following features:</p> +<ul> +<li>The supported ColorMode options in the bitmap driver's GPD are monochrome, 4bpp, 8bpp, and 24bpp. +</li><li>The bitmap driver implements the IPrintOemUni::ImageProcessing callback to access bitmap data one band at a time. The driver's implementation of ImageProcessing buffers the band data every time it is called. The function is also responsible for filling + the BITMAPINFOHEADER and COLORTABLE structures that are necessary for dumping the data out to a bitmap file. +</li><li>The bitmap driver implements the OEMEndDoc DDI hook to dump the buffered bitmap data to the spooler at the end of the print job. The driver's implementation of OEMEndDoc dumps the headers first and then the buffered data. +</li><li>The GrowBuffer helper function is called every time the buffer needs to be enlarged to hold the bitmap data. +</li><li>The bitmap driver renders multi-page documents into a single large output bitmap file. +</li></ul> +<p>This sample has the following limitations:</p> +<ul> +<li>The plug-in does not support landscape orientation although the option exists in the GPD. +</li><li>In 24bpp mode, documents larger than three pages will produce an extremely large bitmap (.bmp) file. Although the output is correct, you might not be able to view it because of memory limitations in the bitmap viewer. +</li></ul> +<p></p> +<h3><a id="OEMPREAN"></a><a id="oemprean"></a>OEMPREAN</h3> +<p>When preanalysis is enabled in the GPD (for more details about preanalysis, see the WDK documentation), Unidrv defines the surface as a banding surface but causes the first playback (that is, the first band) to be of the entire page. Unidrv performs this + definition by setting the GDI clip window to the entire page. Unidrv enables all drawing commands to be hooked but returns before any drawing can be done. On the subsequent passes, Unidrv resets the clip window back to the original band size and bands normally.</p> +<p>In order for plugins to also take part in preanalysis, they can enable OEM preanalysis by specifying the "*PreAnalysisOptions: 8" parameter in the GPD. The OEM rendering plug-in must hook both DrvStartBanding and DrvNextBand when this mode is enabled in + the GPD. The OEM rendering plug-in must test the pptl parameter of the OEMStartBanding call to determine whether preanalysis has been enabled on this page. If the pptl parameter is NULL, preanalysis has been enabled, and the OEM rendering plug-in should consider + all drawing calls up to the first call to OEMNextBand to be part of preanalysis. +</p> +<p>During these preanalysis phase drawing calls, the plug-in should not draw on the surface. The plug-in should also not call back into unidrv. You should use this phase only for analysis of the objects on the page. For example, certain printers need to handle + black objects that intersect with color objects differently from black objects that appear by themselves. Other printers might need to halftone StretchBlt objects differently from BitBlt objects. +</p> +<p>You should be aware that after preanalysis, you might get more calls than you saw in the normal rendering, because primitives that cross band boundaries yield two or more DDI calls after the preanalysis pass. +</p> +<p>The sample uses the bPreAnalysis flag in the OEMPDEV structure to denote whether a particular pass is the preanalysis pass or the actual rendering pass. If the bPreAnalysis flag is set, it indicates that the current pass is the preanalysis pass. The sample + implements all of the drawing function hooks in Ddihook.cpp. The sample uses the OEMStartBanding and OEMNextBand functions to respectively set and reset the bPreAnalysis flag. The sample also uses the DBG_CLIPOBJ debug macro function to dump the bounds of + the clipping rectangle available for preanalysis in each of the drawing functions during the preanalysis pass. To view all of the debug output in the debugger, you must set the debug level to VERBOSE. The rest of the sample is identical to the Oemuni sample + that illustrates a basic OEM rendering plug-in.</p> +<p>Note that the surface used during preanalysis might differ from the surface passed in during the rendering pass. +</p> +<h3><a id="PTPCPIPR"></a><a id="ptpcpipr"></a>PTPCPIPR</h3> +<p>This sample is an educational example that illustrates the basic functionality that a Unidrv plug-in for the IPrintOemPrintTicketProvider interface should implement. +</p> +<p>The primary functionality of the plug-in is to support the PhotoPrintingIntent PrintSchema keyword. The PhotoPrintingIntent keyword is designed to provide a mechanism for photo printers to support enhancements that are specific to photo printing. An application + or the user (through the print UI) can then specify whether a particular print job is a photo-printing job, in which case the device can apply appropriate enhancements. +</p> +<p>The intent setting is communicated to the device driver in a PrintTicket. The actual enhancements made are device-specific, and as such, the driver has to map the high-level intent setting into specific output settings, like resolution or bpp. This plug-in + sample demonstrates the conversion. </p> +<p>The plug-in implements the ExpandIntentOptions method of the IPrintOemPrintTicketProvider interface. This method is called with an input print-ticket. The plug-in checks if the print-ticket contains a photo-printing intent setting, and if so, removes the + setting, while instead adding to the print-ticket output settings as mentioned above. The code sample uses MSXML6 for all PrintTicket XML handling.</p> +<h3><a id="UINUIREP"></a><a id="uinuirep"></a>UINUIREP</h3> +<p>This sample shows how a plug-in for a Unidrv-based driver can replace the default UI. It provides new property sheets for the printer property and printing preferences pages.</p> +<p>Use this sample as an example of implementing full UI replacement in a Unidrv-based plugin. It also demonstrates the use of the new IPrintCoreHelper interface. +</p> +<p>This sample is only provided for educational purposes and should not be used in a production environment. +</p> +</div> + +</div> + + + </div> +</body> +</html> diff --git a/print/OEM Printer Customization Plug-in Samples/description/19eccd10-9a4c-4ebc-a240-2680a581332eBrand.css b/print/OEM Printer Customization Plug-in Samples/description/19eccd10-9a4c-4ebc-a240-2680a581332eBrand.css new file mode 100644 index 00000000..526e88c5 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/description/19eccd10-9a4c-4ebc-a240-2680a581332eBrand.css @@ -0,0 +1,295 @@ +/*Global*/ +h1 { + font-size: 36px; + font-family: 'Segoe UI Light'; + color: #707070; + font-weight: normal; + margin-bottom: 17px !important; +} + +h2, h3, h4, h5, h6, #searchPage h3 { + font-family: 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif !important; + font-weight:normal; + color: #2A2A2A !important; +} + +a, a:link, a:visited { + color: #0095c4; +} + +body { + color:#707070; +} + +.profile-usercard { + color:#707070 !important; +} + +/*temporary setting to override msdn_windows.css +can remove once conflicting settings are removed from that file*/ + + +.LocalNavigation, .LocalNavigation .TabOn, .LocalNavigation .TabOn:hover, .LocalNavigation .TabOff, .LocalNavigation .TabOff a:hover { + display: block; + background-color:transparent !important; + color: #0095c4; +} + +.LocalNavigation .TabOff a { +color:#707070 ; +} + +/*End Global*/ + +.EyebrowContainer +{ + margin-bottom: 0 !important; +} + +#sideNav +{ + width: 215px !important; +} + #sideNav #contributeSection { + padding: 0 0 67px 0; + } +#searchPage #mainContentContainer +{ + margin-right:0 !important; + margin-left:243px !important; +} + +#searchPage .dirSubHeading h2 +{ + font-size: 14px !important; + font-weight: normal !important; + color: #454545 !important; + line-height: 1.45; +} + +#searchPage #directoryListFooter, #searchPage #Pager { + font-size: 14px; +} + +#searchPage h2, #searchPage h3 +{ + font-size: 1.25em !important; +} + +#sideNav #contributeSection h3, .sidebar #contributeSection h3, #contributeSection h3 +{ + font-size: 1.65em !important; +} +.subMenu > h2 +{ + font-family: 'Segoe UI Light','Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif !important; + font-weight:normal; + font-size:30px; + margin: 15px 10px 5px 0; + padding-bottom:0px; +} + +.itemRow { +} + .itemRow .itemBody, .itemRow .itemInfo { + padding: 18px 17px 20px 0; + font-size: 14px; + line-height: 1.45em; + } + + .itemRow .itemTitle { + font-weight: normal; + } + + .itemRow .summaryBox{ + color: #454545; + } + + .Samples #MainContent .itemRow .itemTitle a { + font-weight: 600 !important; + line-height: 1.45; + } + #MainContent a.officialMicrosoftLabel + { + color: #ACACAC; + } + + +.tabContents { + border-top-width:0px; +} + +#UploadPage { + margin: 0px 0px 0px 10px; +} + #UploadPage h1 { + padding: 0; + font-size: 22px; + } + #UploadPage h2 { + color:#F39700 !important; + } + + #UploadPage #uploadPageInstruction { + margin-top:10px; + } + + #UploadPage fieldset { + margin-left:0px; + } + + #UploadPage fieldset h2 { + font-weight:normal; + } + + #UploadPage fieldset#uploadsForm{ + margin-top:25px; + } + + #UploadPage fieldset#summary textarea { + margin-left:0px; + } + + #UploadPage .projectTypeChoice > div { + height: 250px; + } + +#sideNav { +} + + #sideNav .section h3 { + background-color: transparent; + + } + + #sideNav .section UL LI { + border-bottom-width: 0px; + } + + #sideNav .section form > div { + border-bottom: none; + color: #707070; + } + #sideNav .section ul li > div.itemCount + { + color: #707070; + } + + #sideNav .contributeAction a { + padding-bottom: 5px; + } + +#searchPage { +} + + #searchPage h2, #searchPage h3 { + text-transform:none; + background-color:transparent; + font-weight:normal; + font-size:1.2em; + } + + #searchPage .browseFilterBar { + background-color:transparent; + border-width:0px; + font-weight:normal; + } + +#requestsPage { + padding-top:15px; +} + + #requestsPage .tabHeaders { + overflow: visible; + } + + #requestsPage #requestsList { + border: none; + } + + #requestsPage h2, #requestsPage h3 { + text-transform:none; + background-color:transparent; + font-weight:normal; + font-size:1.2em; + } + +#extraActions { +} + #extraActions .section + { + margin-bottom: 10px; + } + #extraActions .section a + { + font-weight:normal; + } + + #extraActions #contributeSection div img { + width:0px; + } + + +#projectPage { +} + + #projectPage .projectTitle { + color: #707070; + margin: 5px 0px 15px 0px; + } + + #projectPage h2.projectSummary, #projectPage #projectInfo, #projectPage .tabHeaders { + font-size: 14px !important; + line-height: 1.45em; + color: #454545 !important; + font-weight: normal !important; + } + + #projectPage #projectInfo a { + color: #00749e; + } + + #projectPage #Downloads a, #projectPage #Downloads label { + font-size: 14px; + } + + #projectPage #reportAbuse { + font-size: 1em; + } + + #projectPage #publishBar a, #projectPage #publishBar a:visited { + color: #0095c4; + font-weight: normal; + } + + #projectPage #Collections .bevelButton{ + background-color: #F8F8F8; + color: #0095C4; + border: 1px solid #707070; + } + + #projectPage #DiscussionsTabPane .threadHeader .title { + font-weight:bold !important; + color:Black !important;#F8F8F8; + font-family: 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif !important; + } + + #projectPage .sidebar .section .titleBar h3 { + font-weight:normal; + font-size:1.2em; + } + +#LocalNav { +} + + #LocalNav.HeaderTabs { + margin-left:11px; + } + +#searchPage .dirSubHeading h1 +{ + margin-bottom:17px !important; +} + + + diff --git a/print/OEM Printer Customization Plug-in Samples/description/Brand.css b/print/OEM Printer Customization Plug-in Samples/description/Brand.css new file mode 100644 index 00000000..65dcfb8d --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/description/Brand.css @@ -0,0 +1,3615 @@ +#BodyBackground +{ + min-width:0px; +} + +#JelloExpander, .IE7 #JelloExpander, .IE8 #JelloExpander, .IE9 #JelloExpander +{ + padding-left:0px; + padding-right:0px; +} + +#JelloSizer +{ + margin: 0 auto; + max-width: 0px; + padding: 0; + width: 100%; +} + +/* Global Styles */ +body +{ + font-size:0.75em; +} + +h1 +{ + font-size: 36px; + font-family: 'Segoe UI', Tahoma, Helvetica, Sans-Serif; + color: #000; + font-weight: normal; + padding-top:4px; + margin-bottom: 17px; + line-height: 1.3; + +} + +h2, h3, h4, h5, h6 +{ + font-family: 'Segoe UI Semibold', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif; + color:#2a2a2a; + font-weight:normal; +} + +a, a:link, a:visited { + color: #00749E; +} +a:hover { + color: #0095c4; + text-decoration:none; +} + +/*---------- Masthead -----------*/ + +.NetworkLogo a { + display: none; +} + +/*-------- Start Advertisment --------*/ + +.advertisment { + padding-top:5px; +} + +/*-------- End Advertisment --------*/ + + +/*-------- Start LocalTabs Page --------*/ +#GalleriesNavigation { + float: right; +} + +.LocalNavigation +{ + display:block; + overflow: auto; + width: auto; +} + .LocalNavigation .HeaderTabs { + width: auto; + } + .LocalNavigation .TabOff a { + color:#333; + } + + .LocalNavigation .TabOff a:hover { + background-color:#E0E7EC; + margin-top: 1px; + padding: 4px 6px; + } + + .LocalNavigation #notificationLink span { + color:Red; + font-weight:bold; + } + + +/*-------- End LocalTabs Page --------*/ + +/*-------- Start SubMenu Page --------*/ + +.subMenu +{ + margin: 0 0 10px 0; + color: #FFFFFF; + overflow: hidden; +} + +.subMenu a, .subMenu span +{ + margin: 5px 5px 0 5px; +} + +.subMenu > h2 +{ + float: left; + margin: 7px 15px 0 0; + vertical-align: middle; + color: #666; + padding-bottom: 5px; +} + +.subMenu .advancedSearchLink +{ + float: left; + margin: 9px 0 0 15px; +} + + + +.subMenu .uploadLink +{ + float: right; + margin: 5px 5px 0 0; + padding: 0 0 0 30px; + height: 24px; + background: url('../Common/smalluploadicon.png') no-repeat 10px 0; + color: #0066E1; + cursor: pointer; +} + +.subMenu #searchBoxContainer +{ + float: left; + width: 400px; + padding: 3px 50px; +} + +/*-------- End SubMenu Page --------*/ + +/*-------- Start SearchBox --------*/ + +div.searchbox +{ + overflow:auto; + width:450px; + margin:26px 0 14px 0; +} + +.srchbox +{ + width: 100%; + background-color: #dedfe1; + color: #999; + padding: 0px 2px; + height: 25px; + table-layout: auto; + margin-bottom:5px; +} + + + +.srchbox #searchImageCell input +{ + background: transparent url('searchButton.png') no-repeat 0 0; + width: 20px; + height: 20px; + padding-left: 1px; + margin-top: 3px; +} + + +.srchbox #searchImageCell +{ + text-align: right; + padding: 0px; + vertical-align: middle; +} + +.IE7 .srchbox #searchImageCell +{ + padding:2px 2px 0 0; +} + +.srchbox #searchImageCell input +{ +} + + +table.srchbox +{ + table-layout: fixed; +} + +.srchbox .stxtcell +{ + padding-right: 4px; + width:90%; +} + +.srchbox .stxtcell > input +{ + margin-right: 4px; + height: 26px; + line-height:26px; + width: 100%; + padding: 0px; + padding-left: 4px; + padding-top: 2px; + border: none; + font-style: normal !important; + outline: none; + background-color: transparent; +} + +.IE7 .srchbox .stxtcell > input +{ + height: 20px; +} + +.srchbox .stxtcell > input.stxtinptpassive +{ + color: #AAA; + font-style: normal !important; +} + +/*-------- End SearchBox --------*/ + + +/*-------- Start Search Page --------*/ + + +#searchPage #mainContentContainer +{ + margin: 0 0 0 243px; +} +#searchPage #directoryContent { + border-left: 3px solid #eee; + margin-left: -20px; + padding-left: 20px; +} +#searchPage .browseFilterBar, #dashboardPage .browseFilterBar +{ + padding: 5px 0 6px 0; + +} + + #searchPage .browseFilterBar a, #dashboardPage .browseFilterBar a + { + font-weight:normal; + } + + #searchPage .browseFilterBar .browseSort, #dashboardPage .browseFilterBar .browseSort + { + float:right; + } + + #searchPage .browseBreadcrumb + { + padding-top:3px; + } + + #searchPage .browseFilterBar .browseSort select, #dashboardPage .browseFilterBar .browseSort select + { + height:20px; + } + + #searchPage .browseFilterBar .browseSort img, #dashboardPage .browseFilterBar .browseSort img + { + vertical-align:text-top; + } + +#searchPage h2, #searchPage h3 +{ + font-size: 1.25em; + padding: 2px 0 3px 3px; +} + +#searchPage h2 +{ + display:inline; + clear:none; +} + + #dashboardsearchbox + { + width:420px; + margin:0; + float:left; + } + +/*-------- End Search Page --------*/ + +/*-------- Begin Requests Page --------*/ + +#requestsPage { + color:#666; +} + + #requestsPage h1 { + clear:none; + } + #requestsPage h2, #requestsPage h3 + { + font-size: 1.25em; + } + + #requestsPage h2 + { + display:inline; + clear:none; + } + + #requestsPage h3 + { + padding: 2px 0 3px 3px; + } + + #requestsPage #mainContentContainer + { + margin: 0 0 0 243px; + } + + #requestsPage #mainContentWrapper { + float:left; + width:100%; + } + #requestsPage #mainContent { + position:relative; + } + + #requestsPage #mainContent .subtitle{ + margin-bottom:5px; + } + + #requestsPage #requestsFilterBar { + margin-top: 10px; + overflow: auto; + } + + #requestsPage #requestsFilterBar .requestsCrumb { + float: left; + margin:10px 0 10px 10px; + } + #requestsPage #requestsFilterBar .requestsSort { + float: right; + margin:10px 0 10px 0; + } + + #requestsPage #Pager { + text-align: center; + padding-top: .75em; + padding-bottom: .75em; + } + + #requestsPage #requestsRss { + float: right; + margin: 2px 0 0 3px; + cursor: pointer; + } + + .IE7 #requestsPage #requestsList { + padding-top: 10px; + margin-top:5px; + } + + #requestsPage #requestsList .noResults { + padding: 10px 0; + } + + +/*-------- End Requests Page --------*/ + +/*-------- Begin Request List Item --------*/ +.requestlistitem td +{ + padding: .9em 0 .9em .5em; +} + .requestlistitem .votebox + { + + text-align:center; + } + + .requestlistitem .voteboxcontainer + { + vertical-align:top; + width: 75px; + } + + .requestlistitem #votelabel + { + border-width:1px; + border-bottom-style:solid; + } + + #myRequestsTab #votenumber, + #requestsPage #votenumber + { + background-color: #777; + padding: 6px 10px; + color: #fff; + margin-bottom: 5px; + font-size: 1.6em; + } + + #myRequestsTab .votelink, + #requestsPage .votelink + { + font-weight:bold; + background-color: #eee; + padding: 5px 0; + width: 75px; + float: left; + } + + #myRequestsTab .needvote, + #requestsPage .needvote + { + font-weight:bold; + } + + #myRequestsTab .alreadyvoted, #myRequestsTab .resolved + #requestsPage .alreadyvoted, #requestsPage .resolved + { + font-weight:bold; + color: #666; + } + + .requestlistitem .linkform + { + width:100%; + float:right; + margin-top:15px; + } + + .requestlistitem .requesttitle + { + font-weight:600; + margin-bottom:3px; + } + + .requestlistitem .requester + { + margin-bottom:3px; + } + + .requestlistitem .hidden + { + display:none; + } + + .requestlistitem .requestSummary div + { + margin-bottom:0.25em; + } + + .requestlistitem .requestSummary + { + line-height: 1.45em; + width: 80%; + } + .requestlistitem .requestInfo + { + padding:1.2em 0 0 2.5em; + vertical-align:top; + width:15%; + line-height: 1.45em; + } + + .requestlinks > td + { + padding-bottom: 16px; + } + + .requestlinks div + { + float:right; + } + + .requestlistitem .textbox + { + width:95%; + } + + + +/*-------- End Request List Item --------*/ + + +/*-------- Begin New Request Form --------*/ +#newrequest { + margin-top:5px; + background:#F8F8F8; + border-width:1px; + border-style:solid; + border-color:#E8E8E8; + padding:5px; +} + +#newrequest > div:first-child { + font-weight:bold; +} + +#newrequest .itemheading { + margin-top:5px; +} + +#newrequest textarea { + width:95%; +} + +#newrequest .field-validation-error { + display:block; + color:Red; + font-weight:bold; +} +#newrequest #submit { + margin-top:5px; +} + +/*-------- End New Request Form --------*/ + +/*-------- Request Description Page ------*/ + +.reqDescPage #mainContent { + overflow: auto; +} +.reqDescPage #header { + float: left; + width: 100%; +} + +.reqDescPage { + color: #000 !important; +} + +.reqDescPage #sideNav { + background-color: #fff; +} + +.reqDescPage #header td { + vertical-align: bottom; +} + +.reqDescPage #header #votenumber { + width: 50px; + padding: 6px 12px; + text-align: center; + float: left; +} + +.reqDescPage #header .requestTitle { + margin: 0 0 5px 10px; + width: 85%; +} + +.reqDescPage #header .requestTitle h1 { + margin-bottom: 0px; + font-size: 2em; +} + +.reqDescPage #headerLinks { + +} + +.reqDescPage .votelink +{ + text-align: center; + float: left; +} + +#requestsPage #headerLinks .assignlink +{ + font-weight:bold; + background-color: #eee; + padding: 5px 10px; + float: left; + margin-left: 10px; +} + +.reqDescPage #projectInfo { + clear: both; +} + +.reqDescPage #solutions { + clear: both; + padding-top: 30px; +} + +.reqDescPage .solutionItems { + clear: both; +} + +.reqDescPage .solutionHeader { + border-bottom: 1px solid #ccc; +} + +.reqDescPage .solutionAddContainer { + padding-top: 15px; + float: left; +} + +.reqDescPage #SubmittedProjectLinkUrl { + width: 400px; +} + +.reqDescPage .solutionItem { + margin-top: 25px; + padding: 0 5px 5px 0; + float: left; +} +.reqDescPage .solutionItemDetails { + float: left; + width: 535px; +} + +.reqDescPage .solutionItemLinks { + margin-top: 10px; + clear: both; + float: left; + width: 100%; +} + +.reqDescPage .solutionItemLinks a { + float: left; + margin-right: 10px; + font-weight:bold; + background-color: #eee; + padding: 5px 10px; +} + +.reqDescPage .solutionItem .itemTitle { + font-size: 1.2em; + padding-bottom: 5px; +} + +.reqDescPage .tagsContainer label { + display: none; +} + +.reqDescPage .solutionItem .summaryBox { + padding: .25em 0 .25em 0; + clear: both; + line-height: 1.45; +} + +.reqDescPage .solutionsection { + float: left; + margin-left: 20px; +} +.reqDescPage .completedSolution { + font-size: 1.25em; + padding-top: 4px; +} + +.reqDescPage .requestDescriptionCont, .reqDescPage .requestDicussions { + padding-top: 30px; + clear: both; + overflow: auto; +} + +.reqDescPage .requestDescription { + padding-top: 10px; + line-height: 1.45; +} + +.reqDescPage .requestDicussionsAsk { + padding: 10px 0; +} + +.reqDescPage .watermark { + color:Gray; + } + + +/*-------- Begin Extra Actions Section --------*/ +#extraActions +{ + float: right; + width: 300px; + vertical-align: top; +} + + #extraActions .section + { + padding: 0 0 10px 0; + overflow:auto; + } + + #extraActions .section a + { + font-weight:bold; + } +/*-------- End Extra Actions Section --------*/ + +/*-------- Begin Contribute --------*/ + + +#contributeSection a +{ + font-size:1.1em; +} + +#contributeSection, #sideNav #contributeSection h3, .sidebar #contributeSection h3, #contributeSection h3 +{ + background-color:#fff; + margin: 0 0 9px 0; + padding-left: 0px; +} + +#sideNav #contributeSection h3, .sidebar #contributeSection h3, #contributeSection h3 +{ + font-size:1.65em; + margin-top:42px; +} + +#sideNav #contributeSection, #contributeSection +{ + padding:0 0 41px 0; +} + +#projectPage .sidebar #contributeSection +{ + margin: 10px 0 10px 0; + padding:0 0 5px 0; + +} + +#sideNav #contributeSection > div, .sidebar #contributeSection > div, #contributeSection > div +{ + padding: 0 0 2px 0; + overflow:auto; +} + +#sideNav #contributeSection img, #contributeSection img +{ + float: left; + width: 25px; +} + +#sideNav #contributeSection .contributeAction, .sidebar #contributeSection .contributeAction, #contributeSection .contributeAction +{ + padding:17px 0 0 0; +} + + #contributeSection .contributeAction img + { + background-color:#00749e; + margin-right:9px; + } + + #contributeSection .contributeAction img:hover + { + background-color:#0095C4; + } + + #contributeSection .contributeAction a + { + display:block; + line-height: 1.8; + } + +#uploadLink, #exclamationLink, #myContributionsLink +{ + display:block; + line-height: 1.8; +} + +#myContributionsLink span +{ + color: red; +} + +#feedbackLink +{ + background: url("FeedbackIcon.png") no-repeat; + width: 40px; + height: 40px; +} + +.itemRow .affiliationLink, #editorPicksSection .affiliationLink +{ + background: url("../common/MicrosoftLogo.png") no-repeat; + width: 82px; + height: 18px; +} + + +#contributeSection a+div +{ + +} + +.IE7 #contributeSection a+div +{ + float:left; +} +/*-------- End Contribute --------*/ + + +/*-------- Begin Directory List Footer --------*/ + +#directoryListFooter { + padding:5px; + margin-top:10px; + margin-bottom:10px; + border:1px solid #E6E6E6; + background-color:#F8F8F8; + width:438px; +} + +#directoryListFooter h4 +{ + font-size:1em; +} + +/*-------- End Directory List Footer --------*/ + +/*-------- Begin Editors Picks --------*/ +#editorPicksSection ul +{ + padding-left:0px; + line-height:135%; +} + + #editorPicksSection ul li + { + clear: left; + padding-top: 10px; + list-style:none; + } + #editorPicksSection ul li:first-child { + padding-top: 0; + } + + #editorPicksSection a { + font-weight: normal !important; + } + + #editorPicksSection ul li .thumbnail + { + float: left; + padding: 3px; + max-width: 60px; + } + + #editorPicksSection ul li .thumbnail img { + max-width: 60px; + } +/*-------- End Editors Picks --------*/ + +/*-------- Begin Side Nav Section --------*/ + +#sideNav +{ + width: 215px; + margin-left: 0; + vertical-align: top; + float: left; +} + + #sideNav #sideNavHeader + { + margin-bottom: 10px; + padding-left: 12px; + } + + #sideNav #sideNavHeader a + { + margin-right:3px; + } + + #sideNav .section + { + padding: 0 10px 18px 0px; + } + #sideNav .section h3 + { + + padding: 2px 0 3px 3px; + } + + #sideNav .section ul + { + } + + #sideNav .section ul li + { + padding: 4px 0 2px; + margin-left: 3px; + margin-right: 3px; + } + + + #sideNav .section form > div + { + padding: 4px 0 0 0; + border-bottom: none; + margin: 0 3px 0 3px; + color: #3A3E43; + } + .IE8 #sideNav .section ul li > div.itemText + { + word-wrap: break-word; + width: 225px; + } + #sideNav .section ul li > div.itemCount + { + color: #3A3E43; + } + #sideNav .section a + { + font-weight: normal; + } + + #sideNav .section a:hover + { + text-decoration: underline; + } + +/*-------- End Side Nav Section --------*/ + + + +/*-------- Start Dashboard Page --------*/ + +#dashboardPage { + padding-top:5px; + clear:both; +} +#dashboardPage .contributions .tabContents { + padding: 5px 5px 10px 0; + clear:both; +} + #dashboardPage .contributions .noContributions { + clear:both; + } +#dashboardPage #mainContentWrapper { + float:left; + width:100%; +} + +#dashboardPage #detailsSection { + float:left; + margin-left:-100%; + width:240px; + padding: 0 0 18px 10px; +} + +.IE7 #dashboardPage #detailsSection { + width:auto; + min-width: 300px; + max-width: 300px; +} +.IE7 #dashboardPage #detailsSection .itemBar { + width: 270px; +} + +#dashboardPage #detailsSection h3 { + word-wrap:break-word; +} + +#dashboardPage #mainContent { + margin:0 0 0 250px; + position:relative; +} + +#dashboardPage .dashboardEvenRow +{ + background-color: #ececec; +} +#dashboardPage .dashboardPadding +{ + padding-bottom: 4px; +} +#dashboardPage .dashboardCell +{ + width: 100%; + vertical-align: top; + padding: 1em 0.5em 0.5em 0.5em; + word-wrap: break-word; +} +#dashboardPage .projectManagement +{ + width: 24em; + padding: 0em 1em 0em 1em; + vertical-align: top; + text-align: right; + float: right; +} + +#dashboardPage #subscriptionsLink +{ + position:absolute; + right:5px; +} + +#dashboardPage .itemDelete +{ + vertical-align:top; + padding-top:.8em; + width:30px; +} + +#dashboardPage .itemDeleteText +{ + border-style:solid; + border-width:thin; + border-collapse:collapse; + padding-bottom:2px; + padding-left:4px; + padding-right:4px; + color:Gray +} + +#dashboardPage #myRequestsTab .requestTabHeaders +{ + font-weight:normal; + border-bottom: solid 1px #CCC; + padding-bottom: 10px; + padding-top: 10px; + float: left; + width: 100%; +} + +#dashboardPage #myRequestsTab .requestTabHeaders div:first-child +{ + border: 0; +} + +#dashboardPage #myRequestsTab .requestTabHeaders div +{ + padding: 2px 9px 3px 9px; + font-size: 0.9em; + line-height: 125%; + color:#00749E; + border-left: solid 1px #555; + cursor: pointer; + float: left; + text-align: center; +} + +#dashboardPage #myRequestsTab .requestTabHeaders div.currentRequest +{ + background-color:#fff; + cursor: default; + border-bottom:none; + margin-bottom:-2px; + color:#000; +} + +#dashboardPage #myRequestsTab .requestTabHeaders div.currentRequest a { + color: #000; +} + + +#dashboardPage #myRequestsTab .requestTabHeaders div a +{ + text-decoration:none; +} + +#dashboardPage #myRequestsTab .requestTabContents +{ + clear: both; +} + +#dashboardPage #myRequestsTab .requestTabContents .noResults { + padding-top: 20px; +} + +/*-------- End Dashboard Page --------*/ + +/*-------- Start Upload Page --------*/ + +#UploadPage +{ + margin-left:10px; + max-width:925px; +} + + #UploadPage .watermark { + color:Gray; + } + + #UploadPage .projectTypeChoice { + } + + #UploadPage .projectTypeChoice > div { + padding: 20px 10px 20px 10px; + border: 1px solid darkgrey; + cursor: pointer; + height: 200px; + float: left; + } + + #UploadPage .projectTypeChoice > div + div + { + margin: 0 0 0 5px; + } + + #UploadPage .projectTypeChoice div.current + { + background-color: #E9E9E9; + cursor: default; + } + + #UploadPage .projectTypeChoice div.choice { + font-size: large; + font-weight: bold; + padding: 0 0 10px 0; + } + + #UploadPage .projectTypeChoice div.description { + padding: 0 0 0 17px; + } + + #UploadPage .projectTypeChoice #genericSampleUploadDescription { + padding-top: 5px; + } + + #UploadPage .projectTypeChoice #genericSampleUploadDescription .logos { + overflow: auto; + } + + #UploadPage .projectTypeChoice #genericSampleUploadDescription .vslogo { + background: url(../samples/vslogo.png) no-repeat; + width: 125px; + height: 18px; + } + + #UploadPage .projectTypeChoice #genericSampleUploadDescription .javalogo { + background: url(../samples/javalogo.png) no-repeat; + width: 33px; + height: 60px; + float: left; + } + + #UploadPage .projectTypeChoice #genericSampleUploadDescription .phplogo { + background: url(../samples/phplogo.png) no-repeat; + width: 65px; + height: 35px; + float: left; + margin: 15px 0 0 10px; + } + + #UploadPage .projectTypeChoice #genericSampleUploadDescription .nodejslogo { + background: url(../samples/nodejslogo.png) no-repeat; + width: 90px; + height: 25px; + float: left; + margin: 18px 0 0 10px; + } + + #UploadPage .projectTypeChoice #genericSampleUploadDescription > div+div { + margin-top: 10px; + } + + #UploadPage .projectTypeContents { + clear: left; + padding: 10px 0 0 0; + } + + #UploadPage .projectTypeContents .instruction > div+div { + padding-top: 5px; + } + #UploadPage #libraryContainer { + margin: 5px 0 0 0; + display: none; + } + #UploadPage fieldset + { + margin: 10px 0 30px 5px; + } + + #UploadPage fieldset > * + { + margin-left:10px; + } + + #UploadPage .fieldsetStyleContainer { + margin: 10px 0 0 5px; + } + + #UploadPage fieldset h2, + #UploadPage .fieldsetStyleContainer h2 + { + font-family: 'Segoe UI Semibold','Segoe UI','Lucida Grande',Verdana,Arial,Helvetica,sans-serif; + font-size: 17px; + font-weight: bold; + color: #3A3E43; + border-bottom: 2px solid #EFEFEF; + width: 100%; + padding-bottom: 3px; + margin-left:0px; + margin-bottom:8px; + } + + .IE7 #UploadPage fieldset h2, + .IE7 #UploadPage .fieldsetStyleContainer h2 + { + margin-left:-10px; + } + + #UploadPage fieldset .field-validation-error + { + clear:left; + display:block; + margin-top:4px; + } + + #UploadPage fieldset .required + { + margin-left: 3px; + } + + #UploadPage fieldset .instruction, + #UploadPage .fieldsetStyleContainer .description, + #UploadPage .fieldsetStyleContainer .instruction + { + color: #3A3E43; + margin:0 0 10px 0; + } + + #UploadPage fieldset .faqLink + { + margin: 0 0 10px 0; + } + + #UploadPage fieldset label + { + display:block; + } + + #UploadPage fieldset input[type=text] + { + width:60%; + } + + #UploadPage fieldset input[type=checkbox] + { + float:left; + clear:left; + margin-right:5px; + } + + #UploadPage fieldset input[type=radio] + { + float:left; + clear:left; + margin-right:5px; + } + + #UploadPage fieldset#richDescription textarea + { + width:70%; + height:600px; + } + + #UploadPage fieldset#summary textarea + { + width:60%; + height:100px; + margin-top: 10px; + margin-left: -30px; + } + + .IE #UploadPage fieldset#summary textarea, .IE9 #UploadPage fieldset#summary textarea + { + margin-left: -30px; + overflow: auto; + } + + .FF #UploadPage fieldset#summary textarea + { + margin-left: -30px; + } + + #UploadPage fieldset#summary #SummaryReadOnly + { + width:60%; + margin-top: 10px; + padding-top: 5px; + color: #909082; + } + + #UploadPage fieldset#summary #SummaryCharCount + { + width:60%; + text-align: right; + } + + #UploadPage fieldset#options label + { + margin-bottom:10px; + } + + #UploadPage fieldset#license label + { + margin-bottom:10px; + } + + #UploadPage input[type="text"].tagInput, #UploadPage input[type="text"].listInput + { + width:40%; + float:left; + } + + #UploadPage .addedTags, #UploadPage .addedProjects + { + margin-bottom:15px; + width: 500px; + + } + #UploadPage .addedTags .tag, #UploadPage .addedProjects .projectTitle + { + position:relative; + overflow:hidden; + } + + #UploadPage .addedTags .tag label, #UploadPage .addedProjects .projectTitle label + { + float:left; + width: 450px; + } + + #UploadPage .addedTags .tag a, #UploadPage .addedProjects .projectTitle a + { + position:absolute; + text-align:right; + right:0px; + } + + .fileManager .fileUploadProgressIndicator + { + width: 500px; + } + + .fileManager .uploadProcessingWarning { + margin-top: 5px; + } + + .fileManager .fileUploadProgressIndicator .throbber + { + font-weight: bold; + background: url('./progressIndicatorWhite.gif') no-repeat 10px 0; + padding: 7px 10px 5px 60px; + height: 25px; + margin-left: -10px; + } + + .fileManager #uploadFrame, .fileManager .uploadFrame + { + width:100%; + } + + .fileManager .addLabel + a + { + margin-left:25px; + } + + .fileManager fieldset label { + display: block; + } + + .fileManager .unlocalizedFiles { + color:#808080; + } + + .fileManager .filesContainer + { + margin-bottom:15px; + width: 500px; + + } + + .fileManager .filesContainer .file + { + position:relative; + overflow:hidden; + } + + .fileManager .filesContainer .file .title { + border-bottom: 1px solid #000000; + padding-bottom: 3px; + margin-top: 10px; + margin-bottom: 10px; + } + + .fileManager .filesContainer .file .title .manageLinks + { + float: right; + } + + .fileManager .filesContainer .file .version { + padding: 0 0 20px 10px; + } + + .fileManager .filesContainer .file .version label { + float: left; + font-weight: bold; + } + + .fileManager .filesContainer .file .version span { + float: left; + margin-left: 5px; + } + + .fileManager .filesContainer .file .language { + clear: left; + padding: 0 0 5px 10px; + } + + .fileManager .filesContainer .file .language label { + font-weight: bold; + } + + .fileManager .filesContainer .file .language label + label { + font-weight: normal; + padding-left: 10px; + } + + .fileManager .filesContainer .file .language div { + padding-left: 20px; + } + + .file .requirements { + clear: left; + padding: 0 0 0 10px; + } + + .file .requirements label { + font-weight: bold; + } + + .file .requirements > div { + padding-left: 20px; + } + + .file .requirements .requirementsContent { + padding-top: 5px; + padding-bottom: 10px; + } + + .file .requirements .requirementsContent label { + font-style: italic; + font-weight: normal; + } + + .file .requirements .requirementsContent > div + { + margin-bottom:4px; + position:relative; + } + + .requirementsContent .requirementsRemove { + float:right; + position:absolute; + right:0px; + } + + .requirements .requirementsAddError { + color:#ff0000; + } + + .requirements .reqBrowseButton { + margin-left : 10px; + } + + #UploadPage fieldset .requirements input[type="text"] { + margin-right: 10px; + width: 70%; + } + + .reqBrowsefade + { + position: absolute; + background-color: #aaaaaa; + } + .reqBrowse + { + background-color: #f4f4f4; + border:1px solid #000000; + -border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + padding:15px; + position: absolute; + display: block; + } + + .reqBrowsebuttons + { + text-align:right; + position:absolute; + right:10px; + bottom:5px; + } + .reqBrowsebuttons > button + { + color: Blue; + border: none; + background: none; + font-weight: bold; + cursor:pointer; + } + + .reqBrowseclose + { + display:none; + } + + .reqBrowseDialog + { + width: 700px; + clear:both; + overflow:hidden; + padding-bottom: 20px; + } + + .reqBrowseDialog > h2 + { + border-bottom: 1px solid #000000; + padding-bottom: 5px; + } + .reqBrowseDialog > p + { + margin: 15px 0 15px 0; + } + + .reqBrowseSearchCont + { + width: 100%; + background: white; + padding: 0px 2px; + -moz-border-radius: 2px; + border-radius: 2px; + border: 1px solid #888; + margin-bottom: 5px; + height: 29px; + } + .reqBrowseSearchCont .rbboxcont + { + width:90%; + float:left; + margin-top: 2px; + } + + .reqBrowseSearchCont input + { + border:none; + outline:none; + border-color: transparent; + } + .reqBrowseSearchBox + { + margin-right: 4px; + height: 20px; + line-height: 20px; + width: 100%; + padding-left: 4px; + padding-top: 2px; + } + + .reqBrowseSearchBoxDefault + { + color: #AAA; + } + .reqBrowseSearchCont .rbbtncont + { + float: right; + margin-top: 4px; + } + .reqBrowseSearchBtn + { + background: transparent url('searchButton.png') no-repeat 0 0; + width: 22px; + height: 22px; + float:left; + cursor:pointer; + } + + .reqBrowseTabs + { + border-bottom: 5px solid #E8E8E8; + margin:3px 0; + overflow:auto; + } + + .reqBrowseTabs .reqBrowseTabsR + { + color:#fff !important; + } + + .reqBrowseTabs .reqBrowseTabsHighlight + { + color:#000 !important; + background-color:#E8E8E8; + } + + .reqBrowseTabs a + { + padding:5px 12px; + color:#fff; + background-color:#888; + font-weight:bold; + float:left; + margin: 0 4px 0px 0; + } + + .reqBrowsePager td + { + text-align:center; + } + .reqBrowseDialog #Pager + { + margin: 5px 0 15px 0; + } + + .reqBrowseContent + { + height:310px; + overflow:auto; + clear:both; + position:relative; + } + + .reqBrowsePager + { + width:700px; + margin:0 auto; + } + + .reqBrowseContentError + { + color:#ff0000; + margin:5px; + } + .reqBrowseContent .requirementItem + { + border-bottom: 2px solid #E8E8E8; + padding: 4px 0 6px 0; + overflow:auto; + } + .reqBrowseContent .section1 + { + float:left; + width:75%; + padding-left:25px; + position:relative; + } + + .reqBrowseContent .section1 input + { + position:absolute; + left:0px; + } + + .reqBrowseContent .title + { + font-weight:bold; + } + .reqBrowseContent .section2 + { + float:right; + } + + + .progressIndicatorfade + { + position: absolute; + background-color: #FFFFFF; + } + .progressIndicator + { + background-color: #f4f4f4; + border: 1px solid #000000; + -border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + padding: 15px; + position: absolute; + display: block; + max-width: 70%; + max-height: 70%; + } + #progressIndicator .progressIndicatorclose + { + display: none; + } + + #progressIndicatorContent + { + font-weight: bold; + padding: 7px 10px 0 10px; + height: 25px; + } + + +/*-------- End Upload Page --------*/ + +/* --- + --- Homepage --- + --- */ +p +{ + margin: 0 0 1px 0; +} +#homePageHeader +{ + float: left; + margin-bottom: 1em; + width: 100%; +} + +.tagline { + font-size: x-small; + position: relative; + top: -11px; +} + +.welcomeInfo +{ + float: left; + width: 700px; +} +.welcomeInfo h2 +{ + font-size: 16px; +} +.welcomeInfo p +{ + margin: 5px 0 0 0; +} + +#siteActions > div +{ + border: 1px solid #BBBBBB; + padding: 15px 5px 0 65px; + height: 55px; + background-repeat: no-repeat; + background-position: 10px 10px; +} +#siteActions a, #siteActions p +{ + margin-top: 5px; +} + +#siteActions .label a +{ + font-size: 1.25em; + font-weight: bold; + margin-bottom: 3px; +} + +#myGalleryBox +{ + background-image: url("MyGalleryIcon.png"); +} + +#findActions +{ + float: right; + padding: 10px; + width: 225px; + height: 50px; + border: 1px solid #BBBBBB; + margin: 0 10px 0 0; +} + +#findBox div:first-child +{ + margin: 0 0 5px 0; + font-weight: bold; +} + +#legalDisclaimer +{ + margin: 0 0 10px; + color: #798072; + font-size: 0.8em; +} + +#siteActions +{ + float: right; + width: 200px; +} +#siteActions > div +{ + margin-bottom: 10px; +} +.homePageProjects +{ + width: 100%; + float: left; +} +.homePageProjects > div +{ + padding-left: 1.5em; +} +.homePageProjects > div:first-child +{ + padding-left: 0; +} + +.homePageProjects .projectList ul +{ + padding: 0; + margin: 0; +} +.homePageProjects li +{ + margin-top: .5em; + padding-bottom: 0.5em; + list-style-type: none; +} +.homePageProjects .itemRow a, .homePageProjects .itemRow a:hover +{ + color: #0054A6; +} + +.projectList > a:first-child +{ + margin-left: 1px; + float: right; +} +.projectList > a, .projectList > a:hover +{ + color: #5BAEDB; +} +.projectListTitle +{ + height: 27px; + font-size: 16px; + font-weight: bold; + line-height: 125%; + background: #E8E8E8; + padding: 5px 5px 5px 25px; +} +.homePageListPager +{ + text-align: right; + margin-bottom: -.5em; +} + +.recentlyAddedProjects +{ + float: left; + width: 32%; +} +.mostPopularProjects +{ + float: right; + width: 32%; +} +.highestRankedProjects +{ + overflow: hidden; +} +* html .highestRankedProjects +{ + float: left; +} +* html .highestRankedProjects > div +{ + width: 100%; +} + +#Pager +{ + text-align:left; +} + +/* Impromptu warning style */ +.ipWarningfade +{ + position: absolute; + background-color: #aaaaaa; +} +div.ipWarning +{ + width: 400px; + position: absolute; + border-radius: 10px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + padding: 20px 0 20px 20px; + background-color: #FCE5E6; + border: solid 2px #EE1F25; +} +.ipWarningcontainer +{ + font-weight: bold; +} +.ipWarningclose +{ + display: none; +} +.ipWarningmessage div +{ + position: relative; +} +.ipWarningmessage div div + div +{ + text-align: center; + padding-right: 20px; +} +.ipWarningmessage div div:first-child div +{ + margin-left: 50px; +} +.ipWarningmessage div div:first-child img +{ + position: absolute; + margin: -20px 0 0 0; + top: 35%; +} +.ipWarningbuttons +{ + text-align: center; + margin: 20px 0 0 0; +} +.ipWarning button +{ + padding: 4px 8px 4px 8px; + margin: 2px; + font-weight: bold; + border: solid 1px #A6A3A6; + color: #FFFFFF; + background: #B8BABC; + filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr='#B8BABC',EndColorStr='#949699'); +} + +#eyebrow +{ + width: 100%; +} +#siteMessage .unsupportedLocale { + margin: 10px 0 0 243px; + border: solid 1px #CCC; + background: #FCFEC5; + padding: 5px; +} + +#Footer +{ + width: 100%; + height: auto; +} + +.clear +{ + clear: both; +} + +#buildVersion +{ + clear: both; + margin-left: auto; + margin-right: auto; + padding-right: 26px; + padding-top: 8px; + text-align: right; +} + +#page +{ + clear: both; + padding-top: 10px; +} + +#page h1 +{ + padding: 10px 0px; +} + +#ownerBar +{ + background: #EFEFEF; + border: 2px solid #7FCBF5; + text-align: left; + color: Black; + margin: 10px 0 20px 0; + padding: 5px; + word-spacing: 0px; + font-size: medium; +} + +#ownerBar a +{ + color: Blue; + padding: 0 5px 0 5px; +} + + + + +/*-------- Start Tab Control --------*/ + +.tabHeaders +{ + font-weight:normal; + border-bottom: solid 1px #CCC; + float: left; + width: 100%; +} + +.tabHeaders div +{ + padding: 7px 19px 8px 19px; + font-size: 0.9em; + line-height: 125%; + color:#00749E; + cursor: pointer; + float: left; + text-align: center; +} + +.tabHeaders div.current +{ + background-color:#fff; + cursor: default; + border: 1px solid #CCC; + border-bottom:none; + margin-bottom:-2px; + color:#000; +} + +.tabHeaders div a +{ + text-decoration:none; +} + +.tabContents +{ + clear: both; +} + +#MainContent .tabHeaders div.current a +{ + color:#000; +} + +.tabContents div.current +{ + display: block; +} +/*-------- End Tab Control --------*/ + +.itemContainer +{ + width: 100%; +} +.itemRow .itemTitle +{ + padding-bottom: 5px; + font-size:1.1em; + font-weight: bold; +} + +.itemRow .itemBody, .itemRow .itemInfo +{ + padding:15px 17px 16px 0; +} +.itemRow .itemDescription +{ + overflow: hidden; + max-height: 80px; +} +.itemRow .itemBody +{ + vertical-align: top; + line-height: 1.4; +} +.itemRow .itemBody a.officialMicrosoftLabel +{ + color: #ACACAC; +} +.itemRow .itemInfo +{ + vertical-align: top; + padding-left: .5em; + line-height: 1.4; + width: 10em; + text-align:right; +} + +.IE7 .itemRow .itemInfo +{ + width:11em; +} + +.itemRow .itemInfo .ratingStars +{ + float: left; +} +.itemRow .itemInfo .ratingCount +{ + padding: 0 0 0 5px; + float: left; +} +.itemRow .ratingInfo +{ + text-align: center; +} + +.itemRow .affiliationLink, #editorPicksSection .affiliationLink +{ + position: relative; + top: 3px; +} + +#editorPicksSection a.officialMicrosoftLabel +{ + color: #ACACAC; +} + +.itemRow .tagsContainer label { + display:none; +} + +.editorPickedItem +{ + background-color:#F8F8F8; +} + +.editorPickedText +{ + font-size:1.25em; + padding-bottom:2px; +} +.editorPickedItem > td +{ + border-top:6px solid #fff; +} + +.dirSubHeading +{ + margin-bottom:15px; +} + +#searchPage .dirSubHeading h2 +{ + line-height:1.4; + font-size:1.1em; +} + +#searchPage .dirSubHeading h2 span +{ + padding-top:5px; + display:block; +} + +#searchPage .dirSubHeading h1, #searchPage .dirSubHeading h2 +{ + clear:none; + padding-left:0px; +} + +.dirSubHeading .dirSubLinks +{ + font-size:1.2em; + padding-top:5px; +} + + +.summaryBox +{ + padding: .25em 0 .25em 0; + clear: both; + line-height:1.45; +} + +/*-------- Start Rating Stars --------*/ + +.RatingStar +{ + width: 11px; + height: 11px; + padding: 0 8px 0 0; + background-position: center; + float: left; +} + +.FilledRatingStar, .HalfRatingStar, .EmptyRatingStar, .FilledRatingStarHover +{ + width: 11px; + height: 11px; + padding: 0px 1px 0px 0px; + margin-top: 2px; +} + +.FilledRatingStar +{ + background: url(../samples/fullStar.png) no-repeat; +} + +.ownerRating .FilledRatingStar +{ + background: url(../samples/fullStar.png) no-repeat; +} + +.FilledRatingStarHover +{ + background: url(../samples/fullStarHover.png) no-repeat; + +} + +.HalfRatingStar +{ + background: url(../samples/halfStar.png) no-repeat; + +} + +.EmptyRatingStar +{ + background: url(../samples/emptyStar.png) no-repeat; + +} + +.EditStarMode .RatingStar +{ + cursor: pointer; +} + + + +/*-------- End Rating Stars --------*/ + +.discussionFormTable +{ + width: 100%; + table-layout: fixed; +} + + +#ReviewsTabPane .seeAllLink, #DiscussionsTabPane .seeAllLink +{ + margin-top: 10px; + text-align: center; +} + +/*-------- Start DiscussionsTab --------*/ + +.threadActions +{ + text-align: right; + margin-top: 10px; + float: right; +} + +#DiscussionsTabPane .reply, #DiscussionsTabPane .toggleDiscussion +{ + cursor: pointer; +} + + +#defaultDicussionText, #newDiscussion +{ + padding-top: 10px; +} +#DiscussionsTabPane .posts +{ + display: block; +} +#DiscussionsTabPane .threadHeader .left +{ + float: left; +} +#DiscussionsTabPane .threadHeader .right +{ + float: right; +} +#DiscussionsTabPane .normal +{ + font-weight: normal; +} + +#DiscussionsTabPane .threadHeader +{ + position: relative; + background-color: #ECECEC; + padding: 4px 10px 4px 10px; +} + +#DiscussionsTabPane .threadHeader .title +{ + color: #000000; + font-weight: bold; + margin-bottom: .7em; +} +#DiscussionsTabPane .threadHeader .label +{ + color: #000000; +} +#DiscussionsTabPane .postMeta +{ + color: #666666; +} +#DiscussionsTabPane .threadHeader .value +{ + font-weight: bold; + color: #000000; +} + +#DiscussionsTabPane .reply +{ + font-weight: normal; + cursor: hand; +} + +#DiscussionsTabPane ul li +{ + list-style-type: none; + list-style-image: none; + padding-bottom: 10px; +} + +#DiscussionsTabPane ul +{ + padding-left: 0px; + margin-left: 0px; + padding-right: 2px; +} + +.IE #reviewList .right +{ + margin-right: -1em; +} + +#newDiscussion +{ + margin: 0 0 15px 0; +} +#newDiscussion #Title +{ + width: 50%; +} +#newDiscussion textarea +{ + width: 99%; + height: 10em; +} + +#DiscussionsTabPane +{ + margin-left: 0px; + padding: 0 1em 1em 1em; +} + + +.postMeta +{ + float: right; +} + +.postReply +{ + cursor: hand; + float: right; + font-weight: bold; +} + +.postSaveReply +{ + display: none; +} + +.postSaveReply textarea +{ + width: 99%; + margin-bottom: 4px; + height: 8em; +} + +.toggleDiscussion +{ + cursor: hand; +} + +.saveReplyErrorMessage +{ + display: none; + margin: 0 0 4px 0; + color: Red; + font-weight: bold; +} + +#discussionListItem .avatar +{ + float: left; + padding: 5px; + vertical-align: middle; +} + +#discussionListItem .discussion +{ + margin-left: 55px; + padding: 0 5px 5px 5px; + vertical-align: top; +} + +.IE7 #discussionListItem .avatar +{ + margin-top: 15px; +} + + +/*-------- End DiscussionsTab --------*/ + + +.flotChart +{ + height: 300px; +} + +#projectMenuBarTop +{ + padding: 10px 0 20px 0; + font-weight: bold; + font-size: 25px; +} +.dayHeader +{ + font-weight: bold; +} + +/*-------- Start StatsPage --------*/ +#statsPage +{ + border: none; + background-color: Transparent; + margin-top: 1em; +} + +#statsPage .rangeBox +{ + padding: 5px; + background-color: #ECECEC; + border: solid 1px #C2C2C2; + float: left; +} +#statsPage .statBox +{ + margin-top: 1em; + margin-bottom: 10px; + overflow: hidden; + display: none; +} +#statsPage .statBox h3 +{ + font-size: 1.1em; + display: inline; +} + +#statsPage #statMessage +{ + margin-top: 1em; + display: none; +} + +#statsPage #statDownloadBox img { + float: left; +} + +#statsPage .statDownloadLink { + padding-left: 5px; + vertical-align: middle; +} + +#pointTooltip +{ + border: solid #000000 1px; + height: 35px; + background-color: #EEEEEE; + position: absolute; + display: none; + text-align: center; + padding: 9px; + border-radius: 4px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + z-index: 1000; + white-space: nowrap; +} + +.flotChart +{ + height: 300px; +} + +/*-------- End StatsPage --------*/ + + +/***************************************************************/ +/* TagAutoComplete Styles */ +/***************************************************************/ +.AutoCompletePanel +{ + font-size: 95%; + border: solid .1em #999; + background-color: #f0f0f0; + padding: .15em; +} + +.AutoCompletePanel div.Row +{ + color: #000; + cursor: pointer; + background-color: transparent; + padding: .15em .25em; + text-align: left; +} + +.AutoCompletePanel div.Selected +{ + color: #fff; + background-color: #6D6D6D; +} + + +/*-------- Start Subscription Form --------*/ + +#subscribeForm +{ + background-color: #D3D3D1; + border: 1px solid #000000; + -border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + padding: 15px; + position: absolute; + display: block; +} + +#subscribeForm .subscribeFormbuttons +{ + text-align: right; + margin-top: 10px; +} +#subscribeForm .subscribeFormbuttons > button +{ + color: Blue; + border: none; + background: none; + font-weight: bold; + cursor: pointer; +} + +#subscribeForm .subscribeFormclose +{ + display: none; +} + +#subscribeForm table +{ + margin-bottom: 15px; +} + +#subscribeForm table th +{ + text-align: left; + font-weight: bold; + border-bottom: 1px solid #000000; +} + +#subscribeForm table td +{ + padding: 5px 10px 5px 20px; +} + +#subscribeForm .rowHeading td +{ + font-weight: bold; + border-bottom: 1px solid #FFFFFF; +} + +#subscribeForm table tr td:first-child +{ + padding: 5px 40px 5px 0; +} + + +/*-------- End Subscription Form --------*/ + +/*-------- Start Tag Browser --------*/ + +.tagBrowserfade +{ + position: absolute; + background-color: #aaaaaa; +} +#tagBrowser +{ + background-color: #f4f4f4; + border:1px solid #000000; + -border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + padding:15px; + position: absolute; + display: block; +} + +#tagBrowser .tagBrowserbuttons +{ + text-align:right; + margin-top: 10px; +} +#tagBrowser .tagBrowserbuttons > button +{ + color: Blue; + border: none; + background: none; + font-weight: bold; + cursor:pointer; +} + +#tagBrowser .tagBrowserclose +{ + display:none; +} + +.tagBrowserContainer { + width: 450px; +} + +.tagBrowserContainer h2 { + border-bottom: 1px solid #000000; + padding-bottom: 5px; +} +.tagBrowserContainer > p { + margin: 15px 0 15px 0; +} + +.tagBrowserContainer .tags { + margin: 5px; + height: 225px; + overflow-y: scroll; +} + + +/*-------- End Tag Browser --------*/ + +/*-------- Start List Filter Box --------*/ + +div#filterInputBox +{ + overflow:auto; + min-width:225px; +} + +.filterBox +{ + width: 100%; + background: #FFFFFF; + padding: 0px 2px; + height: 25px; + -moz-border-radius: 2px; + border-radius: 2px; + border: 1px solid #888888; + table-layout: auto; + margin-bottom:5px; +} + + .filterBox #filterImageCell + { + text-align: right; + padding: 0px; + vertical-align: middle; + } + + .IE7 .filterBox #filterImageCell + { + padding:2px 2px 0 0; + } + + .filterBox #filterImg + { + background: transparent url('searchButton.png') no-repeat 0 0; + width: 22px; + height: 22px; + } + +table.filterBox +{ + table-layout: fixed; +} + + .filterBox .stxtcell + { + padding-right: 4px; + width:90%; + } + + .filterBox .stxtcell > input + { + margin-right: 4px; + height: 26px; + line-height:26px; + width: 100%; + padding: 0px; + padding-left: 4px; + padding-top: 2px; + border: none; + } + + .IE7 .filterBox .stxtcell > input + { + height: 20px; + } + + .filterBox .stxtcell > input.stxtinptpassive + { + color: #ACACAC; + } + +/*-------- End List Filter Box --------*/ + +/*-------- Start Notifications --------*/ + +#notificationsSummaryBox +{ + font-weight: bold; + padding: .5em; +} + + +.notificationsByDay, .notifications +{ + /*list-style: none;*/ +} + +.dayHeader +{ + border-bottom: 1px solid silver; + margin-top: 1em; + padding-bottom: .5em; +} + +.notifications +{ + margin-top: .5em; +} + +ul.notifications li +{ + line-height: 1.5em; +} + +ul.notifications li.unread +{ + font-weight: bold; +} + +ul.notifications li ol, ul.notifications li ul +{ + margin-left: 1.5em; +} + +/*-------- End Notifications --------*/ + +/*-------- Start ProjectDetailsPage --------*/ + +#projectPage #projectInfo +{ + position: relative; + margin-top: 5px; + height: 100%; +} +#projectInfo .section +{ + float: left; + margin-bottom: 0px; + height: 100%; +} + + #projectInfo .section .itemBar, #projectInfo .section .itemBarLong + { + clear: both; + padding: 7px 0 7px 0; + overflow:auto; + } + + #projectInfo .section .itemBarLong:first-child + { + padding-top:3px; + } + + .IE7 #projectInfo .section .itemBar, .IE7 #projectInfo .section .itemBarLong + { + padding-top: 5px; + } + + #projectInfo .section .itemBar > label, #projectInfo .section .itemBarLong > label + { + width: 130px; + float: left; + } + + #projectInfo .section .itemBar div#yourRating { + float:left; + } + + #projectInfo .section .itemBar div.RatingStar { + margin:2px 1px 0 0; + } + + #projectInfo .section .itemBar div#RatingCount { + padding: 0 0 0 3px; + } + + #projectInfo .section .itemBar .ratingsWithCountContainer img { + vertical-align:top; + float:left; + padding-right: 4px; + } + + #projectInfo .section .itemBar > span, #projectInfo .section .itemBarLong > span, #projectPage .section .itemBar > div + { + float: left; + } + + #projectInfo .section .itemBar, #projectInfo .section .itemBarLong { + width: 100%; + } + + #projectInfo .section .itemBar > span { + float: none; + } + + #projectInfo .section .itemBar > span .shareThisItem { + white-space: nowrap; + } + + #projectInfo .section .itemBarLong div + { + margin-left: 130px; + padding: 0; + } + + #projectInfo .section .viewonlinecont + { + background-color:#d3d3d3; + padding:5px 10px; + margin-top:10px; + float:left; + font-weight:bold; + } + +#projectInfo #sectionLeft +{ + width: 50%; +} +#projectInfo #sectionRight +{ + width: 50%; +} +.IE7 #projectInfo #sectionRight +{ + width: auto; +} + +#projectPage h2.projectSummary +{ + font-weight:normal; + font-size: 1.1em; + margin-bottom: 11px; + line-height:1.4; + word-wrap: break-word; +} + +.IE7 #projectPage h2.projectSummary +{ + font-family: 'Segoe UI' , 'Lucida Grande' ,Verdana,Arial,Helvetica,sans-serif; +} + +.IE #projectPage .projectTitle, .IE9 #projectPage .projectTitle +{ + width: 100%; +} + +#projectPage #reportAbuse +{ + float: left; + font-size: x-small; +} + +#projectPage .hiddenSidebar { + display: none; +} + +#projectPage .fullProjectBody { + margin-left:-275px; +} + +.IE8 #projectPage #userCard { + float: left; + height: auto; +} + +#projectPage #userCard .avatar img { + max-width: 100px; + max-height: 100px; +} + +#projectDetails +{ + overflow:hidden; +} + +#projectBody +{ + width: 100%; + overflow:hidden; +} + + #projectDetails > div:first-child + { + margin: 5px 0 0 260px; + } + + #projectBody > div:first-child + { + margin: 20px 0 0 260px; + } + + .IE7 #projectContent .tabHeaders + { + overflow:hidden; + margin-bottom:-20px; + } + +#projectPage .sidebar +{ + float: left; + width: 215px; + margin-right: -250px; +} + + #projectPage .sidebar .section + { + margin: 20px 0 10px 0; + } + + #projectPage .sidebar .section .titleBar h3 + { + padding: 0 0 2px 0; + } + + #projectPage .sidebar .section .itemBarRight + { + min-height: 21px; + position: relative; + padding-top: 5px; + } + + #projectPage .sidebar .section .titleBar + { + margin-bottom: 5px; + } + + #projectPage .sidebar .section .authorItem + { + padding: 0 0 5px 10px; + } + + #projectPage .sidebar .section .authorItem a + { + display:block; + float:left; + max-width:170px; + } + + #projectPage .sidebar .section .authorItem > div + { + float:right; + } + + #projectPage .sidebar #advertisement + { + margin-top: 20px; + } + + #projectPage .sidebar #advertisement .label + { + text-align: center; + } + + #projectPage .sidebar #moreFromAuthor + { + width:225px; + margin: 20px 0 10px 0; + float:left; + } + + #projectPage .sidebar #moreFromAuthor .bottomBar { + padding: 5px 0px 5px 25px; + text-align: right; + } + +#projectPage #Collections { + min-height:22px; + min-width:169px; +} + +#projectPage #Collections .bevelButton { + background-color: #8CC63F; +} + +#projectPage .bevelButton +{ + font-weight: bold; + border-radius: 3px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + color: white; + padding: 2px 10px 3px; + text-align: center; +} + +#projectPage #DiscussionsTabPane .bevelButton +{ + font-weight: normal; + color: black; + padding: 1px 10px 1px; +} + +#projectPage #Downloads { + padding: 0 0 8px 0; + float: left; +} + #projectPage #Downloads > div:first-child { + float: left; + margin: 15px 0 0 0; + height:35px; + line-height:1.6; + width: 130px; + } + #projectPage #Downloads label + { + font-size:1.25em; + } + #projectPage #Downloads input + { + min-width: 100px; + padding: 3px 10px 3px 10px; + margin: 3px 10px 0 10px; + font-weight: bold; + float: left; + } + + #projectPage #Downloads .button + { + background-color:#007494; + color:#fff; + padding:5px 15px; + margin: 15px 15px 0 0; + float:left; + } + + #projectPage #Downloads .button:hover + { + background-color:#0095c4; + text-decoration:none; + } + +#projectPage #projectBody .attachments { + margin: 0 0 15px 0; +} + + #projectPage #projectBody .attachments label { + float: left; + } + + #projectPage #projectBody .attachments .files a, #projectPage #projectBody .attachments .files span { + float: left; + padding: 0 5px 0 5px; + } + +#publishBar +{ + border: 1px solid #707070; + background-color: #F8F8F8; + margin-top: 10px; +} + +.linehighlight { + background-color: #fff000; +} + +#sourceItem { + height: 610px; +} + #sourceItem > div:first-child { + padding: 20px 5px 0 15px; + font-weight: bold; + } + #sourceItem > div+div { + height: 560px; + padding: 10px; + overflow: auto; + } + #sourceItem .copyCode { + font-weight: normal; + margin: 0 15px 0 0; + float: right; + } + +.sourceList { + height: 600px; + padding: 5px; + border-top: 1px solid #CCC; + margin-top: -1px; +} + + .sourceList .sourceListTabHeader + { + margin:20px 10px; + } + .sourceList .sourceListTabs + { + margin-bottom:20px; + border-bottom: 1px solid #CCC; + float:left; + width:100%; + } + .sourceList .sourceListTabs .languageTab { + padding:5px 10px 5px 10px; + font-weight: bold; + float: left; + margin: 0 3px 0px 0; + color:#00749E; + } + .sourceList .sourceListTabs .languageTab:hover + { + color: #0095C4; + } + + .sourceList .sourceListTabs .selectedLanguage { + background-color: #fff; + color: #000; + border: 1px solid #ccc; + border-bottom:none; + margin-bottom:-2px; + } + + .sourceList .sourceListTabs .unselectedLanguage { + cursor: pointer; + } + + .sourceList .endTabs { + clear: both; + } + + .sourceList .sourceListContent { + padding-top: 5px; + } + + +.sbfc, +.sbfe +{ + white-space: nowrap; + text-indent: 20px; + cursor: pointer; + padding: .2em 0em .2em 0em; + background-repeat: no-repeat; + background-position: left center; + font-weight: bold; + text-decoration: none !important; +} + +.sbfc +{ + background-image: url(../samples/node_closed.gif); +} + +.sbfe +{ + white-space: nowrap; + background-image: url(../samples/node_opened.gif); +} + +.ndbf +{ + white-space: nowrap; + text-indent:20px; +} + +.sbf +{ + white-space: nowrap; + background: url(../samples/bullet.gif) no-repeat 4px -1px; + cursor: pointer; + text-indent: 20px; + white-space: nowrap; + padding: .1em 0em .1em 0em; +} + +.sbsf, +.sbf:hover +{ + color: #000; + text-decoration: none !important; + +} + +.sbsf +{ + color: #000 !important; + background-color: rgb(232, 232, 232); +} + +.sbf:hover +{ + color: #ce8b10; +} + +/*-------- Translate --------*/ +.translatePage { + width: 900px; +} +.translatePage .fileManager { + margin-bottom:20px; +} +.translatePage .fileManager h4 { + margin-top:10px; +} +.translatePage #formContainer { + width: 100%; +} +.translatePage .formLabel { + width: 300px; + padding: 5px; +} + .translatePage .textInput { + width: 425px; +} +.translatePage TEXTAREA.richText { + height: 600px; + width: 620px; +} +.translatePage TEXTAREA.unadornedEditor { + height: 600px; +} +.translatePage .formWideLabel, .translatePage .richText { + padding: 5px; +} +.translatePage .formWideLabel, .translatePage .unadornedEditor { + width: 750px; + padding: 5px; +} +.translatePage #languageSelection { + margin: 15px; + display: inline-block; +} + +.translateTab, .translateTabSelected { + font-weight: bold; + float: left; + text-align: center; + margin: 10px; + padding: 7px; + background: #E8E8E8; + white-space: nowrap; + cursor: pointer; +} + +.translateTabSelected +{ + color: White; + background: Gray; +} + +.translateTabSelected .translateLabel, .translateTab .translateLabel +{ + white-space: nowrap; + float: left; + padding: 0 5px 0 5px; +} + +.translateTab #deleteLanguage, .translateTab #moreLanguages +{ + padding-left: 10px; +} + +.translateLabel #deleteLanguage { + color: #FFFFFF; +} +/*-------- End Translate --------*/ +/*-------- Begin Eula --------*/ + + +#eulaPagefade +{ + position: absolute; + background-color: #FFFFFF; +} + +#eulaPage +{ + background-color: #f4f4f4; + border: 1px solid #000000; + -border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + padding: 15px; + display: block; + max-width: 70%; +} + +#eulaPage .eulaPageclose +{ + text-align: right; +} + +#eulaPage .eulaPagemessage +{ + overflow: auto; + max-height: 350px; +} + + #eulaPage .eulaPagemessage h1 + { + margin: 0 0 5px 0; + } + +#eulaPage .eulaPagebuttons +{ + text-align: right; + margin-top: 10px; +} +#eulaPage .eulaPagebuttons > button +{ + color: Blue; + border: none; + background: none; + font-weight: bold; + cursor: pointer; +} + + + #eulaPage #eula #documentText + { + line-height: normal; + } + +/*-------- End DocumentView --------*/ +/*-------- Begin FAQ --------*/ + +#FAQPage #TableOfContents h2 +{ + padding: 5px; + border-bottom: 2px solid #EFEFEF; + margin: 0 0 10px 0; + max-width: 70%; +} + +#FAQPage .FAQSection +{ + padding: 10px 0px; + width: 70%; +} + + #FAQPage .FAQSection h2 + { + padding: 5px; + border-bottom: 2px solid #EFEFEF; + } + + #FAQPage .FAQSection h3 + { + padding: 5px; + } + + #FAQPage .FAQSection ul, #FAQPage .FAQSection ol + { + margin: 0; + } + + #FAQPage .FAQSection #description > div + { + overflow: auto; + padding-left: 10px; + } + + #FAQPage .FAQSection #description img + { + float: left; + } + + #FAQPage .FAQSection #description div > div + { + padding-top: 10px; + float: left; + } + + #FAQPage .FAQSection > div > div + { + padding: 0 15px; + } + + #FAQPage #Reputation th, #FAQPage #Reputation td + { + padding-left: 20px; + } + +/*-------- End FAQ --------*/ +/*-------- Begin DocumentView --------*/ + +#documentView #documentText +{ + line-height: normal; +} + +/*-------- End DocumentView --------*/ + +.Opera wbr:after +{ + content: "\00200B"; +} + + +.IE9 wbr:after +{ + content: "\00200B"; +} + +.IE8 wbr { + width: 0px; + display: inline-block; + overflow: hidden; +} + +/*-------- Begin FileManager --------*/ + +.uploadControlNoError + { + height:30px + } +.uploadControlWithError + { + height:80px; + } +/*-------- End FileManager --------*/ + +/*-------- Begin User Card --------*/ +#userCard .titleBar { + border-bottom: solid 5px #E8E8E8; + margin: 10px 0 5px 0; +} + #userCard .titleBar h3 + { + font-size: 1.0em; + font-weight: bold; + line-height: 125%; + padding: 0 0 2px 0; + } + +#userCard .userFeed { + float: right; +} + +#userCard .bio { + max-width:300px; + white-space: normal; +} + +#userCard .avatar +{ + padding: 5px 5px 10px 5px; + margin: 0 0 3px 0; + text-align: center; +} + +#userCard .itemBar { + padding: 5px; +} + + #userCard .itemBar label + { + float: left; + } + + #userCard .itemBar label+span { + display: block; + margin-left: 100px; + } + +#userCard .collapsableSidebar { + clear:both; + width:100%; + margin-top: 5px; +} + +/* Profile Overrides */ +#userCard +{ + padding: 0 0 10px 0 +} + +#userCard .profile-usercard +{ + width:225px; +} + +#userCard .profile-usercard, #userCard .profile-inline, #userCard .profile-inline-header +{ + border:0px; + background-color:#fff; +} + +#userCard .profile-userimage-large +{ + margin-bottom:10px; + border:none; + width:auto; + height:auto; +} + +#userCard .profile-inline .profile-inline-header-details +{ + width:100%; + display:block; + clear:both; + margin-left:0px; +} + + + +/*-------- End User Card --------*/ +/*-------- Begin Description Progress Meter --------*/ + +#descriptionProgressMeter { + float: right; + border-top: 1px solid #DADADA; + border-left: 1px solid #DADADA; + width: 210px; + padding-left: 7px; +} + + #descriptionProgressMeter h4 { + font-weight: bold; + } + + #descriptionProgressMeter #progressGraphic { + border: 1px solid #888888; + width: 205px; + margin: 10px 0; + background-color: #E9E9E9; + padding: 1px 0 0 1px; + } + + #descriptionProgressMeter #progressGraphic div { + background-image: url("../common/progress_meter.png"); + padding-left: 5px; + } + + #descriptionProgressMeter #progressText { + font-weight: bold; + margin: 5px 0; + + } + + #descriptionProgressMeter #goodDescriptionText p+p { + padding: 5px 0; + } + + #descriptionProgressMeter #goodDescriptionText > div { + margin-top: 5px; + width: 150px; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + overflow: auto; + } + + #descriptionProgressMeter #goodDescriptionText div img { + float: left; + } + + #descriptionProgressMeter #goodDescriptionText div div { + margin: 7px 0 5px 10px; + } + +/*-------- End Description Progress Indicator --------*/ + +/*-------- Start Sample Pack Tab View --------*/ +.SamplePackTab #headerBar +{ + padding: 15px 5px 20px 5px; + font-weight: bold +} + .SamplePackTab #headerBar .reportCount + { + padding-top: 2px; + } + .SamplePackTab #headerBar .samplePackSort + { + float: right; + color: #666; + } +/*-------- End Sample Pack Tab View --------*/
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/description/Combined.css b/print/OEM Printer Customization Plug-in Samples/description/Combined.css new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/description/Combined.css diff --git a/print/OEM Printer Customization Plug-in Samples/description/Galleries.css b/print/OEM Printer Customization Plug-in Samples/description/Galleries.css new file mode 100644 index 00000000..52bf19b1 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/description/Galleries.css @@ -0,0 +1,417 @@ +/* *************************************************** +Galleries.css - Common Structure + +This is where we define common layout for structures that are truly close to common across the different +Galleries sites. To make sure this works we need to follow certain conventions. + +1. Define each logical structure in its own section with its own comment block that gives the section +a Name, Description and defines the root element if one exists (i.e #someElement). Also, mark the closing block. + +2. Indent styles in a section to represent if it is a child of a previous element. +i.e. #someDiv{ + } + #someDiv ul { + } + +3. Do not include brand specific information here like colors and fonts unless they are *really* common. + +4. If there is an element that you know will be overridden in each brand stylesheet still include it here with an empty definition. +This will aid in knowing what section to override and what selectors to use. + +i.e. #someSction a { + } + +5. When you add a new section also update the Table of Contents below so that we have a quick overview of the sections + + *****************************************************/ + +/**************************************************** +Table of Contents + + Global - global classes + + FileAttachmentDisplay - The list of attached files under the editor + Eyebrow - The breadcrumb control at the top of the master page + Pager - The common paging control, used for browsing pages of search results + Profile User Card - Elements in the profile usercard control + SideNav - The navigation side bar that contains the search filters + + +*****************************************************/ + +/******************************** +Name: Global +Root: none +Description: truly global classes +********************************/ +body { + text-align: left; + direction: ltr; +} + +img.rss { + background: url(../../../GlobalResources/Images/Rss.png) no-repeat; + background-position: 0px 0px; + height: 17px; + width: 17px; +} +/* End Global Section */ + +/******************************** +Name: FileAttachmentDisplay +Root: #fileAttachmentDisplay +Description: The list of attached files under the editor +********************************/ +#fileAttachmentDisplay { +} + #fileAttachmentDisplay .attachment { + margin-right: 10px; + float: left; + } + + #fileAttachmentDisplay .attachment .displayAttachment { + padding: 0px 0 13px 0; + float: left; + } + + #fileAttachmentDisplay .attachment .removeAttachment { + background-image: url('/Content/Common/delete.png'); + display: block; + width: 16px; + height: 16px; + float: left; + } +/* End FileAttachmentDisplay Section */ + + +/******************************** +Name: Eyebrow +Root: .EyebrowContainer +Description: The breadcrumb control at the top of the master page +********************************/ +.EyebrowContainer { +} + .EyebrowContainer div.EyebrowElement{ + display:inline; + } + + .EyebrowContainer .EyebrowElement{ + font-weight:normal + } + .EyebrowContainer .EyebrowLeafLink{ + color:#000; + } +/* End Eyebrow Section */ + +/******************************** +Name: Pager +Root: #Pager +Description: The common paging control, used for browsing pages of search results +********************************/ +#Pager { +} + #Pager div{ + display:inline; + } +/* End Pager Section */ + +/******************************** + +Name: Profile User Card +Root: #dashboardPage #userCard +Description: Elements in the profile usercard control + +********************************/ + #dashboardPage #userCard .profile-usercard-inline { + margin: 5px 0 10px 0; + } + + /* #dashboardPage #userCard .profile-usercard { + width: 288px; + } +/* End Profile User Card Section */ + +/******************************** + +Name: Discussion +Root: #DiscussionsTabPane +Description: Defines the layout of the dicussion + + +********************************/ +#DiscussionsTabPane { +} + + #DiscussionsTabPane .itemHidden + { + background: lightgrey; + } + + #discussionListItem { + } + + .discussion .postActions + { + float: right; + } + + #discussionListItem .postItem + { + white-space: pre-wrap; + word-wrap: break-word; + font-size:1em; + } + +/* End Discussion Section */ + + +/******************************** + +Name: SearchDefaultLocale +Root: .searchDefaultLocale +Description: Defines the layout of the include english result checkbox on the Browse Page + + +********************************/ +.searchDefaultLocale +{ + float: right; + margin: 20px 0 0 5px; +} + .searchDefaultLocale input + { + vertical-align:top; + } + .searchDefaultLocale span + { + margin-left: -3px; + } +/*-------- End SearchDefaultLocale --------*/ + + +/******************************** + +Name: SideNav +Root: #sideNav +Description: Defines the layout of the naviation elements on the side of the Browse Page + These represent the different filters like Code Language, Category and Tag + + +********************************/ + +#sideNav { + width: 250px; + vertical-align:top; +} + #sideNav h3 { + } + + #sideNav .section { + padding: 0 0 10px 0; + position: relative; + } + + #sideNav .section a { + } + + #sideNav .section a:hover { + } + + #sideNav .section > div { + padding:5px 5px 5px 0; + line-height:150%; + } + + #sideNav .section ul { + list-style-type:none; + padding:0px; + margin:0px; + } + + #sideNav .section ul li { + position: relative; + padding: 5px 5px 5px 0; + } + + #sideNav .section ul li .selectedFilter { + float: left; + padding-right: 5px; + } + + #sideNav .section div.itemCount { + float: right; + } + + #sideNav .section form input[ type = "checkbox"] { + margin: 0px 4px 0px 0px; + vertical-align: middle; + } +/* End SideNav Section */ + +/*----------- Contribution Logos *******/ +.contributionLogo { + float: left; + position: relative; + margin-right: 6px; +} + +.logo_visualstudio { + background: transparent url('../common/logos/visualstudio.png') no-repeat; + width: 23px; + height: 12px; + margin-top: 3px; +} +.logo_allinonecode { + background: transparent url('../common/logos/1code.png') no-repeat; + width: 14px; + height: 16px; +} +.logo_exchange { + background: transparent url('../common/logos/exchange.png') no-repeat; + width: 14px; + height: 16px; +} +.logo_ie { + background: transparent url('../common/logos/ie.png') no-repeat; + width: 16px; + height: 16px; +} +.logo_office { + background: transparent url('../common/logos/office.png') no-repeat; + width: 17px; + height: 16px; +} +.logo_windows { + background: transparent url('../common/logos/windows.png') no-repeat; + width: 17px; + height: 16px; + } +.logo_azure { + background: transparent url('../common/logos/windowsazuredark.png') no-repeat; + width: 16px; + height: 16px; +} + +.logo_windowsphone { + background: transparent url('../common/logos/windowsphone.png') no-repeat; + width: 16px; + height: 16px; + } + + .contributionLogoTip { + position: absolute; + display: none; + border: solid 1px #CCC; + color: #333; + background-color: #F0F0F0; + font-size: 11px; + font-family: "Segoe UI",Sans-Serif; + box-shadow: 3px 3px 5px #888; + -moz-box-shadow: 3px 3px 5px #888; + z-index: 1003; + padding: 5px; + min-width: 250px; + } + +/*----------- End Contribution Logos *******/ + +.clear +{ + clear: both; +} + +.customcontributionLogoTip { + position: absolute; + display: none; + border: solid 1px #CCC; + background-color: white; + color: #333; + font-size: 11px; + font-family: "Segoe UI",Sans-Serif; + box-shadow: 3px 3px 5px #888; + -moz-box-shadow: 3px 3px 5px #888; + z-index: 1004; + padding: 5px; + min-width: 250px; +} + +.customcontributionTittle { + font-size: 14px; + margin-left: 90px; +} + +.customcontributionDiscription { + font-size: 13px; + margin: 10px 5px; + text-align: justify; +} + +.customcontribution { + float: left; + position: relative; + margin-right: 6px; +} + +.customcontributionLink { + margin-left: 5px; +} + +.customcontributionlogo { + float: left; + padding: 0 10px; + margin: 0; + width: 70px; + height: 70px; + background-repeat: no-repeat; +} + + +.logo_azure_large { + background-image: url('../common/logos/windowsazure_large.png'); +} +.logo_visualstudio_large { + background-image: url('../common/logos/visualstudio_large.png'); +} +.logo_exchange_large { + background-image: url('../common/logos/exchange_large.png'); +} +.logo_ie_large { + background-image: url('../common/logos/ie_large.png'); +} +.logo_office_large { + background-image: url('../common/logos/office_large.png'); +} +.logo_windows_large { + background-image: url('../common/logos/windows_large.png'); +} +.logo_windowsphone_large { + background-image: url('../common/logos/windowsphone_large.png'); +} + +/* Custome Header */ +.dirSubHeading .windowssdk .container +{ + background: #00BCF2 url('wpappsbackground.png') no-repeat; + color: #575757; + padding: 20px 10px 50px 225px; +} + +.dirSubHeading .windowssdk .container h1, .dirSubHeading .windowssdk .container h2 { + color: #575757 !important; +} + +.dirSubHeading .windowssdk .container p { + margin: 28px 0 0 0 !important; +} + +.dirSubHeading .windowssdk .container a { + background-color: #575757; + color: #FFFFFF !important; + cursor: pointer; + font-size: 16px; + font-family: 'Segoe UI Semibold','Segoe UI','Lucida Grande',Verdana,Arial,Helvetica,sans-serif; + padding: 11px; +} + + + diff --git a/print/OEM Printer Customization Plug-in Samples/description/Layout.css b/print/OEM Printer Customization Plug-in Samples/description/Layout.css new file mode 100644 index 00000000..625f7776 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/description/Layout.css @@ -0,0 +1,147 @@ +#container { + min-height: 768px; +} + +#leftSubHeaderContainer +{ + margin-top:20px; +} + +#title h1 +{ + font-size:25px; +} + +#subtitle h2 +{ + font-size:15px; +} + +#subtitle +{ + margin-left:10px; +} + + +#formContainer +{ + margin-left:10px; + margin-top:30px; +} + +.formLabel +{ + float:left; + width: 250px; +} + +.formRow +{ + clear:both; + padding: 10px 0 10px 10px; +} + + +.formRecaptchaRow +{ + clear:both; + float:left; + margin-top:20px; + margin-left:10px; + margin-bottom:20px; +} + +.formSubmitRow +{ + clear:both; + margin-top:20px; + margin-left:300px; + margin-bottom:20px; +} + +.formControl { + width:300px; + float:left; +} +.formControl .textInput +{ + width:300px; +} + +.formControl textarea +{ + width:425px; + height:100px; +} + +.formControl .tag +{ + width:425px; +} + +.formControl .richText +{ + margin-top:10px; + width:500px; + height:440px; +} + +.formWideLabel +{ + width:500px; +} + +.formBigLabel +{ + margin-top:20px; + font-size:20px; +} + +.formControlBelow +{ + clear:both; + margin-top:10px; + width:500px; +} + +.required +{ + color: Red; +} +.helpText +{ + color: #9D9D9D; + font-style: italic; +} + +#agreementSummary +{ + clear:both; + margin-top:10px; + width:800px; +} + +.field-validation-error, .validation-summary-errors +{ + color: #FF0000; + font-weight: bold; +} + +.tinyMCETemplate { + position: relative; + left: 400px; + width: 300px; + max-height: 300px; + overflow: auto; +} + +.IE6 .tinyMCETemplate { + left: 25px; +} + +.ownerBar { + padding: 5px; +} +.ownerBar .ownerBarOptions { + float: right; +} diff --git a/print/OEM Printer Customization Plug-in Samples/description/dc96e5d0-205a-4f07-963c-0adecf31d9c1Combined.css b/print/OEM Printer Customization Plug-in Samples/description/dc96e5d0-205a-4f07-963c-0adecf31d9c1Combined.css new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/description/dc96e5d0-205a-4f07-963c-0adecf31d9c1Combined.css diff --git a/print/OEM Printer Customization Plug-in Samples/description/iframedescription.css b/print/OEM Printer Customization Plug-in Samples/description/iframedescription.css new file mode 100644 index 00000000..9abc9cdb --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/description/iframedescription.css @@ -0,0 +1,179 @@ +body { + color: #000000; + font-family: 'Segoe UI',Verdana,Arial; + font-size: 0.813em; + font-style: normal; + word-wrap: break-word; +} + +/*BEGIN HEADERS*/ +.h1, h1 { + color: #3A3E43; + font-family: 'Segoe UI',Verdana,Arial; + font-size: 1.4em; + font-weight: bold; + margin: 0; +} + +.h2, h2 { + color: #3A3E43; + font-family: 'Segoe UI',Verdana,Arial; + font-size: 1.2em; + font-weight: bold; +} +.h3, h3 { + color: #3A3E43; + font-family: 'Segoe UI',Verdana,Arial; + font-size: 1.077em; + font-weight: bold; +} +.h4, h4 { + color: #3A3E43; + font-family: 'Segoe UI',Verdana,Arial; + font-size: 1em; + font-weight: bold; +} +h4.subHeading { + margin-bottom: 7px; + margin-top: 13px; +} +/*END HEADERS*/ + +/*BEGIN LINKS*/ +a:link { + color: #00749E; + text-decoration: none; +} +a:hover { + text-decoration: underline; +} +a:visited { + color: #960BB4; + text-decoration: none; +} +a:focus { + outline: 1px dotted #000000; +} + +a.libraryLink:link { + text-decoration:none; + border-bottom:1px dotted; +} + +/*END LINKS*/ + +/*BEGIN IMAGES*/ +img { + border: 0 none; +} +/*END IMAGES*/ + +/*BEGIN TABLE*/ +.title table { + color: #000000; + font-family: 'Segoe UI',Verdana,Arial; + font-size: 1.077em; + font-style: normal; +} +table { + border-collapse: collapse; +} + +table, table th, table td { + border:1px solid #BBBBBB; +} +/*END TABLE*/ + +/*BEGIN LIST*/ +ul { + list-style-type: disc; + margin-left:40px; + padding-left: 0; +} +ul li { + padding-bottom: 10px; +} +ol { + margin-left:40px; + padding-left: 0; +} +ol li { + padding-bottom: 10px; +} +/*END LIST*/ + +.scriptcode { + position: relative; + padding: 8px 8px 8px 8px; + background: #FFFFFF; + font-size: 12px; + line-height: 125%; + font-weight:normal; +} +.scriptcode pre +{ + white-space: pre-wrap !important; /* css-3 */ + word-wrap: break-word !important; /* Internet Explorer 5.5+ */ + margin:0 0 10px 0 !important; + padding: 10px; + border-top: solid 2px #D0D2D2; + border-bottom: solid 2px #D0D2D2; + border-left: solid 1px #D0D2D2; + border-right: solid 1px #D0D2D2; +} + +.scriptcode .title { + color:#E66A38; + font-size: 12px; + font-weight:bold; + margin: 0; + min-height: 23px; +} +.scriptcode .title > span:first-child { + border-left: solid 1px #D0D2D2; +} +.scriptcode .title > span { + padding: 4px 8px 4px 8px; + display: inline-block; + border-top: 1px solid #D0D2D2; + border-right: 1px solid #D0D2D2; + border-collapse: collapse; + text-align: center; + background: white; +} +.scriptcode .title > span.otherTab { + color: #1364C4; + background: #EFF5FF; + cursor: pointer; +} + +.scriptcode .hidden { + display: none !important; + visibility: hidden !important; +} + +.scriptcode .copyCode { + padding: 8px 2px 0 2px !important; + margin-right: 15px; + position: absolute !important; + right: 0 !important; + top: 17px; + display:block !important; + background: #FFFFFF; +} +.scriptcode .pluginLinkHolder { + display: none; +} +.scriptcode .pluginEditHolderLink { + display: none; +} + +.Opera wbr +{ + display: inline-block; +} + +.IE9 wbr:after +{ +content: "\00200B"; +} diff --git a/print/OEM Printer Customization Plug-in Samples/description/offline.js b/print/OEM Printer Customization Plug-in Samples/description/offline.js new file mode 100644 index 00000000..f5d07c8a --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/description/offline.js @@ -0,0 +1,52 @@ +var Galleries = Galleries || { }; + +(function() { + + function findElem(parent, tagName, className) { + var elemToSearch = (parent) ? parent : document.body; + var tagMatch = elemToSearch.getElementsByTagName(tagName); + var evaluator = function(elem) { + return (className) ? (elem.className.indexOf(className) > -1) : true; + }; + + return findArrayElem(tagMatch, evaluator); + } + + function findArrayElem(array, evaluator) { + var newArray = new Array(); + for (var count = 0; count < array.length; count++) { + if (evaluator(array[count])) { + newArray.push(array[count]); + } + } + return newArray; + } + + function iterateElem(elems, delegate) { + for(var count = 0; count < elems.length; count++) { + delegate(count, elems[count]); + } + } + + function isHidden(elem) { + return (elem.offsetHeight === 0 && elem.offsetWidth === 0) || elem.style && elem.style.display === "none"; + } + + function onWindowLoad(callback) { + attachEventHandler(null, 'load', callback); + } + + function attachEventHandler(elem, event, callback) { + var elemToAttach = (elem) ? elem : window; + if (document.addEventListener) { + elemToAttach.addEventListener(event, callback, false); + } else if ( document.attachEvent ) { + elemToAttach.attachEvent('on' + event, callback); + } + } + + Galleries.findElem = findElem; + Galleries.iterateElem = iterateElem; + Galleries.attachEventHandler = attachEventHandler; + Galleries.onWindowLoad = onWindowLoad; +})();
\ No newline at end of file diff --git a/print/OEM Printer Customization Plug-in Samples/license.rtf b/print/OEM Printer Customization Plug-in Samples/license.rtf new file mode 100644 index 00000000..690a7ad0 --- /dev/null +++ b/print/OEM Printer Customization Plug-in Samples/license.rtf @@ -0,0 +1,25 @@ +{\rtf1\ansi\ansicpg1252\uc1\htmautsp\deff2{\fonttbl{\f0\fcharset0 Times New Roman;}{\f2\fcharset0 MS Shell Dlg;}}{\colortbl\red0\green0\blue0;\red255\green255\blue255;}\loch\hich\dbch\pard\plain\ltrpar\itap0{\lang1033\fs16\f2\cf0 \cf0\ql{\f2 \line \li0\ri0\sa0\sb0\fi0\ql\par} +{\fs40\f2 {\ltrch MICROSOFT LIMITED PUBLIC LICENSE version 1.1}\li0\ri0\sa0\sb0\fi0\ql\par} +{\f2 \line {\ltrch ----------------------}\line \li0\ri0\sa0\sb0\fi0\ql\par} +{\f2 {\ltrch This license governs use of code marked as \ldblquote sample\rdblquote or \ldblquote example\rdblquote available on this web site without a license agreement, as provided under the section above titled \ldblquote NOTICE SPECIFIC TO SOFTWARE AVAILABLE ON THIS WEB SITE.\rdblquote If you use such code (the \ldblquote software\rdblquote ), you accept this license. If you do not accept the license, do not use the software.}\li0\ri0\sa0\sb0\fi0\ql\par} +{\f2 \line \li0\ri0\sa0\sb0\fi0\ql\par} +{\f2 {\ltrch 1. Definitions}\li0\ri0\sa0\sb0\fi0\ql\par} +{\f2 {\ltrch The terms \ldblquote reproduce,\rdblquote \ldblquote reproduction,\rdblquote \ldblquote derivative works,\rdblquote and \ldblquote distribution\rdblquote have the same meaning here as under U.S. copyright law. }\li0\ri0\sa0\sb0\fi0\ql\par} +{\f2 {\ltrch A \ldblquote contribution\rdblquote is the original software, or any additions or changes to the software.}\li0\ri0\sa0\sb0\fi0\ql\par} +{\f2 {\ltrch A \ldblquote contributor\rdblquote is any person that distributes its contribution under this license.}\li0\ri0\sa0\sb0\fi0\ql\par} +{\f2 {\ltrch \ldblquote Licensed patents\rdblquote are a contributor\rquote s patent claims that read directly on its contribution.}\li0\ri0\sa0\sb0\fi0\ql\par} +{\f2 \line \li0\ri0\sa0\sb0\fi0\ql\par} +{\f2 {\ltrch 2. Grant of Rights}\li0\ri0\sa0\sb0\fi0\ql\par} +{\f2 {\ltrch (A) Copyright Grant - Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create.}\li0\ri0\sa0\sb0\fi0\ql\par} +{\f2 {\ltrch (B) Patent Grant - Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software.}\li0\ri0\sa0\sb0\fi0\ql\par} +{\f2 \line \li0\ri0\sa0\sb0\fi0\ql\par} +{\f2 {\ltrch 3. Conditions and Limitations}\li0\ri0\sa0\sb0\fi0\ql\par} +{\f2 {\ltrch (A) No Trademark License- This license does not grant you rights to use any contributors\rquote name, logo, or trademarks.}\li0\ri0\sa0\sb0\fi0\ql\par} +{\f2 {\ltrch (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically.}\li0\ri0\sa0\sb0\fi0\ql\par} +{\f2 {\ltrch (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software.}\li0\ri0\sa0\sb0\fi0\ql\par} +{\f2 {\ltrch (D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.}\li0\ri0\sa0\sb0\fi0\ql\par} +{\f2 {\ltrch (E) The software is licensed \ldblquote as-is.\rdblquote You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement.}\li0\ri0\sa0\sb0\fi0\ql\par} +{\f2 {\ltrch (F) Platform Limitation - The licenses granted in sections 2(A) and 2(B) extend only to the software or derivative works that you create that run directly on a Microsoft Windows operating system product, Microsoft run-time technology (such as the .NET Framework or Silverlight), or Microsoft application platform (such as Microsoft Office or Microsoft Dynamics).}\li0\ri0\sa0\sb0\fi0\ql\par} +{\f2 \line \li0\ri0\sa0\sb0\fi0\ql\par} +} +}
\ No newline at end of file |
