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.

161 lines
3.8 KiB

  1. #include <windows.h>
  2. #undef WINAPI
  3. #define WINAPI FAR PASCAL _loadds
  4. #include "dciman.h"
  5. static char szSystemIni[] = "system.ini";
  6. static char szWinIni[] = "win.ini";
  7. static char szDrivers[] = "Drivers";
  8. static char szDrawDib[] = "DrawDib";
  9. static char szDCI[] = "dci";
  10. static char szDVA[] = "dva";
  11. static char szDISPLAY[] = "display";
  12. static char szDCISVGA[] = "dcisvga";
  13. static char szDCIDVA[] = "dcidva";
  14. static BOOL fDVA;
  15. extern LONG DVAEscape(HDC hdc, UINT function, UINT size, LPVOID lp_in_data, LPVOID lp_out_data);
  16. /****************************************************************************
  17. ***************************************************************************/
  18. #define USE_DCI_EQUALS 0x01
  19. #define USE_DRIVER 0x02
  20. #define USE_DCISVGA 0x04
  21. HDC WINAPI DCIOpenProvider(void)
  22. {
  23. char ach[128];
  24. HDC hdc;
  25. UINT u;
  26. int dva;
  27. int dcidva;
  28. BOOL try_dcisvga = 0;
  29. BOOL try_display = 0;
  30. BOOL try_driver = 0;
  31. //
  32. // get dcidva variable.
  33. // 1 = use DCI= line
  34. // 2 = use display drivetr
  35. // 4 = use DCISVGA
  36. //
  37. dcidva = USE_DCI_EQUALS | USE_DRIVER | USE_DCISVGA;
  38. dcidva = GetPrivateProfileInt( szDrawDib, szDCIDVA, dcidva, szWinIni );
  39. if( dcidva == 0 ) {
  40. return NULL;
  41. }
  42. /*
  43. * get the DCI provider, order of attempts
  44. * 1) try DCI=
  45. * 2) try display driver
  46. * 3) try DCISVGA
  47. */
  48. if( dcidva & USE_DCI_EQUALS ) {
  49. GetPrivateProfileString(szDrivers, szDCI, "", ach, sizeof(ach), szSystemIni);
  50. } else if( dcidva & USE_DRIVER ) {
  51. try_driver = 1;
  52. lstrcpy( ach,szDISPLAY );
  53. } else {
  54. try_dcisvga = 1;
  55. lstrcpy( ach,szDCISVGA );
  56. }
  57. again:
  58. u = SetErrorMode(SEM_NOOPENFILEERRORBOX);
  59. hdc = CreateDC(ach, NULL, NULL, NULL);
  60. SetErrorMode(u);
  61. if (hdc == NULL)
  62. {
  63. fail:
  64. if( try_dcisvga ) {
  65. goto LastResort;
  66. }
  67. if( !try_driver ) {
  68. if( dcidva & USE_DRIVER ) {
  69. try_driver = 1;
  70. lstrcpy(ach, szDISPLAY);
  71. } else if( dcidva & USE_DCISVGA ) {
  72. try_dcisvga = 1;
  73. lstrcpy(ach, szDCISVGA);
  74. } else {
  75. goto LastResort;
  76. }
  77. } else {
  78. if( dcidva & USE_DCISVGA ) {
  79. try_dcisvga = 1;
  80. lstrcpy(ach, szDCISVGA);
  81. } else {
  82. goto LastResort;
  83. }
  84. }
  85. goto again;
  86. }
  87. //
  88. // now check for the Escape. If not, continue looping
  89. //
  90. u = DCICOMMAND;
  91. if (Escape(hdc, QUERYESCSUPPORT,sizeof(u),(LPCSTR)&u,NULL) == 0)
  92. {
  93. DeleteDC(hdc);
  94. goto fail;
  95. }
  96. return hdc;
  97. LastResort:
  98. //
  99. // driver does not do escape, punt it, try old DVA first though
  100. //
  101. if (DVAEscape(hdc,QUERYESCSUPPORT,sizeof(u),(LPVOID)&u,NULL) != 0)
  102. {
  103. fDVA = TRUE;
  104. return hdc;
  105. }
  106. return NULL;
  107. }
  108. /****************************************************************************
  109. ***************************************************************************/
  110. void WINAPI DCICloseProvider(HDC hdc)
  111. {
  112. if (hdc)
  113. DeleteDC(hdc);
  114. }
  115. /****************************************************************************
  116. ***************************************************************************/
  117. int WINAPI DCISendCommand(HDC hdc, DCICMD FAR *pcmd, VOID FAR * FAR * lplpOut)
  118. {
  119. if (lplpOut) // in case it fails, make sure this is NULL
  120. *lplpOut = NULL;
  121. if (fDVA)
  122. return DVAEscape(hdc, DCICOMMAND, sizeof(DCICMD),(LPVOID)pcmd, lplpOut);
  123. else
  124. return Escape(hdc, DCICOMMAND, sizeof(DCICMD),(LPCSTR)pcmd, lplpOut);
  125. }
  126. /****************************************************************************
  127. ***************************************************************************/
  128. extern int WINAPI DCICreatePrimary(HDC hdc, DCISURFACEINFO FAR * FAR *lplpSurface)
  129. {
  130. DCICMD cmd;
  131. cmd.dwCommand = DCICREATEPRIMARYSURFACE;
  132. cmd.dwParam1 = 0;
  133. cmd.dwParam2 = 0;
  134. cmd.dwVersion = DCI_VERSION;
  135. cmd.dwReserved = 0;
  136. return DCISendCommand(hdc, &cmd, lplpSurface);
  137. }