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.

1466 lines
47 KiB

  1. /////////////////////////////////////////
  2. // fmlbpres.c
  3. //
  4. // September.4,1997 H.Ishida (FPL)
  5. //
  6. // COPYRIGHT(C) FUJITSU LIMITED 1997
  7. #include "fmlbp.h"
  8. #include "fmdebug.h"
  9. // for lib.h debug
  10. DWORD gdwDrvMemPoolTag = 'meoD';
  11. enum FUFM_CEX_FLAGS {
  12. FUFM_CEX_CONTINUE = 0x20,
  13. FUFM_CEX_SEPARATE = 0x60,
  14. FUFM_CEX_TERMINATE = 0x70
  15. };
  16. #define CMDID_START_JOB_0 0
  17. #define CMDID_START_JOB_1 1
  18. #define CMDID_START_JOB_2 2
  19. #define CMDID_START_JOB_3 3
  20. #define CMDID_START_JOB_4 4
  21. #define CMDID_END_JOB 9
  22. #define CMDID_EMMODE_FM 10
  23. #define CMDID_EMMODE_ESCP 11
  24. #define CMDID_SIZE_REDUCTION_100 20
  25. #define CMDID_SIZE_REDUCTION_75 21
  26. #define CMDID_SIZE_REDUCITON_70 22
  27. #define CMDID_RESOLUTION_240 30
  28. #define CMDID_RESOLUTION_400 31
  29. #define CMDID_ORIENTATION_PORTRAIT 40
  30. #define CMDID_ORIENTATION_LANDSCAPE 41
  31. #define CMDID_PAPERSOURCE_AUTO 50
  32. #define CMDID_PAPERSOURCE_MANUAL 51
  33. #define CMDID_PAPERSOURCE_BIN1 52
  34. #define CMDID_PAPERSOURCE_BIN2 53
  35. #define CMDID_PAPERSOURCE_BIN3 54
  36. #define CMDID_FORM_A3 60
  37. #define CMDID_FORM_A4 61
  38. #define CMDID_FORM_A5 62
  39. #define CMDID_FORM_B4 63
  40. #define CMDID_FORM_B5 64
  41. #define CMDID_FORM_LETTER 65
  42. #define CMDID_FORM_LEGAL 66
  43. #define CMDID_FORM_JAPANESE_POSTCARD 67
  44. #define CMDID_FORM_CUSTOM_SIZE 68
  45. #define CMDID_COPIES 70
  46. #define CMDID_START_DOC 80
  47. #define CMDID_START_PAGE 90
  48. #define CMDID_SET_LINEFEEDSPACING 100
  49. #define CMDID_FF 101
  50. #define CMDID_CR 102
  51. #define CMDID_LF 103
  52. #define CMDID_X_MOVE 110
  53. #define CMDID_Y_MOVE 111
  54. #define CMDID_SEND_BLOCK 120
  55. #define CMDID_FONTATTR_BOLD_OFF 130
  56. #define CMDID_FONTATTR_BOLD_ON 131
  57. #define CMDID_FONTATTR_ITALIC_OFF 132
  58. #define CMDID_FONTATTR_ITALIC_ON 133
  59. #define CMDID_FONTATTR_UNDERLINE_OFF 134
  60. #define CMDID_FONTATTR_UNDERLINE_ON 135
  61. #define CMDID_FONTATTR_STRIKEOUT_OFF 136
  62. #define CMDID_FONTATTR_STRIKEOUT_ON 137
  63. // #251047: overlaps SBCS on vert mode
  64. #define CMDID_SELECTSINGLE 140
  65. #define CMDID_SELECTDOUBLE 141
  66. /////////////////////////////////////////////////
  67. struct tag_FUFM_COMMAND{
  68. UINT cbCommand;
  69. PBYTE pbCommand;
  70. };
  71. typedef struct tag_FUFM_COMMAND FUFM_COMMAND;
  72. typedef struct tag_FUFM_COMMAND* PFUFM_COMMAND;
  73. typedef const struct tag_FUFM_COMMAND* PCFUFM_COMMAND;
  74. // KGS
  75. const FUFM_COMMAND g_cmd7Point = { 6, "\x1C\x26\x27\x60\x27\x70" };
  76. const FUFM_COMMAND g_cmd9Point = { 6, "\x1C\x26\x29\x60\x29\x70" };
  77. const FUFM_COMMAND g_cmd10halfPoint = { 8, "\x1C\x26\x21\x20\x65\x21\x20\x75" };
  78. const FUFM_COMMAND g_cmd12Point = { 8, "\x1C\x26\x21\x22\x60\x21\x22\x70" };
  79. // TF + HSS2
  80. const FUFM_COMMAND g_cmdMinchou = { 9, "\x1C\x28\x61\x70\x1BQ1 |" };
  81. const FUFM_COMMAND g_cmdGothic = { 9, "\x1C\x28\x61\x71\x1BQ1 |" };
  82. // HWF
  83. const FUFM_COMMAND g_cmdHWF = { 2, "\x1CK" };
  84. // VWF
  85. const FUFM_COMMAND g_cmdVWF = { 7, "\x1CJ\x1BQ1 q" };
  86. // #251047: overlaps SBCS on vert mode
  87. const FUFM_COMMAND g_cmdSingleMode = { 3, "\x1B(H" };
  88. const FUFM_COMMAND g_cmdDoubleMode = { 3, "\x1B$B" };
  89. /////////////////////////////////////////////////
  90. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  91. PBYTE fufmPutULONG(PBYTE pb, size_t cchDest, size_t* pcchRemaining, ULONG ulData)
  92. {
  93. size_t cchRemaining = cchDest;
  94. if (pb){
  95. if (cchDest > 0){
  96. if(9 < ulData){
  97. pb = fufmPutULONG(pb, cchRemaining, &cchRemaining, ulData / 10);
  98. if (NULL == pb) goto stop;
  99. }
  100. *pb++ = (BYTE)('0' + ulData % 10);
  101. cchRemaining--;
  102. }else{
  103. pb = NULL;
  104. }
  105. }
  106. stop:
  107. if (!pb){
  108. cchRemaining = 0;
  109. }
  110. if (pcchRemaining)
  111. {
  112. *pcchRemaining = cchRemaining;
  113. }
  114. return pb;
  115. }
  116. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  117. PBYTE fufmPutLONG(PBYTE pb, size_t cchDest, size_t* pcchRemaining, LONG lData)
  118. {
  119. size_t cchRemaining = cchDest;
  120. if (pb){
  121. if (cchDest > 0){
  122. if(0 > lData){
  123. *pb++ = '-';
  124. lData = -lData;
  125. cchRemaining--;
  126. }
  127. pb = fufmPutULONG(pb, cchRemaining, &cchRemaining, (ULONG)lData);
  128. }else{
  129. pb = NULL;
  130. }
  131. }
  132. if (!pb){
  133. cchRemaining = 0;
  134. }
  135. if (pcchRemaining)
  136. {
  137. *pcchRemaining = cchRemaining;
  138. }
  139. return pb;
  140. }
  141. BYTE fufmGetHEX(int hi, int low)
  142. {
  143. DWORD dwData = 0;
  144. if('0' <= hi && hi <= '9')
  145. dwData += (hi - '0');
  146. else if('a' <= hi && hi <= 'f')
  147. dwData += (hi - 'a') + 10;
  148. else if('A' <= hi && hi <= 'F')
  149. dwData += (hi - 'A') + 10;
  150. dwData *= 10;
  151. if('0' <= low && low <= '9')
  152. dwData += (low - '0');
  153. else if('a' <= low && low <= 'f')
  154. dwData += (low - 'a') + 10;
  155. else if('A' <= low && low <= 'F')
  156. dwData += (low - 'A') + 10;
  157. return (BYTE)dwData;
  158. }
  159. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  160. PBYTE fufmPutCexParam(PBYTE pb, size_t cchDest, size_t* pcchRemaining, int iParam, int iFlag)
  161. {
  162. size_t cchRemaining = cchDest;
  163. if (pb){
  164. if (cchDest > 0){
  165. if(iParam > 9){
  166. pb = fufmPutCexParam(pb, cchRemaining, &cchRemaining, iParam / 10, FUFM_CEX_CONTINUE);
  167. }
  168. *pb++ = (BYTE)((iParam % 10) | iFlag);
  169. cchRemaining--;
  170. }else{
  171. pb = NULL;
  172. }
  173. }
  174. if (!pb){
  175. cchRemaining = 0;
  176. }
  177. if (pcchRemaining)
  178. {
  179. *pcchRemaining = cchRemaining;
  180. }
  181. return pb;
  182. }
  183. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  184. PBYTE _cdecl fufmFormatCommand(PBYTE pbCmd, size_t cchDest, size_t* pcchRemaining, LPCSTR pszFmt, ...)
  185. {
  186. LPCSTR pch;
  187. LPBYTE pb;
  188. size_t cchRemaining = cchDest;
  189. va_list arg;
  190. va_start(arg, pszFmt);
  191. pb = pbCmd;
  192. if (pb){
  193. if (cchDest > 0){
  194. for(pch = pszFmt; *pch != '\0'; ++pch){
  195. // When an error occurs, set the null to pb.
  196. if (cchRemaining < (size_t)(pb - pbCmd)){
  197. pb = NULL;
  198. break;
  199. }
  200. if(*pch == '%'){
  201. ++pch;
  202. switch(*pch){
  203. case 'd':
  204. pb = fufmPutLONG(pb, cchRemaining, &cchRemaining, va_arg(arg, LONG));
  205. break;
  206. case 'u':
  207. pb = fufmPutULONG(pb, cchRemaining, &cchRemaining, va_arg(arg, ULONG));
  208. break;
  209. case '%':
  210. *pb++ = '%';
  211. cchRemaining --;
  212. break;
  213. default:
  214. VERBOSE(("[fufmFormatCommand]invalid seq. %%%c\r\n", *pch))
  215. break;
  216. }
  217. }
  218. else{
  219. *pb++ = *pch;
  220. cchRemaining --;
  221. }
  222. }
  223. }else{
  224. pb = NULL;
  225. }
  226. }
  227. va_end(arg);
  228. if (pb && (pb - pbCmd)){
  229. cchRemaining = cchDest - (pb - pbCmd);
  230. }else{
  231. cchRemaining = 0;
  232. }
  233. if (pcchRemaining)
  234. {
  235. *pcchRemaining = cchRemaining;
  236. }
  237. return pb;
  238. }
  239. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  240. PBYTE fufmPutCP(PBYTE pb, size_t cchDest, size_t* pcchRemaining, int iPitch)
  241. {
  242. size_t cchRemaining = cchDest;
  243. if (pb){
  244. // CP
  245. if (cchDest > 1){
  246. *pb++ = 0x1c;
  247. *pb++ = 0x24;
  248. cchRemaining-=2;
  249. pb = fufmPutCexParam(pb, cchRemaining, &cchRemaining, iPitch, FUFM_CEX_TERMINATE);
  250. }else{
  251. pb = NULL;
  252. }
  253. }
  254. if (!pb){
  255. cchRemaining = 0;
  256. }
  257. if (pcchRemaining)
  258. {
  259. *pcchRemaining = cchRemaining;
  260. }
  261. return pb;
  262. }
  263. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  264. PBYTE fufmPutCommand(PBYTE pb, size_t cchDest, size_t* pcchRemaining, const FUFM_COMMAND* pCmd)
  265. {
  266. size_t cchRemaining = cchDest;
  267. if (pb){
  268. if (cchDest > 0){
  269. if (cchDest < pCmd->cbCommand) return NULL;
  270. memcpy(pb, pCmd->pbCommand, pCmd->cbCommand);
  271. cchRemaining -= pCmd->cbCommand;
  272. pb += pCmd->cbCommand;
  273. }else{
  274. pb = NULL;
  275. }
  276. }
  277. if (!pb){
  278. cchRemaining = 0;
  279. }
  280. if (pcchRemaining)
  281. {
  282. *pcchRemaining = cchRemaining;
  283. }
  284. return pb;
  285. }
  286. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  287. PBYTE fufmUpdatePosition(PBYTE pb, size_t cchDest, size_t* pcchRemaining, PFUFMPDEV pFufmPDEV)
  288. {
  289. int x;
  290. int y;
  291. size_t cchRemaining = cchDest;
  292. if (pb){
  293. if(pFufmPDEV->dwPosChanged != 0){
  294. x = pFufmPDEV->x + 1;
  295. y = pFufmPDEV->y + 1;
  296. switch(pFufmPDEV->dwPosChanged){
  297. case FUFM_X_POSCHANGED: // HPA command
  298. VERBOSE(("[fufmUpdatePosition]HPA %d\r\n", x))
  299. if (cchRemaining > 1){
  300. *pb++ = 0x1b;
  301. *pb++ = 0x5b;
  302. cchRemaining-= 2;
  303. }else{
  304. pb = NULL;
  305. break;
  306. }
  307. pb = fufmPutULONG(pb, cchRemaining, &cchRemaining, x);
  308. if (!pb){
  309. pb = NULL;
  310. break;
  311. }
  312. if (cchRemaining > 0){
  313. *pb++ = 0x60;
  314. cchRemaining--;
  315. }else{
  316. pb = NULL;
  317. break;
  318. }
  319. break;
  320. default: // SAP command
  321. VERBOSE(("[fufmUpdatePosition]SAP %d %d\r\n", x, y))
  322. if (cchRemaining > 1){
  323. *pb++ = 0x1c;
  324. *pb++ = 0x22;
  325. cchRemaining-= 2;
  326. }else{
  327. pb = NULL;
  328. break;
  329. }
  330. pb = fufmPutCexParam(pb, cchRemaining, &cchRemaining, x, FUFM_CEX_SEPARATE);
  331. if (!pb){
  332. pb = NULL;
  333. break;
  334. }
  335. pb = fufmPutCexParam(pb, cchRemaining, &cchRemaining, y, FUFM_CEX_TERMINATE);
  336. if (!pb){
  337. pb = NULL;
  338. break;
  339. }
  340. break;
  341. }
  342. pFufmPDEV->dwPosChanged = 0;
  343. }
  344. }
  345. if (!pb){
  346. cchRemaining = 0;
  347. }
  348. if (pcchRemaining)
  349. {
  350. *pcchRemaining = cchRemaining;
  351. }
  352. return pb;
  353. }
  354. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  355. PBYTE fufmUpdateFontAttributes(PBYTE pb, size_t cchDest, size_t* pcchRemaining, PFUFMPDEV pFufmPDEV)
  356. {
  357. DWORD dwAttributes;
  358. DWORD dwParam;
  359. size_t cchRemaining = cchDest;
  360. if (pb){
  361. if((pFufmPDEV->dwFlags & FUFM_FLAG_SCALABLEFONT) != 0){
  362. if(pFufmPDEV->devData.dwFontAttributes != pFufmPDEV->reqData.dwFontAttributes){
  363. pFufmPDEV->devData.dwFontAttributes = pFufmPDEV->reqData.dwFontAttributes;
  364. dwAttributes = pFufmPDEV->devData.dwFontAttributes;
  365. dwParam = 0;
  366. if (cchRemaining > 1){
  367. *pb++ = 0x1c;
  368. *pb++ = '*';
  369. cchRemaining-= 2;
  370. }else{
  371. return NULL;
  372. }
  373. if((dwAttributes & FUFM_FONTATTR_BOLD) != 0){
  374. if (cchRemaining > 0){
  375. *pb++ = (BYTE)(FUFM_CEX_SEPARATE + dwParam);
  376. }else
  377. return NULL;
  378. dwParam = 1;
  379. }
  380. if((dwAttributes & FUFM_FONTATTR_ITALIC) != 0){
  381. if (cchRemaining > 0){
  382. *pb++ = (BYTE)(FUFM_CEX_SEPARATE + dwParam);
  383. }else
  384. return NULL;
  385. dwParam = 3;
  386. }
  387. if((dwAttributes & FUFM_FONTATTR_UNDERLINE) != 0){
  388. if (cchRemaining > 0){
  389. *pb++ = (BYTE)(FUFM_CEX_SEPARATE + dwParam);
  390. }else
  391. return NULL;
  392. dwParam = 4;
  393. }
  394. if((dwAttributes & FUFM_FONTATTR_STRIKEOUT) != 0){
  395. if (cchRemaining > 0){
  396. *pb++ = (BYTE)(FUFM_CEX_SEPARATE + dwParam);
  397. }else
  398. return NULL;
  399. dwParam = 9;
  400. }
  401. if (cchRemaining > 0){
  402. *pb++ = (BYTE)(FUFM_CEX_TERMINATE + dwParam);
  403. }else
  404. return NULL;
  405. }
  406. }
  407. }
  408. if (!pb){
  409. cchRemaining = 0;
  410. }
  411. if (pcchRemaining)
  412. {
  413. *pcchRemaining = cchRemaining;
  414. }
  415. return pb;
  416. }
  417. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Change the return value: void -> BOOL
  418. BOOL fufmCmdStartDoc(PDEVOBJ pdevobj)
  419. {
  420. PFUFMPDEV pFufmPDEV;
  421. PCFUFMDATA pReq;
  422. PFUFMDATA pDev;
  423. PBYTE pbCmd;
  424. BYTE abCmd[256];
  425. BOOL bResolutionCommandNeed;
  426. BOOL bPaperCommandNeed;
  427. BOOL bCopyCommandNeed;
  428. DWORD dwPaperSize;
  429. DWORD dwPaperWidth;
  430. DWORD dwPaperLength;
  431. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  432. size_t sizeRem = sizeof(abCmd);
  433. VERBOSE(("[fufmCmdStartDoc]\r\n"))
  434. pFufmPDEV = (PFUFMPDEV)pdevobj->pdevOEM;
  435. pReq = &pFufmPDEV->reqData;
  436. pDev = &pFufmPDEV->devData;
  437. pbCmd = abCmd;
  438. bResolutionCommandNeed = TRUE;
  439. bPaperCommandNeed = FALSE;
  440. bCopyCommandNeed = TRUE;
  441. if(pDev->dwSizeReduction != pReq->dwSizeReduction){
  442. pDev->dwSizeReduction = pReq->dwSizeReduction;
  443. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  444. pbCmd = fufmFormatCommand(pbCmd, sizeRem, &sizeRem, "\x1bQ%u!I", pDev->dwSizeReduction);
  445. if (NULL == pbCmd) return FALSE;
  446. bResolutionCommandNeed = TRUE;
  447. bPaperCommandNeed = TRUE;
  448. }
  449. if(bResolutionCommandNeed != FALSE || pDev->dwResolution != pReq->dwResolution){
  450. pDev->dwResolution = pReq->dwResolution;
  451. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  452. pbCmd = fufmFormatCommand(pbCmd, sizeRem, &sizeRem, "\x1bQ%u!A", pDev->dwResolution);
  453. if (NULL == pbCmd) return FALSE;
  454. bPaperCommandNeed = TRUE;
  455. bCopyCommandNeed = TRUE;
  456. pDev->dwFontAttributes = 0;
  457. }
  458. if(pDev->dwPaperSize != pReq->dwPaperSize){
  459. pDev->dwPaperSize = pReq->dwPaperSize;
  460. bPaperCommandNeed = TRUE;
  461. }
  462. if(pDev->dwPaperSource != pReq->dwPaperSource){
  463. pDev->dwPaperSource = pReq->dwPaperSource;
  464. bPaperCommandNeed = TRUE;
  465. }
  466. if(pDev->dwPaperOrientation != pReq->dwPaperOrientation){
  467. pDev->dwPaperOrientation = pReq->dwPaperOrientation;
  468. bPaperCommandNeed = TRUE;
  469. }
  470. if(bPaperCommandNeed != FALSE){
  471. dwPaperSize = pDev->dwPaperSize;
  472. if(dwPaperSize == FUFM_PAPERSIZE_CUSTOM_SIZE)
  473. dwPaperSize = FUFM_PAPERSIZE_A4;
  474. if(pDev->dwPaperSource != FUFM_PAPERSOURCE_AUTO){
  475. // PAPER command
  476. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  477. pbCmd = fufmFormatCommand(pbCmd, sizeRem, &sizeRem, "\x1bQ%u;%u;%u;%u!@",
  478. HIWORD(dwPaperSize),
  479. LOWORD(dwPaperSize),
  480. LOWORD(pDev->dwPaperSource),
  481. pDev->dwPaperOrientation);
  482. if (NULL == pbCmd) return FALSE;
  483. }
  484. else{
  485. // PAPER2 command
  486. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  487. pbCmd = fufmFormatCommand(pbCmd, sizeRem, &sizeRem, "\x1bQ%u;%u;%u!F",
  488. HIWORD(dwPaperSize),
  489. LOWORD(dwPaperSize),
  490. pDev->dwPaperOrientation);
  491. if (NULL == pbCmd) return FALSE;
  492. }
  493. if((pFufmPDEV->dwFlags & FUFM_FLAG_PAPER3) != 0 &&
  494. pDev->dwPaperSize == FUFM_PAPERSIZE_CUSTOM_SIZE &&
  495. pDev->dwPaperSource == FUFM_PAPERSOURCE_MANUAL){
  496. // PAPER3 command
  497. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  498. pbCmd = fufmFormatCommand(pbCmd, sizeRem, &sizeRem, "\x1bQ9;%u;%u;%u!\\",
  499. pFufmPDEV->dwPaperWidth,
  500. pFufmPDEV->dwPaperLength,
  501. pDev->dwPaperOrientation);
  502. if (NULL == pbCmd) return FALSE;
  503. }
  504. }
  505. if(bCopyCommandNeed != FALSE || pDev->dwCopies != pReq->dwCopies){
  506. pDev->dwCopies = pReq->dwCopies;
  507. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  508. pbCmd = fufmFormatCommand(pbCmd, sizeRem, &sizeRem, "\x1bQ%u!D", pDev->dwCopies);
  509. if (NULL == pbCmd) return FALSE;
  510. }
  511. if((pFufmPDEV->dwFlags & FUFM_FLAG_SCALABLEFONT) != 0){
  512. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  513. pbCmd = fufmFormatCommand(pbCmd, sizeRem, &sizeRem, "\x1bQ1;0;1;1;0!Q\x1c*\x70");
  514. if (NULL == pbCmd) return FALSE;
  515. }
  516. if(pbCmd > abCmd){
  517. WRITESPOOLBUF(pdevobj, abCmd, (DWORD)(pbCmd - abCmd));
  518. }
  519. return TRUE;
  520. }
  521. void fufmCmdEmMode(PDEVOBJ pdevobj, FUFM_EMMODE emMode)
  522. {
  523. PFUFMPDEV pFufmPDEV;
  524. VERBOSE(("[fufmCmdChangeEM]%d\r\n", emMode))
  525. pFufmPDEV = (PFUFMPDEV)pdevobj->pdevOEM;
  526. pFufmPDEV->emMode = emMode;
  527. if(pFufmPDEV->emMode == FUFM_EMMODE_ESCP){
  528. WRITESPOOLBUF(pdevobj, "\x1b/\xb2@\x7f", 5);
  529. }
  530. }
  531. void fufmCmdEndJob(PDEVOBJ pdevobj)
  532. {
  533. PFUFMPDEV pFufmPDEV;
  534. VERBOSE(("[fufmCmdEndJob]\r\n"))
  535. pFufmPDEV = (PFUFMPDEV)pdevobj->pdevOEM;
  536. if(pFufmPDEV->emMode == FUFM_EMMODE_ESCP){
  537. WRITESPOOLBUF(pdevobj, "\x1b\x7f\x00\x00\x01\x05", 6);
  538. }
  539. else if((pFufmPDEV->dwFlags & FUFM_FLAG_QUICKRESET) == 0){
  540. WRITESPOOLBUF(pdevobj, "\x1bQ0!d", 5);
  541. }
  542. else{
  543. WRITESPOOLBUF(pdevobj, "\x1b\x63", 2);
  544. }
  545. }
  546. void fufmCmdStartPage(PDEVOBJ pdevobj)
  547. {
  548. PFUFMPDEV pFufmPDEV;
  549. VERBOSE(("[fufmCmdStartPage]\r\n"))
  550. pFufmPDEV = (PFUFMPDEV)pdevobj->pdevOEM;
  551. pFufmPDEV->x = 0;
  552. pFufmPDEV->y = 0;
  553. pFufmPDEV->dwPosChanged = FUFM_X_POSCHANGED | FUFM_Y_POSCHANGED;
  554. }
  555. void fufmCmdEndPage(PDEVOBJ pdevobj)
  556. {
  557. VERBOSE(("[fufmCmdEndPage]\r\n"))
  558. }
  559. void fufmCmdFormFeed(PDEVOBJ pdevobj)
  560. {
  561. PFUFMPDEV pFufmPDEV;
  562. VERBOSE(("[fufmCmdFormFeed]\r\n"))
  563. pFufmPDEV = (PFUFMPDEV)pdevobj->pdevOEM;
  564. pFufmPDEV->x = 0;
  565. pFufmPDEV->y = 0;
  566. pFufmPDEV->dwPosChanged = FUFM_X_POSCHANGED | FUFM_Y_POSCHANGED;
  567. WRITESPOOLBUF(pdevobj, "\x0c", 1);
  568. }
  569. void fufmCmdCR(PDEVOBJ pdevobj)
  570. {
  571. PFUFMPDEV pFufmPDEV;
  572. VERBOSE(("[fufmCmdCR]\r\n"))
  573. pFufmPDEV = (PFUFMPDEV)pdevobj->pdevOEM;
  574. pFufmPDEV->x = 0;
  575. pFufmPDEV->dwPosChanged |= FUFM_X_POSCHANGED;
  576. }
  577. void fufmCmdSetLinefeedSpacing(PDEVOBJ pdevobj, int iLinefeedSpacing)
  578. {
  579. PFUFMPDEV pFufmPDEV;
  580. VERBOSE(("[fufmSetLinefeedSpacing]\r\n"))
  581. pFufmPDEV = (PFUFMPDEV)pdevobj->pdevOEM;
  582. pFufmPDEV->iLinefeedSpacing = iLinefeedSpacing;
  583. }
  584. void fufmCmdLF(PDEVOBJ pdevobj)
  585. {
  586. PFUFMPDEV pFufmPDEV;
  587. VERBOSE(("[fufmCmdLF]\r\n"))
  588. pFufmPDEV = (PFUFMPDEV)pdevobj->pdevOEM;
  589. pFufmPDEV->y += pFufmPDEV->iLinefeedSpacing;
  590. pFufmPDEV->dwPosChanged |= FUFM_Y_POSCHANGED;
  591. }
  592. INT fufmCmdXMove(PFUFMPDEV pFufmPDEV, PDWORD pdwParams)
  593. {
  594. INT x;
  595. VERBOSE(("[fufmCmdXMove] %d\r\n", pdwParams[0]))
  596. x = FUFM_MASTER_TO_DEVICE(pFufmPDEV, pdwParams[0]);
  597. if(x < 0)
  598. x = 0;
  599. if(x != pFufmPDEV->x){
  600. pFufmPDEV->x = x;
  601. pFufmPDEV->dwPosChanged |= FUFM_X_POSCHANGED;
  602. }
  603. // #492286: Characters printed as wrong position.
  604. return (INT)pdwParams[0];
  605. }
  606. INT fufmCmdYMove(PFUFMPDEV pFufmPDEV, PDWORD pdwParams)
  607. {
  608. INT y;
  609. VERBOSE(("[fufmCmdYMove] %d\n", pdwParams[0]))
  610. y = FUFM_MASTER_TO_DEVICE(pFufmPDEV, pdwParams[0]);
  611. if(y < 0)
  612. y = 0;
  613. if(y != pFufmPDEV->y){
  614. pFufmPDEV->y = y;
  615. pFufmPDEV->dwPosChanged |= FUFM_Y_POSCHANGED;
  616. }
  617. // #492286: Characters printed as wrong position.
  618. return (INT)pdwParams[0];
  619. }
  620. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Change the return value: void -> BOOL
  621. BOOL fufmCmdSendBlock(PDEVOBJ pdevobj, PDWORD pdwParams)
  622. {
  623. enum { FUFM_ZERO_DATA_SIZE = 512 };
  624. enum { FUFM_CY_BORDER = 180 };
  625. static BYTE abZeroData[FUFM_ZERO_DATA_SIZE];
  626. PFUFMPDEV pFufmPDEV;
  627. DWORD cbBlockData;
  628. DWORD cBlockByteWidth;
  629. int x;
  630. int y;
  631. int cyBorder;
  632. int yBorder;
  633. int cPadLine;
  634. int cPadSize;
  635. PBYTE pbCmd;
  636. BYTE abCmd[64];
  637. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  638. size_t sizeRem = sizeof(abCmd);
  639. DDI_VERBOSE(("[fufmCmdSendBlock]\r\n"))
  640. pFufmPDEV = pdevobj->pdevOEM;
  641. cbBlockData = pdwParams[0];
  642. cBlockByteWidth = pdwParams[1];
  643. x = pFufmPDEV->x + 1;
  644. y = pFufmPDEV->y + 1;
  645. cyBorder = FUFM_MASTER_TO_DEVICE(pFufmPDEV, FUFM_CY_BORDER);
  646. yBorder = pFufmPDEV->cyPage - cyBorder;
  647. cPadLine = y - yBorder;
  648. if(cPadLine < 0)
  649. cPadLine = 0;
  650. VERBOSE(("y %d yBorder %d cPadLine %d\r\n", y, yBorder, cPadLine))
  651. cPadSize = cPadLine * cBlockByteWidth;
  652. pbCmd = abCmd;
  653. if(pFufmPDEV->dwPosChanged != 0 || cPadLine > 0){
  654. // SAP command
  655. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  656. if (sizeRem > 1){
  657. *pbCmd++ = 0x1c;
  658. *pbCmd++ = 0x22;
  659. sizeRem -= 2;
  660. }else
  661. return FALSE;
  662. pbCmd = fufmPutCexParam(pbCmd, sizeRem, &sizeRem, x, FUFM_CEX_SEPARATE);
  663. if (!pbCmd) return FALSE;
  664. pbCmd = fufmPutCexParam(pbCmd, sizeRem, &sizeRem, y - cPadLine, FUFM_CEX_TERMINATE);
  665. if (!pbCmd) return FALSE;
  666. pFufmPDEV->dwPosChanged = 0;
  667. }
  668. // RTGIMG command
  669. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  670. pbCmd = fufmFormatCommand(pbCmd, sizeRem, &sizeRem, "\x1bQ%u;%u;0!a",
  671. cbBlockData + cPadSize,
  672. cBlockByteWidth * 8);
  673. if (NULL == pbCmd) return FALSE;
  674. WRITESPOOLBUF(pdevobj, abCmd, (DWORD)(pbCmd - abCmd));
  675. if(cPadSize > 0){
  676. VERBOSE(("pad image %d lines\r\n", cPadLine))
  677. for(; cPadSize > FUFM_ZERO_DATA_SIZE; cPadSize -= FUFM_ZERO_DATA_SIZE)
  678. WRITESPOOLBUF(pdevobj, abZeroData, FUFM_ZERO_DATA_SIZE);
  679. WRITESPOOLBUF(pdevobj, abZeroData, cPadSize);
  680. }
  681. return TRUE;
  682. }
  683. // MINI5 Export func.
  684. INT APIENTRY OEMCommandCallback(
  685. PDEVOBJ pdevobj,
  686. DWORD dwCmdCbID,
  687. DWORD dwCount,
  688. PDWORD pdwParams)
  689. {
  690. PFUFMPDEV pFufmPDEV;
  691. DDI_VERBOSE(("[OEMCommandCallback]dwCmdCbID %d\r\n", dwCmdCbID))
  692. // NTRAID#NTBUG9-587382-2002/03/27-v-sueyas-: Check for illegal parameters
  693. if (NULL == pdevobj)
  694. {
  695. ERR(("OEMCommandCallback: Invalid parameter(s).\n"));
  696. return 0;
  697. }
  698. pFufmPDEV = (PFUFMPDEV)pdevobj->pdevOEM;
  699. if(IS_VALID_FUFMPDEV(pFufmPDEV) == FALSE)
  700. return 0;
  701. switch(dwCmdCbID){
  702. case CMDID_FF: fufmCmdFormFeed(pdevobj); break;
  703. case CMDID_CR: fufmCmdCR(pdevobj); break;
  704. case CMDID_SET_LINEFEEDSPACING:
  705. // NTRAID#NTBUG9-587382-2002/03/27-v-sueyas-: Check for illegal parameters
  706. if (!pdwParams)
  707. return 0; // cannot do anything
  708. fufmCmdSetLinefeedSpacing(pdevobj, (int)pdwParams[0]);
  709. break;
  710. case CMDID_LF: fufmCmdLF(pdevobj); break;
  711. case CMDID_X_MOVE:
  712. // NTRAID#NTBUG9-587382-2002/03/27-v-sueyas-: Check for illegal parameters
  713. if (!pdwParams)
  714. return 0; // cannot do anything
  715. return fufmCmdXMove(pFufmPDEV, pdwParams);
  716. // no break
  717. case CMDID_Y_MOVE:
  718. // NTRAID#NTBUG9-587382-2002/03/27-v-sueyas-: Check for illegal parameters
  719. if (!pdwParams)
  720. return 0; // cannot do anything
  721. return fufmCmdYMove(pFufmPDEV, pdwParams);
  722. // no break
  723. case CMDID_SEND_BLOCK:
  724. // NTRAID#NTBUG9-587382-2002/03/27-v-sueyas-: Check for illegal parameters
  725. if (!pdwParams)
  726. return 0; // cannot do anything
  727. fufmCmdSendBlock(pdevobj, pdwParams);
  728. break;
  729. case CMDID_FONTATTR_BOLD_OFF: pFufmPDEV->reqData.dwFontAttributes &= ~FUFM_FONTATTR_BOLD; break;
  730. case CMDID_FONTATTR_BOLD_ON: pFufmPDEV->reqData.dwFontAttributes |= FUFM_FONTATTR_BOLD; break;
  731. case CMDID_FONTATTR_ITALIC_OFF: pFufmPDEV->reqData.dwFontAttributes &= ~FUFM_FONTATTR_ITALIC; break;
  732. case CMDID_FONTATTR_ITALIC_ON: pFufmPDEV->reqData.dwFontAttributes |= FUFM_FONTATTR_ITALIC; break;
  733. case CMDID_FONTATTR_UNDERLINE_OFF: pFufmPDEV->reqData.dwFontAttributes &= ~FUFM_FONTATTR_UNDERLINE; break;
  734. case CMDID_FONTATTR_UNDERLINE_ON: pFufmPDEV->reqData.dwFontAttributes |= FUFM_FONTATTR_UNDERLINE; break;
  735. case CMDID_FONTATTR_STRIKEOUT_OFF: pFufmPDEV->reqData.dwFontAttributes &= ~FUFM_FONTATTR_STRIKEOUT; break;
  736. case CMDID_FONTATTR_STRIKEOUT_ON: pFufmPDEV->reqData.dwFontAttributes |= FUFM_FONTATTR_STRIKEOUT; break;
  737. // #251047: overlaps SBCS on vert mode
  738. case CMDID_SELECTSINGLE: {
  739. PBYTE pb;
  740. BYTE ab[256];
  741. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  742. size_t sizeRem = sizeof(ab);
  743. pb = ab;
  744. pb = fufmPutCommand(pb, sizeRem, &sizeRem, &g_cmdSingleMode);
  745. if (!pb) return 0;
  746. // #284409: SBCS rotated on vert mode
  747. // if (pFufmPDEV->dwFlags & FUFM_FLAG_VERTICALFONT)
  748. // pb = fufmPutCommand(pb, &g_cmdHWF);
  749. if (pb > ab)
  750. WRITESPOOLBUF(pdevobj, ab, (DWORD)(pb - ab));
  751. break;
  752. }
  753. case CMDID_SELECTDOUBLE: {
  754. PBYTE pb;
  755. BYTE ab[256];
  756. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  757. size_t sizeRem = sizeof(ab);
  758. pb = ab;
  759. pb = fufmPutCommand(pb, sizeRem, &sizeRem, &g_cmdDoubleMode);
  760. if (!pb) return 0;
  761. // #284409: SBCS rotated on vert mode
  762. // if (pFufmPDEV->dwFlags & FUFM_FLAG_VERTICALFONT)
  763. // pb = fufmPutCommand(pb, &g_cmdVWF);
  764. if (pb > ab)
  765. WRITESPOOLBUF(pdevobj, ab, (DWORD)(pb - ab));
  766. break;
  767. }
  768. // PAGE_SETUP.1
  769. case CMDID_START_PAGE: fufmCmdStartPage(pdevobj); break;
  770. // DOC_SETUP.1
  771. case CMDID_SIZE_REDUCTION_100: pFufmPDEV->reqData.dwSizeReduction = FUFM_SIZE_REDUCTION_100; break;
  772. case CMDID_SIZE_REDUCTION_75: pFufmPDEV->reqData.dwSizeReduction = FUFM_SIZE_REDUCTION_75; break;
  773. case CMDID_SIZE_REDUCITON_70: pFufmPDEV->reqData.dwSizeReduction = FUFM_SIZE_REDUCTION_70; break;
  774. // DOC_SETUP.2
  775. case CMDID_RESOLUTION_240: pFufmPDEV->reqData.dwResolution = FUFM_RESOLUTION_240; break;
  776. case CMDID_RESOLUTION_400: pFufmPDEV->reqData.dwResolution = FUFM_RESOLUTION_400; break;
  777. // DOC_SETUP.3
  778. case CMDID_ORIENTATION_PORTRAIT: pFufmPDEV->reqData.dwPaperOrientation = FUFM_PAPERORIENTATION_PORTRAIT; break;
  779. case CMDID_ORIENTATION_LANDSCAPE: pFufmPDEV->reqData.dwPaperOrientation = FUFM_PAPERORIENTATION_LANDSCAPE; break;
  780. // DOC_SETUP.4
  781. case CMDID_PAPERSOURCE_AUTO: pFufmPDEV->reqData.dwPaperSource = FUFM_PAPERSOURCE_AUTO; break;
  782. case CMDID_PAPERSOURCE_MANUAL: pFufmPDEV->reqData.dwPaperSource = FUFM_PAPERSOURCE_MANUAL; break;
  783. case CMDID_PAPERSOURCE_BIN1: pFufmPDEV->reqData.dwPaperSource = FUFM_PAPERSOURCE_BIN1; break;
  784. case CMDID_PAPERSOURCE_BIN2: pFufmPDEV->reqData.dwPaperSource = FUFM_PAPERSOURCE_BIN2; break;
  785. case CMDID_PAPERSOURCE_BIN3: pFufmPDEV->reqData.dwPaperSource = FUFM_PAPERSOURCE_BIN3; break;
  786. // DOC_SETUP.5
  787. case CMDID_FORM_A3: pFufmPDEV->reqData.dwPaperSize = FUFM_PAPERSIZE_A3; break;
  788. case CMDID_FORM_A4: pFufmPDEV->reqData.dwPaperSize = FUFM_PAPERSIZE_A4; break;
  789. case CMDID_FORM_A5: pFufmPDEV->reqData.dwPaperSize = FUFM_PAPERSIZE_A5; break;
  790. case CMDID_FORM_B4: pFufmPDEV->reqData.dwPaperSize = FUFM_PAPERSIZE_B4; break;
  791. case CMDID_FORM_B5: pFufmPDEV->reqData.dwPaperSize = FUFM_PAPERSIZE_B5; break;
  792. case CMDID_FORM_LETTER: pFufmPDEV->reqData.dwPaperSize = FUFM_PAPERSIZE_LETTER; break;
  793. case CMDID_FORM_LEGAL: pFufmPDEV->reqData.dwPaperSize = FUFM_PAPERSIZE_LEGAL; break;
  794. case CMDID_FORM_JAPANESE_POSTCARD: pFufmPDEV->reqData.dwPaperSize = FUFM_PAPERSIZE_JAPANESE_POSTCARD; break;
  795. // DOC_SETUP.6
  796. // @Aug/31/98 ->
  797. case CMDID_COPIES:
  798. // NTRAID#NTBUG9-587382-2002/03/27-v-sueyas-: Check for illegal parameters
  799. if (!pdwParams)
  800. return 0; // cannot do anything
  801. if (MAX_COPIES_VALUE < pdwParams[0]) {
  802. pFufmPDEV->reqData.dwCopies = MAX_COPIES_VALUE;
  803. }
  804. else if (1 > pdwParams[0]) {
  805. pFufmPDEV->reqData.dwCopies = 1;
  806. }
  807. else {
  808. pFufmPDEV->reqData.dwCopies = pdwParams[0];
  809. }
  810. // @Aug/31/98 <-
  811. break;
  812. // DOC_SETUP.7
  813. case CMDID_START_DOC: fufmCmdStartDoc(pdevobj); break;
  814. // JOB_SETUP.1
  815. case CMDID_START_JOB_0: pFufmPDEV->dwFlags = 0; break;
  816. case CMDID_START_JOB_1: pFufmPDEV->dwFlags = FUFM_FLAG_START_JOB_1; break;
  817. case CMDID_START_JOB_2: pFufmPDEV->dwFlags = FUFM_FLAG_START_JOB_2; break;
  818. case CMDID_START_JOB_3: pFufmPDEV->dwFlags = FUFM_FLAG_START_JOB_3; break;
  819. case CMDID_START_JOB_4: pFufmPDEV->dwFlags = FUFM_FLAG_START_JOB_4; break;
  820. // JOB_SETUP.2
  821. case CMDID_EMMODE_FM: fufmCmdEmMode(pdevobj, FUFM_EMMODE_FM); break;
  822. case CMDID_EMMODE_ESCP: fufmCmdEmMode(pdevobj, FUFM_EMMODE_ESCP); break;
  823. // JOB_FINISH.1
  824. case CMDID_END_JOB: fufmCmdEndJob(pdevobj); break;
  825. }
  826. return 0;
  827. }
  828. void fufmGetPaperSize(PFUFMPDEV pFufmPDEV, const GDIINFO* pGdiInfo)
  829. {
  830. pFufmPDEV->dwPaperWidth = pGdiInfo->ulHorzSize;
  831. if((LONG)pFufmPDEV->dwPaperWidth < 0)
  832. pFufmPDEV->dwPaperWidth = (-(LONG)pFufmPDEV->dwPaperWidth + 500) / 1000;
  833. pFufmPDEV->dwPaperLength = pGdiInfo->ulVertSize;
  834. if((LONG)pFufmPDEV->dwPaperLength < 0)
  835. pFufmPDEV->dwPaperLength = (-(LONG)pFufmPDEV->dwPaperLength + 500) / 1000;
  836. VERBOSE(("paper size %u %u\r\n", pFufmPDEV->dwPaperWidth, pFufmPDEV->dwPaperLength))
  837. VERBOSE(("printable area %u %u\r\n", pGdiInfo->ulHorzRes, pGdiInfo->ulVertRes))
  838. pFufmPDEV->cyPage = (int)pGdiInfo->ulVertRes;
  839. }
  840. void fufmInitData(PFUFMDATA pDev)
  841. {
  842. pDev->dwSizeReduction = FUFM_SIZE_REDUCTION_UNKNOWN;
  843. pDev->dwResolution = FUFM_RESOLUTION_UNKNOWN;
  844. pDev->dwPaperSize = FUFM_PAPERSIZE_UNKNOWN;
  845. pDev->dwPaperSource = FUFM_PAPERSOURCE_UNKNOWN;
  846. pDev->dwPaperOrientation = FUFM_PAPERORIENTATION_UNKNOWN;
  847. pDev->dwCopies = (DWORD)-1; // UNKNOWN
  848. pDev->dwFontAttributes = 0;
  849. }
  850. // MINI5 Export func.
  851. PDEVOEM APIENTRY OEMEnablePDEV(
  852. PDEVOBJ pdevobj,
  853. PWSTR pPrinterName,
  854. ULONG cPatterns,
  855. HSURF* phsurfPatterns,
  856. ULONG cjGdiInfo,
  857. GDIINFO* pGdiInfo,
  858. ULONG cjDevInfo,
  859. DEVINFO* pDevInfo,
  860. DRVENABLEDATA* pded
  861. )
  862. {
  863. PFUFMPDEV pFufmPDEV;
  864. DDI_VERBOSE(("[OEMEnablePDEV]" __DATE__ " " __TIME__ "\r\n"));
  865. // NTRAID#NTBUG9-587382-2002/03/27-v-sueyas-: Check for illegal parameters
  866. if (NULL == pdevobj)
  867. {
  868. ERR(("Invalid parameter(s).\n"));
  869. return NULL;
  870. }
  871. pFufmPDEV = (PFUFMPDEV)MemAlloc(sizeof(FUFMPDEV));
  872. if(pFufmPDEV != NULL){
  873. pFufmPDEV->dwSignature = FUFM_OEM_SIGNATURE;
  874. pFufmPDEV->emMode = FUFM_EMMODE_FM;
  875. pFufmPDEV->dwFlags = 0;
  876. pFufmPDEV->dwPosChanged = FUFM_X_POSCHANGED | FUFM_Y_POSCHANGED;
  877. pFufmPDEV->x = 0;
  878. pFufmPDEV->y = 0;
  879. pFufmPDEV->iLinefeedSpacing = 0;
  880. VERBOSE(("paper size %u %u\r\n", pGdiInfo->szlPhysSize.cx, pGdiInfo->szlPhysSize.cy))
  881. fufmGetPaperSize(pFufmPDEV, pGdiInfo);
  882. fufmInitData(&pFufmPDEV->devData);
  883. fufmInitData(&pFufmPDEV->reqData);
  884. }
  885. return pFufmPDEV;
  886. }
  887. // MINI5 Export func.
  888. VOID APIENTRY OEMDisablePDEV(PDEVOBJ pdevobj)
  889. {
  890. PFUFMPDEV pFufmPDEV;
  891. DDI_VERBOSE(("[OEMDisablePDEV]\r\n"));
  892. // NTRAID#NTBUG9-587382-2002/03/27-v-sueyas-: Check for illegal parameters
  893. if (NULL == pdevobj)
  894. {
  895. ERR(("Invalid parameter(s).\n"));
  896. return;
  897. }
  898. pFufmPDEV = (PFUFMPDEV)pdevobj->pdevOEM;
  899. if(IS_VALID_FUFMPDEV(pFufmPDEV) == FALSE)
  900. return;
  901. MemFree(pdevobj->pdevOEM);
  902. pdevobj->pdevOEM = NULL;
  903. }
  904. // MINI5 Export func.
  905. BOOL APIENTRY OEMResetPDEV(
  906. PDEVOBJ pdevobjOld,
  907. PDEVOBJ pdevobjNew
  908. )
  909. {
  910. PFUFMPDEV pFufmPDEVOld;
  911. PFUFMPDEV pFufmPDEVNew;
  912. DDI_VERBOSE(("[OEMResetPDEV]\r\n"))
  913. // NTRAID#NTBUG9-587382-2002/03/27-v-sueyas-: Check for illegal parameters
  914. if (NULL == pdevobjOld || NULL == pdevobjNew)
  915. {
  916. ERR(("Invalid parameter(s).\n"));
  917. return FALSE;
  918. }
  919. pFufmPDEVOld = (PFUFMPDEV)pdevobjOld->pdevOEM;
  920. if(IS_VALID_FUFMPDEV(pFufmPDEVOld) == FALSE)
  921. return FALSE;
  922. pFufmPDEVNew = (PFUFMPDEV)pdevobjNew->pdevOEM;
  923. if(IS_VALID_FUFMPDEV(pFufmPDEVNew) == FALSE)
  924. return FALSE;
  925. pFufmPDEVNew->devData = pFufmPDEVOld->devData;
  926. return TRUE;
  927. }
  928. // MINI5 Export func.
  929. // NTRAID#NTBUG9-587382-2002/03/27-v-sueyas-: Error handling
  930. BOOL APIENTRY bOEMOutputCharStr(
  931. PDEVOBJ pdevobj,
  932. PUNIFONTOBJ pUFObj,
  933. DWORD dwType,
  934. DWORD dwCount,
  935. PVOID pGlyph
  936. )
  937. {
  938. PFUFMPDEV pFufmPDEV;
  939. GETINFO_GLYPHSTRING glyphStr;
  940. PBYTE pb;
  941. BYTE abBuff[256];
  942. // #333653: Change I/F for GETINFO_GLYPHSTRING
  943. PTRANSDATA pTrans, aTrans;
  944. DWORD i;
  945. DWORD cbNeeded;
  946. PDWORD pdwGlyphID;
  947. INT cxfont; //#144637
  948. // #284409: SBCS rotated on vert mode
  949. BYTE ab[16];
  950. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  951. size_t sizeRem = sizeof(abBuff);
  952. DDI_VERBOSE(("[OEMOutputCharStr]\r\n"))
  953. // NTRAID#NTBUG9-587382-2002/03/27-v-sueyas-: Check for illegal parameters
  954. if(NULL == pdevobj || NULL == pUFObj)
  955. {
  956. ERR(("bOEMOutputCharStr: Invalid parameter(s).\n"));
  957. return FALSE;
  958. }
  959. pFufmPDEV = (PFUFMPDEV)pdevobj->pdevOEM;
  960. if(IS_VALID_FUFMPDEV(pFufmPDEV) == FALSE)
  961. return FALSE;
  962. pb = abBuff;
  963. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  964. pb = fufmUpdatePosition(pb, sizeRem, &sizeRem, pFufmPDEV);
  965. if (!pb) return FALSE;
  966. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  967. pb = fufmUpdateFontAttributes(pb, sizeRem, &sizeRem, pFufmPDEV);
  968. if (!pb) return FALSE;
  969. if(pb > abBuff){
  970. WRITESPOOLBUF(pdevobj, abBuff, (DWORD)(pb - abBuff));
  971. }
  972. switch(dwType){
  973. case TYPE_GLYPHHANDLE:
  974. VERBOSE(("TYPE_GLYPHHANDLE\r\n"))
  975. glyphStr.dwSize = sizeof(glyphStr);
  976. glyphStr.dwCount = dwCount;
  977. glyphStr.dwTypeIn = TYPE_GLYPHHANDLE;
  978. glyphStr.pGlyphIn = pGlyph;
  979. glyphStr.dwTypeOut = TYPE_TRANSDATA;
  980. // #333653: Change I/F for GETINFO_GLYPHSTRING
  981. glyphStr.pGlyphOut = NULL;
  982. glyphStr.dwGlyphOutSize = 0;
  983. if(pUFObj->pfnGetInfo(pUFObj, UFO_GETINFO_GLYPHSTRING, &glyphStr, sizeof(glyphStr), &cbNeeded) || !glyphStr.dwGlyphOutSize){
  984. VERBOSE(("UFO_GETINFO_GLYPHSTRING error\r\n"))
  985. return FALSE;
  986. }
  987. if((aTrans = (PTRANSDATA)MemAlloc(glyphStr.dwGlyphOutSize)) == NULL) {
  988. VERBOSE(("MemAlloc fail\r\n"))
  989. return FALSE;
  990. }
  991. glyphStr.pGlyphOut = aTrans;
  992. if(FALSE == pUFObj->pfnGetInfo(pUFObj, UFO_GETINFO_GLYPHSTRING, &glyphStr, sizeof(glyphStr), &cbNeeded)){
  993. VERBOSE(("UFO_GETINFO_GLYPHSTRING error\r\n"))
  994. goto out;
  995. }
  996. pTrans = aTrans;
  997. cxfont = pFufmPDEV->cxfont; //#144637
  998. for(i = dwCount; i > 0; --i){
  999. VERBOSE(("TYPE_TRANSDATA:ubCodePageID:0x%x ubType:0x%x\r\n", pTrans->ubCodePageID, pTrans->ubType))
  1000. switch(pTrans->ubType & (MTYPE_FORMAT_MASK | MTYPE_DOUBLEBYTECHAR_MASK)){
  1001. case MTYPE_DIRECT:
  1002. case MTYPE_DIRECT | MTYPE_SINGLE:
  1003. case MTYPE_DIRECT | MTYPE_DOUBLE:
  1004. // #284409: SBCS rotated on vert mode
  1005. if (pFufmPDEV->dwFlags & FUFM_FLAG_VERTICALFONT) {
  1006. if (pFufmPDEV->dwFlags & FUFM_FLAG_FONTROTATED) {
  1007. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  1008. pb = fufmPutCommand(ab, sizeRem, &sizeRem, &g_cmdHWF);
  1009. if (!pb) return FALSE;
  1010. if (pb > ab)
  1011. WRITESPOOLBUF(pdevobj, ab, (DWORD)(pb - ab));
  1012. pFufmPDEV->dwFlags &= ~FUFM_FLAG_FONTROTATED;
  1013. }
  1014. }
  1015. WRITESPOOLBUF(pdevobj, &pTrans->uCode.ubCode, 1);
  1016. pFufmPDEV->x += (cxfont / 2); //#144637
  1017. break;
  1018. case MTYPE_PAIRED:
  1019. case MTYPE_PAIRED | MTYPE_DOUBLE:
  1020. // #284409: SBCS rotated on vert mode
  1021. if (pFufmPDEV->dwFlags & FUFM_FLAG_VERTICALFONT) {
  1022. if (!(pFufmPDEV->dwFlags & FUFM_FLAG_FONTROTATED)) {
  1023. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  1024. pb = fufmPutCommand(ab, sizeRem, &sizeRem, &g_cmdVWF);
  1025. if (!pb) return FALSE;
  1026. if (pb > ab)
  1027. WRITESPOOLBUF(pdevobj, ab, (DWORD)(pb - ab));
  1028. pFufmPDEV->dwFlags |= FUFM_FLAG_FONTROTATED;
  1029. }
  1030. }
  1031. WRITESPOOLBUF(pdevobj, pTrans->uCode.ubPairs, 2);
  1032. pFufmPDEV->x += cxfont; //#144637
  1033. break;
  1034. case MTYPE_PAIRED | MTYPE_SINGLE:
  1035. // #284409: SBCS rotated on vert mode
  1036. if (pFufmPDEV->dwFlags & FUFM_FLAG_VERTICALFONT) {
  1037. if (pFufmPDEV->dwFlags & FUFM_FLAG_FONTROTATED) {
  1038. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  1039. pb = fufmPutCommand(ab, sizeRem, &sizeRem, &g_cmdHWF);
  1040. if (!pb) return FALSE;
  1041. if (pb > ab)
  1042. WRITESPOOLBUF(pdevobj, ab, (DWORD)(pb - ab));
  1043. pFufmPDEV->dwFlags &= ~FUFM_FLAG_FONTROTATED;
  1044. }
  1045. }
  1046. WRITESPOOLBUF(pdevobj, &pTrans->uCode.ubPairs[1], 1);
  1047. pFufmPDEV->x += (cxfont / 2); //#144637
  1048. break;
  1049. }
  1050. ++pTrans;
  1051. }
  1052. out:
  1053. MemFree(aTrans);
  1054. break;
  1055. case TYPE_GLYPHID:
  1056. VERBOSE(("TYPE_GLYPHID\r\n"))
  1057. pdwGlyphID = (PDWORD)pGlyph;
  1058. for(i = dwCount; i > 0; --i){
  1059. VERBOSE(("TYPE_GLYPHID:0x%x\r\n", *pdwGlyphID))
  1060. WRITESPOOLBUF(pdevobj, (PBYTE)pGlyph, 1);
  1061. ++pdwGlyphID;
  1062. }
  1063. break;
  1064. case TYPE_TRANSDATA:
  1065. VERBOSE(("TYPE_TRANSDATA\r\n"))
  1066. break;
  1067. case TYPE_UNICODE:
  1068. VERBOSE(("TYPE_UNICODE\r\n"))
  1069. break;
  1070. }
  1071. return TRUE;
  1072. }
  1073. // NTRAID#NTBUG9-587382-2002/03/27-v-sueyas-: Error handling
  1074. BOOL APIENTRY bOEMSendFontCmd(
  1075. PDEVOBJ pdevobj,
  1076. PUNIFONTOBJ pUFObj,
  1077. PFINVOCATION pFInv
  1078. )
  1079. {
  1080. PFUFMPDEV pFufmPDEV;
  1081. enum { CB_STDVAR_2 = sizeof(GETINFO_STDVAR) + sizeof(DWORD) * 2 * (2 - 1) };
  1082. PGETINFO_STDVAR pSV;
  1083. DWORD adwStdVarBuff[(CB_STDVAR_2 + sizeof(DWORD) - 1) / sizeof(DWORD)];
  1084. DWORD cbNeeded;
  1085. DWORD i;
  1086. LONG cxFont;
  1087. LONG cyFont;
  1088. DWORD dwResolution;
  1089. PBYTE pbCmd;
  1090. BYTE abCmd[256];
  1091. PIFIMETRICS pIFI;
  1092. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  1093. size_t sizeRem = sizeof(abCmd);
  1094. // NTRAID#NTBUG9-587382-2002/03/27-v-sueyas-: Check for illegal parameters
  1095. if(NULL == pdevobj || NULL == pUFObj || NULL == pFInv)
  1096. {
  1097. ERR(("bOEMSendFontCmd: Invalid parameter(s).\n"));
  1098. return FALSE;
  1099. }
  1100. pIFI = pUFObj->pIFIMetrics;
  1101. #define SV_HEIGHT (pSV->StdVar[0].lStdVariable)
  1102. #define SV_WIDTH (pSV->StdVar[1].lStdVariable)
  1103. DDI_VERBOSE(("[OEMSendFontCmd]FontID:%d dwFlags:%x\r\n", pUFObj->ulFontID, pUFObj->dwFlags))
  1104. pFufmPDEV = (PFUFMPDEV)pdevobj->pdevOEM;
  1105. if(IS_VALID_FUFMPDEV(pFufmPDEV) == FALSE)
  1106. return FALSE;
  1107. pSV = (PGETINFO_STDVAR)adwStdVarBuff;
  1108. pSV->dwSize = CB_STDVAR_2;
  1109. pSV->dwNumOfVariable = 2;
  1110. pSV->StdVar[0].dwStdVarID = FNT_INFO_FONTHEIGHT;
  1111. pSV->StdVar[1].dwStdVarID = FNT_INFO_FONTWIDTH;
  1112. if (!pUFObj->pfnGetInfo(pUFObj, UFO_GETINFO_STDVARIABLE, pSV, pSV->dwSize, &cbNeeded)) {
  1113. VERBOSE(("UFO_GETINFO_STDVARIABLE failed.\r\n"))
  1114. return FALSE;
  1115. }
  1116. VERBOSE(("FNT_INFO_FONTHEIGHT %d\r\n", pSV->StdVar[0].lStdVariable))
  1117. VERBOSE(("FNT_INFO_FONTWIDTH %d\r\n", pSV->StdVar[1].lStdVariable))
  1118. // this printer requires DBCS cell (square, if not stretched)
  1119. // X/Y sizes as X/Y values for scalable font command.
  1120. cyFont = FUFM_MASTER_TO_DEVICE(pFufmPDEV, pSV->StdVar[0].lStdVariable);
  1121. cxFont = cyFont
  1122. * SV_WIDTH * FH_IFI(pIFI) / SV_HEIGHT / FW_IFI(pIFI);
  1123. pFufmPDEV->cxfont = cxFont; //#144637
  1124. dwResolution = pFufmPDEV->devData.dwResolution;
  1125. VERBOSE(("dwResolution %u cxFont %u cyFont %u\r\n", dwResolution, cxFont, cyFont))
  1126. pbCmd = abCmd;
  1127. for(i = 0; i < pFInv->dwCount; ++i){
  1128. switch(pFInv->pubCommand[i]){
  1129. case 'a': // 7point non scalable font
  1130. pbCmd = fufmPutCommand(pbCmd, sizeRem, &sizeRem, &g_cmd7Point);
  1131. if (!pbCmd)return FALSE;
  1132. pbCmd = fufmPutCP(pbCmd, sizeRem, &sizeRem, (dwResolution != 400)? 24: 40);
  1133. if (!pbCmd)return FALSE;
  1134. break;
  1135. case 'b': // 9point non scalable font
  1136. pbCmd = fufmPutCommand(pbCmd, sizeRem, &sizeRem, &g_cmd9Point);
  1137. if (!pbCmd)return FALSE;
  1138. pbCmd = fufmPutCP(pbCmd, sizeRem, &sizeRem, (dwResolution != 400)? 30: 50);
  1139. if (!pbCmd)return FALSE;
  1140. break;
  1141. case 'c': // 10.5point non scalable font
  1142. pbCmd = fufmPutCommand(pbCmd, sizeRem, &sizeRem, &g_cmd10halfPoint);
  1143. if (!pbCmd)return FALSE;
  1144. pbCmd = fufmPutCP(pbCmd, sizeRem, &sizeRem, (dwResolution != 400)? 36: 60);
  1145. if (!pbCmd)return FALSE;
  1146. break;
  1147. case 'd': // 12point non scalable font
  1148. pbCmd = fufmPutCommand(pbCmd, sizeRem, &sizeRem, &g_cmd12Point);
  1149. if (!pbCmd)return FALSE;
  1150. pbCmd = fufmPutCP(pbCmd, sizeRem, &sizeRem, (dwResolution != 400)? 40: 66);
  1151. if (!pbCmd)return FALSE;
  1152. break;
  1153. case 's': // scalable font
  1154. if (cyFont == cxFont) {
  1155. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  1156. pbCmd = fufmFormatCommand(pbCmd, sizeRem, &sizeRem, "\x1BQ%u!R", cyFont);
  1157. if (NULL == pbCmd) return FALSE;
  1158. }
  1159. else {
  1160. // NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
  1161. pbCmd = fufmFormatCommand(pbCmd, sizeRem, &sizeRem, "\x1BQ%u;%u!R", cyFont, cxFont);
  1162. if (NULL == pbCmd) return FALSE;
  1163. }
  1164. pbCmd = fufmPutCP(pbCmd, sizeRem, &sizeRem, cxFont);
  1165. if (!pbCmd)return FALSE;
  1166. break;
  1167. case 'H': // HWF
  1168. pFufmPDEV->dwFlags &= ~FUFM_FLAG_VERTICALFONT;
  1169. pbCmd = fufmPutCommand(pbCmd, sizeRem, &sizeRem, &g_cmdHWF);
  1170. if (!pbCmd)return FALSE;
  1171. // #284409: SBCS rotated on vert mode
  1172. pFufmPDEV->dwFlags &= ~FUFM_FLAG_FONTROTATED;
  1173. break;
  1174. case 'V': // VWF
  1175. pFufmPDEV->dwFlags |= FUFM_FLAG_VERTICALFONT;
  1176. // #284409: SBCS rotated on vert mode
  1177. // pbCmd = fufmPutCommand(pbCmd, sizeRem, &sizeRem, &g_cmdVWF);
  1178. // if (!pbCmd)return FALSE;
  1179. break;
  1180. case 'M': // Minchou
  1181. pbCmd = fufmPutCommand(pbCmd, sizeRem, &sizeRem, &g_cmdMinchou);
  1182. if (!pbCmd)return FALSE;
  1183. break;
  1184. case 'G': // Gothic
  1185. pbCmd = fufmPutCommand(pbCmd, sizeRem, &sizeRem, &g_cmdGothic);
  1186. if (!pbCmd)return FALSE;
  1187. break;
  1188. }
  1189. }
  1190. if(pbCmd > abCmd)
  1191. WRITESPOOLBUF(pdevobj, abCmd, (DWORD)(pbCmd - abCmd));
  1192. return TRUE;
  1193. }
  1194. // end of fmlbpres.c