;===========================================================================
;
; Validation constants
;
DCX_VALID_L         equ 004fbh
DCX_VALID_H         equ 00001h
WS_VALID_L	    equ 00000h
WS_VALID_H	    equ 0ffffh
WS_EX_VALID_L       equ 07fffh
WS_EX_VALID_H       equ 00007h
GND_VALID_L         equ 00003h
GND_VALID_H	    equ 00000h

DT_VALID	    equ 0ffffh
CS_VALID	    equ 07fefh
SWP_VALID	    equ 03fffh
QS_VALID	    equ 000ffh
TPM_VALID	    equ 0000fh
RDW_VALID           equ 00fffh
SW_VALID	    equ 08007h
MB_VALID	    equ 0b377h
IDC_VALID	    equ 00007h
MF_VALID	    equ 04fffh
MF_CHANGE_VALID     equ 05fffh
EV_VALID	    equ 03fffh
SPIF_VALID	    equ 00003h
DDL_VALID	    equ 0e03fh
PM_VALID	    equ 00003h
WPF_VALID           equ 00003h

SB_MAX		    equ 3
ESB_MAX 	    equ 3
SB_CMD_MAX	    equ 8
SW_MAXIMIZE	    equ 3
SW_MAX		    equ 9
SM_MAX              equ 80
CTLCOLOR_MAX	    equ 8
COLOR_MAX	    equ 20
GW_MAX		    equ 5
WH_MIN		    equ -1
WH_MAX		    equ 10
MSGF_MAX	    equ 7
SPI_MAX             equ 65
PWR_MAX             equ 3

HHOOK_MAGIC	    equ ('H' or ('K' * 256))
WS_CHILD	    equ 4000h

;=======================================================================
;
; GDI types
;

IFNDEF	WOW
;    ExternFP	<IsGDIObject>
ENDIF

;
; Generate a GDI object validation macro.
;
; If nullok is 1, allow NULL.
; min & max are the allowed OBJ_* range.
; except, if specified, is an OBJ_* value within the range to reject.
;
_GenHGDI    macro   name,nullok,htype,min,max,except
    name &macro   hObj,opts
	local	badobj
	local	objok
        _GenParm    <hObj>,2,<opts>
	if VLgen
	    IFNDEF WOW
		if nullok
		    mov	cx,_P_&&hObj
		    jcxz	objok
		    push	cx
		else
		    push	_P_&&hObj
		endif
;		call	IsGDIObject
		ifnb <except>
		    cmp	al,except
		    jz	    badobj
		endif
		ife min-max
		    cmp	al,min
		    je	objok
		else
		    cmp	al,min
		    jb	    badobj
		    cmp	al,max
		    jbe	objok
		endif
		badobj:
		mov	ax,_P_&&hObj
		mov	bx,ERR_BAD_&htype
		lcall	Inval_Param_
		objok:
	    ENDIF
	endif
    &endm
endm

OBJ_PEN 	equ	1
OBJ_BRUSH	equ	2
OBJ_FONT	equ	3
OBJ_PALETTE	equ	4
OBJ_BITMAP	equ	5
OBJ_RGN 	equ	6
OBJ_DC		equ	7
OBJ_IC		equ	8
OBJ_DISABLED_DC equ	9
OBJ_METADC	equ	10
OBJ_METAFILE	equ	11

_GenHGDI    <P_HDC>,0,HDC,OBJ_DC,OBJ_METAFILE
_GenHGDI    <P_HDC0>,1,HDC,OBJ_DC,OBJ_METAFILE

_GenHGDI    <P_HPEN>,0,HPEN,OBJ_PEN,OBJ_PEN
_GenHGDI    <P_HPEN0>,1,HPEN,OBJ_PEN,OBJ_PEN

_GenHGDI    <P_HBRUSH>,0,HBRUSH,OBJ_BRUSH,OBJ_BRUSH
_GenHGDI    <P_HBRUSH0>,1,HBRUSH,OBJ_BRUSH,OBJ_BRUSH

_GenHGDI    <P_HFONT>,0,HFONT,OBJ_FONT,OBJ_FONT
_GenHGDI    <P_HFONT0>,1,HFONT,OBJ_FONT,OBJ_FONT

_GenHGDI    <P_HPALETTE>,0,HPALETTE,OBJ_PALETTE,OBJ_PALETTE
_GenHGDI    <P_HPALETTE0>,1,HPALETTE,OBJ_PALETTE,OBJ_PALETTE

_GenHGDI    <P_HBITMAP>,0,HBITMAP,OBJ_BITMAP,OBJ_BITMAP
_GenHGDI    <P_HBITMAP0>,1,HBITMAP,OBJ_BITMAP,OBJ_BITMAP

_GenHGDI    <P_HRGN>,0,HRGN,OBJ_RGN,OBJ_RGN
_GenHGDI    <P_HRGN0>,1,HRGN,OBJ_RGN,OBJ_RGN

P_HBITMAP01 macro   hbm,opts
    _GenParm    <hbm>,2,<opts>
    if VLgen
	IFNDEF	WOW
	    mov	    ax, _P_&hbm
	    cmp	    ax, 1	    ; allow NULL or (HBITMAP)1
	    jbe	    @F
	    push    ax
	    push    ax
;	    call    IsGDIObject
	    cmp	    al, OBJ_BITMAP
	    pop	    ax
	    jz	    @F
	    mov	    bx,ERR_BAD_HBITMAP
	    lcall   Inval_Param_
	@@:
	ENDIF
    endif
endm

;============================================================================
;
; USER types
;
ExternFP    <IsMenu>
ExternFP    <IsWindow>

sBegin	TEXT
ExternNP    <ValidateMessage>			TEMPLY!!!! ChandanC
sEnd	TEXT

sBegin	DATA
    IFNDEF	WOW
	ExternW	<hMenuHeap>
	ExternW	<cInstalledDrivers>
    ENDIF
sEnd    DATA

DGROUP  group   _DATA

P_HWND  macro   h,opts
    _GenParm    <h>,2,<opts>
    if VLgen
	IFNDEF WOW
	    mov	 bx,_P_&h
	    lcall	 VHWND
	    _gensub VHWND
	ENDIF
    endif
endm

P_HWND0 macro   h,opts
    _GenParm    <h>,2,<opts>
    if VLgen
	IFNDEF WOW
	    mov	 bx,_P_&h
	    lcall	 VHWND0
	    _gensub VHWND
	ENDIF
    endif
endm

P_HWNDNOFAIL macro   h,opts
    _GenParm    <h>,2,<opts>
    if VLgen
	IFNDEF	WOW
	    lea	 bx, _P_&h
	    lcall	 VHWNDNOFAIL
	    _gensub VHWNDNOFAIL
	    @@:
	ENDIF
    endif
endm

P_HWNDNOFAIL0 macro   h,opts
    _GenParm    <h>,2,<opts>
    if VLgen
	IFNDEF WOW
	    lea	 bx, _P_&h
	    lcall	 VHWNDNOFAIL0
	    _gensub VHWNDNOFAIL
	    @@:
	ENDIF
    endif
endm

P_HWNDINSERT macro   h,opts
    _GenParm    <h>,2,<opts>
    if VLgen
	IFNDEF	WOW
	    mov	 bx,_P_&h
	    inc	 bx
	    inc	 bx
	    cmp	 bx,3		 ; accept HWND_TOP (0), HWND_BOTTOM (1),
	    jbe	 @F		 ;   HWND_NOTOPMOST (0xfffe) HWND_TOPMOST (0xffff)
	    dec	 bx
	    dec	 bx
	    lcall	 VHWND
	    _gensub VHWND
	    @@:
	ENDIF
    endif
endm

P_HWNDFFFF macro   h,opts
    _GenParm    <h>,2,<opts>
    if VLgen
	IFNDEF	WOW
	    mov	 bx,_P_&h
	    inc	 bx		 ;; accept hwnd == 0xffff
	    jz	@F
	    dec	 bx
	    lcall	 VHWND
	    _gensub VHWND
	    @@:
	ENDIF
    endif
endm

P_HOOK_HK macro   name,opts
    _GenParm    <name>,4,<opts>
    if VLgen
	IFNDEF	WOW
	    mov	 ax,_P_&name+2
	    cmp	ax, HHOOK_MAGIC	    ; magic for unhook
	    jz	@F
	    mov	ax,_P_&name
	    mov	cx,_P_&name+2
	    lcall	LPFN
	    _gensub LPFN
	    @@:
	ENDIF
    endif
endm

;
; CreateWindow and CreateWindowEx HMENU parameter.  If WS_CHILD, then
; hMenu is an ID, else it's a menu handle.
;
P_HMENU0CW  macro   style, x, y, cx, cy, hwndParent, hMenu, opts
    local	hmenu0cw_exit
    _GenParm	<style>,4,<opts>
    _GenParm	<x>,2,<opts>
    _GenParm	<y>,2,<opts>
    _GenParm	<cx>,2,<opts>
    _GenParm	<cy>,2,<opts>
    _GenParm	<hwndParent>,2,<opts>
    _GenParm	<hMenu>,2,<opts>
    if VLgen
	IFNDEF	WOW
	    mov	bx,_P_&hwndParent  ;validate parent window handle (can be NULL)
	    lcall	 VHWND0
	    _gensub VHWND

	    test word ptr _P_&style+2, WS_CHILD
	    jnz	 hmenu0cw_exit	   ;if this is a child window, we're done...
	    mov	 bx,_P_&hMenu	   ;...else verify menu handle (can be NULL)
	    lcall	 VHMENU0
	    _gensub VHMENU
	    hmenu0cw_exit:
	ENDIF
    endif
endm

P_HMENU macro	hMenu,opts
    _GenParm    <hMenu>,2,<opts>
    if VLgen
	IFNDEF	WOW
	    mov	 bx,_P_&hMenu
	    lcall	 VHMENU
	    _gensub VHMENU
	ENDIF
    endif
endm

P_HMENU0 macro	 hMenu,opts
    _GenParm    <hMenu>,2,<opts>
    if VLgen
	IFNDEF	WOW
	    mov	 bx,_P_&hMenu
	    lcall	 VHMENU0
	    _gensub VHMENU
	ENDIF
    endif
endm

;
; HDRVR validation
;
P_HDRVR macro   h,opts
    _GenParm    <h>,2,<opts>
    if VLgen
	IFNDEF	WOW
	    mov	 bx,_P_&h
	    lcall	 HDRVR
	    _gensub HDRVR
	ENDIF
    endif
endm

P_HDRVR0 macro   h,opts
    _GenParm    <h>,2,<opts>
    if VLgen
	IFNDEF	WOW
	    mov	 bx,_P_&h
	    lcall	 HDRVR0
	    _gensub HDRVR
	ENDIF
    endif
endm

;
; HDWP validation
;
P_HDWP macro   h,opts
    _GenParm    <h>,2,<opts>
    if VLgen
	IFNDEF	WOW
	    mov	 bx,_P_&h
	    lcall	 HDWP
	    _gensub HDWP
	ENDIF
    endif
endm

P_HDWP0 macro   h,opts
    _GenParm    <h>,2,<opts>
    if VLgen
	IFNDEF	WOW
	    mov	 bx,_P_&h
	    lcall	 HDWP0
	    _gensub HDWP
	ENDIF
    endif
endm

;-----------------------------
; HICON and HCURSOR validation

P_HICON       equ <P_GHANDLE>
P_HCURSOR     equ <P_GHANDLE>
P_HCURSOR0    equ <P_GHANDLE0>

STRUCT	<CURSORSHAPE>
F_int xHotSpot
F_int yHotSpot
F_int cx
F_int cy
F_int cbWidth
F_BYTE Planes
F_BYTE BitsPixel
ENDSTRUCT

;----------------------------------

EXTRA_EXPAND	macro	lseg

IFNDEF	WOW
;
; HDRVR validation
;
ifdef genHDRVR&lseg

public HDRVR0&lseg
HDRVR0&lseg:
	 or	 bx,bx		 ; accept NULL
	 jz	 HDRVR_ok&lseg

public HDRVR&lseg
HDRVR&lseg:
	 or	 bx,bx
	 jz	 HDRVR_err&lseg
	 mov	 ax,DGROUP
	 mov	 es,ax
assume	es:DGROUP
	 cmp	 bx,es:[_DATA:cInstalledDrivers]
assume	es:NOTHING
	 ja	 HDRVR_err&lseg
HDRVR_ok&lseg:
	 ret

