Sample Code
Windows Driver Samples/ OEM Printer Customization Plug-in Samples/ C++/ PSUIRep/ devmode.cpp/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A // PARTICULAR PURPOSE. // // Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved. // // FILE: Devmode.cpp // // PURPOSE: Implementation of Devmode functions shared with OEM UI and OEM rendering modules. // #include "precomp.h" #include "debug.h" #include "globals.h" #include "devmode.h" #include "helper.h" #include "features.h" #include "oemui.h" // This indicates to Prefast that this is a usermode driver file. _Analysis_mode_(_Analysis_code_type_user_driver_); HRESULT hrOEMDevMode( DWORD dwMode, POEMDMPARAM pOemDMParam) { POEMDEV pOEMDevIn; POEMDEV pOEMDevOut; // Verify parameters. if ( (NULL == pOemDMParam) || ( (OEMDM_SIZE != dwMode) && (OEMDM_DEFAULT != dwMode) && (OEMDM_CONVERT != dwMode) && (OEMDM_MERGE != dwMode) ) ) { ERR(ERRORTEXT( "DevMode() ERROR_INVALID_PARAMETER.\r\n" )); VERBOSE(DLLTEXT( "\tdwMode = %d, pOemDMParam = %#lx.\r\n" ), dwMode, pOemDMParam); SetLastError(ERROR_INVALID_PARAMETER); return E_FAIL; } // Cast generic (i.e. PVOID) to OEM private devomode pointer type. pOEMDevIn = (POEMDEV) pOemDMParam->pOEMDMIn; pOEMDevOut = (POEMDEV) pOemDMParam->pOEMDMOut; switch (dwMode) { case OEMDM_SIZE: pOemDMParam->cbBufSize = sizeof (OEMDEV); break ; case OEMDM_DEFAULT: pOEMDevOut->dmOEMExtra.dwSize = sizeof (OEMDEV); pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; pOEMDevOut->dwDriverData = 0; pOEMDevOut->dwAdvancedData = 0; VERBOSE(DLLTEXT( "pOEMDevOut after setting default values:\r\n" )); Dump(pOEMDevOut); break ; case OEMDM_CONVERT: ConvertOEMDevmode(pOEMDevIn, pOEMDevOut, pOemDMParam->cbBufSize); break ; case OEMDM_MERGE: ConvertOEMDevmode(pOEMDevIn, pOEMDevOut, pOemDMParam->cbBufSize); MakeOEMDevmodeValid(pOEMDevOut); break ; } Dump(pOemDMParam); return S_OK; } BOOL ConvertOEMDevmode(PCOEMDEV pOEMDevIn, POEMDEV pOEMDevOut, DWORD dwSize) { if ( (NULL == pOEMDevIn) || (NULL == pOEMDevOut) || (dwSize < sizeof (OEMDEV)) ) { ERR(ERRORTEXT( "ConvertOEMDevmode() invalid parameters.\r\n" )); return FALSE; } // Check OEM Signature, if it doesn't match ours, // then just assume DMIn is bad and use defaults. if (pOEMDevIn->dmOEMExtra.dwSignature == pOEMDevOut->dmOEMExtra.dwSignature) { VERBOSE(DLLTEXT( "Converting private OEM Devmode.\r\n" )); VERBOSE(DLLTEXT( "pOEMDevIn:\r\n" )); Dump(pOEMDevIn); // Set the devmode defaults so that anything the isn't copied over will // be set to the default value. pOEMDevOut->dwDriverData = 0; pOEMDevOut->dwAdvancedData = 0; // Copy the old structure in to the new using which ever size is the smaller. // Devmode maybe from newer Devmode (not likely since there is only one), or // Devmode maybe a newer Devmode, in which case it maybe larger, // but the first part of the structure should be the same. // DESIGN ASSUMPTION: the private DEVMODE structure only gets added to; // the fields that are in the DEVMODE never change only new fields get added to the end. memcpy (pOEMDevOut, pOEMDevIn, __min(dwSize, __min(pOEMDevOut->dmOEMExtra.dwSize, pOEMDevIn->dmOEMExtra.dwSize))); // Re-fill in the size and version fields to indicated // that the DEVMODE is the current private DEVMODE version. pOEMDevOut->dmOEMExtra.dwSize = sizeof (OEMDEV); pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; } else { WARNING(DLLTEXT( "Unknown DEVMODE signature, pOEMDMIn ignored.\r\n" )); // Don't know what the input DEVMODE is, so just use defaults. pOEMDevOut->dmOEMExtra.dwSize = sizeof (OEMDEV); pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; pOEMDevOut->dwDriverData = 0; pOEMDevOut->dwAdvancedData = 0; } return TRUE; } BOOL MakeOEMDevmodeValid(POEMDEV pOEMDevmode) { if (NULL == pOEMDevmode) { return FALSE; } // ASSUMPTION: pOEMDevmode is large enough to contain OEMDEV structure. // Make sure that dmOEMExtra indicates the current OEMDEV structure. pOEMDevmode->dmOEMExtra.dwSize = sizeof (OEMDEV); pOEMDevmode->dmOEMExtra.dwSignature = OEM_SIGNATURE; pOEMDevmode->dmOEMExtra.dwVersion = OEM_VERSION; // Set driver data, if not valid. if (pOEMDevmode->dwDriverData > 100) { pOEMDevmode->dwDriverData = 0; } // Set Advanced driver data, if not valid. if (pOEMDevmode->dwAdvancedData > 100) { pOEMDevmode->dwAdvancedData = 0; } return TRUE; } void Dump(PCOEMDEV pOEMDevmode) { if ( (NULL != pOEMDevmode) && (pOEMDevmode->dmOEMExtra.dwSize >= sizeof (OEMDEV)) && (OEM_SIGNATURE == pOEMDevmode->dmOEMExtra.dwSignature) ) { VERBOSE(TEXT( "\tdmOEMExtra.dwSize = %d\r\n" ), pOEMDevmode->dmOEMExtra.dwSize); VERBOSE(TEXT( "\tdmOEMExtra.dwSignature = %#x\r\n" ), pOEMDevmode->dmOEMExtra.dwSignature); VERBOSE(TEXT( "\tdmOEMExtra.dwVersion = %#x\r\n" ), pOEMDevmode->dmOEMExtra.dwVersion); VERBOSE(TEXT( "\tdwDriverData = %#x\r\n" ), pOEMDevmode->dwDriverData); VERBOSE(TEXT( "\tdwAdvancedData = %#x\r\n" ), pOEMDevmode->dwAdvancedData); } else { ERR(ERRORTEXT( "Dump(POEMDEV) unknown private OEM DEVMODE.\r\n" )); } } |
Our Services
-
What our customers say about us?
Read our customer testimonials to find out why our clients keep returning for their projects.
View Testimonials