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.

1267 lines
31 KiB

  1. /*++
  2. Copyright (c) 1990 - 1996 Microsoft Corporation
  3. All rights reserved
  4. Module Name:
  5. winspool.idl
  6. Abstract:
  7. A very simple interface which is part of an RPC application (client and
  8. server) demonstrating how to use RPC on NT.
  9. Author:
  10. mikemon 12-10-90 Created.
  11. Environment:
  12. User Mode -Win32
  13. Revision History:
  14. --*/
  15. [
  16. uuid(12345678-1234-ABCD-EF00-0123456789AB),
  17. version(1.0),
  18. #ifdef __midl
  19. ms_union,
  20. #endif // __midl
  21. endpoint("mscn_np:[\\pipe\\spoolss]"),
  22. pointer_default(unique)
  23. ]
  24. interface winspool
  25. {
  26. import "import.idl";
  27. #include "..\inc\ntfytab.h"
  28. //
  29. // Maximum space reserved for passing additional data in RpcReplyOpenPrinter,
  30. // RpcRouterReplyPrinter and RpcRemoteFindFirstPrinterChangeNotifications.
  31. //
  32. const DWORD kRpcMaxBufferSize = 512;
  33. //
  34. // Maximum space that can be requested on calls to RpcGetSpoolFileInfo and
  35. // RpcCommitSpoolData. The size is of a SPOOL_FILE_INFO_1 structure in bytes.
  36. //
  37. const DWORD kSpoolFileInfoMaxBufferSize = sizeof(SPOOL_FILE_INFO_1);
  38. typedef WORD TABLE;
  39. typedef struct _NOTIFY_ATTRIB_TABLE {
  40. WORD Attrib;
  41. TABLE Table;
  42. } NOTIFY_ATTRIB_TABLE, *PNOTIFY_ATTRIB_TABLE;
  43. typedef [context_handle] void *PRINTER_HANDLE;
  44. typedef [context_handle] void *GDI_HANDLE;
  45. typedef [handle] wchar_t *STRING_HANDLE;
  46. typedef [string] wchar_t *SPL_STRING;
  47. typedef struct _PORT_VAR_CONTAINER {
  48. DWORD cbMonitorData;
  49. [size_is(cbMonitorData), unique] LPBYTE pMonitorData;
  50. } PORT_VAR_CONTAINER, *PPORT_VAR_CONTAINER, *LPPORT_VAR_CONTAINER;
  51. typedef struct _PORT_CONTAINER {
  52. DWORD Level;
  53. [switch_is(Level)] union {
  54. [case(1)]
  55. LPPORT_INFO_1W pPortInfo1;
  56. [case(2)]
  57. LPPORT_INFO_2W pPortInfo2;
  58. [case(3)]
  59. LPPORT_INFO_3W pPortInfo3;
  60. [case((DWORD)-1)]
  61. LPPORT_INFO_FFW pPortInfoFF;
  62. } PortInfo;
  63. } PORT_CONTAINER, *PPORT_CONTAINER, *LPPORT_CONTAINER;
  64. typedef struct _DEVMODE_CONTAINER {
  65. DWORD cbBuf;
  66. [size_is(cbBuf), unique] LPBYTE pDevMode;
  67. } DEVMODE_CONTAINER, *PDEVMODE_CONTAINER, *LPDEVMODE_CONTAINER;
  68. typedef struct _SECURITY_CONTAINER {
  69. DWORD cbBuf;
  70. [size_is(cbBuf), unique] LPBYTE pSecurity;
  71. } SECURITY_CONTAINER, *PSECURITY_CONTAINER, *LPSECURITY_CONTAINER;
  72. typedef struct _PRINTER_CONTAINER {
  73. DWORD Level;
  74. [switch_is(Level)] union {
  75. [case(0)]
  76. LPPRINTER_INFO_STRESSW pPrinterInfoStress;
  77. [case(1)]
  78. LPPRINTER_INFO_1W pPrinterInfo1;
  79. [case(2)]
  80. LPPRINTER_INFO_2W pPrinterInfo2;
  81. [case(3)]
  82. LPPRINTER_INFO_3 pPrinterInfo3;
  83. [case(4)]
  84. LPPRINTER_INFO_4W pPrinterInfo0;
  85. [case(5)]
  86. LPPRINTER_INFO_5W pPrinterInfo5;
  87. [case(6)]
  88. LPPRINTER_INFO_6 pPrinterInfo6;
  89. [case(7)]
  90. LPPRINTER_INFO_7W pPrinterInfo7;
  91. [case(8)]
  92. LPPRINTER_INFO_8W pPrinterInfo8;
  93. [case(9)]
  94. LPPRINTER_INFO_9W pPrinterInfo9;
  95. } PrinterInfo;
  96. } PRINTER_CONTAINER, *PPRINTER_CONTAINER, *LPPRINTER_CONTAINER;
  97. typedef struct _JOB_CONTAINER {
  98. DWORD Level;
  99. [switch_is(Level)] union {
  100. [case(1)]
  101. JOB_INFO_1W *Level1;
  102. [case(2)]
  103. JOB_INFO_2W *Level2;
  104. [case(3)]
  105. JOB_INFO_3 *Level3;
  106. } JobInfo;
  107. } JOB_CONTAINER, *PJOB_CONTAINER, *LPJOB_CONTAINER;
  108. typedef struct _RPC_DRIVER_INFO_3W {
  109. DWORD cVersion;
  110. SPL_STRING pName;
  111. SPL_STRING pEnvironment;
  112. SPL_STRING pDriverPath;
  113. SPL_STRING pDataFile;
  114. SPL_STRING pConfigFile;
  115. SPL_STRING pHelpFile;
  116. SPL_STRING pMonitorName;
  117. SPL_STRING pDefaultDataType;
  118. DWORD cchDependentFiles;
  119. [size_is(cchDependentFiles), unique] WCHAR *pDependentFiles;
  120. } RPC_DRIVER_INFO_3W, *PRPC_DRIVER_INFO_3W, *LPRPC_DRIVER_INFO_3W;
  121. typedef struct _RPC_DRIVER_INFO_4W {
  122. DWORD cVersion;
  123. SPL_STRING pName;
  124. SPL_STRING pEnvironment;
  125. SPL_STRING pDriverPath;
  126. SPL_STRING pDataFile;
  127. SPL_STRING pConfigFile;
  128. SPL_STRING pHelpFile;
  129. SPL_STRING pMonitorName;
  130. SPL_STRING pDefaultDataType;
  131. DWORD cchDependentFiles;
  132. [size_is(cchDependentFiles), unique] WCHAR *pDependentFiles;
  133. DWORD cchPreviousNames;
  134. [size_is(cchPreviousNames), unique] WCHAR *pszzPreviousNames;
  135. } RPC_DRIVER_INFO_4W, *PRPC_DRIVER_INFO_4W, *LPRPC_DRIVER_INFO_4W;
  136. typedef struct _RPC_DRIVER_INFO_6W {
  137. DWORD cVersion;
  138. SPL_STRING pName;
  139. SPL_STRING pEnvironment;
  140. SPL_STRING pDriverPath;
  141. SPL_STRING pDataFile;
  142. SPL_STRING pConfigFile;
  143. SPL_STRING pHelpFile;
  144. SPL_STRING pMonitorName;
  145. SPL_STRING pDefaultDataType;
  146. DWORD cchDependentFiles;
  147. [size_is(cchDependentFiles), unique] WCHAR *pDependentFiles;
  148. DWORD cchPreviousNames;
  149. [size_is(cchPreviousNames), unique] WCHAR *pszzPreviousNames;
  150. FILETIME ftDriverDate;
  151. DWORDLONG dwlDriverVersion;
  152. SPL_STRING pMfgName;
  153. SPL_STRING pOEMUrl;
  154. SPL_STRING pHardwareID;
  155. SPL_STRING pProvider;
  156. } RPC_DRIVER_INFO_6W, *PRPC_DRIVER_INFO_6W, *LPRPC_DRIVER_INFO_6W;
  157. typedef struct _DRIVER_CONTAINER {
  158. DWORD Level;
  159. [switch_is(Level)] union {
  160. [case(1)]
  161. LPDRIVER_INFO_1W Level1;
  162. [case(2)]
  163. LPDRIVER_INFO_2W Level2;
  164. [case(3)]
  165. LPRPC_DRIVER_INFO_3W Level3;
  166. [case(4)]
  167. LPRPC_DRIVER_INFO_4W Level4;
  168. [case(6)]
  169. LPRPC_DRIVER_INFO_6W Level6;
  170. } DriverInfo;
  171. } DRIVER_CONTAINER, *PDRIVER_CONTAINER, *LPDRIVER_CONTAINER;
  172. typedef struct _RPC_DRIVER_INFCAT_INFO_1 {
  173. [string, ref] wchar_t *pszCatPath;
  174. [string, unique] wchar_t *pszCatNameOnSystem;
  175. } RPC_DRIVER_INFCAT_INFO_1, *PRPC_DRIVER_INFCAT_INFO_1, *LPRPC_DRIVER_INFCAT_INFO_1;
  176. typedef struct _RPC_DRIVER_INFCAT_INFO_2 {
  177. [string, ref] wchar_t *pszCatPath;
  178. [string, ref] wchar_t *pszInfPath;
  179. [string, unique] wchar_t *pszSrcLoc;
  180. DWORD dwMediaType;
  181. DWORD dwCopyStyle;
  182. } RPC_DRIVER_INFCAT_INFO_2, *PRPC_DRIVER_INFCAT_INFO_2, *LPRPC_DRIVER_INFCAT_INFO_2;
  183. typedef struct _DRIVER_INFCAT_CONTAINER {
  184. DWORD dwLevel;
  185. [switch_is(dwLevel)] union {
  186. [case(1)]
  187. LPRPC_DRIVER_INFCAT_INFO_1 pDriverInfCatInfo1;
  188. [case(2)]
  189. LPRPC_DRIVER_INFCAT_INFO_2 pDriverInfCatInfo2;
  190. } DriverInfCatInfo;
  191. } DRIVER_INFCAT_CONTAINER, *PDRIVER_INFCAT_CONTAINER, *LPDRIVER_INFCAT_CONTAINER;
  192. typedef struct _DOC_INFO_CONTAINER {
  193. DWORD Level;
  194. [switch_is(Level)] union {
  195. [case(1)]
  196. LPDOC_INFO_1W pDocInfo1;
  197. } DocInfo;
  198. } DOC_INFO_CONTAINER, *PDOC_INFO_CONTAINER, *LPDOC_INFO_CONTAINER;
  199. typedef struct _FORM_CONTAINER {
  200. DWORD Level;
  201. [switch_is(Level)] union {
  202. [case(1)]
  203. LPFORM_INFO_1W pFormInfo1;
  204. } FormInfo;
  205. } FORM_CONTAINER, *PFORM_CONTAINER, *LPFORM_CONTAINER;
  206. typedef struct _MONITOR_CONTAINER {
  207. DWORD Level;
  208. [switch_is(Level)] union {
  209. [case(1)]
  210. LPMONITOR_INFO_1W pMonitorInfo1;
  211. [case(2)]
  212. LPMONITOR_INFO_2W pMonitorInfo2;
  213. } MonitorInfo;
  214. } MONITOR_CONTAINER, *PMONITOR_CONTAINER, *LPMONITOR_CONTAINER;
  215. typedef struct _RPC_PROVIDOR_INFO_2W {
  216. DWORD cchOrder;
  217. [size_is(cchOrder), unique] WCHAR *pOrder;
  218. } RPC_PROVIDOR_INFO_2W, *PRPC_PROVIDOR_INFO_2W, *LPRPC_PROVIDOR_INFO_2W;
  219. typedef struct _PROVIDOR_CONTAINER {
  220. DWORD Level;
  221. [switch_is(Level)] union {
  222. [case(1)]
  223. LPPROVIDOR_INFO_1W pProvidorInfo1;
  224. [case(2)]
  225. LPRPC_PROVIDOR_INFO_2W pRpcProvidorInfo2;
  226. } ProvidorInfo;
  227. } PROVIDOR_CONTAINER, *PPROVIDOR_CONTAINER, *LPPROVIDOR_CONTAINER;
  228. typedef struct _SPLCLIENT_CONTAINER {
  229. DWORD Level;
  230. [switch_is(Level)] union {
  231. [case(1)]
  232. LPSPLCLIENT_INFO_1 pClientInfo1;
  233. [case(2)]
  234. LPSPLCLIENT_INFO_2 pClientInfo2;
  235. } ClientInfo;
  236. } SPLCLIENT_CONTAINER, *PSPLCLIENT_CONTAINER, *LPSPLCLIENT_CONTAINER;
  237. typedef struct _FILE_INFO_CONTAINER {
  238. DWORD Level;
  239. [switch_is(Level)] union {
  240. [case(1)]
  241. SPOOL_FILE_INFO_1 *Level1;
  242. [default];
  243. } FileInfo;
  244. } FILE_INFO_CONTAINER, *PFILE_INFO_CONTAINER, *LPFILE_INFO_CONTAINER;
  245. typedef struct _STRING_CONTAINER {
  246. DWORD cbBuf;
  247. [size_is(cbBuf/2), unique] LPWSTR pszString;
  248. } STRING_CONTAINER, *PSTRING_CONTAINER;
  249. typedef struct _RPC_BINARY_CONTAINER {
  250. DWORD cbBuf;
  251. [size_is(cbBuf), unique] LPBYTE pszString;
  252. } RPC_BINARY_CONTAINER, *PRPC_BINARY_CONTAINER;
  253. typedef struct _SYSTEMTIME_CONTAINER {
  254. DWORD cbBuf;
  255. PSYSTEMTIME pSystemTime;
  256. } SYSTEMTIME_CONTAINER, *PSYSTEMTIME_CONTAINER;
  257. typedef struct _RPC_V2_NOTIFY_OPTIONS_TYPE {
  258. WORD Type;
  259. WORD Reserved0;
  260. DWORD Reserved1;
  261. DWORD Reserved2;
  262. DWORD Count;
  263. [size_is(Count), unique] PWORD pFields;
  264. } RPC_V2_NOTIFY_OPTIONS_TYPE, *PRPC_V2_NOTIFY_OPTIONS_TYPE;
  265. typedef struct _RPC_V2_NOTIFY_OPTIONS {
  266. DWORD Version;
  267. DWORD Reserved;
  268. DWORD Count;
  269. [size_is(Count), unique] PRPC_V2_NOTIFY_OPTIONS_TYPE pTypes;
  270. } RPC_V2_NOTIFY_OPTIONS, *PRPC_V2_NOTIFY_OPTIONS;
  271. typedef [switch_type(DWORD)] union _RPC_V2_NOTIFY_INFO_DATA_DATA {
  272. [case(TABLE_STRING)]
  273. STRING_CONTAINER String;
  274. [case(TABLE_DWORD)]
  275. DWORD dwData[2];
  276. [case(TABLE_TIME)]
  277. SYSTEMTIME_CONTAINER SystemTime;
  278. [case(TABLE_DEVMODE)]
  279. DEVMODE_CONTAINER DevMode;
  280. [case(TABLE_SECURITYDESCRIPTOR)]
  281. SECURITY_CONTAINER SecurityDescriptor;
  282. } RPC_V2_NOTIFY_INFO_DATA_DATA, *PRPC_V2_NOTIFY_INFO_DATA_DATA;
  283. typedef struct _RPC_V2_NOTIFY_INFO_DATA {
  284. WORD Type;
  285. WORD Field;
  286. DWORD Reserved;
  287. DWORD Id;
  288. [switch_is(Reserved & 0xffff)] RPC_V2_NOTIFY_INFO_DATA_DATA Data;
  289. } RPC_V2_NOTIFY_INFO_DATA, *PRPC_V2_NOTIFY_INFO_DATA;
  290. typedef struct _RPC_V2_NOTIFY_INFO {
  291. DWORD Version;
  292. DWORD Flags;
  293. DWORD Count;
  294. [size_is(Count), unique] RPC_V2_NOTIFY_INFO_DATA aData[];
  295. } RPC_V2_NOTIFY_INFO, *PRPC_V2_NOTIFY_INFO;
  296. typedef [switch_type(DWORD)] union _RPC_V2_UREPLY_PRINTER {
  297. [case (REPLY_PRINTER_CHANGE)]
  298. PRPC_V2_NOTIFY_INFO pInfo;
  299. } RPC_V2_UREPLY_PRINTER, *PRPC_V2_UREPLY_PRINTER;
  300. DWORD
  301. RpcEnumPrinters(
  302. [in] DWORD Flags,
  303. [in, string, unique] STRING_HANDLE Name,
  304. [in] DWORD Level,
  305. [in, out, unique, size_is(cbBuf)] LPBYTE pPrinterEnum,
  306. [in] DWORD cbBuf,
  307. [out] LPDWORD pcbNeeded,
  308. [out] LPDWORD pcReturned
  309. );
  310. DWORD
  311. RpcOpenPrinter(
  312. [in, string, unique] STRING_HANDLE pPrinterName,
  313. [out] PRINTER_HANDLE *pHandle,
  314. [in, string, unique] wchar_t * pDatatype,
  315. [in] LPDEVMODE_CONTAINER pDevMode,
  316. [in] DWORD AccessRequired
  317. );
  318. DWORD
  319. RpcSetJob(
  320. [in] PRINTER_HANDLE hPrinter,
  321. [in] DWORD JobId,
  322. [in, unique] LPJOB_CONTAINER pJobContainer,
  323. [in] DWORD Command
  324. );
  325. DWORD
  326. RpcGetJob(
  327. [in] PRINTER_HANDLE hPrinter,
  328. [in] DWORD JobId,
  329. [in] DWORD Level,
  330. [in, out, unique, size_is(cbBuf)] LPBYTE pJob,
  331. [in] DWORD cbBuf,
  332. [out] LPDWORD pcbNeeded
  333. );
  334. DWORD
  335. RpcEnumJobs(
  336. [in] PRINTER_HANDLE hPrinter,
  337. [in] DWORD FirstJob,
  338. [in] DWORD NoJobs,
  339. [in] DWORD Level,
  340. [in, out, unique, size_is(cbBuf)] LPBYTE pJob,
  341. [in] DWORD cbBuf,
  342. [out] LPDWORD pcbNeeded,
  343. [out] LPDWORD pcReturned
  344. );
  345. DWORD
  346. RpcAddPrinter(
  347. [in, string, unique] STRING_HANDLE pName,
  348. [in] PPRINTER_CONTAINER pPrinterContainer,
  349. [in] PDEVMODE_CONTAINER pDevModeContainer,
  350. [in] PSECURITY_CONTAINER pSecurityContainer,
  351. [out] PRINTER_HANDLE *pHandle
  352. );
  353. DWORD
  354. RpcDeletePrinter(
  355. [in] PRINTER_HANDLE hPrinter
  356. );
  357. DWORD
  358. RpcSetPrinter(
  359. [in] PRINTER_HANDLE hPrinter,
  360. [in] PPRINTER_CONTAINER pPrinterContainer,
  361. [in] PDEVMODE_CONTAINER pDevModeContainer,
  362. [in] PSECURITY_CONTAINER pSecurityContainer,
  363. [in] DWORD Command
  364. );
  365. DWORD
  366. RpcGetPrinter(
  367. [in] PRINTER_HANDLE hPrinter,
  368. [in] DWORD Level,
  369. [in, out, unique, size_is(cbBuf)] LPBYTE pPrinter,
  370. [in] DWORD cbBuf,
  371. [out] LPDWORD pcbNeeded
  372. );
  373. DWORD
  374. RpcAddPrinterDriver(
  375. [in, string, unique] STRING_HANDLE pName,
  376. [in] PDRIVER_CONTAINER pDriverContainer
  377. );
  378. DWORD
  379. RpcEnumPrinterDrivers(
  380. [in, string, unique] STRING_HANDLE pName,
  381. [in, unique, string] wchar_t * pEnvironment,
  382. [in] DWORD Level,
  383. [in, out, unique, size_is(cbBuf)] LPBYTE pDrivers,
  384. [in] DWORD cbBuf,
  385. [out] LPDWORD pcbNeeded,
  386. [out] LPDWORD pcReturned
  387. );
  388. DWORD
  389. RpcGetPrinterDriver(
  390. [in] PRINTER_HANDLE hPrinter,
  391. [in, unique, string] wchar_t * pEnvironment,
  392. [in] DWORD Level,
  393. [in, out, unique, size_is(cbBuf)] LPBYTE pDriver,
  394. [in] DWORD cbBuf,
  395. [out] LPDWORD pcbNeeded
  396. );
  397. DWORD
  398. RpcGetPrinterDriverDirectory(
  399. [in, string, unique] STRING_HANDLE pName,
  400. [in, unique, string] wchar_t * pEnvironment,
  401. [in] DWORD Level,
  402. [in, out, unique, size_is(cbBuf)] LPBYTE pDriverDirectory,
  403. [in] DWORD cbBuf,
  404. [out] LPDWORD pcbNeeded
  405. );
  406. DWORD
  407. RpcDeletePrinterDriver(
  408. [in, string, unique] STRING_HANDLE pName,
  409. [in, string] wchar_t * pEnvironment,
  410. [in, string] wchar_t * pDriverName
  411. );
  412. DWORD
  413. RpcAddPrintProcessor(
  414. [in, string, unique] STRING_HANDLE pName,
  415. [in, string] wchar_t * pEnvironment,
  416. [in, string] wchar_t * pPathName,
  417. [in, string] wchar_t * pPrintProcessorName
  418. );
  419. DWORD
  420. RpcEnumPrintProcessors(
  421. [in, string, unique] STRING_HANDLE pName,
  422. [in, unique, string] wchar_t * pEnvironment,
  423. [in] DWORD Level,
  424. [in, out, unique, size_is(cbBuf)] LPBYTE pPrintProcessorInfo,
  425. [in] DWORD cbBuf,
  426. [out] LPDWORD pcbNeeded,
  427. [out] LPDWORD pcReturned
  428. );
  429. DWORD
  430. RpcGetPrintProcessorDirectory(
  431. [in, string, unique] STRING_HANDLE pName,
  432. [in, unique, string] wchar_t * pEnvironment,
  433. [in] DWORD Level,
  434. [in, out, unique, size_is(cbBuf)] LPBYTE pPrintProcessorDirectory,
  435. [in] DWORD cbBuf,
  436. [out] LPDWORD pcbNeeded
  437. );
  438. DWORD
  439. RpcStartDocPrinter(
  440. [in] PRINTER_HANDLE hPrinter,
  441. [in] PDOC_INFO_CONTAINER pDocInfoContainer,
  442. [out] LPDWORD pJobId
  443. );
  444. DWORD
  445. RpcStartPagePrinter(
  446. [in] PRINTER_HANDLE hPrinter
  447. );
  448. DWORD
  449. RpcWritePrinter(
  450. [in] PRINTER_HANDLE hPrinter,
  451. [in, size_is(cbBuf)] LPBYTE pBuf,
  452. [in] DWORD cbBuf,
  453. [out] LPDWORD pcWritten
  454. );
  455. DWORD
  456. RpcEndPagePrinter(
  457. [in] PRINTER_HANDLE hPrinter
  458. );
  459. DWORD
  460. RpcAbortPrinter(
  461. [in] PRINTER_HANDLE hPrinter
  462. );
  463. DWORD
  464. RpcReadPrinter(
  465. [in] PRINTER_HANDLE hPrinter,
  466. [out, size_is(cbBuf)] LPBYTE pBuf,
  467. [in] DWORD cbBuf,
  468. [out] LPDWORD pcNoBytesRead
  469. );
  470. DWORD
  471. RpcEndDocPrinter(
  472. [in] PRINTER_HANDLE hPrinter
  473. );
  474. DWORD
  475. RpcAddJob(
  476. [in] PRINTER_HANDLE hPrinter,
  477. [in] DWORD Level,
  478. [in, out, unique, size_is(cbBuf)] LPBYTE pAddJob,
  479. [in] DWORD cbBuf,
  480. [out] LPDWORD pcbNeeded
  481. );
  482. DWORD
  483. RpcScheduleJob(
  484. [in] PRINTER_HANDLE hPrinter,
  485. [in] DWORD JobId
  486. );
  487. DWORD
  488. RpcGetPrinterData(
  489. [in] PRINTER_HANDLE hPrinter,
  490. [in, string] wchar_t * pValueName,
  491. [out] LPDWORD pType,
  492. [out, size_is(nSize)] LPBYTE pData,
  493. [in] DWORD nSize,
  494. [out] LPDWORD pcbNeeded
  495. );
  496. DWORD
  497. RpcSetPrinterData(
  498. [in] PRINTER_HANDLE hPrinter,
  499. [in, string] wchar_t * pValueName,
  500. [in] DWORD Type,
  501. [in, size_is(cbData)] LPBYTE pData,
  502. [in] DWORD cbData
  503. );
  504. DWORD
  505. RpcWaitForPrinterChange(
  506. [in] PRINTER_HANDLE hPrinter,
  507. [in] DWORD Flags,
  508. [out] LPDWORD pFlags
  509. );
  510. DWORD
  511. RpcClosePrinter(
  512. [in, out] PRINTER_HANDLE *phPrinter
  513. );
  514. DWORD
  515. RpcAddForm(
  516. [in] PRINTER_HANDLE hPrinter,
  517. [in] PFORM_CONTAINER pFormInfoContainer
  518. );
  519. DWORD
  520. RpcDeleteForm(
  521. [in] PRINTER_HANDLE hPrinter,
  522. [in, string] wchar_t * pFormName
  523. );
  524. DWORD
  525. RpcGetForm(
  526. [in] PRINTER_HANDLE hPrinter,
  527. [in, string] wchar_t * pFormName,
  528. [in] DWORD Level,
  529. [in, out, unique, size_is(cbBuf)] LPBYTE pForm,
  530. [in] DWORD cbBuf,
  531. [out] LPDWORD pcbNeeded
  532. );
  533. DWORD
  534. RpcSetForm(
  535. [in] PRINTER_HANDLE hPrinter,
  536. [in, string] wchar_t * pFormName,
  537. [in] PFORM_CONTAINER pFormInfoContainer
  538. );
  539. DWORD
  540. RpcEnumForms(
  541. [in] PRINTER_HANDLE hPrinter,
  542. [in] DWORD Level,
  543. [in, out, unique, size_is(cbBuf)] LPBYTE pForm,
  544. [in] DWORD cbBuf,
  545. [out] LPDWORD pcbNeeded,
  546. [out] LPDWORD pcReturned
  547. );
  548. DWORD
  549. RpcEnumPorts(
  550. [in, string, unique] STRING_HANDLE pName,
  551. [in] DWORD Level,
  552. [in, out, unique, size_is(cbBuf)] LPBYTE pPort,
  553. [in] DWORD cbBuf,
  554. [out] LPDWORD pcbNeeded,
  555. [out] LPDWORD pcReturned
  556. );
  557. DWORD
  558. RpcEnumMonitors(
  559. [in, string, unique] STRING_HANDLE pName,
  560. [in] DWORD Level,
  561. [in, out, unique, size_is(cbBuf)] LPBYTE pMonitor,
  562. [in] DWORD cbBuf,
  563. [out] LPDWORD pcbNeeded,
  564. [out] LPDWORD pcReturned
  565. );
  566. DWORD
  567. RpcAddPort(
  568. [in, string, unique] STRING_HANDLE pName,
  569. [in] ULONG_PTR hWnd,
  570. [in, string] wchar_t * pMonitorName
  571. );
  572. DWORD
  573. RpcConfigurePort(
  574. [in, string, unique] STRING_HANDLE pName,
  575. [in] ULONG_PTR hWnd,
  576. [in, string] wchar_t * pPortName
  577. );
  578. DWORD
  579. RpcDeletePort(
  580. [in, string, unique] STRING_HANDLE pName,
  581. [in] ULONG_PTR hWnd,
  582. [in, string] wchar_t * pPortName
  583. );
  584. DWORD
  585. RpcCreatePrinterIC(
  586. [in] PRINTER_HANDLE hPrinter,
  587. [out] GDI_HANDLE *pHandle,
  588. [in] LPDEVMODE_CONTAINER pDevModeContainer
  589. );
  590. DWORD
  591. RpcPlayGdiScriptOnPrinterIC(
  592. [in] GDI_HANDLE hPrinterIC,
  593. [in, size_is(cIn)] LPBYTE pIn,
  594. [in] DWORD cIn,
  595. [out, size_is(cOut)] LPBYTE pOut,
  596. [in] DWORD cOut,
  597. [in] DWORD ul
  598. );
  599. DWORD
  600. RpcDeletePrinterIC(
  601. [in, out] GDI_HANDLE *phPrinterIC
  602. );
  603. DWORD
  604. RpcAddPrinterConnection(
  605. [in, string] STRING_HANDLE pName
  606. );
  607. DWORD
  608. RpcDeletePrinterConnection(
  609. [in, string] STRING_HANDLE pName
  610. );
  611. DWORD
  612. RpcPrinterMessageBox(
  613. [in] PRINTER_HANDLE hPrinter,
  614. [in] DWORD Error,
  615. [in] ULONG_PTR hWnd,
  616. [in, string, unique] wchar_t *pText,
  617. [in, string, unique] wchar_t *pCaption,
  618. [in] DWORD dwType
  619. );
  620. DWORD
  621. RpcAddMonitor(
  622. [in, string, unique] STRING_HANDLE Name,
  623. [in] PMONITOR_CONTAINER pMonitorContainer
  624. );
  625. DWORD
  626. RpcDeleteMonitor(
  627. [in, string, unique] STRING_HANDLE Name,
  628. [in, unique, string] wchar_t * pEnvironment,
  629. [in, string] wchar_t *pMonitorName
  630. );
  631. DWORD
  632. RpcDeletePrintProcessor(
  633. [in, string, unique] STRING_HANDLE Name,
  634. [in, unique, string] wchar_t * pEnvironment,
  635. [in, string] wchar_t *pPrintProcessorName
  636. );
  637. DWORD
  638. RpcAddPrintProvidor(
  639. [in, string, unique] STRING_HANDLE Name,
  640. [in] PPROVIDOR_CONTAINER pProvidorContainer
  641. );
  642. DWORD
  643. RpcDeletePrintProvidor(
  644. [in, string, unique] STRING_HANDLE Name,
  645. [in, unique, string] wchar_t * pEnvironment,
  646. [in, string] wchar_t *pPrintProvidorName
  647. );
  648. DWORD
  649. RpcEnumPrintProcessorDatatypes(
  650. [in, string, unique] STRING_HANDLE pName,
  651. [in, unique, string] wchar_t * pPrintProcessorName,
  652. [in] DWORD Level,
  653. [in, out, unique, size_is(cbBuf)] LPBYTE pDatatypes,
  654. [in] DWORD cbBuf,
  655. [out] LPDWORD pcbNeeded,
  656. [out] LPDWORD pcReturned
  657. );
  658. DWORD
  659. RpcResetPrinter(
  660. [in] PRINTER_HANDLE hPrinter,
  661. [in, string, unique] wchar_t * pDatatype,
  662. [in] LPDEVMODE_CONTAINER pDevMode
  663. );
  664. //
  665. // Everything below is new to the interface (new for daytona).
  666. //
  667. DWORD
  668. RpcGetPrinterDriver2(
  669. [in] PRINTER_HANDLE hPrinter,
  670. [in, unique, string] wchar_t * pEnvironment,
  671. [in] DWORD Level,
  672. [in, out, unique, size_is(cbBuf)] LPBYTE pDriver,
  673. [in] DWORD cbBuf,
  674. [out] LPDWORD pcbNeeded,
  675. [in] DWORD dwClientMajorVersion,
  676. [in] DWORD dwClientMinorVersion,
  677. [out] LPDWORD pdwServerMaxVersion,
  678. [out] LPDWORD pdwServerMinVersion
  679. );
  680. DWORD
  681. RpcClientFindFirstPrinterChangeNotification(
  682. [in] PRINTER_HANDLE hPrinter,
  683. [in] DWORD fdwFlags,
  684. [in] DWORD fdwOptions,
  685. [in] DWORD dwPID,
  686. [in, unique] PRPC_V2_NOTIFY_OPTIONS pOptions,
  687. [out] LPDWORD pdwEvent
  688. );
  689. DWORD
  690. RpcFindNextPrinterChangeNotification(
  691. [in] PRINTER_HANDLE hPrinter,
  692. [in] DWORD fdwFlags,
  693. [out] LPDWORD pdwChange,
  694. [in, unique] PRPC_V2_NOTIFY_OPTIONS pOptions,
  695. [out] PRPC_V2_NOTIFY_INFO* ppInfo
  696. );
  697. DWORD
  698. RpcFindClosePrinterChangeNotification(
  699. [in] PRINTER_HANDLE hPrinter
  700. );
  701. //
  702. // This func will never be used (only be beta2 daytona)
  703. //
  704. DWORD
  705. RpcRouterFindFirstPrinterChangeNotificationOld(
  706. [in] PRINTER_HANDLE hPrinter,
  707. [in] DWORD fdwFlags,
  708. [in] DWORD fdwOptions,
  709. [in, string, unique] wchar_t * pszLocalMachine,
  710. [in] DWORD dwPrinterLocal
  711. );
  712. //
  713. // The following calls:
  714. //
  715. // RpcReplyPrinterOpenChangeNotification
  716. // RpcReplyPrinterChangeNotification
  717. // RpcReplyPrinterCloseChangeNotification
  718. //
  719. // Originate from the printserver's spooler and go the the client
  720. // machine for notifications.
  721. //
  722. DWORD
  723. RpcReplyOpenPrinter(
  724. [in, string] STRING_HANDLE pMachine,
  725. [out] PRINTER_HANDLE *phPrinterNotify,
  726. [in] DWORD dwPrinterRemote,
  727. [in] DWORD dwType,
  728. [in, range(0, kRpcMaxBufferSize)] DWORD cbBuffer,
  729. [in, unique, size_is(cbBuffer)] LPBYTE pBuffer
  730. );
  731. DWORD
  732. RpcRouterReplyPrinter(
  733. [in] PRINTER_HANDLE hNotify,
  734. [in] DWORD fdwFlags,
  735. [in, range(0, kRpcMaxBufferSize)] DWORD cbBuffer,
  736. [in, unique, size_is(cbBuffer)] LPBYTE pBuffer
  737. );
  738. DWORD
  739. RpcReplyClosePrinter(
  740. [in, out] PRINTER_HANDLE *phNotify
  741. );
  742. DWORD
  743. RpcAddPortEx(
  744. [in, string, unique] STRING_HANDLE pName,
  745. [in] LPPORT_CONTAINER pPortContainer,
  746. [in] LPPORT_VAR_CONTAINER pPortVarContainer,
  747. [in, string] wchar_t * pMonitorName
  748. );
  749. DWORD
  750. RpcRemoteFindFirstPrinterChangeNotification(
  751. [in] PRINTER_HANDLE hPrinter,
  752. [in] DWORD fdwFlags,
  753. [in] DWORD fdwOptions,
  754. [in, string, unique] wchar_t * pszLocalMachine,
  755. [in] DWORD dwPrinterLocal,
  756. [in, range(0, kRpcMaxBufferSize)] DWORD cbBuffer,
  757. [in, out, unique, size_is(cbBuffer)] LPBYTE pBuffer
  758. );
  759. DWORD
  760. RpcSpoolerInit(
  761. [in] STRING_HANDLE pName
  762. );
  763. DWORD
  764. RpcResetPrinterEx(
  765. [in] PRINTER_HANDLE hPrinter,
  766. [in, string, unique] wchar_t * pDatatype,
  767. [in] LPDEVMODE_CONTAINER pDevMode,
  768. [in] DWORD dwFlags
  769. );
  770. //
  771. // The following calls are new for PPC release NT 3.51
  772. //
  773. DWORD
  774. RpcRemoteFindFirstPrinterChangeNotificationEx(
  775. [in] PRINTER_HANDLE hPrinter,
  776. [in] DWORD fdwFlags,
  777. [in] DWORD fdwOptions,
  778. [in, string, unique] wchar_t * pszLocalMachine,
  779. [in] DWORD dwPrinterLocal,
  780. [in, unique] PRPC_V2_NOTIFY_OPTIONS pOptions
  781. );
  782. DWORD
  783. RpcRouterReplyPrinterEx(
  784. [in] PRINTER_HANDLE hNotify,
  785. [in] DWORD dwColor,
  786. [in] DWORD fdwFlags,
  787. [out] PDWORD pdwResult,
  788. [in] DWORD dwReplyType,
  789. [in, switch_is(dwReplyType)] RPC_V2_UREPLY_PRINTER Reply
  790. );
  791. DWORD
  792. RpcRouterRefreshPrinterChangeNotification(
  793. [in] PRINTER_HANDLE hPrinter,
  794. [in] DWORD dwColor,
  795. [in, unique] PRPC_V2_NOTIFY_OPTIONS pOptions,
  796. [out] PRPC_V2_NOTIFY_INFO* ppInfo
  797. );
  798. // Testing Apis for PPC
  799. DWORD
  800. RpcSetAllocFailCount(
  801. [in] PRINTER_HANDLE hPrinter,
  802. [in] DWORD dwFailCount,
  803. [out] LPDWORD lpdwAllocCount,
  804. [out] LPDWORD lpdwFreeCount,
  805. [out] LPDWORD lpdwFailCountHit
  806. );
  807. // New for SUR beta NT 4.0
  808. DWORD
  809. RpcOpenPrinterEx(
  810. [in, string, unique] STRING_HANDLE pPrinterName,
  811. [out] PRINTER_HANDLE *pHandle,
  812. [in, string, unique] wchar_t * pDatatype,
  813. [in] LPDEVMODE_CONTAINER pDevMode,
  814. [in] DWORD AccessRequired,
  815. [in] PSPLCLIENT_CONTAINER pClientInfo
  816. );
  817. DWORD
  818. RpcAddPrinterEx(
  819. [in, string, unique] STRING_HANDLE pName,
  820. [in] PPRINTER_CONTAINER pPrinterContainer,
  821. [in] PDEVMODE_CONTAINER pDevModeContainer,
  822. [in] PSECURITY_CONTAINER pSecurityContainer,
  823. [in] PSPLCLIENT_CONTAINER pClientInfo,
  824. [out] PRINTER_HANDLE *pHandle
  825. );
  826. DWORD
  827. RpcSetPort(
  828. [in, string, unique] STRING_HANDLE pName,
  829. [in, string, unique] wchar_t * pPortName,
  830. [in] LPPORT_CONTAINER pPortContainer
  831. );
  832. DWORD
  833. RpcEnumPrinterData(
  834. [in] PRINTER_HANDLE hPrinter,
  835. [in] DWORD dwIndex,
  836. [out, size_is(cbValueName/sizeof(wchar_t))] wchar_t * pValueName,
  837. [in] DWORD cbValueName,
  838. [out] LPDWORD pcbValueName,
  839. [out] LPDWORD pType,
  840. [out, size_is(cbData)] LPBYTE pData,
  841. [in] DWORD cbData,
  842. [out] LPDWORD pcbData
  843. );
  844. DWORD
  845. RpcDeletePrinterData(
  846. [in] PRINTER_HANDLE hPrinter,
  847. [in, string] wchar_t * pValueName
  848. );
  849. //
  850. // New for clustering
  851. //
  852. DWORD
  853. RpcClusterSplOpen(
  854. [in, string, unique] STRING_HANDLE pServerName,
  855. [in, string, unique] wchar_t * pResource,
  856. [out] PRINTER_HANDLE *pHandle,
  857. [in, string, unique] wchar_t * pName,
  858. [in, string, unique] wchar_t * pAddress
  859. );
  860. DWORD
  861. RpcClusterSplClose(
  862. [in, out] PRINTER_HANDLE * phPrinter
  863. );
  864. DWORD
  865. RpcClusterSplIsAlive(
  866. [in] PRINTER_HANDLE hPrinter
  867. );
  868. DWORD
  869. RpcSetPrinterDataEx(
  870. [in] PRINTER_HANDLE hPrinter,
  871. [in, string] const wchar_t * pKeyName,
  872. [in, string] const wchar_t * pValueName,
  873. [in] DWORD Type,
  874. [in, size_is(cbData)] LPBYTE pData,
  875. [in] DWORD cbData
  876. );
  877. DWORD
  878. RpcGetPrinterDataEx(
  879. [in] PRINTER_HANDLE hPrinter,
  880. [in, string] const wchar_t * pKeyName,
  881. [in, string] const wchar_t * pValueName,
  882. [out] LPDWORD pType,
  883. [out, size_is(nSize)] LPBYTE pData,
  884. [in] DWORD nSize,
  885. [out] LPDWORD pcbNeeded
  886. );
  887. DWORD
  888. RpcEnumPrinterDataEx(
  889. [in] PRINTER_HANDLE hPrinter,
  890. [in, string] const wchar_t * pKeyName,
  891. [out, size_is(cbEnumValues)] LPBYTE pEnumValues,
  892. [in] DWORD cbEnumValues,
  893. [out] LPDWORD pcbEnumValues,
  894. [out] LPDWORD pnEnumValues
  895. );
  896. DWORD
  897. RpcEnumPrinterKey(
  898. [in] PRINTER_HANDLE hPrinter,
  899. [in, string] const wchar_t * pKeyName,
  900. [out, size_is(cbSubkey/sizeof(wchar_t))] wchar_t * pSubkey,
  901. [in] DWORD cbSubkey,
  902. [out] LPDWORD pcbSubkey
  903. );
  904. DWORD
  905. RpcDeletePrinterDataEx(
  906. [in] PRINTER_HANDLE hPrinter,
  907. [in, string] const wchar_t * pKeyName,
  908. [in, string] const wchar_t * pValueName
  909. );
  910. DWORD
  911. RpcDeletePrinterKey(
  912. [in] PRINTER_HANDLE hPrinter,
  913. [in, string] const wchar_t * pKeyName
  914. );
  915. DWORD
  916. RpcSeekPrinter(
  917. [in] PRINTER_HANDLE hPrinter,
  918. [in] LARGE_INTEGER liDistanceToMove,
  919. [out] PLARGE_INTEGER pliNewPointer,
  920. [in] DWORD dwMoveMethod,
  921. [in] BOOL bWrite
  922. );
  923. DWORD
  924. RpcDeletePrinterDriverEx(
  925. [in, string, unique] STRING_HANDLE pName,
  926. [in, string] wchar_t *pEnvironment,
  927. [in, string] wchar_t *pDriverName,
  928. [in] DWORD dwDeleteFlag,
  929. [in] DWORD dwVersionNum
  930. );
  931. DWORD
  932. RpcAddPerMachineConnection(
  933. [in, string, unique] STRING_HANDLE pServer,
  934. [in, string] const wchar_t * pPrinterName,
  935. [in, string] const wchar_t * pPrintServer,
  936. [in, string] const wchar_t * pProvider
  937. );
  938. DWORD
  939. RpcDeletePerMachineConnection(
  940. [in, string, unique] STRING_HANDLE pServer,
  941. [in, string] const wchar_t * pPrinterName
  942. );
  943. DWORD
  944. RpcEnumPerMachineConnections(
  945. [in, string, unique] STRING_HANDLE pServer,
  946. [in, out, unique, size_is(cbBuf)] LPBYTE pPrinterEnum,
  947. [in] DWORD cbBuf,
  948. [out] LPDWORD pcbNeeded,
  949. [out] LPDWORD pcReturned
  950. );
  951. DWORD
  952. RpcXcvData(
  953. [in] PRINTER_HANDLE hXcv,
  954. [in, string] const wchar_t *pszDataName,
  955. [in, size_is(cbInputData)] PBYTE pInputData,
  956. [in] DWORD cbInputData,
  957. [out, size_is(cbOutputData)] PBYTE pOutputData,
  958. [in] DWORD cbOutputData,
  959. [out] PDWORD pcbOutputNeeded,
  960. [in, out] PDWORD pdwStatus
  961. );
  962. DWORD
  963. RpcAddPrinterDriverEx(
  964. [in, string, unique] STRING_HANDLE pName,
  965. [in] PDRIVER_CONTAINER pDriverContainer,
  966. [in] DWORD dwFileCopyFlags
  967. );
  968. // Private Spooler interface to return the server side hPrinter to the client
  969. DWORD
  970. RpcSplOpenPrinter(
  971. [in, string, unique] STRING_HANDLE pPrinterName,
  972. [out] PRINTER_HANDLE *pHandle,
  973. [in, string, unique] wchar_t * pDatatype,
  974. [in] LPDEVMODE_CONTAINER pDevMode,
  975. [in] DWORD AccessRequired,
  976. [in, out] PSPLCLIENT_CONTAINER pSplClientContainer
  977. );
  978. DWORD
  979. RpcGetSpoolFileInfo(
  980. [in] PRINTER_HANDLE hPrinter,
  981. [in] DWORD dwAppProcessId,
  982. [in] DWORD dwLevel,
  983. [out, size_is(cbBuf)] LPBYTE pSpoolFileInfo,
  984. [in, range(0, kSpoolFileInfoMaxBufferSize)] DWORD cbBuf,
  985. [out] LPDWORD pcbNeeded
  986. );
  987. DWORD
  988. RpcCommitSpoolData(
  989. [in] PRINTER_HANDLE hPrinter,
  990. [in] DWORD dwAppProcessId,
  991. [in] DWORD cbCommit,
  992. [in] DWORD dwLevel,
  993. [out, size_is(cbBuf)] LPBYTE pSpoolFileInfo,
  994. [in, range(0, kSpoolFileInfoMaxBufferSize)] DWORD cbBuf,
  995. [out] LPDWORD pcbNeeded
  996. );
  997. DWORD
  998. RpcGetSpoolFileInfo2(
  999. [in] PRINTER_HANDLE hPrinter,
  1000. [in] DWORD dwAppProcessId,
  1001. [in] DWORD dwLevel,
  1002. [in,out] LPFILE_INFO_CONTAINER pSplFileInfoContainer
  1003. );
  1004. DWORD
  1005. RpcCommitSpoolData2(
  1006. [in] PRINTER_HANDLE hPrinter,
  1007. [in] DWORD dwAppProcessId,
  1008. [in] DWORD cbCommit,
  1009. [in] DWORD dwLevel,
  1010. [in,out] LPFILE_INFO_CONTAINER pSplFileInfoContainer
  1011. );
  1012. DWORD
  1013. RpcCloseSpoolFileHandle(
  1014. [in] PRINTER_HANDLE hPrinter
  1015. );
  1016. DWORD
  1017. RpcFlushPrinter(
  1018. [in] PRINTER_HANDLE hPrinter,
  1019. [in, size_is(cbBuf)] LPBYTE pBuf,
  1020. [in] DWORD cbBuf,
  1021. [out] LPDWORD pcWritten,
  1022. [in] DWORD cSleep
  1023. );
  1024. typedef struct _RPC_BIDI_DATA
  1025. {
  1026. DWORD dwBidiType;
  1027. [switch_is(dwBidiType)] union {
  1028. [case(BIDI_NULL, BIDI_BOOL)]
  1029. BOOL bData;
  1030. [case(BIDI_INT)]
  1031. LONG iData;
  1032. [case(BIDI_STRING, BIDI_TEXT, BIDI_ENUM)]
  1033. [string,unique] wchar_t* sData;
  1034. [case(BIDI_FLOAT)]
  1035. FLOAT fData;
  1036. [case(BIDI_BLOB)]
  1037. RPC_BINARY_CONTAINER biData;
  1038. } u;
  1039. } RPC_BIDI_DATA, *PRPC_BIDI_DATA, *LPRPC_BIDI_DATA;
  1040. typedef struct _RPC_BIDI_REQUEST_DATA {
  1041. DWORD dwReqNumber;
  1042. [string,unique] wchar_t* pSchema;
  1043. RPC_BIDI_DATA data;
  1044. } RPC_BIDI_REQUEST_DATA, *PRPC_BIDI_REQUEST_DATA, *LPRPC_BIDI_REQUEST_DATA;
  1045. typedef struct _RPC_BIDI_REQUEST_CONTAINER {
  1046. DWORD Version;
  1047. DWORD Flags;
  1048. DWORD Count;
  1049. [size_is(Count), unique] RPC_BIDI_REQUEST_DATA aData[];
  1050. } RPC_BIDI_REQUEST_CONTAINER, *PRPC_BIDI_REQUEST_CONTAINER, *LPRPC_BIDI_REQUEST_CONTAINER;
  1051. typedef struct _RPC_BIDI_RESPONSE_DATA {
  1052. DWORD dwResult;
  1053. DWORD dwReqNumber;
  1054. [string,unique] wchar_t* pSchema;
  1055. RPC_BIDI_DATA data;
  1056. } RPC_BIDI_RESPONSE_DATA, *PRPC_BIDI_RESPONSE_DATA, *LPRPC_BIDI_RESPONSE_DATA;
  1057. typedef struct _RPC_BIDI_RESPONSE_CONTAINER {
  1058. DWORD Version;
  1059. DWORD Flags;
  1060. DWORD Count;
  1061. [size_is(Count), unique] RPC_BIDI_RESPONSE_DATA aData[];
  1062. } RPC_BIDI_RESPONSE_CONTAINER, *PRPC_BIDI_RESPONSE_CONTAINER, *LPRPC_BIDI_RESPONSE_CONTAINER;
  1063. DWORD RpcSendRecvBidiData (
  1064. [in] PRINTER_HANDLE hPrinter,
  1065. [in,string,unique] const wchar_t *pAction,
  1066. [in] PRPC_BIDI_REQUEST_CONTAINER pReqData,
  1067. [out] PRPC_BIDI_RESPONSE_CONTAINER *ppRespData);
  1068. DWORD RpcAddDriverCatalog(
  1069. [in] PRINTER_HANDLE hPrinter,
  1070. [in] PDRIVER_INFCAT_CONTAINER pDriverInfCatContainer,
  1071. [in] DWORD dwCatalogCopyFlags);
  1072. }