HDRVR_err&lseg:
	 xchg	 ax,bx
	 mov	 bx,ERR_BAD_HDRVR
	 jmp	 Inval_Param_&lseg

endif	 ; genHDRVR&lseg

; HDWP validation
;
ifdef genHDWP&lseg

public HDWP0&lseg
HDWP0&lseg:
	 or	 bx,bx		 ; accept NULL
 jz	 HDWP_ok&lseg

public HDWP&lseg
HDWP&lseg:
	 or	 bx,bx
	 jz	 HDWP_err&lseg
beg_fault_trap	HDWP_trap&lseg
	 mov	 ax,DGROUP
	 mov	 es,ax
assume	es:DGROUP
	 cmp	 es:[bx].SmwpSignature,SMWP_SIG
assume	es:NOTHING
	 jnz	 HDWP_err&lseg
end_fault_trap
HDWP_ok&lseg:
	 ret

HDWP_trap&lseg:
	 fault_fix_stack

HDWP_err&lseg:
	 xchg	 ax,bx
	 mov	 bx,ERR_BAD_HDWP
	 jmp	 short Inval_Param_&lseg

endif	 ; genHDWP&lseg

;
; HWND validation
;
ifdef genVHWND&lseg

public VHWND0&lseg
VHWND0&lseg:
	 or	 bx,bx			 ; accept NULL
	 jz	 HWND_ok&lseg

public VHWND&lseg
VHWND&lseg:
	 mov	 cx,bx			 ; put copy of window handle into cx
beg_fault_trap	HWND_trap&lseg
	 or	 bx,bx			 ; reject NULL without dereferencing
	 jz	 HWND_err&lseg

	mov	ax,_DATA
	mov	es,ax			; ES = window's DS

	mov	bx,es:[bx].wndPcls
	cmp	es:[bx].uclsMagic,'N'+'K'*256
	 jnz	 HWND_err&lseg
end_fault_trap
HWND_ok&lseg:
	 ret

HWND_trap&lseg:
	 fault_fix_stack
HWND_err&lseg:
	 xchg	 ax,cx			 ; ax = hwnd
	 mov	 bx,ERR_BAD_HWND
	 jmp	 short Inval_Param_&lseg

endif	 ; genVHWND&lseg


;HWND validation no failure. If failure, replace with NULL and warn
; Takes a ptr on stack to the hwnd parameter.
ifdef genVHWNDNOFAIL&lseg

public VHWNDNOFAIL0&lseg
VHWNDNOFAIL0&lseg:
	 mov	 cx,ss:[bx]
	 jcxz	 HWNDNOFAIL_ok&lseg	 ; accept NULL

public VHWNDNOFAIL&lseg
VHWNDNOFAIL&lseg:
	 mov	 cx,bx			 ; put copy of ptr to window handle into cx
	 mov	 bx,ss:[bx]		 ; put window handle in bx
beg_fault_trap	HWNDNOFAIL_trap&lseg
	 or	 bx,bx			 ; reject NULL without dereferencing
	 jz	 HWNDNOFAIL_err&lseg

	 mov	 ax,_DATA
	 mov	 es,ax			 ; ES = window's DS

	 mov	 bx,es:[bx].wndPcls
	 cmp	 es:[bx].uclsMagic,'N'+'K'*256
	 jnz	 HWNDNOFAIL_err&lseg
end_fault_trap
HWNDNOFAIL_ok&lseg:
	 ret

HWNDNOFAIL_trap&lseg:
	 fault_fix_stack
HWNDNOFAIL_err&lseg:
	 mov	 bx,cx
	 mov	 ax,ss:[bx]		 ; ax = hwnd
	 mov	 word ptr ss:[bx],0	 ; Patch stack with NULL
	 mov	 bx,ERR_BAD_HWND or ERR_WARNING
	 lcall	 Inval_Param_
	 ret
endif	 ; genVHWNDNOFAIL&lseg


; HMENU validation

ifdef genVHMENU&lseg

public VHMENU0&lseg
VHMENU0&lseg:
	 or	 bx,bx			 ; Accept NULL
	 jz	 HMENU_ok&lseg

public VHMENU&lseg
VHMENU&lseg:
beg_fault_trap	HMENU_trap&lseg
	 or	 bx,bx			 ; reject NULL without dereferencing
	 jz	 HMENU_err&lseg
	 mov	 ax,DGROUP
	 mov	 es,ax
assume	es:DGROUP
	 mov	 es,es:[_DATA:hMenuHeap]
assume	es:NOTHING
	 cmp	 es:[bx].mnSignature,SIG_MENU
	 jnz	 HMENU_err&lseg
end_fault_trap
HMENU_ok&lseg:
	 ret

HMENU_trap&lseg:
	 fault_fix_stack
HMENU_err&lseg:
	 xchg	 ax,bx
	 mov	 bx,ERR_BAD_HMENU
	 jmp	 short Inval_Param_&lseg

endif	 ; genVHMENU&lseg
ENDIF
endm    ; EXTRA_EXPAND

P_HACCEL	equ <P_GHANDLE>
P_HACCEL0	equ <P_GHANDLE0>

P_HCLIPDATA	equ <P_H>		; depends on type.
P_HCLIPDATA0	equ <P_H0>


P_HHOOK     macro   hhook,opts
	    local   hhook_err
	    local   hhook_ok
    _GenParm    <hhook>,4,<opts>
    if VLgen
	IFNDEF	WOW
	    mov	 cx,_P_&hhook
	    mov	 ax,_P_&hhook+2
	    jcxz	hhook_err
	    cmp	 ax,HHOOK_MAGIC
	    je	 hhook_ok
	   hhook_err:
	    mov	 bx,ERR_BAD_DVALUE
	    lcall	Inval_Param_
	   hhook_ok:
	ENDIF
    endif
endm

P_GWWINDEX	equ <P_2>	; GetWindowWord index
P_GCWINDEX	equ <P_2>	; GetClassWord index

P_CID	macro	cid,opts
	local	cid_err
	local	cid_ok
    _GenParm    <cid>,2,<opts>
    if VLgen
	    mov	ax,_P_&cid
	    or	ah,ah
	    jz	cid_ok
	   cid_err:
	    mov	 bx,ERR_BAD_HANDLE
	    lcall	 Inval_Param_
	   cid_ok:
    endif
endm

; Field types

_DefSimpleF F_HDC,2
_DefSimpleF F_HWND,2
_DefSimpleF F_CID,2
_DefSimpleF F_HINSTANCE,2
_DefSimpleF F_HICON0,2
_DefSimpleF F_HCURSOR0,2
_DefSimpleF F_HBRUSHVAL0,2

_DefSimpleF F_LPFNWP,4
_DefSimpleF F_LPFNWND,4
_DefSimpleF F_CLPSTRRSRC,4
_DefSimpleF F_CLPSTRRSRC0,4
_DefSimpleF F_CLPSTRATOM,4

_DefSimpleF F_RGB16,16

STRUCT	<MSG>
F_HWND	     hwnd
F_WORD	     message
F_WORD	     wParam
F_LONG	     lParam
F_DWORD      time
F_POINT      pt
ENDSTRUCT

_GenLP	<P_LPMSG>,<LP>,%VLcbsMSG
_GenLP	<P_LPMSG0>,<LP0>,%VLcbsMSG

P_CLPMSG  macro   lpmsg,opts
    _GenParm    <lpmsg>,4,<opts>
    if VLgen
	mov	ax,_P_&lpmsg
	mov	cx,_P_&lpmsg+2
	mov	bx,VLcbsMSG
	lcall	CLP
        _gensub LP
    ifdef DEBUG
	IFNDEF	WOW
	    mov	es,cx
	    mov	bx,ax
	    mov	 bx,es:[bx]._F_hwnd	 ; DEBUG: just validate the hwnd.
	    lcall	 VHWND0
	    _gensub VHWND
	ENDIF
    else
	mov	es,cx
	mov	bx,ax
	mov	cx,es:[bx]._F_hwnd	; accept hwnd == NULL
	jcxz	@F
	push	cx
	push	es:[bx]._F_message
	push	es:[bx]._F_wParam
	push	es:[bx]._F_lParam+2
	push	es:[bx]._F_lParam
	call	far ptr ValidateMessage
	or	ax,ax
	jnz	@F
	mov	ax,_P_&lpmsg		; report error.
	mov	cx,_P_&lpmsg+2
	mov	 bx,ERR_BAD_PTR
	lcall	 Inval_Param_
    @@:
    endif
    endif
endm

STRUCT	<PAINTSTRUCT>
F_HDC	     hdc
F_BOOL	     fErase
F_RECT	     rcPaint
F_BOOL	     fRestore
F_BOOL	     fIncUpdate
F_RGB16      rgbReserved	;16 reserved bytes
ENDSTRUCT

_GenLP	<P_LPPAINTSTRUCT>,<LP>,%VLcbsPAINTSTRUCT
_GenLP	<P_LPPAINTSTRUCT0>,<LP0>,%VLcbsPAINTSTRUCT
_GenLP	<P_CLPPAINTSTRUCT>,<CLP>,%VLcbsPAINTSTRUCT
_GenLP	<P_CLPPAINTSTRUCT0>,<CLP0>,%VLcbsPAINTSTRUCT

STRUCT	<WNDCLASS>
F_FLAGS      style, CS_VALID
F_LPFNWP     lpfnWndProc	       ;** check for nop/nop/nop or mov ax.
F_int	     cbClsExtra
F_int	     cbWndExtra
F_HINSTANCE  hInstance
F_HICON0     hIcon
F_HCURSOR0   hCursor
F_HBRUSHVAL0 hbrBackground	       ;** hBrush, color value or NULL
F_CLPSTRRSRC0 lpMenuName		;** integer or ptr to null-term. string
				       ;If integer, HIWORD must be 0
F_CLPSTRATOM lpszClassName
ENDSTRUCT

_GenLP	<P_LPWNDCLASS>,<LP>,%VLcbsWNDCLASS
_GenLP	<P_LPWNDCLASS0>,<LP0>,%VLcbsWNDCLASS

;ExternFP    <ValidateWNDCLASS>
P_CLPWNDCLASS	macro	lpwc,opts
    _GenParm	 <lpwc>,4,<opts>
    if VLgen
;	push	_P_&lpwc+2
;	push	_P_&lpwc
;	call	ValidateWNDCLASS
;	or	ax,ax
;	jnz	@F
;	mov	cx,_P_&lpwc+2
;	mov	ax,_P_&lpwc
;	 mov	 bx,ERR_BAD_PTR
;	 lcall	 Inval_Param_
;    @@:
    endif
endm

STRUCT	<DCB>
F_CID	     Id 			     ;comm. device ID
F_WORD	     BaudRate
F_BYTE	     ByteSize			     ;** BYTE. Range 4-8
F_BYTE	     Parity			     ;** BYTE. Range 0-4
F_BYTE	     StopBits			     ;** BYTE. Range 0-2
F_WORD	     RlsTimeout
F_WORD	     CtsTimeout
F_WORD	     DsrTimeout
F_WORD       flags              ; room for the fXXX bitfields
F_char	     XonChar
F_char	     XoffChar
F_WORD	     XonLim
F_WORD	     XoffLim
F_char	     PeChar
F_char	     EofChar
F_char	     EvtChar
F_WORD	     TxDelay
ENDSTRUCT

_GenLP	<P_LPDCB>,<LP>,%VLcbsDCB
_GenLP	<P_LPDCB0>,<LP0>,%VLcbsDCB
_GenLP	<P_CLPDCB>,<CLP>,%VLcbsDCB
_GenLP	<P_CLPDCB0>,<CLP0>,%VLcbsDCB

_GenLP	<P_CLPDT>,<CLP>,4	    ; dialog template ptr
_GenLP	<P_CLPMT>,<CLP>,4	    ; menu template ptr

P_CLPMENUSTR	equ <P_DWORD>	    ; menu string ptr: type depends on MF_*

_GenLP	<P_LPKBDSTATE>,<LP>,256
_GenLP	<P_CLPKBDSTATE>,<CLP>,256

STRUCT	<COMSTAT>
F_BYTE	flags
F_WORD	cbInQue
F_WORD	cbOutQue
ENDSTRUCT

_GenLP	<P_LPCOMSTAT0>,<LP0>,%VLcbsCOMSTAT

_DefSimpleF F_HDRVR,2
_DefSimpleF F_HMODULE,2
_DefSimpleF F_RGB128,128

