Source code of Windows XP (NT5)
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.

499 lines
16 KiB

  1. /*++
  2. Copyright (c) 1992-1993 Microsoft Corporation
  3. Module Name:
  4. PrtInfo.c
  5. Abstract:
  6. This file contains:
  7. NetpPrintDestStructureInfo()
  8. NetpPrintJobStructureInfo()
  9. NetpPrintQStructureInfo()
  10. Author:
  11. John Rogers (JohnRo) 16-Jun-1992
  12. Environment:
  13. Portable to any flat, 32-bit environment. (Uses Win32 typedefs.)
  14. Requires ANSI C extensions: slash-slash comments, long external names.
  15. Revision History:
  16. 16-Jun-1992 JohnRo
  17. Created for RAID 10324: net print vs. UNICODE.
  18. 02-Oct-1992 JohnRo
  19. RAID 3556: DosPrintQGetInfo(from downlevel) level 3, rc=124. (4&5 too.)
  20. 11-May-1993 JohnRo
  21. RAID 9942: fixed GP fault in debug code (NetpDisplayPrintStructureInfo).
  22. --*/
  23. // These must be included first:
  24. #include <windef.h> // IN, DWORD, etc.
  25. #include <lmcons.h> // MAXCOMMENTSZ, DEVLEN, NET_API_STATUS, etc.
  26. #include <rap.h> // LPDESC, needed by <strucinf.h>.
  27. // These may be included in any order:
  28. #include <debuglib.h> // IF_DEBUG().
  29. #include <lmerr.h> // ERROR_ and NERR_ equates.
  30. #include <netlib.h> // NetpSetOptionalArg().
  31. #include <netdebug.h> // NetpAssert().
  32. #include <prefix.h> // PREFIX_ equates.
  33. #include <remdef.h> // REM16_, REM32_, REMSmb_ equates.
  34. #include <rxprint.h> // PDLEN, PRDINFO, etc.
  35. #include <strucinf.h> // My prototypes.
  36. #define MAX_DEST_LIST_LEN NNLEN
  37. #define MAX_DOC_LEN NNLEN
  38. #define MAX_DRIVER_NAME_LEN NNLEN
  39. #define MAX_DRIVER_LIST_LEN NNLEN
  40. #define MAX_LONG_PRINT_Q_LEN QNLEN
  41. #define MAX_NOTIFY_LEN UNLEN
  42. #define MAX_PRINT_PARMS_LEN NNLEN
  43. #define MAX_PRINTER_NAME_LEN PRINTERNAME_SIZE
  44. #define MAX_PRINTER_NAME_LIST_LEN NNLEN
  45. #define MAX_QPROC_LEN NNLEN
  46. #define MAX_QPROC_PARMS_LEN NNLEN
  47. #define MAX_SEP_FILE_LEN PATHLEN
  48. #define MAX_STATUS_LEN NNLEN
  49. #define MAX_PRINT_DEST_0_STRING_LENGTH \
  50. (0)
  51. #define MAX_PRINT_DEST_1_STRING_LENGTH \
  52. (MAX_STATUS_LEN+1)
  53. #define MAX_PRINT_DEST_2_STRING_LENGTH \
  54. (MAX_PRINTER_NAME_LEN+1)
  55. #define MAX_PRINT_DEST_3_STRING_LENGTH \
  56. (MAX_PRINTER_NAME_LEN+1 + UNLEN+1 + DEVLEN+1 + MAX_STATUS_LEN+1 \
  57. + MAXCOMMENTSZ+1 + MAX_DRIVER_LIST_LEN+1)
  58. #define MAX_PRINT_JOB_0_STRING_LENGTH \
  59. (0)
  60. #define MAX_PRINT_JOB_1_STRING_LENGTH \
  61. (MAX_PRINT_PARMS_LEN+1 + MAX_STATUS_LEN+1 + MAXCOMMENTSZ+1)
  62. #define MAX_PRINT_JOB_2_STRING_LENGTH \
  63. (UNLEN+1 + MAXCOMMENTSZ+1 + MAX_DOC_LEN+1)
  64. #define MAX_PRINT_JOB_3_STRING_LENGTH \
  65. (MAX_PRINT_JOB_2_STRING_LENGTH + MAX_NOTIFY_LEN+1 + DTLEN+1 \
  66. + MAX_PRINT_PARMS_LEN+1 + MAX_STATUS_LEN+1 \
  67. + QNLEN+1 + MAX_QPROC_LEN+1 \
  68. + MAX_QPROC_PARMS_LEN+1 + MAX_DRIVER_NAME_LEN+1 \
  69. + MAX_PRINTER_NAME_LEN+1 )
  70. #define MAX_PRINT_Q_0_STRING_LENGTH \
  71. (0)
  72. #define MAX_PRINT_Q_1_STRING_LENGTH \
  73. (MAX_SEP_FILE_LEN+1 + MAX_QPROC_LEN+1 + MAX_DEST_LIST_LEN+1 \
  74. + MAX_PRINT_PARMS_LEN+1 + MAXCOMMENTSZ+1)
  75. #define MAX_PRINT_Q_2_STRING_LENGTH \
  76. (MAX_PRINT_PARMS_LEN+1 + MAX_STATUS_LEN+1 + MAXCOMMENTSZ+1)
  77. #define MAX_PRINT_Q_3_STRING_LENGTH \
  78. (MAX_LONG_PRINT_Q_LEN+1 + MAX_SEP_FILE_LEN+1 + MAX_QPROC_LEN+1 \
  79. + MAX_PRINT_PARMS_LEN+1 + MAXCOMMENTSZ + MAX_PRINTER_NAME_LIST_LEN+1 )
  80. #define MAX_PRINT_Q_4_STRING_LENGTH \
  81. (MAX_PRINT_Q_3_STRING_LENGTH)
  82. #define MAX_PRINT_Q_5_STRING_LENGTH \
  83. (MAX_LONG_PRINT_Q_LEN+1)
  84. #define SET_PRINT_SIZES(ansiFixed,unicodeFixed,variableLength) \
  85. { \
  86. DWORD fixed; \
  87. if (CharSize == sizeof(CHAR)) { \
  88. fixed = ansiFixed; \
  89. } else { \
  90. fixed = unicodeFixed; \
  91. } \
  92. NetpSetOptionalArg( MaxSize, fixed + (variableLength) * CharSize ); \
  93. NetpSetOptionalArg( FixedSize, fixed ); \
  94. NetpSetOptionalArg( StringSize, (variableLength) * CharSize ); \
  95. }
  96. #if DBG
  97. DBGSTATIC VOID
  98. NetpDisplayPrintStructureInfo(
  99. IN LPDEBUG_STRING ApiName,
  100. IN LPDESC * DataDesc16 OPTIONAL,
  101. IN LPDESC * DataDesc32 OPTIONAL,
  102. IN LPDESC * DataDescSmb OPTIONAL,
  103. IN LPDESC * AuxDesc16 OPTIONAL,
  104. IN LPDESC * AuxDesc32 OPTIONAL,
  105. IN LPDESC * AuxDescSmb OPTIONAL,
  106. IN LPDWORD MaxSize OPTIONAL,
  107. IN LPDWORD FixedSize OPTIONAL,
  108. IN LPDWORD StringSize OPTIONAL
  109. )
  110. {
  111. IF_DEBUG( STRUCINF ) {
  112. if (DataDesc16) {
  113. NetpKdPrint(( PREFIX_NETLIB FORMAT_LPDEBUG_STRING
  114. ": desc 16 is " FORMAT_LPDESC
  115. ".\n", ApiName, *DataDesc16 ));
  116. }
  117. if (DataDesc32) {
  118. NetpKdPrint(( PREFIX_NETLIB FORMAT_LPDEBUG_STRING
  119. ": desc 32 is " FORMAT_LPDESC
  120. ".\n", ApiName, *DataDesc32 ));
  121. }
  122. if (DataDescSmb) {
  123. NetpKdPrint(( PREFIX_NETLIB FORMAT_LPDEBUG_STRING
  124. ": desc Smb is " FORMAT_LPDESC
  125. ".\n", ApiName, *DataDescSmb ));
  126. }
  127. if (AuxDesc16) {
  128. NetpKdPrint(( PREFIX_NETLIB FORMAT_LPDEBUG_STRING
  129. ": aux desc 16 is " FORMAT_LPDESC
  130. ".\n", ApiName, *AuxDesc16 ));
  131. }
  132. if (AuxDesc32) {
  133. NetpKdPrint(( PREFIX_NETLIB FORMAT_LPDEBUG_STRING
  134. ": aux desc 32 is " FORMAT_LPDESC
  135. ".\n", ApiName, *AuxDesc32 ));
  136. }
  137. if (AuxDescSmb) {
  138. NetpKdPrint(( PREFIX_NETLIB FORMAT_LPDEBUG_STRING
  139. ": aux desc Smb is " FORMAT_LPDESC
  140. ".\n", ApiName, *AuxDescSmb ));
  141. }
  142. if (MaxSize) {
  143. NetpKdPrint(( PREFIX_NETLIB FORMAT_LPDEBUG_STRING
  144. ": max size is " FORMAT_DWORD
  145. ".\n", ApiName, *MaxSize ));
  146. }
  147. if (FixedSize) {
  148. NetpKdPrint(( PREFIX_NETLIB FORMAT_LPDEBUG_STRING
  149. ": fixed size is " FORMAT_DWORD
  150. ".\n", ApiName, *FixedSize ));
  151. }
  152. if (StringSize) {
  153. NetpKdPrint(( PREFIX_NETLIB FORMAT_LPDEBUG_STRING
  154. ": string size is " FORMAT_DWORD
  155. ".\n", ApiName, *StringSize ));
  156. }
  157. }
  158. } // NetpDisplayPrintStructureInfo
  159. #endif // DBG
  160. NET_API_STATUS
  161. NetpPrintDestStructureInfo (
  162. IN DWORD Level,
  163. IN DWORD ParmNum, // Use PARMNUM_ALL if not applicable.
  164. IN BOOL Native, // Should sizes be native or RAP?
  165. IN BOOL AddOrSetInfoApi,
  166. IN DWORD CharSize, // size of chars wanted
  167. OUT LPDESC * DataDesc16 OPTIONAL,
  168. OUT LPDESC * DataDesc32 OPTIONAL,
  169. OUT LPDESC * DataDescSmb OPTIONAL,
  170. OUT LPDWORD MaxSize OPTIONAL,
  171. OUT LPDWORD FixedSize OPTIONAL,
  172. OUT LPDWORD StringSize OPTIONAL
  173. )
  174. {
  175. DBG_UNREFERENCED_PARAMETER(ParmNum);
  176. NetpAssert( Native );
  177. NetpAssert( (CharSize==sizeof(CHAR)) || (CharSize==sizeof(WCHAR)) );
  178. //
  179. // Decide what to do based on the info level.
  180. //
  181. switch (Level) {
  182. case 0 :
  183. if (AddOrSetInfoApi == TRUE) {
  184. return (ERROR_INVALID_LEVEL);
  185. }
  186. NetpSetOptionalArg( DataDesc16, REM16_print_dest_0 );
  187. NetpSetOptionalArg( DataDesc32, REM32_print_dest_0 );
  188. NetpSetOptionalArg( DataDescSmb, REMSmb_print_dest_0 );
  189. SET_PRINT_SIZES(
  190. (PDLEN+1), // ansi "struct"
  191. (PDLEN+1) * sizeof(WCHAR), // unicode "struct"
  192. MAX_PRINT_DEST_0_STRING_LENGTH );
  193. break;
  194. case 1 :
  195. if (AddOrSetInfoApi == TRUE) {
  196. return (ERROR_INVALID_LEVEL);
  197. }
  198. NetpSetOptionalArg( DataDesc16, REM16_print_dest_1 );
  199. NetpSetOptionalArg( DataDesc32, REM32_print_dest_1 );
  200. NetpSetOptionalArg( DataDescSmb, REMSmb_print_dest_1 );
  201. SET_PRINT_SIZES(
  202. sizeof(PRDINFOA), // ansi struct
  203. sizeof(PRDINFOW), // unicode struct
  204. MAX_PRINT_DEST_1_STRING_LENGTH );
  205. break;
  206. case 2 :
  207. if (AddOrSetInfoApi == TRUE) {
  208. return (ERROR_INVALID_LEVEL);
  209. }
  210. NetpSetOptionalArg( DataDesc16, REM16_print_dest_2 );
  211. NetpSetOptionalArg( DataDesc32, REM32_print_dest_2 );
  212. NetpSetOptionalArg( DataDescSmb, REMSmb_print_dest_2 );
  213. SET_PRINT_SIZES(
  214. sizeof(LPSTR), // ansi "struct"
  215. sizeof(LPWSTR), // unicode "struct"
  216. MAX_PRINT_DEST_2_STRING_LENGTH );
  217. break;
  218. case 3 :
  219. NetpSetOptionalArg( DataDesc16, REM16_print_dest_3 );
  220. NetpSetOptionalArg( DataDesc32, REM32_print_dest_3 );
  221. NetpSetOptionalArg( DataDescSmb, REMSmb_print_dest_3 );
  222. SET_PRINT_SIZES(
  223. sizeof(PRDINFO3A),
  224. sizeof(PRDINFO3W),
  225. MAX_PRINT_DEST_3_STRING_LENGTH );
  226. break;
  227. default :
  228. return (ERROR_INVALID_LEVEL);
  229. }
  230. #if DBG
  231. NetpDisplayPrintStructureInfo(
  232. "NetpPrintDestStructureInfo",
  233. DataDesc16, DataDesc32, DataDescSmb,
  234. NULL, NULL, NULL, // no aux data descs (16, 32, SMB)
  235. MaxSize, FixedSize, StringSize );
  236. #endif
  237. return (NERR_Success);
  238. } // NetpPrintDestStructureInfo
  239. NET_API_STATUS
  240. NetpPrintJobStructureInfo (
  241. IN DWORD Level,
  242. IN DWORD ParmNum, // Use PARMNUM_ALL if not applicable.
  243. IN BOOL Native, // Should sizes be native or RAP?
  244. IN BOOL SetInfoApi,
  245. IN DWORD CharSize, // size of chars wanted
  246. OUT LPDESC * DataDesc16 OPTIONAL,
  247. OUT LPDESC * DataDesc32 OPTIONAL,
  248. OUT LPDESC * DataDescSmb OPTIONAL,
  249. OUT LPDWORD MaxSize OPTIONAL,
  250. OUT LPDWORD FixedSize OPTIONAL,
  251. OUT LPDWORD StringSize OPTIONAL
  252. )
  253. {
  254. DBG_UNREFERENCED_PARAMETER(ParmNum);
  255. NetpAssert( Native );
  256. NetpAssert( (CharSize==sizeof(CHAR)) || (CharSize==sizeof(WCHAR)) );
  257. switch (Level) {
  258. case 0 :
  259. if (SetInfoApi == TRUE) {
  260. return (ERROR_INVALID_LEVEL);
  261. }
  262. NetpSetOptionalArg(DataDesc16, REM16_print_job_0);
  263. NetpSetOptionalArg(DataDesc32, REM32_print_job_0);
  264. NetpSetOptionalArg(DataDescSmb, REMSmb_print_job_0);
  265. SET_PRINT_SIZES(
  266. sizeof(WORD),
  267. sizeof(WORD),
  268. MAX_PRINT_JOB_0_STRING_LENGTH );
  269. break;
  270. case 1 :
  271. NetpSetOptionalArg(DataDesc16, REM16_print_job_1);
  272. NetpSetOptionalArg(DataDesc32, REM32_print_job_1);
  273. NetpSetOptionalArg(DataDescSmb, REMSmb_print_job_1);
  274. SET_PRINT_SIZES(
  275. sizeof(PRJINFOA),
  276. sizeof(PRJINFOW),
  277. MAX_PRINT_JOB_1_STRING_LENGTH );
  278. break;
  279. case 2 :
  280. if (SetInfoApi == TRUE) {
  281. return (ERROR_INVALID_LEVEL);
  282. }
  283. NetpSetOptionalArg(DataDesc16, REM16_print_job_2);
  284. NetpSetOptionalArg(DataDesc32, REM32_print_job_2);
  285. NetpSetOptionalArg(DataDescSmb, REMSmb_print_job_2);
  286. SET_PRINT_SIZES(
  287. sizeof(PRJINFO2A),
  288. sizeof(PRJINFO2W),
  289. MAX_PRINT_JOB_2_STRING_LENGTH );
  290. break;
  291. case 3 :
  292. NetpSetOptionalArg(DataDesc16, REM16_print_job_3);
  293. NetpSetOptionalArg(DataDesc32, REM32_print_job_3);
  294. NetpSetOptionalArg(DataDescSmb, REMSmb_print_job_3);
  295. SET_PRINT_SIZES(
  296. sizeof(PRJINFO3A),
  297. sizeof(PRJINFO3W),
  298. MAX_PRINT_JOB_3_STRING_LENGTH );
  299. break;
  300. default :
  301. return (ERROR_INVALID_LEVEL);
  302. }
  303. #if DBG
  304. NetpDisplayPrintStructureInfo(
  305. "NetpPrintJobStructureInfo",
  306. DataDesc16, DataDesc32, DataDescSmb,
  307. NULL, NULL, NULL, // no aux data descs (16, 32, SMB)
  308. MaxSize, FixedSize, StringSize );
  309. #endif
  310. return (NO_ERROR);
  311. } // NetpPrintJobStructureInfo
  312. NET_API_STATUS
  313. NetpPrintQStructureInfo (
  314. IN DWORD Level,
  315. IN DWORD ParmNum, // Use PARMNUM_ALL if not applicable.
  316. IN BOOL Native, // Should sizes be native or RAP?
  317. IN BOOL AddOrSetInfoApi,
  318. IN DWORD CharSize, // size of chars wanted
  319. OUT LPDESC * DataDesc16 OPTIONAL,
  320. OUT LPDESC * DataDesc32 OPTIONAL,
  321. OUT LPDESC * DataDescSmb OPTIONAL,
  322. OUT LPDESC * AuxDesc16 OPTIONAL,
  323. OUT LPDESC * AuxDesc32 OPTIONAL,
  324. OUT LPDESC * AuxDescSmb OPTIONAL,
  325. OUT LPDWORD MaxSize OPTIONAL,
  326. OUT LPDWORD FixedSize OPTIONAL,
  327. OUT LPDWORD StringSize OPTIONAL
  328. )
  329. {
  330. DBG_UNREFERENCED_PARAMETER(ParmNum);
  331. NetpAssert( Native );
  332. NetpAssert( (CharSize==sizeof(CHAR)) || (CharSize==sizeof(WCHAR)) );
  333. switch (Level) {
  334. case 0 :
  335. if (AddOrSetInfoApi) {
  336. return (ERROR_INVALID_LEVEL);
  337. }
  338. NetpSetOptionalArg(AuxDesc16, NULL);
  339. NetpSetOptionalArg(AuxDesc32, NULL);
  340. NetpSetOptionalArg(AuxDescSmb, NULL);
  341. NetpSetOptionalArg(DataDesc16, REM16_printQ_0);
  342. NetpSetOptionalArg(DataDesc32, REM32_printQ_0);
  343. NetpSetOptionalArg(DataDescSmb, REMSmb_printQ_0);
  344. SET_PRINT_SIZES(
  345. (LM20_QNLEN+1),
  346. (LM20_QNLEN+1) * sizeof(WCHAR),
  347. MAX_PRINT_Q_0_STRING_LENGTH );
  348. break;
  349. case 1 :
  350. NetpSetOptionalArg(AuxDesc16, NULL);
  351. NetpSetOptionalArg(AuxDesc32, NULL);
  352. NetpSetOptionalArg(AuxDescSmb, NULL);
  353. NetpSetOptionalArg(DataDesc16, REM16_printQ_1);
  354. NetpSetOptionalArg(DataDesc32, REM32_printQ_1);
  355. NetpSetOptionalArg(DataDescSmb, REMSmb_printQ_1);
  356. SET_PRINT_SIZES(
  357. sizeof(PRQINFOA),
  358. sizeof(PRQINFOW),
  359. MAX_PRINT_Q_1_STRING_LENGTH );
  360. break;
  361. case 2 :
  362. if (AddOrSetInfoApi) {
  363. return (ERROR_INVALID_LEVEL);
  364. }
  365. NetpSetOptionalArg(AuxDesc16, REM16_print_job_1);
  366. NetpSetOptionalArg(AuxDesc32, REM32_print_job_1);
  367. NetpSetOptionalArg(AuxDescSmb, REMSmb_print_job_1);
  368. NetpSetOptionalArg(DataDesc16, REM16_printQ_2);
  369. NetpSetOptionalArg(DataDesc32, REM32_printQ_2);
  370. NetpSetOptionalArg(DataDescSmb, REMSmb_printQ_2);
  371. SET_PRINT_SIZES(
  372. sizeof(PRQINFOA),
  373. sizeof(PRQINFOW),
  374. MAX_PRINT_Q_2_STRING_LENGTH );
  375. break;
  376. case 3 :
  377. NetpSetOptionalArg(AuxDesc16, NULL);
  378. NetpSetOptionalArg(AuxDesc32, NULL);
  379. NetpSetOptionalArg(AuxDescSmb, NULL);
  380. NetpSetOptionalArg(DataDesc16, REM16_printQ_3);
  381. NetpSetOptionalArg(DataDesc32, REM32_printQ_3);
  382. NetpSetOptionalArg(DataDescSmb, REMSmb_printQ_3);
  383. SET_PRINT_SIZES(
  384. sizeof(PRQINFO3A),
  385. sizeof(PRQINFO3W),
  386. MAX_PRINT_Q_3_STRING_LENGTH );
  387. break;
  388. case 4 :
  389. if (AddOrSetInfoApi) {
  390. return (ERROR_INVALID_LEVEL);
  391. }
  392. NetpSetOptionalArg(AuxDesc16, REM16_print_job_2);
  393. NetpSetOptionalArg(AuxDesc32, REM32_print_job_2);
  394. NetpSetOptionalArg(AuxDescSmb, REMSmb_print_job_2);
  395. NetpSetOptionalArg(DataDesc16, REM16_printQ_4);
  396. NetpSetOptionalArg(DataDesc32, REM32_printQ_4);
  397. NetpSetOptionalArg(DataDescSmb, REMSmb_printQ_4);
  398. SET_PRINT_SIZES(
  399. sizeof(PRQINFO3A),
  400. sizeof(PRQINFO3W),
  401. MAX_PRINT_Q_4_STRING_LENGTH );
  402. break;
  403. case 5 :
  404. if (AddOrSetInfoApi) {
  405. return (ERROR_INVALID_LEVEL);
  406. }
  407. NetpSetOptionalArg(AuxDesc16, NULL);
  408. NetpSetOptionalArg(AuxDesc32, NULL);
  409. NetpSetOptionalArg(AuxDescSmb, NULL);
  410. NetpSetOptionalArg(DataDesc16, REM16_printQ_5);
  411. NetpSetOptionalArg(DataDesc32, REM32_printQ_5);
  412. NetpSetOptionalArg(DataDescSmb, REMSmb_printQ_5);
  413. SET_PRINT_SIZES(
  414. sizeof(LPVOID),
  415. sizeof(LPVOID),
  416. MAX_PRINT_Q_5_STRING_LENGTH );
  417. break;
  418. default :
  419. return (ERROR_INVALID_LEVEL);
  420. }
  421. #if DBG
  422. NetpDisplayPrintStructureInfo(
  423. "NetpPrintQStructureInfo",
  424. DataDesc16, DataDesc32, DataDescSmb,
  425. AuxDesc16, AuxDesc32, AuxDescSmb,
  426. MaxSize, FixedSize, StringSize );
  427. #endif
  428. return (NO_ERROR);
  429. } // NetpPrintQStructureInfo