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
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
|
//+--------------------------------------------------------------------------
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright 1997 - 2006 Microsoft Corporation. All Rights Reserved.
//
// FILE: devmode.cpp
//
// PURPOSE: Implementation of Devmode functions shared with OEM UI and OEM rendering modules.
//
//--------------------------------------------------------------------------
#include "precomp.h"
#include "debug.h"
#include "devmode.h"
// This indicates to Prefast that this is a usermode driver file.
_Analysis_mode_(_Analysis_code_type_user_driver_);
BOOL
ConvertOEMDevmode(
_In_ PCOEMDEV pOEMDevIn,
_Inout_ POEMDEV pOEMDevOut
);
BOOL
MakeOEMDevmodeValid(
_Out_ POEMDEV pOEMDevmode
);
//+---------------------------------------------------------------------------
//
// Member:
// ::hrOEMDevMode
//
// Synopsis:
// Performs operation on UI Plugins Private DevMode Members.
// Called via IOemUI::DevMode
//
// Returns:
// S_OK or E_FAIL. For more detailed failure info,
// check GetLastError
//
// Last error:
// ERROR_INVALID_PARAMETER
//
//
//----------------------------------------------------------------------------
HRESULT
hrOEMDevMode(
DWORD dwMode,
// Indicates which operation should be performed
_Inout_ POEMDMPARAM pOemDMParam
// contains various data structures needed by this
// routine. The usage of this struct is determined by
// the dwMode flag.
)
{
HRESULT hr = S_OK;
// Return value.
//
// Verify parameters.
//
if ((NULL == pOemDMParam) ||
((OEMDM_SIZE != dwMode) &&
(OEMDM_DEFAULT != dwMode) &&
(OEMDM_CONVERT != dwMode) &&
(OEMDM_MERGE != dwMode)))
{
ERR("DevMode() ERROR_INVALID_PARAMETER.\r\n");
SetLastError(ERROR_INVALID_PARAMETER);
hr = E_FAIL;
}
else
{
POEMDEV pOEMDevIn = (POEMDEV) pOemDMParam->pOEMDMIn;;
// Pointer to the supplied OEM devmode data, if applicable
// based on dwMode.
POEMDEV pOEMDevOut = (POEMDEV) pOemDMParam->pOEMDMOut;;
// Pointer to the DEVMODE data that this routine is
// expected to configure, if applicable based on dwMode.
switch (dwMode)
{
//
// The Method should return the size of the memory allocation
// needed to store the UI plugin Private DEVMODE.
//
case OEMDM_SIZE:
pOemDMParam->cbBufSize = sizeof(OEMDEV);
break;
//
//Should fill the Private DEVMODE with the default values.
//
case OEMDM_DEFAULT:
//
//OEM_DMEXTRAHEADER Members
//
pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV);
pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE;
pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION;
break;
//
// The method should convert private DEVMODE members to
// the current version, if necessary.
//
case OEMDM_CONVERT:
ConvertOEMDevmode(pOEMDevIn, pOEMDevOut);
break;
//
// The method should validate the information contained in private
// DEVMODE members and merge validated values into a private
// DEVMODE structure containing default values
//
case OEMDM_MERGE:
ConvertOEMDevmode(pOEMDevIn, pOEMDevOut);
MakeOEMDevmodeValid(pOEMDevOut);
break;
}
}
return hr;
}
//+---------------------------------------------------------------------------
//
// Member:
// ::ConvertOEMDevmode
//
// Synopsis:
// confirm that the private DEVMODE being passed in is data that
// this driver recognizes, read the settings from the input
// OEM DEVMODE data, and write them to pOEMDevOut.
//
// Returns:
// True unless the routine was called with null pointers
//
//
//----------------------------------------------------------------------------
BOOL
ConvertOEMDevmode(
_In_ PCOEMDEV pOEMDevIn,
// Caller supplied DEVMODE that we are attempting to read
_Inout_ POEMDEV pOEMDevOut
// OEM private DEVMODE configured by this routine based on the settings
// in pOEMDevIn
)
{
if ((NULL == pOEMDevIn) ||
(NULL == pOEMDevOut))
{
ERR("ConvertOEMDevmode() invalid parameters.\r\n");
return FALSE;
}
//
// Check OEM Signature, if it doesn't match ours,
// then just assume DMIn is bad and use defaults.
//
if(pOEMDevIn->dmOEMExtra.dwSignature == pOEMDevOut->dmOEMExtra.dwSignature)
{
//
// Copy the old structure in to the new using which ever size is the
// smaller. Devmode maybe from newer Devmode (not likely since there
// is only one), or Devmode maybe a newer Devmode, in which case it
// maybe larger, but the first part of the structure should be the same.
//
// DESIGN ASSUMPTION: the private DEVMODE structure only gets added to;
// the fields that are in the DEVMODE never change only new fields get
// added to the end.
//
memcpy(pOEMDevOut,
pOEMDevIn,
__min(pOEMDevOut->dmOEMExtra.dwSize, pOEMDevIn->dmOEMExtra.dwSize));
//
// Re-fill in the size and version fields to indicated
// that the DEVMODE is the current private DEVMODE version.
//
pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV);
pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION;
//
// If the plug-in is capable of recognizing multiple versions of it's
// private DEVMODE data add custom handling here to support it.
//
}
else
{
WARNING("Unknown DEVMODE signature, pOEMDMIn ignored.\r\n");
//
// The private DEVMODE data is not something that this plug-in understands,
// so use defaults.
//
pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV);
pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE;
pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION;
}
return TRUE;
}
//+---------------------------------------------------------------------------
//
// Member:
// ::MakeOEMDevmodeValid
//
// Synopsis:
// Force the OEM devmode settings to valid values.
//
// Returns:
// True if the OEMDEV was configured, else FALSE. Only return false if
// the parameter is NULL.
//
//
//----------------------------------------------------------------------------
BOOL
MakeOEMDevmodeValid(
_Out_ POEMDEV pOEMDevmode
// OEM DEVMODE data to modify
)
{
if(NULL == pOEMDevmode)
{
return FALSE;
}
//
// Assumption: pOEMDevmode is large enough to contain OEMDEV structure.
//
pOEMDevmode->dmOEMExtra.dwSize = sizeof(OEMDEV);
pOEMDevmode->dmOEMExtra.dwSignature = OEM_SIGNATURE;
pOEMDevmode->dmOEMExtra.dwVersion = OEM_VERSION;
return TRUE;
}
|