STRUCT	<DRIVERINFOSTRUCT>
F_WORD	    length
F_HDRVR     hDriver
F_HMODULE   hModule
F_RGB128    szAliasName
ENDSTRUCT

P_LPDRIVERINFOSTRUCT	macro	lpdi,opts
    _GenParm    <lpdi>,4,<opts>
    if VLgen
	mov	ax,_P_&lpdi
	mov	cx,_P_&lpdi+2
	lcall	LP0
        _gensub LP
	mov	es,cx
	mov	bx,ax
	cmp	word ptr es:[bx]._F_length,VLcbsDRIVERINFOSTRUCT
	jz	@F
        mov     bx,ERR_BAD_PTR
        lcall   Inval_Param_
@@:
    endif
endm

STRUCT	<WINDOWPLACEMENT>
F_WORD      length
F_FLAGS     flags, WPF_VALID
F_WORD      showCmd
F_POINT     ptMinPosition
F_POINT     ptMaxPosition
F_RECT      rcNormalPosition
ENDSTRUCT

P_LPWINDOWPLACEMENT	macro	lpwp,opts
    _GenParm    <lpwp>,4,<opts>
    if VLgen
	mov	ax,_P_&lpwp
	mov	cx,_P_&lpwp+2
	mov	bx,VLcbsWINDOWPLACEMENT
	lcall	LP
        _gensub LP
	mov	es,cx
	mov	bx,ax
	cmp	word ptr es:[bx]._F_length,VLcbsWINDOWPLACEMENT
	jz	@F
        mov     bx,ERR_BAD_PTR
        lcall   Inval_Param_
@@:
    endif
endm

P_CLPWINDOWPLACEMENT     macro   lpwp,opts
    _GenParm    <lpwp>,4,<opts>
    if VLgen
	mov	ax,_P_&lpwp
	mov	cx,_P_&lpwp+2
	mov	bx,VLcbsWINDOWPLACEMENT
        lcall   CLP
        _gensub CLP
	mov	es,cx
	mov	bx,ax
	cmp	word ptr es:[bx]._F_length,VLcbsWINDOWPLACEMENT
	jz	@F
        mov     bx,ERR_BAD_PTR
        lcall   Inval_Param_
@@:
    endif
endm

; Function pointers
;
P_LPFNWP	equ <P_LPFN>	    ; Window proc
P_LPFNDP	equ <P_LPFN>	    ; dialog proc
P_LPFNDP0	equ <P_LPFN0>
P_LPFNWENUM	equ <P_LPFN>	    ; EnumWindows() enumeration proc
P_LPFNTIMER	equ <P_LPFN>	    ; Timer proc
P_LPFNTIMER0	equ <P_LPFN0>
P_LPFNPENUM	equ <P_LPFN>	    ; EnumProps() enumeration proc
P_LPFNEVENTPROC0 equ <P_LPFN0>      ; SetEventHook proc

P_HOOKPROC	equ <P_LPFN>	    ; SetWindowsHookEx() hook function
_GenLP	<P_LPHOOKPROC>,<LP>,4	    ; Pointer to pointer to function

P_HOTKEYPROC	equ <P_LPFN>

; SystemParametersInfo arguments

P_SPIPARAMS macro   id,wParam,lpParam,flags,opts
P_UVALUE    <id>,SPI_MAX,<opts>
P_WORD	    <wParam>,<opts>
P_LPVOID0   <lpParam>,<opts>
P_FLAGS     <flags>,SPIF_VALID,<opts>
endm
;
; SetSysColors() parameters
;
P_CLPSYSCLRBUF	    macro count, lpIds, lpColors
    P_int	<count>, <opts>
    P_CLPINT	<id>, <opts>
    P_CLPLONG	<lpColors>, <opts>
endm
;
; TabbedTextOut, et al
;
P_CLPTABBUF0 macro   cTabStops, lpTabStops
    _DefParm	<cTabStops>,2,<opts>
    _DefParm	<lpTabStops>,4,<opts>
    if VLgen
	_FlsFrame
	mov	ax,_P_&lpTabStops
	mov	cx,_P_&lpTabStops+2
	mov	bx,_P_&cTabStops
	add	bx,bx
	lcall	CLP0
        _gensub LP
    endif
endm
;
; DrawText() lpch, cch
;
; if cch == -1, then lpch is a pointer to a zero-terminated string.
;
P_CLPBUFFERM1	macro	lpch, cch, opts
    local	dt_chkstr
    local	dt_ok
    _DefParm	<lpch>,4,<opts>
    _DefParm	<cch>,2,<opts>
    if VLgen
	_FlsFrame
	mov	ax,_P_&lpch
	mov	cx,_P_&lpch+2
	mov	bx,_P_&cch
	inc	bx		;; if cch == -1, check zero-terminated string
	jz	dt_chkstr
	dec	bx
	lcall	CLP
        _gensub LP
	jmp	short dt_ok
dt_chkstr:
        mov     bx,-1
	lcall	CLPSZ
        _gensub LPSZ
dt_ok:
    endif
endm
;
; Buffer of words
;
P_LPWBUFFER macro   lpw, cw, opts
    _DefParm	<lpw>,4,<opts>
    _DefParm	<cw>,2,<opts>
    if VLgen
	_FlsFrame
	mov	ax,_P_&lpw
	mov	cx,_P_&lpw+2
	mov	bx,_P_&cw
	add	bx,bx
	lcall	LP
        _gensub LP
    endif
endm

.list
.lall

;===========================================================================
;
; API Descriptions
;
; in CTLMGR.C
API int,    DrawText, TEXT
P_HDC	    hdc
P_CLPBUFFERM1 lpszText, cchText ; cchText == -1 means do strlen.
P_LPRECT    lprc
P_FLAGS     flags,DT_VALID	; if DT_TABSTOP, then hi byte is val.

; in wTEXT.c
API int,    wvsprintf, TEXT
P_LPSTR     lpOut
P_CLPSTR    lpFmt
P_CLPSTR0   lpParams
APIERR
E_SETEMPTYNC	lpOut
APIEND

;;;;;;;;ChandanC TEMPLY!!! FIX ME
; in wsprintf.c
;API int,    wsprintf, TEXT
;P_LPSTR     lpOut
;P_CLPSTR    lpFmt
;APIERR
;E_SETEMPTYNC	lpOut
;APIEND

; in CTLMGR.C
API DWORD,  GetTabbedTextExtent, TEXT
P_HDC	    hdc
P_CLPBUFFER lpchText, cchText
P_CLPTABBUF0 cTabStops, lpTabStops

; in CTLMGR.C
API LONG,   TabbedTextOut, TEXT
P_HDC	    hdc
P_int	    x
P_int	    y
P_CLPBUFFER lpchText, cchText
P_CLPTABBUF0 cTabStops, lpTabStops
P_int	    xTabOrigin

; in WMICON.C
API BOOL,   DrawIcon, TEXT
P_HDC	    hdc
P_int	    x
P_int	    y
P_HICON     hIcon

; in WMDC.C
API HDC,    GetWindowDC, TEXT	; ** calls GetDCEx directly
P_HWND0     hwnd		; obsolete NULL - source of errors

; in WMDC.C
API HDC,    GetDC, TEXT	; ** calls GetDCEx directly
P_HWND0     hwnd		; obsolete NULL - source of errors

; in WMDC.C
API BOOL,   ReleaseDC, TEXT	; return type is int in windows.h -- fix it
P_HWND0     hwnd		; not used at all
P_HDC	    hdc 		; only used for comparison

; in WMDC.C
API HDC,    GetDCEx, TEXT
P_HWND	    hwnd		; Must be a real window.
P_HRGN0     hrgn		; Can be NULL, what about (HRGN)1???
P_DFLAGS    flags,DCX_VALID_L,DCX_VALID_H

; in WINLOOP3.ASM
API WORD,   RegisterWindowMessage, TEXT, <ASM, NOGEN>	; <WIN> calls AddAtom
P_CLPSTRATOM lpszName		 ; const

; in WINLOOP1.ASM
API BOOL,   GetMessage, TEXT, <ASM, FUNNYFRAME>
P_LPMSG     lpmsg		; Compound parameter
P_HWND0     hwndFilter
P_WORD	    msgFilterFirst
P_WORD	    msgFilterLast
APIERR
    mov     ax, -1		;0 return indicates WM_QUIT was retrieved.
APIEND				;so return -1 instead

; in WINLOOP1.ASM
API BOOL,   TranslateMessage, TEXT, <ASM>	; <WIN>
P_CLPMSG    lpmsg

; in WINLOOP1.ASM
API LONG,   DispatchMessage, TEXT, <ASM>	; <WIN>
P_CLPMSG    lpmsg				; const

; in WINLOOP1.ASM
API BOOL,   PeekMessage, TEXT, <ASM, FUNNYFRAME>
P_LPMSG     lpmsg
P_HWND0     hwndFilter
P_WORD	    msgFilterFirst
P_WORD	    msgFilterLast
P_FLAGS     flags,PM_VALID

; in WINLANG.ASM
API int,    lstrcmp, TEXT, <ASM>	   ;error return value ?? (0 is valid)
P_CLPSTR    lpsz1, -1, DEBUGONLY
P_CLPSTR    lpsz2, -1, DEBUGONLY

; in WINLANG.ASM
API int,    lstrcmpi, TEXT, <ASM>
P_CLPSTR    lpsz1, -1, DEBUGONLY               ;error return value ?? (0 is valid)
P_CLPSTR    lpsz2, -1, DEBUGONLY

; in INEXIT.C
API BOOL,   ExitWindows, TEXT, <NOGEN>
P_DWORD     errorCode
P_WORDMBZ   unused		    ; must be 0.

; in INEXIT.C
API BOOL,   ExitWindowsExec, TEXT
P_CLPSTR    lpExeName
P_CLPSTR0   lpParams

; in WINMISC2.ASM
API BOOL,   SwapMouseButton, TEXT, <NOGEN, ASM, FUNNYFRAME>
P_BOOL	    fSwap

; in WINLOOP3.ASM
API DWORD,  GetMessagePos, TEXT, <VOID, ASM, FUNNYFRAME>

; in WINLOOP3.ASM
API LONG,   GetMessageTime, TEXT, <VOID, ASM, FUNNYFRAME>

; in WINLOOP3.ASM
API LONG,   GetMessageExtraInfo, TEXT, <VOID, ASM, FUNNYFRAME>

; in WINMISC1.ASM
API HWND,   GetSysModalWindow, TEXT, <VOID, ASM, FUNNYFRAME>

; in WINMISC1.ASM
API HWND,   SetSysModalWindow, TEXT, <ASM>	; <SMALL>
P_HWND0     hwnd

; SendMessage/PostMessage parameters
;

P_SMPARMS   macro   hwnd, msg, wParam, lParam, opts
_DefParm    <hwnd>,2,<opts>
_DefParm    <msg>,2,<opts>
_DefParm    <wParam>,2,<opts>
_DefParm    <lParam>,4,<opts>
if VLgen
    _FlsFrame
    mov     ax,_P_&hwnd     ;; If hwnd == 0xFFFF, skip validation
    inc     ax
    jz	    @F
    push    _P_&hwnd
    push    _P_&msg
    push    _P_&wParam
    push    _P_&lParam+2
    push    _P_&lParam
    call    far ptr ValidateMessage
    or	    ax,ax
    jnz     @F
    pop     bx		    ; pop off error handler addr addr
    pop     bp		    ; and saved bp
    cwd		     ; dx:ax = 0
    jmp     bx		    ; jump to error handler
@@:
endif
endm

; in WINSEND.ASM
API LONG,   SendMessage, TEXT, <ASM, FUNNYFRAME>
P_SMPARMS   hwnd, <msg>, wParam, lParam

; in WINLOOP1.ASM
API BOOL,   PostMessage, TEXT, <ASM, FUNNYFRAME>
P_SMPARMS   hwnd, <msg>, wParam, lParam

; in WINLOOP1.ASM
API BOOL,   PostAppMessage, TEXT, <ASM, FUNNYFRAME>
P_HTASK     hTask
P_WORD	    <msg>
P_WORD	    wParam
P_LONG	    lParam

; in WINSEND.ASM
API void,   ReplyMessage, TEXT, <NOGEN, ASM>
P_LONG	    result

; in WINSEND.ASM
API void,   WaitMessage, TEXT, <VOID, ASM>

