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.

276 lines
4.3 KiB

  1. title HMem
  2. ;HMem.asm - huge memory functions HMemCpy, etc
  3. include gpfix.inc
  4. include kernel.inc
  5. externFP Int21Handler
  6. DataBegin
  7. externW WinFlags
  8. ifdef WOW
  9. externD pFileTable
  10. externW cur_dos_PDB
  11. externW Win_PDB
  12. endif
  13. DataEnd
  14. ifdef WOW
  15. externFP WOWFileRead
  16. externFP WOWFileWrite
  17. endif
  18. sBegin CODE
  19. assumes cs,CODE
  20. ifdef WOW
  21. externD prevInt21proc
  22. endif
  23. externA __AHINCR
  24. cProc hMemCpy,<PUBLIC,FAR>,<ds, si, di>
  25. parmD dest ; to ES:DI
  26. parmD src ; to DS:SI
  27. parmD cnt ; to DX:AX
  28. localW flags
  29. cBegin
  30. SetKernelDS
  31. mov bx, WinFlags
  32. mov flags, bx
  33. mov dx, seg_cnt ; DX:AX is 32 bit length
  34. mov ax, off_cnt
  35. xor cx, cx ; 0 if fault loading operands
  36. beg_fault_trap hmc_trap
  37. lds si, src
  38. les di, dest
  39. cld
  40. hmc_loop:
  41. mov cx, 8000h ; try to copy 32K
  42. cmp cx, si ; space left in source?
  43. jae @F
  44. mov cx, si
  45. @@: cmp cx, di ; space left in dest?
  46. jae @F
  47. mov cx, di
  48. @@: neg cx ; convert bytes left to positive
  49. or dx, dx ; >64K left to copy?
  50. jnz @F
  51. cmp cx, ax ; At least this much left?
  52. jbe @F
  53. mov cx, ax
  54. @@: sub ax, cx ; Decrement count while we're here
  55. sbb dx, 0
  56. test flags, WF_CPU386 + WF_CPU486 + WF_ENHANCED
  57. jnz hmc_do32
  58. shr cx, 1 ; Copy 32KB
  59. rep movsw
  60. adc cx, 0
  61. rep movsb
  62. jmps hmc_copied
  63. hmc_do32:
  64. .386p
  65. push cx
  66. shr cx, 2
  67. rep movsd
  68. pop cx
  69. and cx, 3
  70. rep movsb
  71. .286p
  72. hmc_copied:
  73. mov cx, ax ; At end of copy?
  74. or cx, dx
  75. jz hmc_done
  76. or si, si ; Source wrap-around?
  77. jnz @F
  78. mov bx, ds
  79. add bx, __AHINCR
  80. mov ds, bx
  81. @@: or di, di ; Dest wrap-around?
  82. jnz @F
  83. mov bx, es
  84. add bx, __AHINCR
  85. mov es, bx
  86. end_fault_trap
  87. @@: jmps hmc_loop
  88. hmc_trap:
  89. fault_fix_stack ; DX:AX = bytes left if failure
  90. krDebugOut DEB_ERROR, "hMemCopy: Copy past end of segment"
  91. add ax, cx
  92. adc dx, 0
  93. hmc_done: ; DX:AX = 0 if success
  94. cEnd
  95. ifdef W_Q21
  96. cProc _HREAD, <PUBLIC, FAR, NODATA>, <ds>
  97. parmW h
  98. parmD lpData
  99. parmD dwCnt
  100. cBegin
  101. SetKernelDS ds
  102. push bx
  103. mov bx, Win_PDB
  104. cmp bx, cur_dos_PDB
  105. je HR_PDB_ok
  106. push ax
  107. mov cur_dos_PDB,bx
  108. mov ah,50h
  109. pushf
  110. call cs:prevInt21Proc ; JUMP THROUGH CS VARIABLE
  111. pop ax
  112. HR_PDB_OK:
  113. pop bx
  114. cCall WowFileRead,<h,lpData,dwCnt,cur_dos_PDB,0,pFileTable>
  115. ; DX:AX = Number Bytes Read
  116. ; DX = FFFF, AX = Error Code
  117. inc dx
  118. jnz @f
  119. xor dx,dx
  120. or ax, -1
  121. @@:
  122. dec dx
  123. cEnd
  124. cProc _HWRITE, <PUBLIC, FAR, NODATA>, <ds>
  125. parmW h
  126. parmD lpData
  127. parmD dwCnt
  128. cBegin
  129. SetKernelDS ds
  130. push bx ; Setting the DOS PDB can probably
  131. mov bx, Win_PDB ; be removed just pass Win_PDB to
  132. cmp bx, cur_dos_PDB ; the WOW thunk
  133. je HW_PDB_ok
  134. push ax
  135. mov cur_dos_PDB,bx
  136. mov ah,50h
  137. pushf
  138. call cs:prevInt21Proc ; JUMP THROUGH CS VARIABLE
  139. pop ax
  140. HW_PDB_OK:
  141. pop bx
  142. cCall WowFileWrite,<h,lpData,dwCnt,cur_dos_PDB,0,pFileTable>
  143. ; DX:AX = Number Bytes Read
  144. ; DX = FFFF, AX = Error Code
  145. inc dx
  146. jnz @f
  147. xor dx,dx
  148. or ax, -1
  149. @@:
  150. dec dx
  151. cEnd
  152. else
  153. public _HREAD, _HWRITE
  154. _HREAD:
  155. mov bx, 3f00h
  156. jmps hugeIO
  157. _HWRITE:
  158. mov bx, 4000h
  159. cProc hugeIO, <FAR, NODATA>, <ds, si, di, cx>
  160. parmW h
  161. parmD lpData
  162. parmD dwCnt
  163. localD dwTot
  164. localW func
  165. cBegin
  166. mov func, bx ; read from a file
  167. mov bx, h
  168. xor cx, cx
  169. mov seg_dwTot, cx
  170. mov off_dwTot, cx
  171. beg_fault_trap hr_fault
  172. lds dx, lpData
  173. mov si, seg_dwCnt
  174. mov di, off_dwCnt
  175. hr_loop:
  176. mov cx, 8000h ; try to do 32KB
  177. cmp cx, dx ; space left in data buffer
  178. jae @F
  179. mov cx, dx
  180. neg cx
  181. @@: or si, si ; at least 64K left
  182. jnz @F
  183. cmp cx, di
  184. jbe @F
  185. mov cx, di
  186. @@: mov ax, func ; talk to DOS
  187. DOSCALL
  188. jc hr_oops
  189. add off_dwTot, ax ; update transfer count
  190. adc seg_dwTot, 0
  191. cmp ax, cx ; end of file?
  192. jnz hr_done
  193. sub di, ax ; decrement count
  194. sbb si, 0
  195. mov cx, si ; end of count
  196. or cx, di
  197. jz hr_done
  198. add dx, ax ; update pointer to data
  199. jnz @F ; wrapped to next segment
  200. mov ax, ds
  201. add ax, __AHINCR
  202. mov ds, ax
  203. end_fault_trap
  204. @@: jmps hr_loop
  205. hr_fault:
  206. pop dx
  207. pop ax
  208. ; krDebugOut DEB_ERROR, "File I/O past end of memory block"
  209. krDebugOut DEB_ERROR, "GP fault in _hread/_hwrite at #DX #AX"
  210. ; fault_fix_stack
  211. hr_oops:
  212. or dx, -1
  213. mov seg_dwTot, dx
  214. mov off_dwTot, dx
  215. hr_done:
  216. mov dx, seg_dwTot
  217. mov ax, off_dwTot
  218. cEnd
  219. endif ; WOW
  220. sEnd
  221. end