diff options
Diffstat (limited to 'print/OEM Printer Customization Plug-in Samples/C++/bitmap')
15 files changed, 4267 insertions, 0 deletions
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 + |