P_MSGPARMS  macro   hwnd, msg, wParam, lParam, opts
_DefParm    <hwnd>,2,<opts>
_DefParm    <msg>,2,<opts>
_DefParm    <wParam>,2,<opts>
_DefParm    <lParam>,4,<opts>
if VLgen
    _FlsFrame
    push    _P_&hwnd
    push    _P_&msg
    push    _P_&wParam
    push    _P_&lParam+2
    push    _P_&lParam
    call    far ptr ValidateMessage
    or	    ax,ax
    jnz     @F
    pop     bx		    ; pop off error handler addr addr
    pop     bp		    ; and saved bp
    cwd
    jmp     bx		    ; jump to error handler
@@:
endif
endm

; in MSDWP.C
API LONG,   DefWindowProc, TEXT
P_MSGPARMS  hwnd,<msg>,wParam,lParam

; in WINLOOP3.ASM
API void,   PostQuitMessage, TEXT, <NOGEN, ASM>
P_int	    exitCode

; in WINLOOP1.ASM
API LONG,   CallWindowProc, TEXT, <ASM> ; <WIN>
P_LPFNWP    lpfnWndProc
P_MSGPARMS  hwnd,<msg>,wParam,lParam

; in WINSEND.ASM
API BOOL,   InSendMessage, TEXT, <VOID, ASM, FUNNYFRAME>

; in WINLOOP3.ASM
API WORD,   GetDoubleClickTime, TEXT, <VOID, ASM, FUNNYFRAME>

; in WINLOOP3.ASM
API void,   SetDoubleClickTime, TEXT, <NOGEN, ASM, FUNNYFRAME>
P_WORD	    ticks

; in WMCLASS.C
API BOOL,   RegisterClass, TEXT
P_CLPWNDCLASS lpwcls		; const

; in WMCLASS.C
API BOOL,   UnregisterClass, TEXT
P_CLPSTRATOM lpszClass
P_HINSTANCE32 hInstance

; in WMCLASS.C
API BOOL,   GetClassInfo, TEXT
P_HINSTANCE0 hInstance
P_CLPSTRATOM lpszClass
P_LPWNDCLASS lpwcls

; in WMCLASS.C
API int,    GetClassName, TEXT
P_HWND	    hwnd
P_LPBUFFER  lpszName, cchName
APIERR
E_SETEMPTY  lpszName, cchName
APIEND

; in WINQ.ASM
API BOOL,   SetMessageQueue, TEXT, <NOGEN, ASM>
P_int	    cMsgs

; in TMSWITCH.C
API HWND,   GetNextQueueWindow, TEXT
P_HWND	    hwnd
P_BOOL	    fPrevious		;; ??? HEADER FILE ERROR: should be BOOL

; in CLASS.ASM
API HWND,   CreateWindow, TEXT, <ASM, FUNNYFRAME>
P_CLPSTRATOM lpszClass
P_CLPSTR0    lpszText
P_HMENU0CW   style, x, y, cx, cy, hwndParent, hMenu
P_HINSTANCE0 hInstance          ; Need to allow 0 because IdleWild Bozos didn't initialize some variables
P_DWORD     lpCreateParams	; Should be CLPVOID0, but sometimes people pass other stuff

; in WMCREATE.C
API HWND,   CreateWindowEx, TEXT
P_DFLAGS    exStyle, WS_EX_VALID_L, WS_EX_VALID_H
P_CLPSTRATOM lpszClass
P_CLPSTR0    lpszText
P_HMENU0CW   style, x, y, cx, cy, hwndParent, hMenu
P_HINSTANCE hInstance
P_DWORD     lpCreateParams	; Should be CLPVOID0, but sometimes people pass other stuff

; in WINMISC1.ASM
API BOOL,   IsWindow, TEXT, <NOGEN, ASM, FUNNYFRAME>	; No validation needed
P_HWND	    hwnd

; in WINMISC2.ASM
API BOOL,   IsChild, TEXT, <ASM, FUNNYFRAME, DEBUGONLY>
P_HWND	    hwndParent, DEBUGONLY	;used for comparison only
P_HWND0     hwndChild			; allow NULL for backward compatibility

; in WMDSTROY.C
API BOOL,   DestroyWindow, TEXT
P_HWND	    hwnd

; in WINOBJ.C
API BOOL,   DragDetect, TEXT
P_HWND      hwndFrom
P_POINT     ptScreen

API LRESULT, DragObject, TEXT
P_HWND hwndParent
P_HWND0 hwndFrom
P_WORD wFmt
P_LONG dwData
P_HCURSOR0 hCursor

; in WMSTATE.C
API BOOL,   GetWindowPlacement, TEXT
P_HWND              hwnd
P_LPWINDOWPLACEMENT lpp

; in WMSTATE.C
API BOOL,   SetWindowPlacement, TEXT
P_HWND              hwnd
P_CLPWINDOWPLACEMENT lpp

; in WMSHOW.C
API BOOL,   ShowWindow, TEXT
P_HWND	    hwnd
P_VALUE     cmd,SW_MAX

; in WMFLASH.C
API BOOL,   FlashWindow, TEXT
P_HWND	    hwnd
P_BOOL	    fFlash

; in WMSHOW.C
API void,   ShowOwnedPopups, TEXT
P_HWND	    hwnd
P_BOOL	    fShow

; in WMSHOW.C
API BOOL,   OpenIcon, TEXT
P_HWND	    hwnd

; in WMSHOW.C
API void,   CloseWindow, TEXT
P_HWND	    hwnd

; in WMMOVE.C
API BOOL,   MoveWindow, TEXT
P_HWND	    hwnd
P_int	    x
P_int	    y
P_int	    cx
P_int	    cy
P_BOOL	    fRedraw

; in WMSWP.C
API BOOL,   SetWindowPos, TEXT
P_HWND	    hwnd
P_HWNDINSERT hwndInsertAfter
P_int	    x
P_int	    y
P_int	    cx
P_int	    cy
P_FLAGS     flags, SWP_VALID

; in WMSWP.C
API HDWP,  BeginDeferWindowPos, TEXT, <NOGEN>
P_int	    cwndHint

; in WMSWP.C
API HDWP,  DeferWindowPos, TEXT,
P_HDWP     hdwp               ; must be non-null
P_HWND	    hwnd
P_HWNDINSERT hwndInsertAfter
P_int	    x
P_int	    y
P_int	    cx
P_int	    cy
P_FLAGS     flags, SWP_VALID

; in WMSWP.C
API BOOL,   EndDeferWindowPos, TEXT
P_HDWP     hdwp               ; must be non-null

; in WMSWP.C
API BOOL,   BringWindowToTop, TEXT
P_HWND	    hwnd

; in WINMISC2.ASM
API BOOL,   IsWindowVisible, TEXT, <ASM, FUNNYFRAME, DEBUGONLY>
P_HWND	    hwnd

; in WINMISC1.ASM
API BOOL,   IsIconic, TEXT, <ASM, FUNNYFRAME, DEBUGONLY>
P_HWND	    hwnd

; in WMMISC.C
API BOOL,   AnyPopup, TEXT, <VOID>

; in WINMISC1.ASM
API BOOL,   IsZoomed, TEXT, <ASM, FUNNYFRAME, DEBUGONLY>
P_HWND	    hwnd

; in DLGBEGIN.C
API HWND,    CreateDialog, TEXT	; Calls CreateDialogParam
P_HINSTANCE  hModule
P_CLPSTRRSRC lpszTemplateName
P_HWND0      hwndOwner
P_LPFNDP0   lpfnDlgProc

; in DLGBEGIN.C
API HWND,   CreateDialogIndirect, TEXT	; Calls CreateDialogIndirectParam
P_HINSTANCE hInstance
P_CLPDT     lpDlgTemplate
P_HWND0     hwndOwner
P_LPFNDP0  lpfnDlgProc

; in DLGBEGIN.C
API HWND,    CreateDialogParam, TEXT
P_HINSTANCE  hInstance
P_CLPSTRRSRC lpszTemplateName
P_HWND0      hwndOwner
P_LPFNDP0   lpfnDlgProc
P_LONG	     lParam

; in DLGBEGIN.C
API HWND,   CreateDialogIndirectParam, TEXT
P_HINSTANCE hInstance
P_CLPDT     lpDlgTemplate
P_HWND0     hwndOwner
P_LPFNDP0  lpfnDlgProc
P_LONG	    lParam

; in DLGMGR.C
API int,     DialogBox, TEXT	; Calls DialogBoxParam
P_HINSTANCE  hInstance
P_CLPSTRRSRC lpszTemplateName
P_HWND0      hwndOwner
P_LPFNDP0   lpfnDlgProc

; in DLGMGR.C
API int,    DialogBoxIndirect, TEXT		; Calls DialogBoxIndirectParam
P_HINSTANCE hInstance
P_GHANDLE   hDlgTemplate
P_HWND0     hwndOwner
P_LPFNDP0  lpfnDlgProc

; in DLGMGR.C
API int,     DialogBoxParam, TEXT
P_HINSTANCE  hInstance
P_CLPSTRRSRC lpszTemplateName
P_HWND0      hwndOwner
P_LPFNDP0   lpfnDlgProc
P_LONG	     lParam

; in DLGMGR.C
API int,    DialogBoxIndirectParam, TEXT
P_HINSTANCE hInstance
P_GHANDLE   hDlgTemplate
P_HWND0     hwndOwner
P_LPFNDP0  lpfnDlgProc
P_LONG	    lParam

; in DLGEND.C
API void,   EndDialog, TEXT
P_HWND	    hwndDlg
P_int	    result

; in DLGMGR.C
API HWND,   GetDlgItem, TEXT
P_HWND	    hwndDlg
P_int	    idItem

; in DLGMGR.C
API void,   SetDlgItemInt, TEXT	; calls SetDlgItemText
P_HWND	    hwndDlg
P_int	    idItem
P_WORD	    value
P_BOOL	    fSigned

; in DLGMGR.C
API WORD,   GetDlgItemInt, TEXT
P_HWND	    hwndDlg
P_int	    idItem
P_LPBOOL0   lpfValOk
P_BOOL	    fSigned


; in DLGMGR.C
API void,   SetDlgItemText, TEXT
P_HWND      hwndDlg
P_int       idItem
P_CLPSTR0   lpszText

ifdef DEBUG
; in DLGMGR.C
API int,    GetDlgItemText, TEXT
P_HWND	    hwndDlg
P_int	    idItem
P_LPBUFFER  lpszText, cchText
APIERR
E_SETEMPTY  lpszText, cchText
APIEND
else
; in DLGMGR.C
API int,    GetDlgItemText, TEXT
P_HWND	    hwndDlg
P_int	    idItem
P_DWORD     lpszText
P_WORD      cchText
endif

; in DLGMGR.C
API void,   CheckDlgButton, TEXT
P_HWND	    hwndDlg
P_int	    idItem
P_WORD	    checkState

; in DLGMGR.C
API void,   CheckRadioButton, TEXT	    ; calls CheckDlgButton
P_HWND	    hwndDlg
P_int	    idFirst
P_int	    idLast
P_int	    idCheck

; in DLGMGR.C
API WORD,   IsDlgButtonChecked, TEXT
P_HWND	    hwndDlg
P_int	    idItem

; in DLGMGR.C
API LONG,   SendDlgItemMessage, TEXT
P_HWND	    hwndDlg
P_int	    idItem
P_WORD	    <msg>
P_WORD	    wParam
P_LONG	    lParam

; in DMGROUP.C
API HWND,   GetNextDlgGroupItem, TEXT
P_HWND	    hwndDlg
P_HWND0      hwndCurrent
P_BOOL	    fPrev

; in DMGROUP.C
API HWND,   GetNextDlgTabItem, TEXT
P_HWND	    hwndDlg
P_HWND0     hwndCurrent
P_BOOL	    fPrev

; in DLGMGR.C
API int,    GetDlgCtrlID, TEXT
P_HWND	    hwndCtl

; in DLGBEGIN.C
API long,   GetDialogBaseUnits, TEXT, <VOID> ;??? SHOULD BE DWORD

; in DLGMGR.C
API LONG,   DefDlgProc, TEXT
P_MSGPARMS  hwndDlg,<msg>,wParam,lParam
;P_HWND     hwndDlg
;P_WORD     <msg>                               ;??? should be unsigned
;P_WORD     wParam
;P_LONG     lParam

; in WINHOOK.ASM
API BOOL,   CallMsgFilter, TEXT, <ASM>
P_LPMSG     lpmsg
P_WORD      code

; in CLIPBRD.C
API BOOL,   OpenClipboard, TEXT
P_HWND0     hwnd

