blob: 06e049c9cb4ee8dedfaad4f1cea8a02b299b2357 (
plain)
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
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
|
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved.
//
// FILE: command.cpp
//
// PURPOSE: Source module for OEM customized Command(s).
//
#include "precomp.h"
#include "oemps.h"
#include "debug.h"
#include "command.h"
#include "resource.h"
// This indicates to Prefast that this is a usermode driver file.
_Analysis_mode_(_Analysis_code_type_user_driver_);
////////////////////////////////////////////////////////
// Internal String Literals
////////////////////////////////////////////////////////
const CHAR TEST_BEGINSTREAM[] = "%%Test: Before begin stream\r\n";
const CHAR TEST_PSADOBE[] = "%%Test: Before %!PS-Adobe\r\n";
const CHAR TEST_PAGESATEND[] = "%%Test: Replace driver's %%PagesAtend\r\n";
const CHAR TEST_PAGES[] = "%%Test: Replace driver's %%Pages: (atend)\r\n";
const CHAR TEST_DOCUMENTPROCESSCOLORS[] = "%%Test: Replace driver's %%DocumentProcessColors: (atend)\r\n";
const CHAR TEST_COMMENTS[] = "%%Test: Before %%EndComments\r\n";
const CHAR TEST_DEFAULTS[] = "%%Test: Before %%BeginDefaults and %%EndDefaults\r\n";
const CHAR TEST_BEGINPROLOG[] = "%%Test: After %%BeginProlog\r\n";
const CHAR TEST_ENDPROLOG[] = "%%Test: Before %%EndProlog\r\n";
const CHAR TEST_BEGINSETUP[] = "%%Test: After %%BeginSetup\r\n";
const CHAR TEST_ENDSETUP[] = "%%Test: Before %%EndSetup\r\n";
const CHAR TEST_BEGINPAGESETUP[] = "%%Test: After %%BeginPageSetup\r\n";
const CHAR TEST_ENDPAGESETUP[] = "%%Test: Before %%EndpageSetup\r\n";
const CHAR TEST_PAGETRAILER[] = "%%Test: After %%PageTrailer\r\n";
const CHAR TEST_TRAILER[] = "%%Test: After %%Trailer\r\n";
const CHAR TEST_PAGENUMBER[] = "%%Test: Replace driver's %%Page:\r\n";
const CHAR TEST_PAGEORDER[] = "%%Test: Replace driver's %%PageOrder:\r\n";
const CHAR TEST_ORIENTATION[] = "%%Test: Replace driver's %%Orientation:\r\n";
const CHAR TEST_BOUNDINGBOX[] = "%%Test: Replace driver's %%BoundingBox:\r\n";
const CHAR TEST_DOCNEEDEDRES[] = "%%Test: Append to driver's %%DocumentNeededResourc\r\n";
const CHAR TEST_DOCSUPPLIEDRES[] = "%%Test: Append to driver's %%DocumentSuppliedResou\r\n";
const CHAR TEST_EOF[] = "%%Test: After %%EOF\r\n";
const CHAR TEST_ENDSTREAM[] = "%%Test: After the last byte of job stream\r\n";
const CHAR TEST_DOCUMENTPROCESSCOLORSATEND[] = "%%Test: DocumentProcessColorsAtend\r\n";
const CHAR TEST_VMSAVE[] = "%%Test: %%VMSave\r\n";
const CHAR TEST_VMRESTORE[] = "%%Test: %%VMRestore\r\n";
const CHAR TEST_PLATECOLOR[] = "%%Test: %%PlateColor:\r\n";
const CHAR TEST_SHOWPAGE[] = "%%Test: %%SowPage:\r\n";
const CHAR TEST_PAGEBBOX[] = "%%Test: %%PageBox:\r\n";
const CHAR TEST_ENDPAGECOMMENTS[] = "%%Test: %%EndPageComments:\r\n";
////////////////////////////////////////////////////////////////////////////////////
// The PSCRIPT driver calls this OEM function at specific points during output
// generation. This gives the OEM DLL an opportunity to insert code fragments
// at specific injection points in the driver's code. It should use
// DrvWriteSpoolBuf for generating any output it requires.
HRESULT PSCommand(PDEVOBJ pdevobj, DWORD dwIndex, PVOID pData, DWORD cbSize,
IPrintOemDriverPS* pOEMHelp, PDWORD pdwReturn)
{
PCSTR pProcedure = NULL;
DWORD dwLen = 0;
DWORD dwSize = 0;
HRESULT hResult = E_FAIL;
VERBOSE("Entering OEMCommand...\r\n");
UNREFERENCED_PARAMETER(cbSize);
UNREFERENCED_PARAMETER(pData);
switch (dwIndex)
{
case PSINJECT_BEGINSTREAM:
VERBOSE("OEMCommand PSINJECT_BEGINSTREAM\n");
pProcedure = TEST_BEGINSTREAM;
break;
case PSINJECT_PSADOBE:
VERBOSE("OEMCommand PSINJECT_PSADOBE\n");
pProcedure = TEST_PSADOBE;
break;
case PSINJECT_PAGESATEND:
VERBOSE("OEMCommand PSINJECT_PAGESATEND\n");
pProcedure = TEST_PAGESATEND;
break;
case PSINJECT_PAGES:
VERBOSE("OEMCommand PSINJECT_PAGES\n");
pProcedure = TEST_PAGES;
break;
case PSINJECT_DOCNEEDEDRES:
VERBOSE("OEMCommand PSINJECT_DOCNEEDEDRES\n");
pProcedure = TEST_DOCNEEDEDRES;
break;
case PSINJECT_DOCSUPPLIEDRES:
VERBOSE("OEMCommand PSINJECT_DOCSUPPLIEDRES\n");
pProcedure = TEST_DOCSUPPLIEDRES;
break;
case PSINJECT_PAGEORDER:
VERBOSE("OEMCommand PSINJECT_PAGEORDER\n");
pProcedure = TEST_PAGEORDER;
break;
case PSINJECT_ORIENTATION:
VERBOSE("OEMCommand PSINJECT_ORIENTATION\n");
pProcedure = TEST_ORIENTATION;
break;
case PSINJECT_BOUNDINGBOX:
VERBOSE("OEMCommand PSINJECT_BOUNDINGBOX\n");
pProcedure = TEST_BOUNDINGBOX;
break;
case PSINJECT_DOCUMENTPROCESSCOLORS:
VERBOSE("OEMCommand PSINJECT_DOCUMENTPROCESSCOLORS\n");
pProcedure = TEST_DOCUMENTPROCESSCOLORS;
break;
case PSINJECT_COMMENTS:
VERBOSE("OEMCommand PSINJECT_COMMENTS\n");
pProcedure = TEST_COMMENTS;
break;
case PSINJECT_BEGINDEFAULTS:
VERBOSE("OEMCommand PSINJECT_BEGINDEFAULTS\n");
pProcedure = TEST_DEFAULTS;
break;
case PSINJECT_ENDDEFAULTS:
VERBOSE("OEMCommand PSINJECT_BEGINDEFAULTS\n");
pProcedure = TEST_DEFAULTS;
break;
case PSINJECT_BEGINPROLOG:
VERBOSE("OEMCommand PSINJECT_BEGINPROLOG\n");
pProcedure = TEST_BEGINPROLOG;
break;
case PSINJECT_ENDPROLOG:
VERBOSE("OEMCommand PSINJECT_ENDPROLOG\n");
pProcedure = TEST_ENDPROLOG;
break;
case PSINJECT_BEGINSETUP:
VERBOSE("OEMCommand PSINJECT_BEGINSETUP\n");
pProcedure = TEST_BEGINSETUP;
break;
case PSINJECT_ENDSETUP:
VERBOSE("OEMCommand PSINJECT_ENDSETUP\n");
pProcedure = TEST_ENDSETUP;
break;
case PSINJECT_BEGINPAGESETUP:
VERBOSE("OEMCommand PSINJECT_BEGINPAGESETUP\n");
pProcedure = TEST_BEGINPAGESETUP;
break;
case PSINJECT_ENDPAGESETUP:
VERBOSE("OEMCommand PSINJECT_ENDPAGESETUP\n");
pProcedure = TEST_ENDPAGESETUP;
break;
case PSINJECT_PAGETRAILER:
VERBOSE("OEMCommand PSINJECT_PAGETRAILER\n");
pProcedure = TEST_PAGETRAILER;
break;
case PSINJECT_TRAILER:
VERBOSE("OEMCommand PSINJECT_TRAILER\n");
pProcedure = TEST_TRAILER;
break;
case PSINJECT_PAGENUMBER:
VERBOSE("OEMCommand PSINJECT_PAGENUMBER\n");
pProcedure = TEST_PAGENUMBER;
break;
case PSINJECT_EOF:
VERBOSE("OEMCommand PSINJECT_EOF\n");
pProcedure = TEST_EOF;
break;
case PSINJECT_ENDSTREAM:
VERBOSE("OEMCommand PSINJECT_ENDSTREAM\n");
pProcedure = TEST_ENDSTREAM;
break;
case PSINJECT_DOCUMENTPROCESSCOLORSATEND:
VERBOSE("OEMCommand PSINJECT_DOCUMENTPROCESSCOLORSATEND\n");
pProcedure = TEST_DOCUMENTPROCESSCOLORSATEND;
break;
case PSINJECT_VMSAVE:
VERBOSE("OEMCommand PSINJECT_VMSAVE\n");
pProcedure = TEST_VMSAVE;
break;
case PSINJECT_VMRESTORE:
VERBOSE("OEMCommand PSINJECT_VMRESTORE\n");
pProcedure = TEST_VMRESTORE;
break;
case PSINJECT_PLATECOLOR:
VERBOSE("OEMCommand PSINJECT_PLATECOLOR\n");
pProcedure = TEST_PLATECOLOR;
break;
case PSINJECT_SHOWPAGE:
VERBOSE("OEMCommand PSINJECT_SHOWPAGE\n");
pProcedure = TEST_SHOWPAGE;
break;
case PSINJECT_PAGEBBOX:
VERBOSE("OEMCommand PSINJECT_PAGEBBOX\n");
pProcedure = TEST_PAGEBBOX;
break;
case PSINJECT_ENDPAGECOMMENTS:
VERBOSE("OEMCommand PSINJECT_ENDPAGECOMMENTS\n");
pProcedure = TEST_ENDPAGECOMMENTS;
break;
default:
ERR("Undefined PSCommand!\r\n");
*pdwReturn = ERROR_NOT_SUPPORTED;
return E_NOTIMPL;
}
// INVARIANT: should have injection string.
if(NULL != pProcedure)
{
// Write PostScript to spool file.
dwLen = (DWORD)strlen(pProcedure);
if (dwLen > 0)
{
hResult = pOEMHelp->DrvWriteSpoolBuf(pdevobj, const_cast<PSTR>(pProcedure), dwLen, &dwSize);
}
// Set return values.
if(SUCCEEDED(hResult) && (dwLen == dwSize))
{
*pdwReturn = ERROR_SUCCESS;
}
else
{
// Return a meaningful
// error value.
*pdwReturn = GetLastError();
if(ERROR_SUCCESS == *pdwReturn)
{
*pdwReturn = ERROR_WRITE_FAULT;
}
// Make sure we return failure
// if the write didn't succeded.
if(SUCCEEDED(hResult))
{
hResult = HRESULT_FROM_WIN32(*pdwReturn);
}
}
}
return hResult;
}
|