Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

557 lines
10 KiB

  1. /*++
  2. Copyright (c) 1997 Microsoft Corporation
  3. Module Name:
  4. yspool.c
  5. This file was duplicated from private\windows\spooler\spoolss\server\yspool.c
  6. Only useful functions have been kept (only those that go through the GDI message queue)
  7. Abstract:
  8. This module provides all the public exported APIs relating to Printer
  9. and Job management for the Print Providor Routing layer
  10. Author:
  11. Dave Snipp (DaveSn) 15-Mar-1991
  12. [Notes:]
  13. optional-notes
  14. Revision History:
  15. swilson 1-Jun-95 Converted winspool.c to yspool: the merging point of KM & RPC paths
  16. Nicolas Biju-Duval Dec-97 Adaptation for Hydra :
  17. - call to winspool.drv functions
  18. - removed all useless stuff (since we only deal with KM requests)
  19. --*/
  20. #include "precomp.h"
  21. #pragma hdrstop
  22. #include <ntddrdr.h>
  23. #include <stdio.h>
  24. #include <windows.h>
  25. #include <winspool.h>
  26. #include <winspl.h>
  27. #define MIN_DEVMODE_SIZEW 72
  28. #define MIN_DEVMODE_SIZEA 40
  29. //
  30. // We must define these to get the data arrays in data.h to
  31. // load. This avoids a multiple definition problem.
  32. //
  33. #define PRINTER_OFFSETS 1
  34. #define JOB_OFFSETS 1
  35. #define DRIVER_OFFSETS 1
  36. #define FORM_OFFSETS 1
  37. #define ADDJOB_OFFSETS 1
  38. #define FORM_OFFSETS 1
  39. #define PORT_OFFSETS 1
  40. #define PRINTPROCESSOR_OFFSETS 1
  41. #define MONITOR_OFFSETS 1
  42. #define DATATYPE_OFFSETS 1
  43. #include <data.h>
  44. //
  45. // Remove their macros...
  46. //
  47. #undef DBG_TIME
  48. #undef DBGMSG
  49. #undef SPLASSERT
  50. #undef AllocSplMem
  51. #undef FreeSplMem
  52. #include "wingdip.h"
  53. #include "musspl.h"
  54. DWORD ServerHandleCount = 0;
  55. BOOL
  56. InvalidDevModeContainer(
  57. LPDEVMODE_CONTAINER pDevModeContainer
  58. )
  59. {
  60. PDEVMODE pDevMode = (PDEVMODE) pDevModeContainer->pDevMode;
  61. DWORD dwSize = pDevMode ? pDevMode->dmSize + pDevMode->dmDriverExtra : 0;
  62. return dwSize != (DWORD)pDevModeContainer->cbBuf ||
  63. ( dwSize && dwSize < MIN_DEVMODE_SIZEW );
  64. }
  65. void
  66. MarshallDownStructure(
  67. LPBYTE lpStructure,
  68. LPDWORD lpOffsets
  69. )
  70. {
  71. register DWORD i=0;
  72. if (!lpStructure)
  73. return;
  74. while (lpOffsets[i] != -1) {
  75. if ((*(LPBYTE*)(lpStructure+lpOffsets[i]))) {
  76. (*(LPBYTE*)(lpStructure+lpOffsets[i]))-=(UINT_PTR)lpStructure;
  77. }
  78. i++;
  79. }
  80. }
  81. DWORD
  82. YOpenPrinter(
  83. LPWSTR pPrinterName,
  84. HANDLE *phPrinter,
  85. LPWSTR pDatatype,
  86. LPDEVMODE_CONTAINER pDevModeContainer,
  87. DWORD AccessRequired,
  88. BOOL bRpc
  89. )
  90. {
  91. PRINTER_DEFAULTS Defaults;
  92. BOOL bRet;
  93. if ( InvalidDevModeContainer(pDevModeContainer) ) {
  94. return ERROR_INVALID_PARAMETER;
  95. }
  96. Defaults.pDatatype = pDatatype;
  97. Defaults.pDevMode = (LPDEVMODE)pDevModeContainer->pDevMode;
  98. Defaults.DesiredAccess = AccessRequired;
  99. bRet = OpenPrinter(pPrinterName, phPrinter, &Defaults);
  100. if (bRet) {
  101. InterlockedIncrement ( &ServerHandleCount );
  102. return ERROR_SUCCESS;
  103. } else {
  104. *phPrinter = NULL;
  105. return GetLastError();
  106. }
  107. UNREFERENCED_PARAMETER(bRpc);
  108. }
  109. DWORD
  110. YGetPrinter(
  111. HANDLE hPrinter,
  112. DWORD Level,
  113. LPBYTE pPrinter,
  114. DWORD cbBuf,
  115. LPDWORD pcbNeeded,
  116. BOOL bRpc
  117. )
  118. {
  119. BOOL ReturnValue;
  120. DWORD *pOffsets;
  121. *pcbNeeded = 0;
  122. switch (Level) {
  123. case STRESSINFOLEVEL:
  124. pOffsets = PrinterInfoStressOffsets;
  125. break;
  126. case 1:
  127. pOffsets = PrinterInfo1Offsets;
  128. break;
  129. case 2:
  130. pOffsets = PrinterInfo2Offsets;
  131. break;
  132. case 3:
  133. pOffsets = PrinterInfo3Offsets;
  134. break;
  135. case 4:
  136. pOffsets = PrinterInfo4Offsets;
  137. break;
  138. case 5:
  139. pOffsets = PrinterInfo5Offsets;
  140. break;
  141. default:
  142. return ERROR_INVALID_LEVEL;
  143. }
  144. ReturnValue = GetPrinter(hPrinter, Level, pPrinter, cbBuf, pcbNeeded);
  145. if (ReturnValue) {
  146. MarshallDownStructure(pPrinter, pOffsets);
  147. return ERROR_SUCCESS;
  148. } else
  149. return GetLastError();
  150. UNREFERENCED_PARAMETER(bRpc);
  151. }
  152. DWORD
  153. YStartDocPrinter(
  154. HANDLE hPrinter,
  155. LPDOC_INFO_CONTAINER pDocInfoContainer,
  156. LPDWORD pJobId,
  157. BOOL bRpc
  158. )
  159. {
  160. LPWSTR pChar;
  161. if( pDocInfoContainer->Level != 1 ){
  162. RaiseException( ERROR_INVALID_USER_BUFFER,
  163. EXCEPTION_NONCONTINUABLE,
  164. 0,
  165. NULL );
  166. }
  167. try {
  168. if( pDocInfoContainer->DocInfo.pDocInfo1->pDocName ){
  169. for( pChar = pDocInfoContainer->DocInfo.pDocInfo1->pDocName;
  170. *pChar;
  171. ++pChar )
  172. ;
  173. }
  174. if( pDocInfoContainer->DocInfo.pDocInfo1->pOutputFile ){
  175. for( pChar = pDocInfoContainer->DocInfo.pDocInfo1->pOutputFile;
  176. *pChar;
  177. ++pChar )
  178. ;
  179. }
  180. if( pDocInfoContainer->DocInfo.pDocInfo1->pDatatype ){
  181. for( pChar = pDocInfoContainer->DocInfo.pDocInfo1->pDatatype;
  182. *pChar;
  183. ++pChar )
  184. ;
  185. }
  186. } except( EXCEPTION_EXECUTE_HANDLER ){
  187. RaiseException( ERROR_INVALID_USER_BUFFER,
  188. EXCEPTION_NONCONTINUABLE,
  189. 0,
  190. NULL );
  191. }
  192. *pJobId = StartDocPrinter(hPrinter, pDocInfoContainer->Level,
  193. (LPBYTE)pDocInfoContainer->DocInfo.pDocInfo1);
  194. if (*pJobId)
  195. return ERROR_SUCCESS;
  196. else
  197. return GetLastError();
  198. UNREFERENCED_PARAMETER(bRpc);
  199. }
  200. DWORD
  201. YStartPagePrinter(
  202. HANDLE hPrinter,
  203. BOOL bRpc
  204. )
  205. {
  206. BOOL bRet;
  207. bRet = StartPagePrinter(hPrinter);
  208. if (bRet)
  209. return ERROR_SUCCESS;
  210. else
  211. return GetLastError();
  212. UNREFERENCED_PARAMETER(bRpc);
  213. }
  214. DWORD
  215. YWritePrinter(
  216. HANDLE hPrinter,
  217. LPBYTE pBuf,
  218. DWORD cbBuf,
  219. LPDWORD pcWritten,
  220. BOOL bRpc
  221. )
  222. {
  223. BOOL bRet;
  224. bRet = WritePrinter(hPrinter, pBuf, cbBuf, pcWritten);
  225. if (bRet)
  226. return ERROR_SUCCESS;
  227. else
  228. return GetLastError();
  229. UNREFERENCED_PARAMETER(bRpc);
  230. }
  231. DWORD
  232. YEndPagePrinter(
  233. HANDLE hPrinter,
  234. BOOL bRpc
  235. )
  236. {
  237. BOOL bRet;
  238. bRet = EndPagePrinter(hPrinter);
  239. if (bRet)
  240. return ERROR_SUCCESS;
  241. else
  242. return GetLastError();
  243. UNREFERENCED_PARAMETER(bRpc);
  244. }
  245. DWORD
  246. YAbortPrinter(
  247. HANDLE hPrinter,
  248. BOOL bRpc
  249. )
  250. {
  251. BOOL bRet;
  252. bRet = AbortPrinter(hPrinter);
  253. if (bRet)
  254. return ERROR_SUCCESS;
  255. else
  256. return GetLastError();
  257. UNREFERENCED_PARAMETER(bRpc);
  258. }
  259. DWORD
  260. YEndDocPrinter(
  261. HANDLE hPrinter,
  262. BOOL bRpc
  263. )
  264. {
  265. BOOL bRet;
  266. bRet = EndDocPrinter(hPrinter);
  267. if (bRet)
  268. return ERROR_SUCCESS;
  269. else
  270. return GetLastError();
  271. UNREFERENCED_PARAMETER(bRpc);
  272. }
  273. DWORD
  274. YGetPrinterData(
  275. HANDLE hPrinter,
  276. LPTSTR pValueName,
  277. LPDWORD pType,
  278. LPBYTE pData,
  279. DWORD nSize,
  280. LPDWORD pcbNeeded,
  281. BOOL bRpc
  282. )
  283. {
  284. DWORD dwRet;
  285. dwRet = GetPrinterData(hPrinter, pValueName, pType,
  286. pData, nSize, pcbNeeded);
  287. return dwRet;
  288. UNREFERENCED_PARAMETER(bRpc);
  289. }
  290. DWORD
  291. YSetPrinterData(
  292. HANDLE hPrinter,
  293. LPTSTR pValueName,
  294. DWORD Type,
  295. LPBYTE pData,
  296. DWORD cbData,
  297. BOOL bRpc
  298. )
  299. {
  300. DWORD dwRet;
  301. dwRet = SetPrinterData(hPrinter, pValueName, Type, pData, cbData);
  302. return dwRet;
  303. UNREFERENCED_PARAMETER(bRpc);
  304. }
  305. DWORD
  306. YClosePrinter(
  307. LPHANDLE phPrinter,
  308. BOOL bRpc
  309. )
  310. {
  311. BOOL bRet;
  312. bRet = ClosePrinter(*phPrinter);
  313. *phPrinter = NULL; // NULL out handle so bRpc knows to close it down.
  314. if (bRet) {
  315. InterlockedDecrement( &ServerHandleCount );
  316. return ERROR_SUCCESS;
  317. } else
  318. return GetLastError();
  319. UNREFERENCED_PARAMETER(bRpc);
  320. }
  321. DWORD
  322. YGetForm(
  323. PRINTER_HANDLE hPrinter,
  324. LPWSTR pFormName,
  325. DWORD Level,
  326. LPBYTE pForm,
  327. DWORD cbBuf,
  328. LPDWORD pcbNeeded,
  329. BOOL bRpc
  330. )
  331. {
  332. BOOL bRet;
  333. bRet = GetForm(hPrinter, pFormName, Level, pForm, cbBuf, pcbNeeded);
  334. if (bRet) {
  335. MarshallDownStructure(pForm, FormInfo1Offsets);
  336. return ERROR_SUCCESS;
  337. } else
  338. return GetLastError();
  339. UNREFERENCED_PARAMETER(bRpc);
  340. }
  341. DWORD
  342. YEnumForms(
  343. PRINTER_HANDLE hPrinter,
  344. DWORD Level,
  345. LPBYTE pForm,
  346. DWORD cbBuf,
  347. LPDWORD pcbNeeded,
  348. LPDWORD pcReturned,
  349. BOOL bRpc
  350. )
  351. {
  352. BOOL bRet;
  353. DWORD cReturned, cbStruct;
  354. DWORD *pOffsets;
  355. switch (Level) {
  356. case 1:
  357. pOffsets = FormInfo1Offsets;
  358. cbStruct = sizeof(FORM_INFO_1);
  359. break;
  360. default:
  361. return ERROR_INVALID_LEVEL;
  362. }
  363. bRet = EnumForms(hPrinter, Level, pForm, cbBuf, pcbNeeded, pcReturned);
  364. if (bRet) {
  365. cReturned=*pcReturned;
  366. while (cReturned--) {
  367. MarshallDownStructure(pForm, pOffsets);
  368. pForm+=cbStruct;
  369. }
  370. return ERROR_SUCCESS;
  371. } else
  372. return GetLastError();
  373. UNREFERENCED_PARAMETER(bRpc);
  374. }
  375. DWORD
  376. YGetPrinterDriver(
  377. HANDLE hPrinter,
  378. LPWSTR pEnvironment,
  379. DWORD Level,
  380. LPBYTE pDriverInfo,
  381. DWORD cbBuf,
  382. LPDWORD pcbNeeded,
  383. BOOL bRpc
  384. )
  385. {
  386. DWORD *pOffsets;
  387. BOOL bRet;
  388. switch (Level) {
  389. case 1:
  390. pOffsets = DriverInfo1Offsets;
  391. break;
  392. case 2:
  393. pOffsets = DriverInfo2Offsets;
  394. break;
  395. case 3:
  396. pOffsets = DriverInfo3Offsets;
  397. break;
  398. default:
  399. return ERROR_INVALID_LEVEL;
  400. }
  401. //
  402. // Determine if we want the most recent driver
  403. //
  404. bRet = GetPrinterDriverW(hPrinter, pEnvironment, Level, pDriverInfo,
  405. cbBuf, pcbNeeded);
  406. if (bRet) {
  407. MarshallDownStructure(pDriverInfo, pOffsets);
  408. return ERROR_SUCCESS;
  409. } else
  410. return GetLastError();
  411. UNREFERENCED_PARAMETER(bRpc);
  412. }