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.

1248 lines
33 KiB

  1. ;===========================================================================
  2. ;
  3. ; WinError.H constants
  4. ;
  5. ERROR_INVALID_PARAMETER EQU 87
  6. ;===========================================================================
  7. ;
  8. ; Validation constants
  9. ;
  10. GMEM_VALID equ 07372h ; include old GMEM_CODE_DATA
  11. GMEM_REALLOC_VALID equ 063f2h ; include GMEM_MODIFY and old GMEM_CODE_DATA
  12. GETFREESPACE_VALID equ 01002h ; undocumented "2" bit.
  13. OF_VALID equ 0fff7h
  14. LOPEN_VALID equ 000f7h
  15. LMEM_VALID equ 00f72h
  16. LMEM_REALLOC_VALID equ 00ff2h ; includes LMEM_MODIFY
  17. ATTR_MAX equ 3 ; _lcreat max
  18. ORIGIN_MAX equ 2 ; _lseek origin
  19. HANDLE_MAX equ 255
  20. SW_MAX equ 9 ; ShowWindow() SW_* max
  21. ERRMODE_VALID equ 08003h ; SetErrorMode
  22. SWAP_MAX equ 2 ; SwapRecording()
  23. ; Local heap structures and definitions
  24. ; (FROM WINKERN.INC)
  25. ;
  26. LocalHandleEntry STRUC
  27. lhe_address DW ? ; actual address of object
  28. lhe_flags DB ? ; flags and priority level
  29. lhe_count DB ? ; lock count
  30. LocalHandleEntry ENDS
  31. LHE_DISCARDED EQU 040h ; Marks objects that have been discarded.
  32. ; Local arena objects are kept in a doubly linked list.
  33. LocalArena STRUC
  34. la_prev DW ? ; previous arena entry (first entry points to self)
  35. la_next DW ? ; next arena entry (last entry points to self)
  36. la_handle DW ? ; back link to handle table entry
  37. LocalArena ENDS
  38. la_fixedsize = la_handle ; Fixed arena headers stop here
  39. LA_ALIGN = 4-1
  40. LA_MASK = NOT LA_ALIGN
  41. LA_FREE = 00h
  42. LA_BUSY = 01h ; Saved in la_prev field of header
  43. LA_MOVEABLE EQU 02h ; Saved in la_prev field of header
  44. ;==========================================================================
  45. ;
  46. ; Per-segment helper subroutine definitions
  47. ;
  48. EXTRA_EXPAND macro lseg
  49. ifdef genHLOCAL&lseg
  50. public HLOCAL0&lseg
  51. HLOCAL0&lseg:
  52. or bx,bx ; accept NULL
  53. jz LV_OK&lseg
  54. public HLOCAL&lseg
  55. HLOCAL&lseg:
  56. mov dx,si ; preserve SI in DX
  57. mov cx,bx ; cx = handle value
  58. beg_fault_trap LV_trap&lseg
  59. test bl,LA_MOVEABLE ; moveable block?
  60. jz LV_fixed&lseg
  61. mov bx,[bx].lhe_address ; deref moveable object
  62. or bx,bx ; if address is 0, ensure discarded.
  63. jnz @F ; not null addr: continue.
  64. mov bx,cx
  65. test [bx].lhe_flags,LHE_DISCARDED
  66. jnz LV_OK&lseg
  67. jmp short LV_Error&lseg
  68. @@:
  69. test [bx]-(SIZE LocalArena)+la_prev,LA_MOVEABLE ; make sure LA_MOVEABLE is set.
  70. jz LV_Error&lseg
  71. sub bx,(SIZE LocalArena)-la_fixedsize
  72. LV_fixed&lseg:
  73. sub bx,la_fixedsize ; Point to arena block
  74. ifdef DISABLE ; disabled for speed.
  75. ;** Make sure we're at least past the first heap block. We can
  76. ;** do this because heap blocks are always linked into the list
  77. ;** in order. We can get away with using WORD PTR hi_first
  78. ;** for both the 286 and 386 KERNELs because the pointer is
  79. ;** stored in the low WORD of this structure member in the
  80. ;** 386 KERNEL and the structures are identical in 286 and 386
  81. ;** up to this point. Members AFTER hi_first do NOT match
  82. ;** up and we'd have to make special case code for the KERNELs.
  83. mov si,[pLocalHeap] ;Points to HEAPINFO + LOCALINFO
  84. cmp bx,WORD PTR [si].hi_first ;Beyond first block?
  85. jl LV_Error&lseg ;Nope, can't be a local block
  86. endif
  87. ;** Check that this is really a local block
  88. mov ax,[bx].la_prev ;Point to previous arena
  89. test al,LA_BUSY
  90. jz LV_Error&lseg
  91. and al,LA_MASK ; strip off LA_BUSY and LA_MOVEABLE
  92. ; Assume that LA_BUSY bit is set (i.e., we're not a free block)
  93. xchg ax,si
  94. cmp [si].la_next,bx ;Does it chain to this block?
  95. jne LV_Error&lseg ;No, bail
  96. mov si,[bx].la_next ;Point to next arena
  97. mov ax,[si].la_prev
  98. and al,LA_MASK
  99. cmp ax,bx ;Does it chain back to our block?
  100. jne LV_Error&lseg ;Nope: error.
  101. end_fault_trap
  102. LV_OK&lseg:
  103. mov si,dx ; restore SI
  104. ret ; and return.
  105. LV_trap&lseg:
  106. fault_fix_stack
  107. LV_Error&lseg:
  108. mov si,dx ; restore SI
  109. xchg ax,cx ; ax = handle value
  110. mov bx,ERR_BAD_LOCAL_HANDLE
  111. jmp Short Inval_Param_&lseg
  112. endif ;genHLOCAL&lseg
  113. endm
  114. ;===========================================================================
  115. ;
  116. ; Argument types
  117. ;
  118. P_HLOCAL0 macro h,opts
  119. _GenParm <h>,2,<opts>
  120. if VLgen
  121. mov bx,_P_&h
  122. lcall HLOCAL0
  123. _gensub HLOCAL
  124. endif
  125. endm
  126. P_HLOCAL macro h,opts
  127. _GenParm <h>,2,<opts>
  128. if VLgen
  129. mov bx,_P_&h
  130. lcall HLOCAL
  131. _gensub HLOCAL
  132. endif
  133. endm
  134. ;
  135. ; Special case for GlobalReAlloc, GlobalFree, GlobalUnlock because
  136. ; of Turbo Pascal setup program. It turns out it dereferences a handle
  137. ; by doing an inc, which worked on 3.0 but not any more.
  138. ;
  139. ; What happens in 3.1 is that the 3 low bits of a selector will be 1,
  140. ; so an inc will set them all to 0 and carry to the next bit. We check
  141. ; for this by checking for the 3 low bits == 0.
  142. ;
  143. P_GHANDLETP macro h,opts
  144. _GenParm <h>,2,<opts>
  145. if VLgen
  146. mov ax,_P_&h
  147. or ax,ax ; Don't dec if == NULL!
  148. jz @F
  149. test al,0111b ; if GDT and ring 0 selector, it could be
  150. jnz @F ; that turbo pascal did a dec.
  151. dec ax
  152. @@:
  153. lcall GHANDLE
  154. endif
  155. endm
  156. P_SEL equ <P_H>
  157. P_SEL0 equ <P_H0>
  158. P_SELM1 equ <P_H>
  159. P_HRESINFO equ <P_H>
  160. STRUCT <CATCHBUF>
  161. F_RGW reserved,9
  162. ENDSTRUCT
  163. _GenLP <P_LPCATCHBUF>,<LP>,%VLcbsCATCHBUF
  164. _GenLP <P_CLPCATCHBUF>,<LP>,%VLcbsCATCHBUF
  165. P_NPTR equ <P_2>
  166. STRUCT <SEGINFO> ; NOTE: this should be defined in windows.h
  167. F_WORD offSegment
  168. F_WORD cbSegment
  169. F_WORD flags
  170. F_WORD cbAlloc
  171. F_RGW reserved,4
  172. ENDSTRUCT
  173. _GenLP <P_LPSEGINFO>,<LP>,%VLcbsSEGINFO
  174. P_NPBUFFER macro pb, cb, opts
  175. P_NPTR <pb>,<opts>
  176. P_int <cb>,<opts>
  177. endm
  178. ; special case for gettempfilename
  179. ; cannot be used as is for anything else
  180. ; will validate selector of buffer
  181. P_LPFILENAMEBUF macro name, opts
  182. _GenParm <name>,4,<opts>
  183. if VLgen
  184. mov cx,_P_&name+2
  185. mov ax,_P_&name
  186. mov bx, 127 ; 128-char filename buffer
  187. beg_fault_trap LPFbad
  188. mov es,cx
  189. LPFgood_es:
  190. add bx, ax ; offset + 127
  191. jc LPFbad1 ; check 16 bit overflow
  192. or byte ptr es:[bx],0 ; check write permission, limit
  193. end_fault_trap
  194. jmp short LPFexit
  195. LPFbad:
  196. pop bx ; fault ip
  197. add sp,2 ; fix flt stk (fault)
  198. cmp bx, offset LPFgood_es
  199. jb LPFbad1 ; bad selector, no excuse
  200. mov bx, ERR_BAD_PTR or ERR_WARNING
  201. jmp short LPFcallerr
  202. LPFbad1:
  203. mov bx,ERR_BAD_PTR
  204. LPFcallerr:
  205. call HandleParamError
  206. LPFexit:
  207. endif
  208. endm
  209. P_CLPSTRORD equ <P_CLPSTRATOM>
  210. P_CLPSZMODNAME equ <P_CLPSTRATOM>
  211. P_DRIVECHAR equ <P_2>
  212. P_DRIVE equ <P_2>
  213. P_HFILE macro name, opts
  214. _GenParm <name>,2,<opts>
  215. if VLgen
  216. mov ax,_P_&name ; Don't allow -1 for file handles
  217. cmp ax,0FFFFh ; 0 is a valid file handle
  218. jne @F
  219. ;
  220. ; We only want to warn here: this will let DOS return the appropriate error.
  221. ;
  222. mov bx,ERR_BAD_HFILE or ERR_WARNING ; only warn!
  223. lcall Inval_Param_
  224. @@:
  225. endif
  226. endm
  227. ; Huge buffer pointers, that allow accessing beyond the
  228. ; 64k segment limit. For now, we just ensure that there
  229. ; is at least one valid byte in the buffer.
  230. ;
  231. P_LPHUGEBUFFER macro pb, cb, opts
  232. _DefParm <pb>,4,<opts>
  233. _DefParm <cb>,2,<opts>
  234. if VLgen
  235. mov cx,_P_&cb ;; if cb == 0, don't validate
  236. jcxz @F
  237. mov ax,_P_&pb
  238. mov cx,_P_&pb+2
  239. mov bx,1
  240. lcall LP
  241. _gensub LP
  242. @@:
  243. endif
  244. endm
  245. P_CLPHUGEBUFFER macro pb, cb, opts
  246. _DefParm <pb>,4,<opts>
  247. _DefParm <cb>,2,<opts>
  248. if VLgen
  249. mov cx,_P_&cb ;; if cb == 0, don't validate
  250. jcxz @F
  251. mov ax,_P_&pb
  252. mov cx,_P_&pb+2
  253. mov bx,1
  254. lcall CLP
  255. _gensub LP
  256. @@:
  257. endif
  258. endm
  259. STRUCT <LOADPARAMS> ; Should be defined in windows.h
  260. F_WORD segEnv
  261. F_LPSTR lpCmdLine
  262. F_LPVOID lpCmdShow ; far pointer to rgw[2] = { 2, cmdShow };
  263. F_DWORDMBZ dwReserved
  264. ENDSTRUCT
  265. P_CLPLOADPARAMS0M1 macro name,opts
  266. _DefParm <name>,4,<opts>
  267. if VLgen
  268. _FlsFrame
  269. mov ax,_P_&name
  270. mov cx,_P_&name+2
  271. mov bx,ax
  272. or bx,cx
  273. jz @F ;; allow NULL for ATM
  274. mov bx,ax
  275. and bx,cx ;; if ax:cx == -1, accept parameter.
  276. inc bx
  277. jz @F
  278. mov bx,VLcbsLOADPARAMS
  279. lcall CLP
  280. _gensub LP
  281. @@:
  282. endif
  283. endm
  284. STRUCT <OFSTRUCT>
  285. F_BYTE cBytes ;** BYTE. Size of OFSTRUCT
  286. F_BYTE fFixedDisk
  287. F_WORD nErrCode
  288. F_RGB reserved,4 ;** 4 reserved bytes
  289. F_RGCH szPathName,128 ;** null-terminated name of length
  290. ;not > 128. Field length is 128
  291. ;Wrongly documented as 120.
  292. ENDSTRUCT
  293. ; We need this special code for openfile because the ofstruct was
  294. ; wrongly documented as having a szPathName of 120 bytes instead of 128.
  295. ; What we do is validate for 120 bytes, if that fails then issue error.
  296. ; If that succeeds then validate for 128, if that fails then issue a warning
  297. ; but continue the call.
  298. P_LPOFSTRUCT macro name, opts
  299. _GenParm <name>,4,<opts>
  300. if VLgen
  301. mov cx,_P_&name+2
  302. mov ax,_P_&name
  303. mov bx,VLcbsOFSTRUCT-1 ; last addressible byte
  304. sub bx,8 ; start by validating path=120 bytes
  305. beg_fault_trap LPOFbad
  306. mov es,cx
  307. add bx, ax
  308. jc LPOFbad1 ; check 16 bit overflow
  309. or byte ptr es:[bx],0 ; check write limit for path=120
  310. LPOFpath120:
  311. add bx,8
  312. jc LPOFwarn ; check 16 bit overflow
  313. or byte ptr es:[bx],0 ; check write limit for path=128
  314. end_fault_trap
  315. jmp short LPOFexit
  316. LPOFbad:
  317. pop bx ; fault ip
  318. add sp,2 ; fix flt stk (fault)
  319. cmp bx, offset LPOFpath120
  320. jb LPOFbad1 ; bad selector, or path < 120 => error
  321. LPOFwarn:
  322. mov bx, ERR_BAD_PTR or ERR_WARNING
  323. jmp short LPOFcallerr
  324. LPOFbad1:
  325. mov bx,ERR_BAD_PTR
  326. LPOFcallerr:
  327. call HandleParamError
  328. LPOFexit:
  329. endif
  330. endm
  331. P_NPHTABLE equ <P_NPTR>
  332. P_LPFNRHANDLER equ <P_LPFN>
  333. P_LPFNGNOTIFY0 equ <P_LPFN0>
  334. P_LPFNLNOTIFY0 equ <P_LPFN0>
  335. P_HKEY equ <P_4>
  336. ;===========================================================================
  337. ;
  338. ; API Descriptions
  339. ;
  340. ; in 3PROTECT.ASM
  341. API WORD, AllocCStoDSAlias, TEXT, <ASM>
  342. P_SEL sel ;** code selector
  343. ; in 3PROTECT.ASM
  344. API WORD, AllocDStoCSAlias, TEXT, <ASM>
  345. P_SEL sel ;** data selector
  346. ; in 3PROTECT.ASM
  347. API WORD, AllocSelector, TEXT, <ASM, NOGEN>
  348. P_SEL0 sel ;can be 0 (nogen)
  349. ; in 3PROTECT.ASM
  350. API WORD, FreeSelector, TEXT, <ASM>
  351. P_SEL sel
  352. ; in 3PROTECT.ASM
  353. API WORD, PrestoChangoSelector, TEXT, <ASM>
  354. P_SEL selSrc
  355. P_SEL selDst
  356. ; in RESAUX.ASM
  357. API GHANDLE,LoadResource, TEXT, <ASM>
  358. P_HINSTANCE hInstance
  359. P_HRESINFO hResInfo
  360. ; in RESAUX.ASM
  361. API int, AccessResource, TEXT, <ASM>
  362. P_HINSTANCE hInstance
  363. P_HRESINFO hRes
  364. APIERR
  365. mov ax, -1 ;cannot get file handle
  366. APIEND
  367. ; in RESAUX.ASM
  368. API HRESINFO, FindResource, MISCTEXT, <ASM>
  369. P_HINSTANCE hInstance
  370. P_CLPSTRRSRC lpName
  371. P_CLPSTRRSRC lpType
  372. ; in RESAUX.ASM
  373. API GHANDLE,AllocResource, TEXT, <ASM>
  374. P_HINSTANCE hInstance
  375. P_HRESINFO hRes
  376. P_DWORD cbRes
  377. ; in RESAUX.ASM
  378. API BOOL, FreeResource, TEXT, <ASM>
  379. P_GHANDLE hData
  380. ; in RESAUX.ASM
  381. API LPSTR, LockResource, TEXT, <ASM>
  382. P_GHANDLE hResData
  383. ; in RESAUX.ASM
  384. API LPFNRHANDLER, SetResourceHandler, MISCTEXT, <ASM>
  385. P_HINSTANCE hInstance
  386. P_CLPSTRRSRC lpType
  387. P_LPFNRHANDLER lpLoadFunc
  388. ; in RESAUX.ASM
  389. API DWORD, SizeofResource, TEXT, <ASM>
  390. P_HINSTANCE hInstance
  391. P_HRESINFO hResInfo
  392. ; in ATOM.ASM
  393. API BOOL, InitAtomTable, MISCTEXT, <ASM, NOGEN>
  394. P_int size
  395. ; in ATOM.ASM
  396. API ATOM, AddAtom, TEXT, <ASM,FUNNYFRAME,DEBUGONLY>
  397. P_CLPSTRATOM lpString
  398. ; in ATOM.ASM
  399. API ATOM, DeleteAtom, TEXT, <ASM>
  400. P_ATOM atom
  401. ; in ATOM.ASM
  402. API ATOM, FindAtom, TEXT, <ASM,FUNNYFRAME, DEBUGONLY>
  403. P_CLPSTRATOM lpAtomName
  404. ; in ATOM.ASM
  405. API WORD, GetAtomName, TEXT, <ASM>
  406. P_ATOM atom
  407. P_LPBUFFER lpBuffer, cchBuffer
  408. APIERR
  409. E_SETEMPTY lpBuffer, cchBuffer
  410. APIEND
  411. ; in ATOM.ASM
  412. API HANDLE, GetAtomHandle, TEXT, <ASM>
  413. P_ATOM atom
  414. ; in LDSTACK.ASM
  415. API int, Catch, MISCTEXT, <ASM, DEBUGONLY>
  416. P_LPCATCHBUF lpCatchBuf
  417. ; in LDSTACK.ASM
  418. API void, Throw, MISCTEXT, <ASM, FUNNYFRAME,DEBUGONLY>
  419. P_CLPCATCHBUF lpCatchBuf
  420. P_int catchReturn
  421. ; in RIPAUX.ASM
  422. API void, DebugBreak, TEXT, <VOID, ASM, FUNNYFRAME> ;nogen
  423. ; in MODULE.ASM
  424. API BOOL, FreeModule, NRESTEXT, <ASM>
  425. P_HMODULE hModule
  426. ; in MODULE.ASM
  427. API void, FreeLibrary, NRESTEXT, <ASM> ;Falls into FreeModule
  428. P_HMODULE hLibModule
  429. ; in RIPAUX.ASM (debug version) and RIP.C (retail version) ??
  430. API void, FatalExit, TEXT, <ASM, NOGEN, FUNNYFRAME>
  431. P_int code
  432. ; in LDINT.ASM
  433. API void, FatalAppExit, TEXT, <ASM>
  434. P_WORDMBZ reserved ; ** must be 0
  435. P_CLPSTR0 lpMsgText
  436. ; The 286 kernel has GlobalAlloc/ReAlloc size limits of 1meg - 16 bytes.
  437. ;
  438. P_GHCB equ <P_DWORD>
  439. ; in 3GINTERF.ASM
  440. API GHANDLE,GlobalAlloc, TEXT, <ASM>
  441. P_FLAGS flags,GMEM_VALID
  442. P_GHCB cb
  443. ; The 286 kernel has a GlobalCompact size limit of 1meg-16 bytes
  444. ; (but we also have to allow -1L, too).
  445. ;;
  446. P_GCCB equ <P_DWORD>
  447. ; in 3GINTERF.ASM
  448. API DWORD, GlobalCompact, TEXT, <ASM, NOGEN>
  449. P_GCCB cbMinFree
  450. ; in 3GINTERF.ASM
  451. API GHANDLE,GlobalFree, TEXT, <ASM>
  452. P_GHANDLETP h
  453. ; in 3GINTERF.ASM
  454. API DWORD, GlobalHandle, TEXT, <ASM>
  455. P_SEL sel
  456. ; in 3GINTERF.ASM
  457. API LPSTR, GlobalLock, TEXT, <ASM>
  458. P_GHANDLE h
  459. ; The 286 kernel has GlobalReAlloc size limits of 1meg - 16 bytes.
  460. ; However, if GMEM_MODIFY bit is set, we will completely ignore the size
  461. ; field for 3.0 compatability instead of failing the call.
  462. P_GRAPARMS macro cb,flags,opts
  463. P_DWORD <cb>,<opts>
  464. P_FLAGS <flags>,GMEM_REALLOC_VALID,<opts>
  465. endm
  466. ; in 3GINTERF.ASM
  467. API GHANDLE,GlobalReAlloc, TEXT, <ASM>
  468. P_GHANDLETP h
  469. P_GRAPARMS cb,flags
  470. ; in 3GINTERF.ASM
  471. API DWORD, GlobalSize, TEXT, <ASM,FUNNYFRAME> ;nogen
  472. P_GHANDLE h
  473. ; in 3GINTERF.ASM
  474. API BOOL, GlobalUnlock, TEXT, <ASM>
  475. P_GHANDLETP h
  476. ; in 3GINTERF.ASM
  477. API WORD, GlobalFlags, TEXT, <ASM,FUNNYFRAME> ;nogen
  478. P_GHANDLE h
  479. ; in 3GINTERF.ASM
  480. API LPSTR, GlobalWire, TEXT, <ASM, FUNNYFRAME> ;nogen
  481. P_GHANDLE h
  482. ; in 3GINTERF.ASM
  483. API BOOL, GlobalUnWire, TEXT, <ASM, FUNNYFRAME> ;nogen
  484. P_GHANDLE h
  485. ; in 3GINTERF.ASM
  486. API GHANDLE,GlobalLRUNewest, TEXT, <ASM, FUNNYFRAME> ;nogen
  487. P_GHANDLE h
  488. ; in 3GINTERF.ASM
  489. API GHANDLE,GlobalLRUOldest, TEXT, <ASM, FUNNYFRAME> ;nogen
  490. P_GHANDLE h
  491. ; in 3GINTERF.ASM
  492. API VOID, GlobalNotify, TEXT, <ASM>
  493. P_LPFNGNOTIFY0 lpNotifyProc ;** fn. to reside in fixed CS
  494. ; in 3GINTERF.ASM
  495. API WORD, GlobalPageLock, TEXT, <ASM, FUNNYFRAME> ;nogen
  496. P_GHANDLE h
  497. ; in 3GINTERF.ASM
  498. API WORD, GlobalPageUnlock, TEXT, <ASM,FUNNYFRAME> ;nogen
  499. P_SEL sel
  500. ; in 3GINTERF.ASM
  501. API VOID, GlobalFix, TEXT, <ASM, FUNNYFRAME> ;nogen
  502. P_GHANDLE h
  503. ; in 3GINTERF.ASM
  504. API BOOL, GlobalUnfix, TEXT, <ASM, FUNNYFRAME> ;nogen
  505. P_GHANDLE h
  506. ; in 3GINTERF.ASM
  507. API DWORD, GlobalDosAlloc, TEXT, <ASM, NOGEN>
  508. P_GHCB cb
  509. ; in 3GINTERF.ASM
  510. API WORD, GlobalDosFree, TEXT, <ASM,NOGEN> ;calls GlobalFree
  511. P_SEL sel
  512. ; in 3GINTERF.ASM
  513. API GHANDLE,LockSegment, TEXT, <ASM, FUNNYFRAME>
  514. P_SELM1 sel ;** can be -1
  515. ; in 3GINTERF.ASM
  516. API GHANDLE,UnlockSegment, TEXT, <ASM, FUNNYFRAME> ;nogen
  517. P_SELM1 sel ;can be -1
  518. ; in TASK.ASM
  519. API HTASK, GetCurrentTask, TEXT, <VOID, ASM, FUNNYFRAME> ;nogen
  520. ; in USERPRO.ASM
  521. API WORD, GetWindowsDirectory, MISCTEXT, <ASM>
  522. P_LPBUFFER lpBuffer, cb
  523. APIERR
  524. E_SETEMPTY lpBuffer, cb
  525. APIEND
  526. ; in USERPRO.ASM
  527. API WORD, GetSystemDirectory, MISCTEXT, <ASM>
  528. P_LPBUFFER lpBuffer, cb
  529. APIERR
  530. E_SETEMPTY lpBuffer, cb
  531. APIEND
  532. ; in CONTEXT.ASM
  533. API LONG, GetWinFlags, MISCTEXT, <VOID, ASM, FUNNYFRAME> ;nogen
  534. ; in TASK.ASM
  535. API LPSTR, GetDOSEnvironment, MISCTEXT, <VOID, ASM, FUNNYFRAME> ;nogen
  536. ;calls GetCurrentTask
  537. ; in CONTEXT.ASM
  538. API DWORD, GetVersion, MISCTEXT, <VOID, ASM, FUNNYFRAME> ;nogen
  539. ; in TASK.ASM
  540. API WORD, GetNumTasks, MISCTEXT, <VOID, ASM, FUNNYFRAME> ;nogen
  541. ; in LDAUX.ASM
  542. API BOOL, DefineHandleTable, MISCTEXT, <ASM, NOGEN>
  543. P_NPHTABLE pTable ; offset from start of caller's DS
  544. ; in LDAUX.ASM
  545. API LPFN, MakeProcInstance, MISCTEXT, <ASM>
  546. P_LPFN lpProc
  547. P_HINSTANCE0 hInstance ; NULL => use caller's DS (not documemnted)
  548. ; in LDAUX.ASM
  549. API void, FreeProcInstance, MISCTEXT, <ASM>
  550. P_LPFN lpProc
  551. ; in LDAUX.ASM
  552. API GHANDLE,GetCodeHandle, TEXT, <ASM, NOGEN>
  553. P_DWORD lpProc ;;;; SHOULD BE P_CLP
  554. ;
  555. ; GetCodeInfo lpProc parameter can be either a proc addr
  556. ; or module handle:segment number. So, we just validate
  557. ; that the hi order word is a valid selector.
  558. ;
  559. P_LPFNGCI macro name,opts
  560. _DefParm <name>,4,<opts>
  561. if VLgen
  562. _FlsFrame
  563. mov cx,_P_&name+2
  564. inc cx ;; Allow 0xffff to pass...
  565. jz @F
  566. dec cx
  567. xor ax,ax
  568. mov bx,1
  569. lcall CLP
  570. _gensub LP
  571. @@:
  572. endif
  573. endm
  574. P_CLPLOADPARAMS0M1 macro name,opts
  575. _DefParm <name>,4,<opts>
  576. if VLgen
  577. _FlsFrame
  578. mov ax,_P_&name
  579. mov cx,_P_&name+2
  580. mov bx,ax
  581. or bx,cx
  582. jz @F ;; allow NULL for ATM
  583. mov bx,ax
  584. and bx,cx ;; if ax:cx == -1, accept parameter.
  585. inc bx
  586. jz @F
  587. mov bx,VLcbsLOADPARAMS
  588. lcall CLP
  589. _gensub LP
  590. @@:
  591. endif
  592. endm
  593. ; in LDAUX.ASM
  594. API void, GetCodeInfo, TEXT, <ASM>
  595. P_LPFNGCI lpProc ; LPFN or HMODULE:SegNum allowed
  596. P_LPSEGINFO lpSegInfo ; points to buffer of four 32-bit values
  597. ; in LDAUX.ASM
  598. API LPFN, GetProcAddress, NRESTEXT, <ASM>
  599. P_HMODULE0 hModule
  600. P_CLPSTRORD lpProcName
  601. ; in LDAUX.ASM
  602. API HMODULE,GetModuleHandle, NRESTEXT, <ASM>
  603. P_CLPSZMODNAME lpModuleName
  604. ; in LDAUX.ASM
  605. API int, GetModuleUsage, NRESTEXT, <ASM>
  606. P_HMODULE hModule
  607. ; in LDAUX.ASM
  608. API int, GetModuleFileName, NRESTEXT, <ASM, SAVEBX>
  609. P_HMODULE32 hModule
  610. P_LPBUFFER lpszName, cchName
  611. APIERR
  612. E_SETEMPTY lpszName, cchName
  613. APIEND
  614. ; in LDAUX.ASM
  615. API int, GetModuleName, NRESTEXT, <ASM>
  616. P_HMODULE hModule
  617. P_LPBUFFER lpszName, cchName
  618. APIERR
  619. E_SETEMPTY lpszName, cchName
  620. APIEND
  621. ; in LDAUX.ASM
  622. API int, GetInstanceData, NRESTEXT, <ASM>
  623. P_HINSTANCE hInstance
  624. P_NPBUFFER pb, cb ;** points to area in current DS of caller
  625. ; in 3GINTERF.ASM Relevant only in case of EMS
  626. API DWORD, GetFreeSpace, TEXT, <ASM>
  627. P_FLAGS flags,GETFREESPACE_VALID
  628. ; in I21TASK.ASM
  629. API WORD, GetCurrentPDB, MISCTEXT, <VOID, ASM, FUNNYFRAME>
  630. ; in LDOPEN.ASM
  631. API DRIVECHAR, GetTempDrive, MISCTEXT, <ASM, FUNNYFRAME, NOGEN>
  632. P_DRIVECHAR chDrive ;** BYTE drive letter or 0
  633. ; in LDOPEN.ASM
  634. API int, GetTempFileName, MISCTEXT, <ASM>
  635. P_DRIVECHAR chDrive
  636. P_CLPSTR lpPrefix
  637. P_WORD wUnique
  638. P_LPFILENAMEBUF lpTmpFileName ; at least 144(sic) 128 chars
  639. APIERR
  640. E_SETEMPTYNC lpTmpFileName
  641. APIEND
  642. ; in LDOPEN.ASM
  643. API WORD, GetDriveType, MISCTEXT, <ASM, FUNNYFRAME, NOGEN>
  644. P_DRIVE drive ;** int. drive number (0, 1, ...)
  645. ; in LSTRING.ASM
  646. API LPSTR, lstrcpy, TEXT, <ASM, FUNNYFRAME,DEBUGONLY> ;nogen
  647. P_LPSTR lpDst
  648. P_CLPSTR lpSrc
  649. APIERR
  650. E_SETEMPTYNC lpDst
  651. APIEND
  652. ; in LSTRING.ASM
  653. API LPSTR, lstrcat, TEXT, <ASM, FUNNYFRAME,DEBUGONLY> ;nogen
  654. P_LPSTR lpDst
  655. P_CLPSTR lpSrc
  656. APIERR
  657. E_SETEMPTYNC lpDst
  658. APIEND
  659. ; in LSTRING.ASM
  660. API int, lstrOriginal, TEXT, <ASM, FUNNYFRAME,DEBUGONLY> ;nogen
  661. P_CLPSTR lpSrc1
  662. P_CLPSTR lpSrc2
  663. APIERR
  664. mov ax,-1 ; return -1 on error
  665. APIEND
  666. ; in LSTRING.ASM
  667. API int, lstrlen, TEXT, <ASM, FUNNYFRAME,DEBUGONLY> ;nogen
  668. P_CLPSTR lpString
  669. ; in DISKIO.ASM
  670. API int, _lopen, TEXT, <ASM, FUNNYFRAME> ;nogen
  671. P_CLPSTR lpPathName
  672. P_FLAGS iReadWrite, LOPEN_VALID
  673. APIERR
  674. mov ax,-1 ; return -1 on error
  675. APIEND
  676. ; in DISKIO.ASM
  677. API int, _lclose, TEXT, <ASM, FUNNYFRAME> ;nogen
  678. P_HFILE fh
  679. APIERR
  680. mov ax,-1 ; return -1 on error
  681. APIEND
  682. ; in DISKIO.ASM
  683. API int, _lcreat, TEXT, <ASM, FUNNYFRAME> ;nogen
  684. P_CLPSTR lpPathName
  685. P_VALUE attrs, ATTR_MAX
  686. APIERR
  687. mov ax,-1 ; return -1 on error
  688. APIEND
  689. ; in DISKIO.ASM
  690. API LONG, _llseek, TEXT, <ASM, FUNNYFRAME> ;nogen
  691. P_HFILE fh
  692. P_long offset
  693. P_VALUE origin, ORIGIN_MAX
  694. APIERR
  695. mov ax,-1 ; return -1 on error
  696. cwd
  697. APIEND
  698. ; BACKWARD COMPATIBILITY HACK
  699. ; Special case for _lread and _lwrite parameter errors
  700. ;
  701. ; If we have an invalid buffer pointer, we must return 0, not -1
  702. ; for 3.0 compatibility. This is because some apps call these functions
  703. ; with bogus pointers at EOF, in which case DOS ignores the pointer and count.
  704. ; The P_HFILE parameter checking just warns about bogus values, which is
  705. ; later caught by DOS and returned as a -1 error.
  706. ;
  707. ; in DISKIO.ASM
  708. API WORD, _lread, TEXT, <ASM, FUNNYFRAME, SAVEES> ;nogen
  709. P_HFILE fh
  710. P_LPHUGEBUFFER lpBuffer, cb
  711. APIERR
  712. ; return 0 on a validation error (see above)
  713. ;;;;;;;;mov ax,-1 ; return 0 on error
  714. APIEND
  715. ; in DISKIO.ASM
  716. API WORD, _lwrite, TEXT, <ASM, FUNNYFRAME> ;nogen
  717. P_HFILE fh
  718. P_CLPHUGEBUFFER lpBuffer, cb
  719. APIERR
  720. ; Return 0 if we get an error (see above)
  721. ;;;;;;;;mov ax,-1 ; return -1 on error
  722. APIEND
  723. ; in LD.ASM
  724. API HINSTANCE, LoadLibrary, NRESTEXT, <ASM> ;calls LoadModule directly
  725. P_CLPSZMODNAME lpLibName
  726. ; in LD.ASM
  727. API HINSTANCE, LoadModule, NRESTEXT, <ASM, ATMFRAME>
  728. P_CLPSZMODNAME lpModuleMame
  729. P_CLPLOADPARAMS0M1 lpLoadParams ; -1L and NULL allowed
  730. ; in LINTERF.ASM
  731. API HLOCAL, LocalAlloc, TEXT, <ASM>
  732. P_FLAGS flags, LMEM_VALID ;** LMEM_DISCARDABLE, LMEM_FIXED, LMEM_MODIFY,
  733. ;LMEM_MOVEABLE, LMEM_NOCOMPACT, LMEM_NODISCARD
  734. ;LMEM_ZEROINIT
  735. P_WORD cb
  736. ; in LINTERF.ASM
  737. API WORD, LocalCompact, TEXT, <ASM,NOGEN>
  738. P_WORD cbMinFree
  739. ; in LINTERF.ASM
  740. API HLOCAL, LocalFree, TEXT, <ASM>
  741. P_HLOCAL h ;** handle cannot be locked
  742. ;DEBUG version checks if handle is locked
  743. ; in LINTERF.ASM
  744. API HLOCAL, LocalHandle, TEXT, <ASM, FUNNYFRAME, NOGEN>
  745. P_NPTR pmem
  746. ; in LINTERF.ASM
  747. API BOOL, LocalInit, NRESTEXT, <ASM, NOGEN>
  748. P_SEL0 sel ; 0 => current DS. This is not documented
  749. P_NPTR pStart ; start of heap in segment
  750. P_NPTR pEnd ; end of heap in segment
  751. ; in LINTERF.ASM
  752. ifdef DEBUG
  753. API NPSTR, LocalLock, TEXT, <ASM>
  754. else
  755. API NPSTR, LocalLock, TEXT, <ASM, FUNNYFRAME> ;nogen
  756. endif
  757. P_HLOCAL h ;DEBUG checks for lock count overflow
  758. ; in LINTERF.ASM
  759. API HLOCAL, LocalReAlloc, TEXT, <ASM>
  760. P_HLOCAL h
  761. P_WORD cb
  762. P_FLAGS flags, LMEM_REALLOC_VALID ;** LMEM_DISCARDABLE, LMEM_MODIFY,
  763. ;LMEM_MOVEABLE, LMEM_NOCOMPACT,
  764. ;LMEM_NODISCARD, LMEM_ZEROINIT
  765. ; in LINTERF.ASM
  766. API WORD, LocalSize, TEXT, <ASM, FUNNYFRAME> ;nogen
  767. P_HLOCAL h
  768. ; in LINTERF.ASM
  769. API BOOL, LocalUnlock, TEXT, <ASM, FUNNYFRAME> ;nogen
  770. P_HLOCAL h
  771. ; in LINTERF.ASM
  772. API WORD, LocalFlags, TEXT, <ASM, FUNNYFRAME> ;nogen
  773. P_HLOCAL h
  774. ; in LINTERF.ASM
  775. API WORD, LocalShrink, TEXT, <ASM, NOGEN>
  776. P_SEL0 sel ; segment containing heap
  777. P_WORD cb
  778. ; in LINTERF.ASM
  779. API LPFNLNOTIFY, LocalNotify, NRESTEXT, <ASM, FUNNYFRAME>
  780. P_LPFNLNOTIFY0 lpfnNotifyProc
  781. ; in EMSMISC.ASM (Relevant only if EMS present)
  782. API VOID, LimitEmsPages, EMS, <ASM, FUNNYFRAME, NOGEN> ;nogen
  783. P_DWORD cKiloBytes
  784. ; in LSTRING.ASM
  785. API BOOL, IsDBCSLeadByte, TEXT, <ASM, FUNNYFRAME, NOGEN> ;nogen
  786. P_WORD ch
  787. ; in 3LDDEBUG.ASM
  788. API void, OutputDebugString, TEXT, <ASM, FUNNYFRAME, NOGEN> ; preserves all regs
  789. P_CLPSTR lpString
  790. ; in LDOPEN.ASM
  791. API int, OpenFile, TEXT, <ASM>
  792. P_CLPSTR0 lpFileName ; can be NULL if OF_REOPEN is set.
  793. P_LPOFSTRUCT lpOF ;** ptr. to OFSTRUCT
  794. P_FLAGS flags, OF_VALID ;** OF_ flags
  795. APIERR
  796. mov ax,-1 ; return -1 on error
  797. APIEND
  798. ; in 3GINTERF.ASM
  799. API void, SwitchStackBack, TEXT, <VOID, ASM, FUNNYFRAME> ;nogen
  800. ; in 3GINTERF.ASM
  801. API void, SwitchStackTo, TEXT, <ASM, FUNNYFRAME, DEBUGONLY> ;nogen
  802. P_SEL sel
  803. P_NPTR pStack
  804. P_NPTR pStackTop
  805. ; in MISCAPI.ASM
  806. API WORD, SetHandleCount, TEXT, <ASM>
  807. P_UVALUEW wNumber, HANDLE_MAX ;** upto 255 allowed
  808. ; in 3GMOREME.ASM
  809. API LONG, SetSwapAreaSize, TEXT, <ASM, NOGEN>
  810. P_WORD cParagraphs
  811. ; in CONTEXT.ASM
  812. API BOOL, SetErrorMode, MISCTEXT, <ASM>
  813. P_FLAGS flags, ERRMODE_VALID
  814. ; in LDINT.ASM
  815. API void, SwapRecording, MISCTEXT, <ASM, FUNNYFRAME> ;nogen
  816. P_UVALUE action, SWAP_MAX ;** range 0-2
  817. ; in 3GALLOC.ASM
  818. API VOID, ValidateFreeSpaces, TEXT, <VOID, ASM, FUNNYFRAME> ;nogen
  819. ; in CHECKSUM.ASM
  820. API VOID, ValidateCodeSegments, TEXT, <VOID, ASM>
  821. API WORD, WinExec, NRESTEXT, <ASM>
  822. P_CLPSTR lpFileName,256 ; path max = 128 + arg max = 128
  823. P_UVALUE wShow, SW_MAX ;** ShowWindow SW_ IDs
  824. ; in UP.C
  825. API WORD, GetProfileInt, TEXT, <DATA>
  826. P_CLPSTR lpAppName
  827. P_CLPSTR lpKeyname
  828. P_int default
  829. ; in UP.C
  830. API int, GetProfileString, TEXT, <DATA>
  831. P_CLPSTR lpAppName
  832. P_CLPSTR0 lpKeyName
  833. P_CLPSTR0 lpDefault
  834. P_LPBUFFER lpReturnedString, cchBuffer
  835. APIERR
  836. E_SETEMPTY lpReturnedString, cchBuffer
  837. APIEND
  838. ; in UP.C
  839. API WORD, GetPrivateProfileInt, TEXT, <DATA>
  840. P_CLPSTR lpAppName
  841. P_CLPSTR lpKeyname
  842. P_int default
  843. P_CLPSTR lpFileName
  844. ; in UP.C
  845. API int, GetPrivateProfileString, TEXT, <DATA>
  846. P_CLPSTR lpAppName
  847. P_CLPSTR0 lpKeyName
  848. P_CLPSTR0 lpDefault
  849. P_LPBUFFER lpReturnedString, cchBuffer
  850. P_CLPSTR lpFileName
  851. APIERR
  852. E_SETEMPTY lpReturnedString, cchBuffer
  853. APIEND
  854. ; in UP.C
  855. API BOOL, WriteProfileString, TEXT, <DATA>
  856. P_CLPSTR0 lpAppName
  857. P_CLPSTR0 lpKeyName
  858. P_CLPSTR0 lpString
  859. ; in UP.C
  860. API BOOL, WritePrivateProfileString, TEXT, <DATA>
  861. P_CLPSTR0 lpAppName
  862. P_CLPSTR0 lpKeyName
  863. P_CLPSTR0 lpString
  864. P_CLPSTR lpFileName
  865. ; BUGBUG
  866. ; For Win95, the k16 Reg* APIs get only the weakest validation.
  867. ; This is because they were added without _any_ validation,
  868. ; and validation is being added after the final beta.
  869. ; The purpose of this weak validation is to touch each pointer
  870. ; param if non-zero. We need to do this because the real work of
  871. ; the APIs is done at ring0, where we cannot fault in the segment.
  872. ;
  873. ; Stronger validation should be implemented for the next release.
  874. ;
  875. ; [the above comment is directly from Win95's kernel.api]
  876. API LONG, RegEnumKey32, NRESTEXT, <DATA>
  877. ;(HKEY lhKey, DWORD dwIndex, LPSTR lpValue, DWORD dwMax)
  878. P_HKEY hKey
  879. P_DWORD dwIndex
  880. P_CLPVOID0 lpValue
  881. P_DWORD dwMax
  882. APIERR
  883. mov ax,ERROR_INVALID_PARAMETER
  884. APIEND
  885. API LONG, RegOpenKey32, NRESTEXT, <DATA>
  886. ;(HKEY hkey, LPCSTR lpSubKey, PHKEY phkResult)
  887. P_HKEY hKey
  888. P_CLPVOID0 lpSubKey
  889. P_CLPVOID0 phkResult
  890. APIERR
  891. mov ax,ERROR_INVALID_PARAMETER
  892. APIEND
  893. API LONG, RegCreateKey32, NRESTEXT, <DATA>
  894. ;(HKEY hkey, LPCSTR lpSubKey, PHKEY phkResult)
  895. P_HKEY hKey
  896. P_CLPVOID0 lpSubKey
  897. P_CLPVOID0 phkResult
  898. APIERR
  899. mov ax,ERROR_INVALID_PARAMETER
  900. APIEND
  901. API LONG, RegDeleteKey32, NRESTEXT, <DATA>
  902. ;(HKEY hkey, LPCSTR lpSubKey)
  903. P_HKEY hKey
  904. P_CLPVOID0 lpSubKey
  905. APIERR
  906. mov ax,ERROR_INVALID_PARAMETER
  907. APIEND
  908. API LONG, RegQueryValue32, NRESTEXT, <DATA>
  909. ;(HKEY hkey, LPCSTR lpSubKey, LPSTR lpValue, LONG FAR * lpcb)
  910. P_HKEY hKey
  911. P_CLPVOID0 lpSubKey
  912. P_CLPVOID0 lpValue
  913. P_CLPVOID0 lpcbValue
  914. APIERR
  915. mov ax,ERROR_INVALID_PARAMETER
  916. APIEND
  917. API LONG, RegSetValue32, NRESTEXT, <DATA>
  918. ;(HKEY hkey, LPCSTR lpSubKey, DWORD dwType, LPCSTR lpValue, DWORD cbValue)
  919. P_HKEY hKey
  920. P_CLPVOID0 lpSubKey
  921. P_DWORD dwType
  922. P_CLPVOID0 lpValue
  923. P_DWORD cbValue
  924. APIERR
  925. mov ax,ERROR_INVALID_PARAMETER
  926. APIEND
  927. API LONG, RegDeleteValue32, NRESTEXT, <DATA>
  928. ;(HKEY hkey, LPCSTR lpValue)
  929. P_HKEY hKey
  930. P_CLPVOID0 lpValue
  931. APIERR
  932. mov ax,ERROR_INVALID_PARAMETER
  933. APIEND
  934. API LONG, RegEnumValue32, NRESTEXT, <DATA>
  935. ;(HKEY hkey, DWORD dwValue, LPCSTR lpValue, LONG FAR * lpcbValue,DWORD dwReserved,LONG FAR *lpdwType, LPBYTE lpbData, LONG FAR *lpcbData)
  936. P_HKEY hKey
  937. P_DWORD dwValue
  938. P_CLPVOID0 lpValue
  939. P_CLPVOID0 lpcbValue
  940. P_DWORD dwReserved
  941. P_CLPVOID0 lpdwType
  942. P_CLPVOID0 lpbData
  943. P_CLPVOID0 lpcbData
  944. APIERR
  945. mov ax,ERROR_INVALID_PARAMETER
  946. APIEND
  947. API LONG, RegQueryValueEx32, NRESTEXT, <DATA>
  948. ;(HKEY hkey, LPCSTR lpszValue, LONG FAR *lpdwReserved, LONG FAR * lpdwType, LPBYTE lpbData, LONG FAR *lpcbData)
  949. P_HKEY hKey
  950. P_CLPVOID0 lpValue
  951. P_DWORD lpdwReserved
  952. P_CLPVOID0 lpdwType
  953. P_CLPVOID0 lpbData
  954. P_CLPVOID0 lpcbData
  955. APIERR
  956. mov ax,ERROR_INVALID_PARAMETER
  957. APIEND
  958. API LONG, RegSetValueEx32, NRESTEXT, <DATA>
  959. ;(HKEY hkey, LPCSTR lpValue, DWORD dwReserved, DWORD fdwType, LPBYTE lpbData,DWORD cbData)
  960. P_HKEY hKey
  961. P_CLPVOID0 lpValue
  962. P_DWORD dwReserved
  963. P_DWORD dwType
  964. P_CLPVOID0 lpbData
  965. P_DWORD cbData
  966. APIERR
  967. mov ax,ERROR_INVALID_PARAMETER
  968. APIEND
  969. API LONG, RegLoadKey32, NRESTEXT, <DATA>
  970. ;(HKEY hkey, LPCSTR lpSubKey, LPCSTR lpszFileName)
  971. P_HKEY hKey
  972. P_CLPVOID0 lpSubKey
  973. P_CLPVOID0 lpszFileName
  974. APIERR
  975. mov ax,ERROR_INVALID_PARAMETER
  976. APIEND
  977. API LONG, RegUnLoadKey32, NRESTEXT, <DATA>
  978. ;(HKEY hkey, LPCSTR lpSubKey)
  979. P_HKEY hKey
  980. P_CLPVOID0 lpSubKey
  981. APIERR
  982. mov ax,ERROR_INVALID_PARAMETER
  983. APIEND
  984. API LONG, RegSaveKey32, NRESTEXT, <DATA>
  985. ;(HKEY hkey, LPCSTR lpszFile,void far * lpSA)
  986. P_HKEY hKey
  987. P_CLPVOID0 lpszFile
  988. P_CLPVOID0 lpSA
  989. APIERR
  990. mov ax,ERROR_INVALID_PARAMETER
  991. APIEND
  992. ; in CONTEXT.ASM
  993. API void, Yield, TEXT, <VOID, ASM, FUNNYFRAME> ;nogen
  994. ; in ERROR.C
  995. API void, LogError, TEXT, <VOID, NOGEN>
  996. P_WORD err
  997. P_int iParam
  998. P_LPVOID pParam
  999. ; in ERROR.C
  1000. API void, LogParamError, TEXT, <VOID, NOGEN>
  1001. P_WORD err
  1002. ; in ERROR.C
  1003. WDI_VALID equ 0007h
  1004. _DefSimpleF F_MODNAME,8
  1005. STRUCT <WINDEBUGINFO>
  1006. F_FLAGS flags, WDI_VALID
  1007. F_DWORD dwOptions
  1008. F_DWORD dwFilter
  1009. F_MODNAME achAllocModule
  1010. F_DWORD dwAllocBreak
  1011. F_DWORD dwAllocCount
  1012. ENDSTRUCT
  1013. _GenLP <P_LPWINDEBUGINFO>,<LP>,%VLcbsWINDEBUGINFO
  1014. P_CLPWINDEBUGINFO macro lpwdi,opts
  1015. _GenParm <lpwdi>,4,<opts>
  1016. if VLgen
  1017. mov ax,_P_&lpwdi
  1018. mov cx,_P_&lpwdi+2
  1019. mov bx,VLcbsWINDEBUGINFO
  1020. lcall CLP
  1021. _gensub CLP
  1022. mov es,cx
  1023. mov bx,ax
  1024. test word ptr es:[bx]._F_flags,not WDI_VALID
  1025. jz @F
  1026. mov bx,ERR_BAD_PTR
  1027. lcall Inval_Param_
  1028. @@:
  1029. endif
  1030. endm
  1031. API void, SetWinDebugInfo, TEXT, <DEBUGONLY>
  1032. P_CLPWINDEBUGINFO lpwdi
  1033. API void, GetWinDebugInfo, TEXT, <DEBUGONLY>
  1034. P_LPWINDEBUGINFO lpwdi
  1035. P_FLAGS flags, WDI_VALID
  1036. ifdef DBCS
  1037. ; in USERPRO.ASM
  1038. API void, GetSystemDefaultLangID, MISCTEXT, <VOID, ASM, FUNNYFRAME> ;nogen
  1039. endif ; DBCS