; in CLIPBRD.C
API BOOL,   CloseClipboard, TEXT, <VOID>

; in CLIPBRD.C
API HWND,   GetOpenClipboardWindow, TEXT, <VOID>

; in CBVIEWER.C
API HWND,   GetClipboardOwner, TEXT, <VOID>

; in CBVIEWER.C
API HWND,   SetClipboardViewer, TEXT
P_HWND0     hwndViewer

; in CBVIEWER.C
API HWND,   GetClipboardViewer, TEXT, <VOID>

; in CBVIEWER.C
API BOOL,   ChangeClipboardChain, TEXT
P_HWND	    hwndRemove
P_HWND0     hwndNewNext

; in CBMGR.C
API HANDLE, SetClipboardData, TEXT, <NOGEN>
P_WORD      fmt
P_HCLIPDATA0 data

; in CBMGR.C
API HCLIPDATA, GetClipboardData, TEXT, <NOGEN>
P_WORD	    fmt

; in WINLOOP3.ASM
API WORD,   RegisterClipboardFormat, TEXT, <ASM>     ; calls AddAtom
P_CLPSTRATOM lpszName

; in CBFORMAT.C
API int,    CountClipboardFormats, TEXT, <VOID>

; in CLIPBRD.C
API WORD,   EnumClipboardFormats, TEXT, <NOGEN>
P_WORD	    fmtCurrent

; in CBFORMAT.C
API int,    GetClipboardFormatName, TEXT
P_WORD	    fmt
P_LPBUFFER  lpszName, cchName
APIERR
E_SETEMPTY  lpszName, cchName
APIEND

; in CBMGR.C
API BOOL,   EmptyClipboard, TEXT, <VOID>

; in CBFORMAT.C
API BOOL,   IsClipboardFormatAvailable, TEXT, <NOGEN>
P_WORD	    fmt

; in CBFORMAT.C
API int,    GetPriorityClipboardFormat, TEXT	;??? Should be WORD return
P_LPWBUFFER lpFmtList, cFmt

; in WINLOOP2.C
API HWND,   SetFocus, TEXT
P_HWND0     hwndNewFocus

; in WINLOOP3.ASM
API HWND,   GetFocus, TEXT, <VOID, ASM, FUNNYFRAME>

; in WINLOOP3.ASM
API HWND,   GetActiveWindow, TEXT, <VOID, ASM, FUNNYFRAME>

; in WINEVENT.ASM
API int,    GetKeyState, TEXT, <NOGEN, ASM, FUNNYFRAME>
P_int	    vkey		    ;??? SHOULD BE WORD

; in WINEVENT.ASM
API int,    GetAsyncKeyState, TEXT, <NOGEN, ASM, FUNNYFRAME>
P_int	    vkey		    ;??? SHOULD BE WORD

; in WINEVENT.ASM
API void,   GetKeyboardState, TEXT, <ASM, FUNNYFRAME>
P_LPKBDSTATE	pKbdState

; in WINEVENT.ASM
API void,   SetKeyboardState, TEXT, <ASM, FUNNYFRAME>
P_CLPKBDSTATE	pKbdState

; in WINEVENT.ASM
API BOOL,   EnableHardwareInput, TEXT, <ASM, FUNNYFRAME, NOGEN> ; <NODATA, ATOMIC>
P_BOOL	    fEnable

; in WINEVENT.ASM
API BOOL,   GetInputState, TEXT, <ASM, VOID, FUNNYFRAME>

; in WINEVENT.ASM
API FARPROC, SetEventHook, TEXT, <ASM, FUNNYFRAME>
P_LPFNEVENTPROC0 lpfnEventHookProc

; in WINLOOP3.ASM
API HWND,   GetCapture, TEXT, <ASM, VOID, FUNNYFRAME>

; in WINLOOP.C
API HWND,   SetCapture, TEXT, <ASM>	; <WIN>
P_HWND0     hwndCapture

; in WINLOOP.C
API void,   ReleaseCapture, TEXT, <ASM, VOID>	; <WIN>

; in WINEVENT.ASM
API DWORD,  GetQueueStatus, TEXT, <ASM, FUNNYFRAME>
P_FLAGS     flags, QS_VALID

ifdef DISABLE
; in WINLOOP.C
API WORD,   GetSysInputMode, TEXT, <VOID>

; in WINEVENT.ASM
API BOOL,   SetHotKeyHook, TEXT, <ASM>	; <PASCAL>
P_HOTKEYPROC lpfnHookProc
P_HINSTANCE hInstance
P_BOOL	    fHook

; in WINEVENT.ASM
API BOOL,   PostHotKeyEvent, TEXT, <ASM, FUNNYFRAME>
P_HTASK     hTask

endif

; in WINTIMER.ASM
API WORD,     SetTimer, TEXT, <ASM, FUNNYFRAME>
P_HWND0       hwnd
P_int	      id		    ;??? SHOULD BE WORD?
P_WORD	      rate
P_LPFNTIMER0 lpfnTimer

; in WINTIMER.ASM
API BOOL,   KillTimer, TEXT, <ASM, FUNNYFRAME>
P_HWND0     hwnd
P_int	    id

; in WMACT.C
API BOOL,   EnableWindow, TEXT
P_HWND	    hwnd
P_BOOL	    fEnable

; in WINMISC1.ASM
API BOOL,   IsWindowEnabled, TEXT, <ASM, FUNNYFRAME, DEBUGONLY>
P_HWND	    hwnd

; in RMLOAD.ASM
API HACCEL,  LoadAccelerators, TEXT
P_HINSTANCE  hInstance
P_CLPSTRRSRC lpszTemplateName

; in MNACCEL.C
API int,    TranslateAccelerator, TEXT
P_HWND	    hwnd
P_HACCEL    haccel
P_CLPMSG    lpmsg

; in WINMISC2.ASM
API int,    GetSystemMetrics, TEXT, <ASM, FUNNYFRAME>
P_VALUE     metric,SM_MAX

; in MNCREATE.C
API HMENU,   LoadMenu, TEXT
P_HINSTANCE  hInstance
P_CLPSTRRSRC lpszTemplateName

; in MNCREATE.C
API HMENU,  LoadMenuIndirect, TEXT
P_CLPMT     lpMenuTemplate

; in WINMISC2.ASM
API HMENU,  GetMenu, TEXT, <ASM>
P_HWND	    hwnd

; in MNAPI.C
API BOOL,   SetMenu, TEXT
P_HWND	    hwnd
P_HMENU0    hMenu

; in MNCHANGE.C
API BOOL,   ChangeMenu, TEXT
P_HMENU     hMenu
P_WORD	    cmdInsert
P_CLPMENUSTR lpNewItem
P_WORD	    id
P_FLAGS     flags,MF_CHANGE_VALID

; in MNACCEL.C
API BOOL,   HiliteMenuItem, TEXT
P_HWND	    hwnd
P_HMENU     hMenu
P_WORD	    id
P_FLAGS     flags,MF_VALID

; in MNAPI.C
API int,    GetMenuString, TEXT
P_HMENU     hMenu
P_WORD	    id
P_LPBUFFER  lpszString, cchString
P_FLAGS     flags,MF_VALID
APIERR
E_SETEMPTY  lpszString, cchString
APIEND

; in MNAPI2.ASM
API WORD,   GetMenuState, TEXT, <ASM>	; <WIN>
P_HMENU     hMenu
P_WORD	    id
P_FLAGS     flags,MF_VALID
APIERR
    mov     ax,-1
APIEND

; in MNDRAW.ASM
API void,   DrawMenuBar, TEXT
P_HWND	    hwnd

; in MNSYS.C
API HMENU,  GetSystemMenu, TEXT
P_HWND	    hwnd
P_BOOL	    fRevert

; in MNAPI.C
API BOOL,   SetSystemMenu, TEXT
P_HWND	    hwnd
P_HMENU     hMenu

; in MNCREATE.C
API HMENU,  CreateMenu, TEXT, <VOID>

; in MNCREATE.C
API HMENU,  CreatePopupMenu, TEXT, <VOID>

; in MNDSTRY.ASM
API BOOL,   DestroyMenu, TEXT, <ASM>	; <WIN>
P_HMENU     hMenu		; Old 3.1 code had HMENU0 here: is this true for 3.0?

