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.

214 lines
4.1 KiB

  1. /*++
  2. Copyright (c) 1992 Microsoft Corporation
  3. Module Name:
  4. Register.c
  5. Abstract:
  6. This module contains code to allow us to get and set registers that could
  7. be 16 bits or 32 bits, depending on whether a 16 bit dpmi app is running.
  8. Author:
  9. Dave Hastings (daveh) 12-Dec-1992
  10. Revision History:
  11. --*/
  12. //
  13. // Note: We undef the following constant so that we will get the function
  14. // versions of the register functions. We can not put a macro into
  15. // a function pointer
  16. //
  17. #include <precomp.h>
  18. #pragma hdrstop
  19. #undef LINKED_INTO_MONITOR
  20. #include <softpc.h>
  21. //
  22. // Internal functions
  23. //
  24. ULONG
  25. IgetCX(
  26. VOID
  27. );
  28. ULONG
  29. IgetDX(
  30. VOID
  31. );
  32. ULONG
  33. IgetDI(
  34. VOID
  35. );
  36. ULONG
  37. IgetSI(
  38. VOID
  39. );
  40. ULONG
  41. IgetBX(
  42. VOID
  43. );
  44. ULONG
  45. IgetAX(
  46. VOID
  47. );
  48. ULONG
  49. IgetSP(
  50. VOID
  51. );
  52. //
  53. // Register manipulation functions (for register that might be 16 or 32 bits)
  54. //
  55. GETREGISTERFUNCTION GetCXRegister = IgetCX;
  56. GETREGISTERFUNCTION GetDXRegister = IgetDX;
  57. GETREGISTERFUNCTION GetDIRegister = IgetDI;
  58. GETREGISTERFUNCTION GetSIRegister = IgetSI;
  59. GETREGISTERFUNCTION GetBXRegister = IgetBX;
  60. GETREGISTERFUNCTION GetAXRegister = IgetAX;
  61. GETREGISTERFUNCTION GetSPRegister = IgetSP;
  62. SETREGISTERFUNCTION SetCXRegister = (SETREGISTERFUNCTION) setCX;
  63. SETREGISTERFUNCTION SetDXRegister = (SETREGISTERFUNCTION) setDX;
  64. SETREGISTERFUNCTION SetDIRegister = (SETREGISTERFUNCTION) setDI;
  65. SETREGISTERFUNCTION SetSIRegister = (SETREGISTERFUNCTION) setSI;
  66. SETREGISTERFUNCTION SetBXRegister = (SETREGISTERFUNCTION) setBX;
  67. SETREGISTERFUNCTION SetAXRegister = (SETREGISTERFUNCTION) setAX;
  68. SETREGISTERFUNCTION SetSPRegister = (SETREGISTERFUNCTION) setSP;
  69. VOID
  70. DpmiInitRegisterSize(
  71. VOID
  72. )
  73. /*++
  74. Routine Description:
  75. This routine sets up the function pointers.
  76. Arguments:
  77. None.
  78. Return Value:
  79. None.
  80. --*/
  81. {
  82. if (CurrentAppFlags & DPMI_32BIT) {
  83. GetCXRegister = getECX;
  84. GetDXRegister = getEDX;
  85. GetDIRegister = getEDI;
  86. GetSIRegister = getESI;
  87. GetBXRegister = getEBX;
  88. GetAXRegister = getEAX;
  89. GetSPRegister = IgetSP;
  90. SetCXRegister = setECX;
  91. SetDXRegister = setEDX;
  92. SetDIRegister = setEDI;
  93. SetSIRegister = setESI;
  94. SetBXRegister = setEBX;
  95. SetAXRegister = setEAX;
  96. SetSPRegister = setESP;
  97. } else {
  98. //
  99. // Note: we have to call an internal function, because the actual
  100. // function only returns 16 bits, the others are undefined
  101. //
  102. GetCXRegister = IgetCX;
  103. GetDXRegister = IgetDX;
  104. GetDIRegister = IgetDI;
  105. GetSIRegister = IgetSI;
  106. GetBXRegister = IgetBX;
  107. GetAXRegister = IgetAX;
  108. GetSPRegister = IgetSP;
  109. //
  110. // Note: we take advantage of the fact that the compiler always
  111. // pushes 32 bits on the stack
  112. //
  113. SetCXRegister = (SETREGISTERFUNCTION) setCX;
  114. SetDXRegister = (SETREGISTERFUNCTION) setDX;
  115. SetDIRegister = (SETREGISTERFUNCTION) setDI;
  116. SetSIRegister = (SETREGISTERFUNCTION) setSI;
  117. SetBXRegister = (SETREGISTERFUNCTION) setBX;
  118. SetAXRegister = (SETREGISTERFUNCTION) setAX;
  119. SetSPRegister = (SETREGISTERFUNCTION) setSP;
  120. }
  121. }
  122. ULONG
  123. IgetCX(
  124. VOID
  125. )
  126. {
  127. return (ULONG)getCX();
  128. }
  129. ULONG
  130. IgetDX(
  131. VOID
  132. )
  133. {
  134. return (ULONG)getDX();
  135. }
  136. ULONG
  137. IgetDI(
  138. VOID
  139. )
  140. {
  141. return (ULONG)getDI();
  142. }
  143. ULONG
  144. IgetSI(
  145. VOID
  146. )
  147. {
  148. return (ULONG)getSI();
  149. }
  150. ULONG
  151. IgetBX(
  152. VOID
  153. )
  154. {
  155. return (ULONG)getBX();
  156. }
  157. ULONG
  158. IgetAX(
  159. VOID
  160. )
  161. {
  162. return (ULONG)getAX();
  163. }
  164. ULONG
  165. IgetSP(
  166. VOID
  167. )
  168. {
  169. //
  170. // Note: this routine returns the #of bits based on the size (b bit)
  171. // of ss. If we don't, bad things happen
  172. if (Ldt[(getSS() & ~0x7)/sizeof(LDT_ENTRY)].HighWord.Bits.Default_Big) {
  173. return getESP();
  174. } else {
  175. return (ULONG)getSP();
  176. }
  177. }