summaryrefslogtreecommitdiff
path: root/print/OEM Printer Customization Plug-in Samples/C++/bitmap
diff options
context:
space:
mode:
Diffstat (limited to 'print/OEM Printer Customization Plug-in Samples/C++/bitmap')
-rw-r--r--print/OEM Printer Customization Plug-in Samples/C++/bitmap/bitmap.def4
-rw-r--r--print/OEM Printer Customization Plug-in Samples/C++/bitmap/bitmap.h81
-rw-r--r--print/OEM Printer Customization Plug-in Samples/C++/bitmap/bitmap.rc110
-rw-r--r--print/OEM Printer Customization Plug-in Samples/C++/bitmap/bitmap.vcxproj1090
-rw-r--r--print/OEM Printer Customization Plug-in Samples/C++/bitmap/bitmap.vcxproj.Filters174
-rw-r--r--print/OEM Printer Customization Plug-in Samples/C++/bitmap/ddihook.cpp114
-rw-r--r--print/OEM Printer Customization Plug-in Samples/C++/bitmap/debug.h82
-rw-r--r--print/OEM Printer Customization Plug-in Samples/C++/bitmap/devmode.cpp132
-rw-r--r--print/OEM Printer Customization Plug-in Samples/C++/bitmap/devmode.h37
-rw-r--r--print/OEM Printer Customization Plug-in Samples/C++/bitmap/dllentry.cpp50
-rw-r--r--print/OEM Printer Customization Plug-in Samples/C++/bitmap/intrface.cpp2048
-rw-r--r--print/OEM Printer Customization Plug-in Samples/C++/bitmap/intrface.h287
-rw-r--r--print/OEM Printer Customization Plug-in Samples/C++/bitmap/precomp.h40
-rw-r--r--print/OEM Printer Customization Plug-in Samples/C++/bitmap/precompsrc.cpp1
-rw-r--r--print/OEM Printer Customization Plug-in Samples/C++/bitmap/resource.h17
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
+