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.

615 lines
14 KiB

  1. f16ptr typedef ptr far16
  2. f32ptr typedef ptr far32
  3. ;==============================================================================
  4. ; save all 16-bit registers, except dx:ax
  5. ;
  6. ;==============================================================================
  7. SAVEALL macro
  8. push cx ; save all 16-bit registers, except dx:ax
  9. push bx
  10. push bp
  11. push si
  12. push di
  13. push ds
  14. push es
  15. endm
  16. ;==============================================================================
  17. ; restore all 16-bit registers, except dx:ax
  18. ;
  19. ;==============================================================================
  20. RESTOREALL macro StackType:=<Stack16>
  21. POPW es ; restore all 16-bit registers, except dx:ax
  22. CHECKW ds, StackType
  23. POPW ds
  24. CHECKW di, StackType
  25. pop di
  26. CHECKW si, StackType
  27. pop si
  28. CHECKW bp, StackType
  29. pop bp
  30. pop bx
  31. pop cx
  32. endm
  33. ;==============================================================================
  34. ; test two text macros for equality
  35. ;
  36. ;
  37. ;==============================================================================
  38. TextEqual? macro Text_1, Text_2
  39. ifidni <Text_1>, <Text_2>
  40. exitm <not 0>
  41. endif
  42. exitm <0>
  43. endm
  44. ;==============================================================================
  45. ; test two text macros for difference
  46. ;
  47. ;
  48. ;==============================================================================
  49. TextDiff? macro Text_1, Text_2
  50. ifidni <Text_1>, <Text_2>
  51. exitm <0>
  52. endif
  53. exitm <not 0>
  54. endm
  55. ;==============================================================================
  56. ; check a word on top of the stack
  57. ; if not equal, break
  58. ;
  59. ;==============================================================================
  60. CHECKW macro CurrentReg, StackType:=<Stack16>
  61. if (@WordSize eq 4) and TextDiff? (&StackType&,Stack16)
  62. push eax
  63. mov ax,&CurrentReg&
  64. cmp ax,word ptr [esp+4]
  65. pop eax
  66. je @F
  67. int 3
  68. @@:
  69. else
  70. push bp
  71. push ax
  72. mov ax,&CurrentReg&
  73. mov bp,sp
  74. and ebp,0ffffh
  75. cmp ax,word ptr [ebp+4]
  76. pop ax
  77. pop bp
  78. je @F
  79. int 3
  80. @@:
  81. endif
  82. endm
  83. ;==============================================================================
  84. ; pop word
  85. ;
  86. ;==============================================================================
  87. POPW macro SegReg
  88. if @WordSize eq 4
  89. db 66h
  90. endif
  91. pop SegReg
  92. endm
  93. ;==============================================================================
  94. ; pop dword
  95. ;
  96. ;==============================================================================
  97. POPD macro SegReg
  98. if @WordSize eq 2
  99. db 66h
  100. endif
  101. pop SegReg
  102. endm
  103. ;==============================================================================
  104. ; operand-size override
  105. ;
  106. ;==============================================================================
  107. OTHER_OPERAND_SIZE macro arg
  108. db 66h
  109. arg
  110. endm
  111. ;==============================================================================
  112. ; address-size override
  113. ;
  114. ;==============================================================================
  115. OTHER_ADDRESS_SIZE macro arg
  116. db 67h
  117. arg
  118. endm
  119. ;==============================================================================
  120. ; allocate and public a byte flag
  121. ;
  122. ;==============================================================================
  123. PubByte macro name, value
  124. public name
  125. name db value
  126. endm
  127. ;==============================================================================
  128. ; log an api call, 16-bit
  129. ;
  130. ;==============================================================================
  131. APILOG16 macro argName, argFlag, argComment
  132. local do_it,done,szApiName
  133. ifdef DEBUG
  134. externDef PCodeDebug16:far16
  135. externDef OutputDebugString:far16
  136. push ds
  137. push ax
  138. mov ax,seg &argFlag
  139. mov ds,ax
  140. cmp &argFlag,0
  141. je done
  142. jmp do_it
  143. szApiName db 'Api 16=>32: &argName& &argComment&',0Ah,0Dh,0
  144. do_it:
  145. push seg szApiName
  146. push offset szApiName
  147. call OutputDebugString
  148. done:
  149. pop ax
  150. pop ds
  151. call PCodeDebug16
  152. endif
  153. endm
  154. ;==============================================================================
  155. ; log an api call, 32-bit
  156. ;
  157. ;==============================================================================
  158. APILOG macro argName, argFlag
  159. local do_it,done,szApiName
  160. ifdef DEBUG
  161. ;externDef _DbgPrint:near32
  162. ;;If argFlag is nonzero, print out the message.
  163. cmp argFlag&,0
  164. jnz do_it
  165. jmp short done
  166. ;;Define the name here so we can pass it to _DbgPrint.
  167. szApiName db '&argName&',0
  168. do_it:
  169. push offset FLAT:szApiName
  170. push offset FLAT:szApiFmt
  171. ;call _DbgPrint
  172. add esp,2*4
  173. done:
  174. endif
  175. endm
  176. ;==============================================================================
  177. ; log 16-bit api return, in 32-bit code
  178. ;
  179. ;==============================================================================
  180. RETLOG macro argFlag
  181. local do_it, done, szRetFmt
  182. ifdef DEBUG
  183. externDef argFlag&:byte
  184. ;externDef _DbgPrint:near32
  185. cmp argFlag&,0
  186. je done
  187. jmp do_it
  188. szRetFmt db "Ret 16=>32: %4x:%4x",0dh,0ah,0
  189. do_it:
  190. push eax ;;save return code value
  191. push edx
  192. push word ptr 0 ;;parameters to _DbgPrint
  193. push ax
  194. push word ptr 0
  195. push dx
  196. push offset szRetFmt
  197. ;call _DbgPrint
  198. add esp,3*4
  199. pop edx ;;restore return code
  200. pop eax
  201. done:
  202. endif
  203. endm
  204. ;==============================================================================
  205. ; conditionally break
  206. ;
  207. ;==============================================================================
  208. SWITCHABLE_INT3 macro argLabel, argFlag
  209. externDef argLabel :far16
  210. push ds
  211. push ax
  212. mov ax,seg &argFlag
  213. mov ds,ax
  214. cmp &argFlag,0
  215. je @F
  216. argLabel& label far16
  217. int 3
  218. @@:
  219. pop ax
  220. pop ds
  221. endm
  222. ;==============================================================================
  223. ;
  224. ;
  225. ;==============================================================================
  226. STUB0 macro module, argLabel, nBytes, argComment:=<stub0>
  227. externDef argLabel&16 :far16
  228. argLabel&16 label far16
  229. ifdef FSAVEALL
  230. SAVEALL
  231. endif
  232. APILOG16 argLabel&16, f&module&ApiLog, argComment
  233. ifdef INT3
  234. SWITCHABLE_INT3 argLabel&_stub, f&module&Int3
  235. endif
  236. xor ax,ax
  237. cwd
  238. ifdef FSAVEALL
  239. RESTOREALL
  240. endif
  241. retf &nBytes&
  242. endm
  243. ;==============================================================================
  244. ;
  245. ;
  246. ;==============================================================================
  247. STUB macro module, argLabel, nBytes, nRetAX, argComment:=<stub>
  248. externDef argLabel&16 :far16
  249. externDef PCodeDebug16 :far16
  250. argLabel&16 label far16
  251. ifdef FSAVEALL
  252. SAVEALL
  253. endif
  254. APILOG16 argLabel&16, f&module&ApiLog, argComment nRetAX
  255. ifdef INT3
  256. SWITCHABLE_INT3 argLabel&_stub, f&module&Int3
  257. endif
  258. mov ax,&nRetAX
  259. ifdef FSAVEALL
  260. RESTOREALL
  261. endif
  262. retf nBytes
  263. endm
  264. ;==============================================================================
  265. ; repack TEXTMETRIC from 32-bit to 16-bit
  266. ;
  267. ;==============================================================================
  268. PACK_TEXTMETRIC_32_16 macro
  269. lodsd ; first 8 int widened
  270. stosw
  271. lodsd
  272. stosw
  273. lodsd
  274. stosw
  275. lodsd
  276. stosw
  277. lodsd
  278. stosw
  279. lodsd
  280. stosw
  281. lodsd
  282. stosw
  283. lodsd
  284. stosw
  285. add esi,12 ; 9 bytes moved to end
  286. movsd
  287. movsd
  288. movsb
  289. sub esi,21 ; final 3 int
  290. lodsd
  291. stosw
  292. lodsd
  293. stosw
  294. lodsd
  295. stosw
  296. endm
  297. ;==============================================================================
  298. ; repack TEXTMETRIC from 16-bit to 32-bit
  299. ;
  300. ;==============================================================================
  301. PACK_TEXTMETRIC_16_32 macro
  302. lodsw ; first 8 int widened
  303. cwde
  304. stosd
  305. lodsw
  306. cwde
  307. stosd
  308. lodsw
  309. cwde
  310. stosd
  311. lodsw
  312. cwde
  313. stosd
  314. lodsw
  315. cwde
  316. stosd
  317. lodsw
  318. cwde
  319. stosd
  320. lodsw
  321. cwde
  322. stosd
  323. lodsw
  324. cwde
  325. stosd
  326. add esi,9 ; 3 ints after nine bytes
  327. lodsw
  328. cwde
  329. stosd
  330. lodsw
  331. cwde
  332. stosd
  333. lodsw
  334. cwde
  335. stosd
  336. sub esi,21 ; now do the nine bytes
  337. movsd
  338. movsd
  339. movsb
  340. endm
  341. ;==============================================================================
  342. ; repack BITMAP from 32-bit to 16-bit
  343. ;
  344. ;==============================================================================
  345. PACK_BITMAP_32_16 macro
  346. lodsd ; first 4 int widened
  347. stosw
  348. lodsd
  349. stosw
  350. lodsd
  351. stosw
  352. lodsd
  353. stosw
  354. add esi,4 ; 2 bytes moved to end
  355. movsw
  356. sub esi,6
  357. movsd ; bmBits
  358. endm
  359. ;==============================================================================
  360. ; entry code for flat common callback
  361. ;
  362. ;==============================================================================
  363. CALLBACK_PROLOGUE macro
  364. pop eax ; 16:16 callback
  365. pop edx ; eip, API32
  366. push cs ; flat cs
  367. push edx ; eip, API32
  368. push eax ; 16:16 callback
  369. push ebp
  370. mov ebp,esp
  371. push ds ; save registers
  372. push es
  373. push ebx
  374. push edi
  375. push esi
  376. endm
  377. ;==============================================================================
  378. ; exit code for flat common callback
  379. ;
  380. ;==============================================================================
  381. CALLBACK_EPILOGUE macro size
  382. LOCAL bad_esp
  383. ;--------------------------------------------------
  384. ; switch stacks and jump to 16:16 callback
  385. ; when the 16:16 callback does a retf, we will hit our cleanup routine
  386. push dword ptr ADDR_THK_CLEANUP_&size
  387. ; prepare to transfer to the 16-bit callback function
  388. push pCallback16
  389. ; get the ss16 we had when we entered the callback API16
  390. ; make the 16-bit ss:sp point to the same linear address as the flat ss:esp
  391. call UsrQuerySS16
  392. mov esi,eax ; save ss16
  393. push eax
  394. call GetSelectorBase32 ; LATER: LDT lookup
  395. xchg eax,esp
  396. sub eax,esp
  397. jb bad_esp
  398. cmp eax,65535
  399. ja bad_esp
  400. mov ss,si
  401. mov sp,ax
  402. ; effectively, jmp to 16:16 callback
  403. retw
  404. bad_esp:
  405. int 3
  406. endm
  407. ;==============================================================================
  408. ; 16-bit callback cleanup code
  409. ;
  410. ;==============================================================================
  411. CALLBACK_CLEANUP macro size
  412. pop si ; get hMem
  413. pop di
  414. mov cx,si
  415. or cx,di
  416. jz @F
  417. push di ; hMem !NULL, so dealloc
  418. push si
  419. call LocalFree
  420. @@:
  421. call UnmapLS ; thunk id already on stack
  422. add sp,2 ; flat setup pushed dword
  423. movzx ecx,sp ; restore flat stack
  424. lss esp,ss:[ecx]
  425. pop esi ; restore registers
  426. pop edi
  427. pop ebx
  428. POPD es
  429. POPD ds
  430. pop ebp
  431. pop ecx ; discard 16:16 callback
  432. retd size ; return to the 32-bit API
  433. endm
  434. ;==============================================================================
  435. ; save flat stack and thunkID
  436. ;
  437. ;==============================================================================
  438. SAVE_STACK_AND_THUNKID macro
  439. lea eax,[addr_registers] ; save flat stack
  440. push ss
  441. push eax
  442. call GetThunkID32
  443. push eax ; save 16:16 thunkID
  444. endm
  445. ;==============================================================================
  446. ; entry code for 16-bit common callback to 32-bit function
  447. ;
  448. ;==============================================================================
  449. CALLBACK_BODY_16 macro name, size, aliases
  450. local callback_ret
  451. CB16_&name label far16
  452. for x,<aliases>
  453. CB16_&x label far16
  454. endm
  455. push bp
  456. push si
  457. push di
  458. push ds
  459. mov ax,sp
  460. push ss
  461. push ax
  462. mov ax,sp
  463. push ss
  464. push ax
  465. call SelectorOffsetToLinear16
  466. mov ebx,eax
  467. and eax,not 3
  468. mov cx,cs:FlatData
  469. mov ss,cx
  470. mov esp,eax
  471. mov ds,cx
  472. mov es,cx
  473. push cs
  474. push offset callback_ret
  475. jmp f32ptr ptr pfn&name&Callback
  476. callback_ret:
  477. lss sp,ss:[ebx]
  478. pop ds
  479. pop di
  480. pop si
  481. pop bp
  482. retf size ; return to the 16-bit API
  483. endm