; in MNAPI2.ASM
API BOOL,   CheckMenuItem, TEXT, <ASM, FUNNYFRAME>
P_HMENU     hMenu
P_WORD	    id
P_FLAGS     flags,MF_VALID
APIERR
    mov     ax, -1	       ;return -1 (item doesn't exist) instead of 0
APIEND			       ;since 0 is a valid return (MF_UNCHECKED)

; in MNAPI2.ASM
API BOOL,   EnableMenuItem, TEXT, <ASM, FUNNYFRAME>
P_HMENU     hMenu
P_WORD	    id
P_FLAGS     flags,MF_VALID
APIERR
    mov     ax, -1	       ;return -1 (item doesn't exist) instead of 0
APIEND			       ;since 0 is a valid return (MF_ENABLED)

; in MNAPI2.ASM
API HMENU,  GetSubMenu, TEXT, <ASM>	; <WIN>
P_HMENU     hMenu
P_int	    index

; in MNDSTRY.ASM
API WORD,   GetMenuItemID, TEXT, <ASM>	; <WIN>
P_HMENU     hMenu
P_int	    index
APIERR
    mov     ax,-1
APIEND

; in MNAPI.C
API WORD,   GetMenuItemCount, TEXT
P_HMENU     hMenu
APIERR
    mov     ax,-1
APIEND

; in MNCHANGE.C
API BOOL,   InsertMenu, TEXT
P_HMENU     hMenu
P_WORD	    id
P_FLAGS     flags,MF_VALID
P_WORD	    idNew
P_CLPMENUSTR lpszNew	    ; may be bitmap handle or arbitrary long

; in MNCHANGE.C
API BOOL,   AppendMenu, TEXT
P_HMENU     hMenu
P_FLAGS     flags,MF_VALID
P_WORD	    id
P_CLPMENUSTR lpsz	    ; may be bitmap handle or arbitrary long

; in MNCHANGE.C
API BOOL,   ModifyMenu, TEXT
P_HMENU     hMenu
P_WORD	    id
P_FLAGS     flags,MF_VALID
P_WORD	    id
P_CLPMENUSTR lpsz

; in MNCHANGE.C
API BOOL,   RemoveMenu, TEXT
P_HMENU     hMenu
P_WORD	    id
P_FLAGS     flags,MF_VALID

; in MNCHANGE.C
API BOOL,   DeleteMenu, TEXT
P_HMENU     hMenu
P_WORD	    id
P_FLAGS     flags,MF_VALID

; in MNCHANGE.C
API BOOL,   SetMenuItemBitmaps, TEXT
P_HMENU     hMenu
P_WORD	    id
P_FLAGS     flags,MF_VALID
P_HBITMAP0  hbmCheckOff
P_HBITMAP0  hbmCheckOn

; in MNCHANGE.C
API LONG,   GetMenuCheckMarkDimensions, TEXT, <VOID>	; should return DWORD

; in MNPOPUP.C
API BOOL,   TrackPopupMenu, TEXT
P_HMENU     hMenu
P_FLAGS     flags,TPM_VALID
P_int	    x
P_int	    y
P_int	    cx
P_HWND	    hwndOwner
P_CLPRECT0  lprcClickSlop

; in MNGRAY.C
API BOOL,   GrayString, TEXT
P_HDC	    hdc				;??? not validated
P_HBRUSH0   hbr
P_LPFN0     lpfnPrint
P_DWORD     lpData
P_int	    nCount
P_int	    x
P_int	    y
P_int	    cx
P_int	    cy

; in WINLOOP4.ASM
API HWND,   SetActiveWindow, TEXT, <ASM>
P_HWND0     hwndActive

; in WMUPDATE.C
API void,   UpdateWindow, TEXT
P_HWND	    hwnd

; in PAINT.ASM
API HDC,	BeginPaint, TEXT, <ASM, FUNNYFRAME>
P_HWND          hwnd
P_LPPAINTSTRUCT lpps

; in WMPAINT.C
API void,   EndPaint, TEXT
P_HWND	    hwnd
P_CLPPAINTSTRUCT lpps

; in WMUPDATE.C
API BOOL,   GetUpdateRect, TEXT
P_HWND	    hwnd
P_LPRECT0   lprcUpdate
P_BOOL	    fErase

; in WMUPDATE.C
API int,    GetUpdateRgn, TEXT
P_HWND	    hwnd
P_HRGN	    hrgnUpdate
P_BOOL	    fErase

; in WMUPDATE.C
API int,    ExcludeUpdateRgn, TEXT
P_HDC	    hdc
P_HWND	    hwnd

; in PAINT.ASM
API void,   InvalidateRect, TEXT, <ASM, FUNNYFRAME> ; Calls RedrawWindow
P_HWND0     hwnd
P_CLPRECT0  lprcInvalid
P_BOOL	    fErase

; in PAINT.ASM
API void,   ValidateRect, TEXT, <ASM, FUNNYFRAME>   ; Calls RedrawWindow
P_HWND	    hwnd
P_CLPRECT0  lprcValid

; in PAINT.ASM
API void,   InvalidateRgn, TEXT, <ASM, FUNNYFRAME>
P_HWND	    hwnd
P_HRGN0     hrgnInvalid
P_BOOL	    fErase

; in PAINT.ASM
API void,   ValidateRgn, TEXT, <ASM, FUNNYFRAME>
P_HWND	    hwnd
P_HRGN0     hrgnValid

; in WMUPDATE.C
API BOOL,   RedrawWindow, TEXT
P_HWND0	    hwnd
P_CLPRECT0  lprcRedraw
P_HRGN0     hrgnRedraw
P_FLAGS     flags,RDW_VALID

; in WINSPB2.C
API BOOL,   LockWindowUpdate, TEXT
P_HWND0     hwnd

; in WMSCROLL.C
API void,   ScrollWindow, TEXT	; Calls ScrollWindowEx
P_HWND	    hwnd
P_int	    dx
P_int	    dy
P_CLPRECT0  lprcScroll
P_CLPRECT0  lprcClip

; in WMSCROLL.C
API BOOL,   ScrollDC, TEXT
P_HDC	    hdc
P_int	    dx
P_int	    dy
P_CLPRECT0  lprcScroll
P_CLPRECT0  lprcClip
P_HRGN0     hrgnUpdate
P_LPRECT0   lprcUpdate

; in WMSCROLL.C
API int,    ScrollWindowEx, TEXT
P_HWND	    hwnd
P_int	    dx
P_int	    dy
P_CLPRECT0  lprcScroll
P_CLPRECT0  lprcClip
P_HRGN0     hrgnUpdate
P_LPRECT0   lprcUpdate
P_FLAGS     flags,SW_VALID

; in WINSBCTL.C
API int,    SetScrollPos, TEXT
P_HWND	    hwnd
P_VALUE     code,SB_MAX
P_int	    pos
P_BOOL	    fRedraw

; in SBRARE.C
API int,    GetScrollPos, TEXT
P_HWND	    hwnd
P_VALUE     code,SB_MAX

; in WINSBCTL.C
API void,   SetScrollRange, TEXT
P_HWND	    hwnd
P_VALUE     code,SB_MAX
P_int	    posMin
P_int	    posMax
P_BOOL	    fRedraw

; in WINSB.C
API void,   GetScrollRange, TEXT
P_HWND	    hwnd
P_VALUE     code,SB_MAX
P_LPINT     lpMin
P_LPINT     lpMax

; in SBRARE.C
API void,   ShowScrollBar, TEXT
P_HWND	    hwnd		;??? not validated
P_VALUE     code,SB_MAX 	;??? Should be int in windows.h
P_BOOL	    fRedraw

; in WINSBCTL.C
API BOOL,   EnableScrollBar, TEXT
P_HWND	    hwnd
P_VALUE     code,SB_MAX
P_FLAGS     flags,ESB_MAX

; in WINPROPS.C
API BOOL,    SetProp, TEXT
P_HWND	     hwnd
P_CLPSTRATOM lpszName
P_HANDLE0    hData

; in WINMISC2.ASM
API HANDLE,  GetProp, TEXT, <ASM>
P_HWND	     hwnd
P_CLPSTRATOM lpszName

; in WINPROPS.C
API HANDLE,  RemoveProp, TEXT
P_HWND	     hwnd
P_CLPSTRATOM lpszName

; in WINPROPS.C
API int,    EnumProps, TEXT
P_HWND	    hwnd
P_LPFNPENUM lpfnPropEnum

; in WINMISC1.ASM
API void,   SetWindowText, TEXT, <ASM>	; <SMALL>
P_HWND	    hwnd
P_CLPSTR0   lpszText

ifdef DEBUG
; in WINMISC1.ASM
API int,    GetWindowText, TEXT, <ASM>	; <SMALL>
P_HWND	    hwnd
P_LPBUFFER  lpszText, cchText
APIERR
E_SETEMPTY  lpszText, cchText
APIEND
else
; in WINMISC1.ASM
API int,    GetWindowText, TEXT, <ASM>	; <SMALL>
P_HWND	    hwnd
P_DWORD     lpszText
P_WORD      cchText
APIERR
E_SETEMPTY  lpszText, cchText
APIEND
endif

; in WINMISC1.ASM
API int,    GetWindowTextLength, TEXT, <ASM>	; <SMALL>
P_HWND	    hwnd

; in WINMISC1.ASM
API void,   GetClientRect, TEXT, <ASM, FUNNYFRAME>
P_HWND	    hwnd
P_LPRECT    lprcClient

; in WINMISC1.ASM
API void,   GetWindowRect, TEXT, <ASM, FUNNYFRAME>
P_HWND	    hwnd
P_LPRECT    lprcWindow

; in MSUTIL.C
API void,   AdjustWindowRect, TEXT	    ; calls AdjustWindowRectEx
P_LPRECT    lprcAdjust
P_LONG	    style
P_BOOL	    fMenu

; in MSUTIL.C
API void,   AdjustWindowRectEx, TEXT
P_LPRECT    lprcAdjust	;??? not validated
P_LONG	    style
P_BOOL	    fMenu
P_DWORD     exStyle

; in WMSYSERR.C
API int,    MessageBox, TEXT
P_HWND0     hwndOwner
P_CLPSTR0   lpszText
P_CLPSTR0   lpszCaption
P_FLAGS     flags,MB_VALID

; in WINMISC2.ASM
API void,   MessageBeep, TEXT, <NOGEN, ASM>
P_WORD	    flags

; in WMCURSOR.C
API int,    ShowCursor, TEXT, <NOGEN>
P_BOOL	    fShow

; in WINLOOP3.ASM
API void,   SetCursorPos, TEXT, <NOGEN, ASM, FUNNYFRAME>
P_int	    x
P_int	    y

; in WMCURSOR.C
API HCURSOR, GetCursor, TEXT, <VOID>

; in WMCURSOR.C
API HCURSOR, SetCursor, TEXT
P_HCURSOR0  hcsr

; in WINLOOP3.ASM
API void,   GetCursorPos, TEXT, <ASM, FUNNYFRAME>
P_LPPOINT   lppt

; in WINMOUSE.ASM
API void,   ClipCursor, TEXT, <ASM>
P_CLPRECT0  lprcClip

; in WINMOUSE.ASM
API void,   GetClipCursor, TEXT, <ASM>
P_LPRECT    lprcClip

; in WMCARET.C
API void,   CreateCaret, TEXT
P_HWND	    hwnd
P_HBITMAP01 hbmCaret		; can be 0 or 1 (1 for dithered caret)
P_int	    x
P_int	    y

; in WMCARET.C
API WORD,   GetCaretBlinkTime, TEXT, <VOID>

; in INCTLPAN.C
API void,   SetCaretBlinkTime, TEXT, <NOGEN>
P_WORD	    rate

; in WMCARET.C
API void,   DestroyCaret, TEXT, <VOID>

; in WMCARET.C
API void,   HideCaret, TEXT
P_HWND0     hwnd		;??? Why is NULL allowed?

; in WMCARET.C
API void,   ShowCaret, TEXT
P_HWND0     hwnd		;??? Why is NULL allowed?

; in WMCARET.C
API void,   SetCaretPos, TEXT, <NOGEN>
P_int	    x
P_int	    y

; in WMCARET.C
API void,   GetCaretPos, TEXT, <NOGEN>
P_LPPOINT   lppt

; in WINMISC1.ASM
API void,   ClientToScreen, TEXT, <ASM>
P_HWND0     hwnd
P_LPPOINT   lppt

; in WINMISC1.ASM
API void,   ScreenToClient, TEXT, <ASM>
P_HWND0     hwnd
P_LPPOINT   lppt

; in WINMISC1.C
API void,   MapWindowPoints, TEXT, <ASM>
P_HWND0     hwndFrom
P_HWND0     hwndTo
P_LPPOINT   lppt
P_WORD	    cpt

; in WINWHERE.C
API HWND,   WindowFromPoint, TEXT, <NOGEN>
P_POINT     pt

; in WINWHERE.C
API HWND,   ChildWindowFromPoint, TEXT
P_HWND	    hwnd
P_POINT     pt

; in WINLOOP3.ASM
API DWORD,  GetSysColor, TEXT, <ASM, FUNNYFRAME>
P_VALUE     idColor,COLOR_MAX

; in WMCOLOR.C
API void,   SetSysColors, TEXT
P_CLPSYSCLRBUF count, lpIds, lpColors

; in WINRECT.ASM
API void,   DrawFocusRect, TEXT, <ASM, FUNNYFRAME>  ; <NODATA>
P_HDC	    hdc
P_CLPRECT   lprc

; in WINRECT.ASM
API int,    FillRect, TEXT, <ASM, FUNNYFRAME>	; <NODATA>
P_HDC	    hdc
P_CLPRECT   lprc
P_HBRUSH    hbr

; in WINRECT.ASM
API int,    FrameRect, TEXT, <ASM, FUNNYFRAME>	; <NODATA>
P_HDC	    hdc
P_CLPRECT   lprc
P_HBRUSH    hbr

; in WINRECT.ASM
API void,   InvertRect, TEXT, <ASM, FUNNYFRAME> ; <NODATA>
P_HDC	    hdc
P_CLPRECT   lprc

; in WINRECT.ASM
API void,   SetRect, TEXT, <ASM, FUNNYFRAME, DEBUGONLY>    ; <NODATA>
P_LPRECT    lprc
P_int	    left
P_int	    top
P_int	    right
P_int	    bottom

; in WINRECT.ASM
API void,   SetRectEmpty, TEXT, <ASM, FUNNYFRAME, DEBUGONLY>	    ; <NODATA>
P_LPRECT    lprc

; in WINRECT.ASM
API void,   CopyRect, TEXT, <ASM, FUNNYFRAME, DEBUGONLY>	;<NODATA>
P_CLPRECT   lprcSrc
P_LPRECT    lprcDst

; in WINRECT.ASM
API void,   InflateRect, TEXT, <ASM, FUNNYFRAME, DEBUGONLY>	;<NODATA>
P_LPRECT    lprc
P_int	    dx
P_int	    dy

; in WINRECT.ASM
API BOOL    IntersectRect, TEXT, <ASM, FUNNYFRAME, DEBUGONLY>	;<NODATA>
P_LPRECT    lprcDst
P_CLPRECT   lprc1
P_CLPRECT   lprc2

; in WINRECT.ASM
API BOOL    UnionRect, TEXT, <ASM, FUNNYFRAME, DEBUGONLY>	;<NODATA>
P_LPRECT    lprcDst
P_CLPRECT   lprc1
P_CLPRECT   lprc2

; in WINRECT.ASM
API int,    SubtractRect, TEXT, <ASM, FUNNYFRAME, DEBUGONLY>	;<NODATA>, ??? Add to windows.h
P_LPRECT    lprcDst
P_CLPRECT   lprc1
P_CLPRECT   lprc2

; in WINRECT.ASM
API void,   OffsetRect, TEXT, <ASM, FUNNYFRAME, DEBUGONLY>	;<NODATA>
P_LPRECT    lprcDst
P_int	    lprc1
P_int	    lprc2

; in WINRECT.ASM
API BOOL,   IsRectEmpty, TEXT, <ASM, FUNNYFRAME, DEBUGONLY>	;<NODATA>
P_CLPRECT   lprc

; in WINRECT.ASM
API BOOL,   EqualRect, TEXT, <ASM, FUNNYFRAME, DEBUGONLY>  ; <NODATA>
P_CLPRECT   lprc1
P_CLPRECT   lprc2

; in WINRECT.ASM
API BOOL,   PtInRect, TEXT, <ASM, FUNNYFRAME, DEBUGONLY>	; <NODATA>
P_CLPRECT   lprc
P_POINT     pt

_GenLP	<P_CLPANSISTR>,<CLP>,1	    ; AnsiNext/Prev string ptr

P_CLPSTRCHAR macro  name, opts
    _GenParm   <name>,4,<opts>
    if VLgen
	mov	ax,_P_&name	    ; if it's NULL or char, accept.
	mov	cx,_P_&name+2
	jcxz	@F
	mov	bx,1		    ; otherwise make sure there is at least
	lcall	CLP		    ; one byte available.
        _gensub LP
    @@:
    endif
endm

; in winstr.asm
API LPSTR,  AnsiUpper, TEXT, <ASM,FUNNYFRAME>
P_CLPSTRCHAR lpString

; in winstr.asm
API LPSTR,  AnsiLower, TEXT, <ASM,FUNNYFRAME>
P_CLPSTRCHAR lpString

; in winlang.asm
API LPSTR,  AnsiUpperBuff, TEXT, <ASM,FUNNYFRAME>
P_LPBUFFER  lpch, cch

; in winlang.asm
API LPSTR,  AnsiLowerBuff, TEXT, <ASM,FUNNYFRAME>
P_LPBUFFER  lpch, cch

; in winlang.asm
API LPSTR,  AnsiNext, TEXT, <ASM,FUNNYFRAME>
P_CLPANSISTR lpString

; in winlang.asm
API LPSTR,  AnsiPrev, TEXT, <ASM,FUNNYFRAME>
P_CLPANSISTR lpString
P_CLPANSISTR lpCurrentChar

; in WINTIMER.ASM
API DWORD,  GetCurrentTime, TEXT, <VOID, ASM, FUNNYFRAME>

; in WINTIMER.ASM
API DWORD,  GetTickCount, TEXT, <VOID, ASM, FUNNYFRAME>

; in WINTIMER.ASM
API DWORD,  GetTimerResolution, TEXT, <VOID, ASM, FUNNYFRAME>

ifndef WOW
; blow this off, it doesn't do anything but waste 6 instructions
; in WINSTRUC.ASM
API WORD,   GetWindowWord, TEXT, <ASM, FUNNYFRAME>
P_HWND	    hwnd
P_GWWINDEX  index
endif

GWW_HWNDPARENT  equ -8

P_SWWPARMS  macro   index,value
    _GenParm    <index>,2,<opts>
    _GenParm    <value>,2,<opts>
    if VLgen
	IFNDEF	WOW
	    cmp	 word ptr _P_&index,GWW_HWNDPARENT
	    jnz	 @F
	    mov	 bx,_P_&value		 ; validate the supplied parent.
	    lcall	 VHWND0
	    _gensub VHWND
	   @@:
	ENDIF
    endif
endm

; in WINSTRUC.ASM
API WORD,   SetWindowWord, TEXT, <ASM, FUNNYFRAME>
P_HWND	    hwnd
P_SWWPARMS  index,value

ifndef WOW
; blow this off, it doesn't do anything but waste 6 instructions
; in WINSTRUC.ASM
API LONG,   GetWindowLong, TEXT, <ASM, FUNNYFRAME>
P_HWND	    hwnd
P_GWWINDEX  index
endif

GWL_WNDPROC equ -4
GWL_EXSTYLE equ -20

P_SWLPARMS  macro   index,value,opts
        local   notwndproc,notexstyle,cont
    _DefParm	<index>,2,<opts>
    _DefParm	<value>,4,<opts>
    if VLgen
	_FlsFrame

        mov     ax,word ptr _P_&index
        cmp     ax,GWL_WNDPROC              ; is he subclassing?
        jnz     notwndproc
	mov	ax,_P_&value
	mov	cx,_P_&value+2
	lcall	LPFN
        _gensub LPFN
if 0                                        ; Not always a bug,
					    ; and too many people get an error.
					    ; Could compare DS with hwnd->hInstance
					    ; if different: then check.
ifdef DEBUG
	mov	es,cx
	mov	bx,ax
	cmp	es:[bx],09090h		    ; nop, nop, nop?
	jnz	@F			    ; that's bogus...
	mov	bx,ERR_BAD_PTR or ERR_WARNING
	lcall	Inval_Param_
endif
endif
        jmp     short cont;
notwndproc:
        cmp     word ptr _P_&index,GWL_EXSTYLE
	jnz	notexstyle

	IFDEF	WOW			    ; ChandanC
	jmp	SHORT notexstyle
	ENDIF

        mov     ax,_p_&value
        mov     cx,_p_&value+2
        test    ax,not WS_EX_VALID_L
        jnz     @F
        test    cx,not WS_EX_VALID_H
        jnz     @F
        jmp     notexstyle
@@:
        mov     bx,ERR_BAD_DFLAGS or ERR_WARNING
        lcall   Inval_Param_
notexstyle:
cont:
    endif
endm

; in WINSTRUC.ASM
API LONG,   SetWindowLong, TEXT, <ASM, FUNNYFRAME>
P_HWND	    hwnd
P_SWLPARMS  index, value

; in WINSTRUC.ASM
API WORD,   GetClassWord, TEXT, <ASM, FUNNYFRAME>
P_HWND	    hwnd
P_GCWINDEX  index

; in WINSTRUC.ASM
API WORD,   SetClassWord, TEXT, <ASM, FUNNYFRAME>
P_HWND	    hwnd
P_GCWINDEX  index
P_WORD	    value

; in WINSTRUC.ASM
API LONG,   GetClassLong, TEXT, <ASM, FUNNYFRAME>
P_HWND	    hwnd
P_GCWINDEX  index

; in WINSTRUC.ASM
API LONG,   SetClassLong, TEXT, <ASM, FUNNYFRAME>
P_HWND	    hwnd
P_GCWINDEX  index
P_LONG	    value

; in WINMISC1.ASM
API HWND,   GetDesktopHwnd, TEXT, <VOID, ASM>

; in WINMISC1.ASM
API HWND,   GetDesktopWindow, TEXT, <VOID, ASM>

; in WINSHOW.C
API HWND,   GetParent, TEXT
P_HWND	    hwnd

; in WMMISC.C
API HWND,   SetParent, TEXT
P_HWND	    hwnd
P_HWND0     hwndNewParent	; NULL is allowed here, but not for create.  Need hwndObject or something.

; in WMLIST.C
API BOOL,    EnumChildWindows, TEXT
P_HWND	     hwnd
P_LPFNWENUM lpfnEnum
P_LONG	     lParam

; in WMFIND.C
API HWND,     FindWindow, TEXT
P_CLPSTRATOM0 lpszClass
P_CLPSTR0     lpszText

; in WMLIST.C
API BOOL,    EnumWindows, TEXT
P_LPFNWENUM lpfnEnum
P_LONG	     lParam

; in WINMISC1.ASM
API BOOL,    EnumTaskWindows, TEXT, <ASM>	; <SMALL>
P_HTASK      hTask	;??? not validated
P_LPFNWENUM  lpfnEnum
P_LONG	     lParam

; in WINSHOW.C
API HWND,   GetTopWindow, TEXT
P_HWND0     hwnd

; in WINSHOW.ASM
API HWND,   GetNextWindow, TEXT, <OBSOLETE, NOGEN>
P_HWND	    hwnd
P_UVALUE    code,GW_MAX

; in WINMISC1.ASM
API HTASK,  GetWindowTask, TEXT, <ASM>
P_HWND	    hwnd

; in WINSHOW.C
API HWND,   GetLastActivePopup, TEXT
P_HWND	    hwnd

; in WMDC.C
API HWND,   GetWindow, TEXT
P_HWND	    hwnd
P_UVALUE    cmd,GW_MAX

; in WINHOOK.ASM
API HOOKPROC, SetWindowsHook, TEXT, <ASM>
P_RVALUE    idHook,WH_MIN,WH_MAX
P_HOOK_HK  lpfnHook

; in WINHOOK.ASM
API BOOL,   UnhookWindowsHook, TEXT, <ASM>
P_RVALUE    idHook,WH_MIN,WH_MAX
P_HOOKPROC  lpfnHook

; in WINHOOK.ASM
API DWORD,   DefHookProc, TEXT, <ASM>
P_int	     code
P_WORD	     wParam
P_DWORD      lParam
P_LPHOOKPROC lplpfnHook

; in WINHOOK.ASM
API HHOOK,  SetWindowsHookEx, TEXT, <ASM, FUNNYFRAME>
P_RVALUE    idHook,WH_MIN,WH_MAX
P_HOOKPROC  lpfnHook
P_HINSTANCE hInstance
P_HTASK0    hTask

; in WINHOOK.ASM
API BOOL,   UnhookWindowsHookEx, TEXT, <ASM, FUNNYFRAME>
P_HHOOK     hHook

; in WINHOOK.ASM
API DWORD,  CallNextHookEx, TEXT, <ASM>
P_HHOOK     hHook
P_RVALUE    idHook,WH_MIN,WH_MAX
P_WORD	    wParam
P_LONG	    lParam

; in RMLOAD.C
API HBITMAP, LoadBitmap, TEXT
P_HINSTANCE0 hInstance
P_CLPSTRRSRC lpszRsrcName

; in RMLOAD.C
API HCURSOR, LoadCursor, TEXT
P_HINSTANCE0 hInstance
P_CLPSTRRSRC lpszRsrcName

; in RMCREATE.C
API HCURSOR, CreateCursor, TEXT
P_HINSTANCE hInstance
P_int	    xHotSpot
P_int	    yHotSpot
P_int	    cx
P_int	    cy
P_CLPBYTE   lpAndMask		;??? LPBYTE, not LPSTR
P_CLPBYTE   lpXorMask

; in RMCREATE.C
API BOOL,   DestroyCursor, TEXT
P_HCURSOR   hCursor

; in RMCREATE.C
API HCURSOR, CopyCursor, TEXT
P_HINSTANCE hInstance
P_HCURSOR   hCursor


; in RMLOAD.C
API HICON,   LoadIcon, TEXT
P_HINSTANCE0 hInstance
P_CLPSTRRSRC lpszRsrcName

; in RMCREATE.C
API HICON,  CreateIcon, TEXT
P_HINSTANCE hInstance
P_int	    cx
P_int	    cy
P_BYTE	    cPlanes
P_BYTE	    cBitsPixel
P_CLPBYTE   lpAndMask		;??? LPBYTE, not LPSTR
P_CLPBYTE   lpXorMask

; in RMCREATE.C
API BOOL,   DestroyIcon, TEXT
P_HICON     hIcon

; in RMCREATE.C
API HICON,  CopyIcon, TEXT
P_HINSTANCE hInstance
P_HICON     hIcon

; in RMCREATE.C
API void, GetInternalIconHeader, TEXT
P_CLPBYTE  lpHeader
P_LPBYTE   lpDestBuff


; in RMLOAD.C
API int,    LoadString, TEXT
P_HINSTANCE hInstance
P_WORD	    idString
P_LPBUFFER0 lpszString, cchString
APIERR
E_SETEMPTY  lpszString, cchString
APIEND

; in WINMISC1.ASM
API BOOL,   IsTwoByteCharPrefix, TEXT, <ASM, NOGEN>
P_char	    ch

; in DLGMGR2.C
API BOOL,   IsDialogMessage, TEXT
P_HWND	    hwndDlg
P_CLPMSG    lpmsg

; in DLGBEGIN.C
API void,   MapDialogRect, TEXT
P_HWND	    hwndDlg
P_LPRECT    lprcMap

; in LBOXCTL3.C
API int,    DlgDirList, TEXT
P_HWNDNOFAIL0 hwndDlg
P_LPSTR0    lpszPathSpec
P_int	    idListBox
P_int	    idStatic
P_FLAGS     flags,DDL_VALID	   ;??? Need constants in windows.h

; in LBOXCTL3.C
API BOOL,   DlgDirSelect, TEXT
P_HWND	    hwndDlg
P_LPSTR     lpszPathSpec
P_int	    idListBox

API BOOL,   DlgDirSelectEx, TEXT
P_HWND	    hwndDlg
P_LPBUFFER  lpszPathSpec,cchMax
P_int	    idListBox

; in COMBODIR.C
API int,    DlgDirListComboBox, TEXT
P_HWND	    hwndDlg
P_LPSTR0    lpszPathSpec
P_int	    idComboBox
P_int	    idStatic
P_FLAGS     flags,DDL_VALID

API BOOL,   GlobalFindAtom, TEXT
P_CLPSTR    lpszPath

; in COMBODIR.C
API BOOL,   DlgDirSelectComboBox, TEXT
P_HWND	    hwnd
P_LPSTR     lpszPath
P_int	    idComboBox

API BOOL,   DlgDirSelectComboBoxEx, TEXT
P_HWND	    hwnd
P_LPBUFFER  lpszPath, cchMax
P_int	    idComboBox

; in MDIWIN.C
API LONG,   DefFrameProc, TEXT
P_HWND	    hwnd		;??? not validated
P_WORD      hwndMDI		;Need to validate specially since not always
				;used and may be destroyed when DFP is called
P_WORD	    <msg>		;??? Should be unsigned
P_WORD	    wParam
P_LONG	    lParam

; in MDIWIN.C
API LONG,   DefMDIChildProc, TEXT
P_MSGPARMS  hwndDlg,<msg>,wParam,lParam
;P_HWND     hwnd
;P_WORD     <msg>		;??? Should be unsigned
;P_WORD     wParam
;P_LONG     lParam

; in MDIWIN.C
API BOOL,   TranslateMDISysAccel, TEXT
P_HWND	    hwnd
P_CLPMSG    lpmsg

; in DTPARK.C
API WORD,   ArrangeIconicWindows, TEXT
P_HWND	    hwnd

; in WINRARE.C
API BOOL,   SystemParametersInfo, TEXT
P_SPIPARAMS id, wParam, lpParam, flags

; in HELPCALL.C
API BOOL,   WinHelp, TEXT
P_HWND0     hwnd		; Allow NULL cause WinHelp.exe uses it internally
P_CLPSTR0   lpszHelp
P_WORD	    cmd
P_DWORD     data

; in DRVRRARE.C
API HDRVR,  OpenDriver, TEXT
P_CLPSTR    szDriverName
P_CLPSTR0   szSectionName
P_LONG	    lParam2

; in DRVRRARE.C
API LONG,   CloseDriver, TEXT
P_HDRVR     hDriver
P_LONG	    lParam1
P_LONG	    lParam2

; in DRVRRARE.C
API HMODULE,GetDriverModuleHandle, TEXT
P_HDRVR     hDriver

; in DRVR.C
API LONG,   SendDriverMessage, TEXT
P_HDRVR0    hDriver
P_WORD	    message
P_LONG	    lParam1
P_LONG	    lParam2

; in DRVR.C
API LONG,   DefDriverProc, TEXT
P_DWORD     idDriver
P_HDRVR     hDriver	;??? not validated
P_WORD	    message
P_LONG	    lParam1
P_LONG	    lParam2

; in DRVR.C
API HDRVR,  GetNextDriver, TEXT
P_HDRVR0    hDriverCurrent
P_DFLAGS    flags,GND_VALID_L, GND_VALID_H

; in DRVR.C
API BOOL,	     GetDriverInfo, TEXT
P_HDRVR              hDriver
P_LPDRIVERINFOSTRUCT lpInfo

; in PALETTE.C
API HPALETTE, SelectPalette, TEXT
P_HDC	    hdc
P_HPALETTE  hpal		;??? not validated
P_BOOL	    fForceBackground

; in PALETTE.C
API WORD,   RealizePalette, TEXT
P_HDC	    hdc

; in COMDEV.C
API CID,    OpenComm, TEXT
P_CLPSTR    pszComName
P_WORD	    cbInQueue
P_WORD	    cbOutQueue
APIERR
    mov     ax, -1		    ;negative error code
APIEND

; in COMDEV.C
API int,    SetCommState, TEXT
P_CLPDCB    lpdcb
APIERR
    mov     ax, -1		    ;negative error code
APIEND

; in COMDEV.C
API int,    GetCommState, TEXT
P_CID	    cid
P_LPDCB     lpdcb
APIERR
    mov     ax, -1		    ;negative error code
APIEND				    ;0 => success

; in COMDEV.C
API int,    ReadComm, TEXT
P_CID	    cid
P_LPBUFFER  lpBuffer, cbBuffer
APIERR
    mov     ax, -1		    ;negative error code
APIEND

; in COMDEV.C
API int,    UngetCommChar, TEXT
P_CID	    cid
P_char	    ch
APIERR
    mov     ax, -1		    ;negative error code
APIEND

; in COMDEV.C
API int,    WriteComm, TEXT
P_CID	    cid
P_CLPBUFFER lpBuffer, cbBuffer
APIERR
    mov     ax, -1		    ;negative error code
APIEND

; in COMDEV.C
API int,    CloseComm, TEXT
P_CID	    cid
APIERR
    mov     ax, -1		    ;negative error code
APIEND

; in COMDEV.C
API int,    GetCommError, TEXT
P_CID	    cid
P_LPCOMSTAT0 lpComStat

; in COMDEV.C
API int,    BuildCommDCB, TEXT
P_CLPSTR    lpszDef
P_LPDCB     lpdcb
APIERR
    mov     ax, -1		    ;negative error code
APIEND

; in COMDEV.C
API int,    TransmitCommChar, TEXT
P_CID	    cid
P_char	    ch
APIERR
    mov     ax, -1		    ;negative error code
APIEND

; in COMDEV.C
API LPWORD, SetCommEventMask, TEXT
P_CID	    cid
P_FLAGS     evtMask,EV_VALID

; in COMDEV.C
API WORD,   GetCommEventMask, TEXT
P_CID	    cid
P_FLAGS     evtMask,EV_VALID

; in COMDEV.C
API int,    SetCommBreak, TEXT
P_CID	    cid
APIERR
    mov     ax, -1		    ;negative error code
APIEND

; in COMDEV.C
API int,    ClearCommBreak, TEXT
P_CID	    cid
APIERR
    mov     ax, -1		    ;negative error code
APIEND

; in COMDEV.C
API int,    FlushComm, TEXT
P_CID	    cid
P_int	    queue
APIERR
    mov     ax, -1		    ;negative error code
APIEND

; in COMDEV.C
API LONG,   EscapeCommFunction, TEXT
P_CID	    cid
P_int	    fcn
APIERR
    mov     ax, -1		    ;negative error code
    cwd
APIEND

; in COMDEV.C
API BOOL,   EnableCommNotification, TEXT
P_CID	    cid
P_HWND0	    hwnd
P_int	    recvTh
P_int	    sendTh


;===========================================================================
;
; WNet API validation
;
WNNC_MIN	equ	-1
WNNC_MAX	equ	11
WNBD_CONN_MIN	equ	 1
WNBD_CONN_MAX	equ	 3

; error returns (defined in winnet.h)

WN_BAD_POINTER	  equ	    4
WN_BAD_VALUE	  equ	    5

;-------------------------------
; Special-case macro definitions

P_LPBUFFERLPWSIZE macro lpbuf, lpsize, opts
    _DefParm	<lpbuf>,4,<opts>
    _DefParm	<lpsize>,4,<opts>
    if VLgen

	_FlsFrame
	mov	ax, _P_&lpsize
	mov	cx, _P_&lpsize+2
	mov	bx, 2
	lcall	LP		  ;first check ptr. to size WORD
        _gensub LP

	les	bx,_P_&lpsize
	mov	bx,es:[bx]	  ;ax = size of buffer

	mov	ax,_P_&lpbuf
	mov	cx,_P_&lpbuf+2
	lcall	LP		  ;check buffer size
    endif
endm

;----------------
; API definitions (all in winnet.asm)

API WORD, WNetGetCaps, TEXT, <ASM, FUNNYFRAME>
P_RVALUE nIndex, WNNC_MIN, WNNC_MAX

API WORD, WNetDeviceMode, TEXT, <ASM, FUNNYFRAME>
P_HWND0  hWndParent			 ;Driver calls DialogBox with hWndParent as
					 ;dialog owner	=> NULL hWnd is acceptable
APIERR
    mov     ax, WN_BAD_VALUE
APIEND

API WORD, WNetBrowseDialog, TEXT, <ASM, FUNNYFRAME>
P_HWND0   hWndParent
P_RVALUE  wType, WNBD_CONN_MIN, WNBD_CONN_MAX
P_LPSTR lpPath				 ;buffer should be at least 128 chars. long
APIERR
    mov     ax, WN_BAD_VALUE
APIEND

API WORD, WNetGetUser, TEXT, <ASM, FUNNYFRAME>
P_LPBUFFERLPWSIZE lpUserName, lpwSize	 ; lpwSize is far ptr. to WORD
APIERR
    mov     ax, WN_BAD_POINTER
APIEND

API WORD, WNetAddConnection, TEXT, <ASM, FUNNYFRAME>
P_CLPSTR lpNetPath
P_CLPSTR0 lpPassWd
P_CLPSTR lpLocal			 ;"A:"-"Z:", "LPT1:"-"LPT4:"
APIERR
    mov     ax, WN_BAD_POINTER
APIEND

API WORD, WNetCancelConnection, TEXT, <ASM, FUNNYFRAME>
P_CLPSTR lpName
P_BOOL	 bForce
APIERR
    mov     ax, WN_BAD_POINTER
APIEND

API WORD, WNetGetConnection, TEXT, <ASM, FUNNYFRAME>
P_CLPSTR lpLocal
P_LPBUFFERLPWSIZE lpRemoteName, lpwSize  ;lpwSize is far ptr. to WORD
APIERR
    mov     ax, WN_BAD_POINTER
APIEND

API WORD, WNetWatchQueue, TEXT, <ASM, FUNNYFRAME>
P_HWND hWndNotify			 ;can be null?
P_CLPSTR  lpLocal
P_CLPSTR0 szUSer
P_WORD nQueue
APIERR
    mov     ax, WN_BAD_VALUE
APIEND

API WORD, WNetUnwatchQueue, TEXT,<ASM, FUNNYFRAME>
P_CLPSTR  lpLocal
APIERR
    mov     ax, WN_BAD_POINTER
APIEND

API WORD, WNetLockQueueData, TEXT, <ASM, FUNNYFRAME>
P_CLPSTR szQueue
P_CLPSTR0 szUser
P_LPDWORD lplpQueueStruct		 ;driver returns ptr to QUEUESTRUCT
APIERR
    mov     ax, WN_BAD_POINTER
APIEND

API WORD, WNetUnlockQueueData, TEXT, <ASM, FUNNYFRAME>
P_CLPSTR szQueue
APIERR
    mov     ax, WN_BAD_POINTER
APIEND

API HFILE, WNetOpenJob, TEXT, <ASM, FUNNYFRAME>
P_CLPSTR  szQueue
P_CLPSTR0 szTitle
P_WORD nCopies
P_LPWORD lpw				 ;file handle returned
APIERR
    mov     ax, WN_BAD_POINTER
APIEND

P_HFILE equ <P_H>

API WORD, WNetCloseJob, TEXT, <ASM, FUNNYFRAME>
P_HFILE  fh
P_LPWORD0 lpwIDJob
P_LPSTR0  szQueue			 ;name of net. queue returned here
APIERR
    mov     ax, WN_BAD_POINTER
APIEND

API WORD, WNetHoldJob, TEXT, <ASM, FUNNYFRAME>
P_CLPSTR szQueue
P_WORD	wJobID
APIERR
    mov     ax, WN_BAD_POINTER
APIEND

API WORD, WNetReleaseJob, TEXT, <ASM, FUNNYFRAME>
P_CLPSTR szQueue
P_WORD	wJobID
APIERR
    mov     ax, WN_BAD_POINTER
APIEND

API WORD, WNetCancelJob, TEXT, <ASM, FUNNYFRAME>
P_CLPSTR szQueue
P_WORD	wJobID
APIERR
    mov     ax, WN_BAD_POINTER
APIEND

API WORD, WNetSetJobCopies, TEXT, <ASM, FUNNYFRAME>
P_CLPSTR szQueue
P_WORD	wJobID
P_WORD	nCopies
APIERR
    mov     ax, WN_BAD_POINTER
APIEND

API WORD, WNetAbortJob, TEXT, <ASM, FUNNYFRAME>
P_CLPSTR lpDevice
P_HFILE  fh
APIERR
    mov     ax, WN_BAD_POINTER
APIEND

API WORD, WNetGetError, TEXT, <ASM, FUNNYFRAME>
P_LPWORD lpwError
APIERR
    mov     ax, WN_BAD_POINTER
APIEND

API WORD, WNetGetErrorText, TEXT, <ASM, FUNNYFRAME>
P_WORD wError
P_LPBUFFERLPWSIZE lpRemoteName, lpwSize  ;lpwSize is far ptr. to WORD
APIERR
    mov     ax, WN_BAD_POINTER
APIEND