Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

1161 lines
24 KiB

;==========================================================================
;
; Message validation layer include file
;
;- Where applicable, i've specified a class id. as a param. to the MESSAGE
; macro. For others (WM_ messages), i've specified the ID "COMMON".
;
;- For messages meaningful only to controls having a particular style, i've
; added an option to the MESSAGE macro:
;
; <MLCONLY> for messages applicable to ES_MULTILINE edit controls
; <OWNERDRAWVARONLY> " " " " LBS_OWNERDRAWVARIABLE listboxes
; <MULTISELONLY> " " " " LBS_MULTIPLESEL listboxes
; <MULTICOLONLY> " " " " LBS_MULTICOLUMN listboxes
;
;
; Generic message IDs
;
WM_NULL equ 0000h
WM_CREATE equ 0001h
WM_DESTROY equ 0002h
WM_MOVE equ 0003h
WM_SIZEWAIT equ 0004h ;Internal
WM_SIZE equ 0005h
WM_ACTIVATE equ 0006h
WM_SETFOCUS equ 0007h
WM_KILLFOCUS equ 0008h
WM_SETVISIBLE equ 0009h ;Internal
WM_ENABLE equ 000Ah
WM_SETREDRAW equ 000Bh
WM_SETTEXT equ 000Ch
WM_GETTEXT equ 000Dh
WM_GETTEXTLENGTH equ 000Eh
WM_PAINT equ 000Fh
WM_CLOSE equ 0010h
WM_QUERYENDSESSION equ 0011h
WM_QUIT equ 0012h
WM_QUERYOPEN equ 0013h
WM_ERASEBKGND equ 0014h
WM_SYSCOLORCHANGE equ 0015h
WM_ENDSESSION equ 0016h
WM_SYSTEMERROR equ 0017h ;Internal
WM_SHOWWINDOW equ 0018h
WM_CTLCOLOR equ 0019h
WM_WININICHANGE equ 001Ah
WM_DEVMODECHANGE equ 001Bh
WM_ACTIVATEAPP equ 001Ch
WM_FONTCHANGE equ 001Dh
WM_TIMECHANGE equ 001Eh
WM_CANCELMODE equ 001Fh
WM_SETCURSOR equ 0020h
WM_MOUSEACTIVATE equ 0021h
WM_CHILDACTIVATE equ 0022h
WM_QUEUESYNC equ 0023h
WM_GETMINMAXINFO equ 0024h
WM_PAINTICON equ 0026h
WM_ICONERASEBKGND equ 0027h
WM_NEXTDLGCTL equ 0028h
WM_ALTTABACTIVE equ 0029h ;Internal
WM_SPOOLERSTATUS equ 002Ah
WM_DRAWITEM equ 002Bh
WM_MEASUREITEM equ 002Ch
WM_DELETEITEM equ 002Dh
WM_VKEYTOITEM equ 002Eh
WM_CHARTOITEM equ 002Fh
WM_SETFONT equ 0030h
WM_GETFONT equ 0031h
WM_SETHOTKEY equ 0032h
WM_GETHOTKEY equ 0033h
WM_FILESYSCHANGE equ 0034h ;Internal
WM_ISACTIVEICON equ 0035h ;Internal
;WM_UNUSED0036 equ 0036h ;Internal
WM_QUERYDRAGICON equ 0037h
WM_COMPAREITEM equ 0039h
WM_TESTING equ 0040h ;Internal
WM_COMPACTING equ 0041h
;WM_UNUSED equ 0042h
;WM_UNUSED equ 0043h
WM_COMMNOTIFY equ 0044h
;WM_UNUSED equ 0045h
WM_WINDOWPOSCHANGING equ 0046h
WM_WINDOWPOSCHANGED equ 0047h
WM_POWER equ 0048h
WM_NCCREATE equ 0081h
WM_NCDESTROY equ 0082h
WM_NCCALCSIZE equ 0083h
WM_NCHITTEST equ 0084h
WM_NCPAINT equ 0085h
WM_NCACTIVATE equ 0086h
WM_GETDLGCODE equ 0087h
WM_SYNCPAINT equ 0088h ;Internal
WM_SYNCTASK equ 0089h ;Internal
WM_NCMOUSEMOVE equ 00A0h
WM_NCLBUTTONDOWN equ 00A1h
WM_NCLBUTTONUP equ 00A2h
WM_NCLBUTTONDBLCLK equ 00A3h
WM_NCRBUTTONDOWN equ 00A4h
WM_NCRBUTTONUP equ 00A5h
WM_NCRBUTTONDBLCLK equ 00A6h
WM_NCMBUTTONDOWN equ 00A7h
WM_NCMBUTTONUP equ 00A8h
WM_NCMBUTTONDBLCLK equ 00A9h
WM_KEYFIRST equ 0100h
WM_KEYDOWN equ 0100h
WM_KEYUP equ 0101h
WM_CHAR equ 0102h
WM_DEADCHAR equ 0103h
WM_SYSKEYDOWN equ 0104h
WM_SYSKEYUP equ 0105h
WM_SYSCHAR equ 0106h
WM_SYSDEADCHAR equ 0107h
WM_YOMICHAR equ 0108h ;Internal
WM_KEYLAST equ 0108h
WM_CONVERTREQUEST equ 010Ah ;Internal
WM_CONVERTRESULT equ 010Bh ;Internal
WM_INITDIALOG equ 0110h
WM_COMMAND equ 0111h
WM_SYSCOMMAND equ 0112h
WM_TIMER equ 0113h
WM_HSCROLL equ 0114h
WM_VSCROLL equ 0115h
WM_INITMENU equ 0116h
WM_INITMENUPOPUP equ 0117h
WM_SYSTIMER equ 0118h ;Internal
WM_MENUSELECT equ 011Fh
WM_MENUCHAR equ 0120h
WM_ENTERIDLE equ 0121h
WM_LBTRACKPOINT equ 0131h ;Internal
WM_MOUSEFIRST equ 0200h
WM_MOUSEMOVE equ 0200h
WM_LBUTTONDOWN equ 0201h
WM_LBUTTONUP equ 0202h
WM_LBUTTONDBLCLK equ 0203h
WM_RBUTTONDOWN equ 0204h
WM_RBUTTONUP equ 0205h
WM_RBUTTONDBLCLK equ 0206h
WM_MBUTTONDOWN equ 0207h
WM_MBUTTONUP equ 0208h
WM_MBUTTONDBLCLK equ 0209h
WM_MOUSELAST equ 0209h
WM_PARENTNOTIFY equ 0210h
WM_ENTERMENULOOP equ 0211h ;Internal
WM_EXITMENULOOP equ 0212h ;Internal
WM_NEXTMENU equ 0213h ;Internal
WM_MDICREATE equ 0220h
WM_MDIDESTROY equ 0221h
WM_MDIACTIVATE equ 0222h
WM_MDIRESTORE equ 0223h
WM_MDINEXT equ 0224h
WM_MDIMAXIMIZE equ 0225h
WM_MDITILE equ 0226h
WM_MDICASCADE equ 0227h
WM_MDIICONARRANGE equ 0228h
WM_MDIGETACTIVE equ 0229h
WM_DROPOBJECT equ 022Ah ;Internal
WM_QUERYDROPOBJECT equ 022Bh ;Internal
WM_BEGINDRAG equ 022Ch ;Internal
WM_DRAGLOOP equ 022Dh ;Internal
WM_DRAGSELECT equ 022Eh ;Internal
WM_DRAGMOVE equ 022Fh ;Internal
WM_MDISETMENU equ 0230h
WM_ENTERSIZEMOVE equ 0231h ;Internal
WM_EXITSIZEMOVE equ 0232h ;Internal
WM_DROPFILES equ 0233h
WM_KANJIFIRST equ 0280h ;Internal
WM_KANJILAST equ 029Fh ;Internal
WM_CUT equ 0300h
WM_COPY equ 0301h
WM_PASTE equ 0302h
WM_CLEAR equ 0303h
WM_UNDO equ 0304h
WM_RENDERFORMAT equ 0305h
WM_RENDERALLFORMATS equ 0306h
WM_DESTROYCLIPBOARD equ 0307h
WM_DRAWCLIPBOARD equ 0308h
WM_PAINTCLIPBOARD equ 0309h
WM_VSCROLLCLIPBOARD equ 030Ah
WM_SIZECLIPBOARD equ 030Bh
WM_ASKCBFORMATNAME equ 030Ch
WM_CHANGECBCHAIN equ 030Dh
WM_HSCROLLCLIPBOARD equ 030Eh
WM_QUERYNEWPALETTE equ 030Fh
WM_PALETTEGONNACHANGE equ 0310h ;Internal
WM_PALETTEISCHANGING equ 0310h
WM_CHANGEPALETTE equ 0311h ;Internal
WM_PALETTECHANGED equ 0311h
WM_PENWINFIRST equ 0380h
WM_PENWINLAST equ 038Fh
WM_INTERNAL_COALESCE_FIRST equ 0390h ;Internal
WM_COALESCE_FIRST equ 0390h
WM_COALESCE_LAST equ 039Fh
WM_MM_RESERVED_FIRST equ 03A0h ;Internal
WM_MM_RESERVED_LAST equ 03DFh ;Internal
WM_INTERNAL_COALESCE_LAST equ (WM_MM_RESERVED_FIRST+16) ;Internal
WM_INTERNAL_DDE_FIRST equ 03E0h ;Internal
WM_INTERNAL_DDE_LAST equ 03EFh ;Internal
WM_CBT_RESERVED_FIRST equ 03F0h ;Internal
WM_CBT_RESERVED_LAST equ 03FFh ;Internal
WM_USER equ 0400h
; Edit control messages
EM_GETSEL equ (WM_USER+0)
EM_SETSEL equ (WM_USER+1)
EM_GETRECT equ (WM_USER+2)
EM_SETRECT equ (WM_USER+3)
EM_SETRECTNP equ (WM_USER+4)
EM_SCROLL equ (WM_USER+5)
EM_LINESCROLL equ (WM_USER+6)
EM_GETMODIFY equ (WM_USER+8)
EM_SETMODIFY equ (WM_USER+9)
EM_GETLINECOUNT equ (WM_USER+10)
EM_LINEINDEX equ (WM_USER+11)
EM_SETHANDLE equ (WM_USER+12)
EM_GETHANDLE equ (WM_USER+13)
EM_GETTHUMB equ (WM_USER+14)
EM_LINELENGTH equ (WM_USER+17)
EM_REPLACESEL equ (WM_USER+18)
EM_SETFONT equ (WM_USER+19)
EM_GETLINE equ (WM_USER+20)
EM_LIMITTEXT equ (WM_USER+21)
EM_CANUNDO equ (WM_USER+22)
EM_UNDO equ (WM_USER+23)
EM_FMTLINES equ (WM_USER+24)
EM_LINEFROMCHAR equ (WM_USER+25)
EM_SETWORDBREAK equ (WM_USER+26)
EM_SETTABSTOPS equ (WM_USER+27)
EM_SETPASSWORDCHAR equ (WM_USER+28)
EM_EMPTYUNDOBUFFER equ (WM_USER+29)
EM_GETFIRSTVISIBLELINE equ (WM_USER+30)
EM_SETREADONLY equ (WM_USER+31)
EM_SETWORDBREAKPROC equ (WM_USER+32)
EM_GETWORDBREAKPROC equ (WM_USER+33)
EM_GETPASSWORDCHAR equ (WM_USER+34)
EM_MSGMAX equ (WM_USER+35)
; Button control messages
BM_GETCHECK equ (WM_USER+0)
BM_SETCHECK equ (WM_USER+1)
BM_GETSTATE equ (WM_USER+2)
BM_SETSTATE equ (WM_USER+3)
BM_SETSTYLE equ (WM_USER+4)
; Static control messages
STM_SETICON equ (WM_USER+0)
STM_GETICON equ (WM_USER+1)
STM_MSGMAX equ (WM_USER+2)
; Dialog box messages
DM_GETDEFID equ (WM_USER+0)
DM_SETDEFID equ (WM_USER+1)
; Listbox messages
LB_ADDSTRING equ (WM_USER+1)
LB_INSERTSTRING equ (WM_USER+2)
LB_DELETESTRING equ (WM_USER+3)
LB_RESETCONTENT equ (WM_USER+5)
LB_SETSEL equ (WM_USER+6)
LB_SETCURSEL equ (WM_USER+7)
LB_GETSEL equ (WM_USER+8)
LB_GETCURSEL equ (WM_USER+9)
LB_GETTEXT equ (WM_USER+10)
LB_GETTEXTLEN equ (WM_USER+11)
LB_GETCOUNT equ (WM_USER+12)
LB_SELECTSTRING equ (WM_USER+13)
LB_DIR equ (WM_USER+14)
LB_GETTOPINDEX equ (WM_USER+15)
LB_FINDSTRING equ (WM_USER+16)
LB_GETSELCOUNT equ (WM_USER+17)
LB_GETSELITEMS equ (WM_USER+18)
LB_SETTABSTOPS equ (WM_USER+19)
LB_GETHORIZONTALEXTENT equ (WM_USER+20)
LB_SETHORIZONTALEXTENT equ (WM_USER+21)
LB_SETCOLUMNWIDTH equ (WM_USER+22)
LB_ADDFILE equ (WM_USER+23) ;Internal
LB_SETTOPINDEX equ (WM_USER+24)
LB_GETITEMRECT equ (WM_USER+25)
LB_GETITEMDATA equ (WM_USER+26)
LB_SETITEMDATA equ (WM_USER+27)
LB_SELITEMRANGE equ (WM_USER+28)
LB_SETANCHORINDEX equ (WM_USER+29) ;Internal
LB_GETANCHORINDEX equ (WM_USER+30) ;Internal
LB_SETCARETINDEX equ (WM_USER+31)
LB_GETCARETINDEX equ (WM_USER+32)
LB_SETITEMHEIGHT equ (WM_USER+33)
LB_GETITEMHEIGHT equ (WM_USER+34)
LB_FINDSTRINGEXACT equ (WM_USER+35)
LBCB_CARETON equ (WM_USER+36) ;Internal
LBCB_CARETOFF equ (WM_USER+37) ;Internal
LB_MSGMAX equ (WM_USER+38)
; Combo box messages
CB_GETEDITSEL equ (WM_USER+0)
CB_LIMITTEXT equ (WM_USER+1)
CB_SETEDITSEL equ (WM_USER+2)
CB_ADDSTRING equ (WM_USER+3)
CB_DELETESTRING equ (WM_USER+4)
CB_DIR equ (WM_USER+5)
CB_GETCOUNT equ (WM_USER+6)
CB_GETCURSEL equ (WM_USER+7)
CB_GETLBTEXT equ (WM_USER+8)
CB_GETLBTEXTLEN equ (WM_USER+9)
CB_INSERTSTRING equ (WM_USER+10)
CB_RESETCONTENT equ (WM_USER+11)
CB_FINDSTRING equ (WM_USER+12)
CB_SELECTSTRING equ (WM_USER+13)
CB_SETCURSEL equ (WM_USER+14)
CB_SHOWDROPDOWN equ (WM_USER+15)
CB_GETITEMDATA equ (WM_USER+16)
CB_SETITEMDATA equ (WM_USER+17)
CB_GETDROPPEDCONTROLRECT equ (WM_USER+18)
CB_SETITEMHEIGHT equ (WM_USER+19)
CB_GETITEMHEIGHT equ (WM_USER+20)
CB_SETEXTENDEDUI equ (WM_USER+21)
CB_GETEXTENDEDUI equ (WM_USER+22)
CB_GETDROPPEDSTATE equ (WM_USER+23)
CB_FINDSTRINGEXACT equ (WM_USER+24)
CB_MSGMAX equ (WM_USER+25)
; DDE messages
WM_DDE_FIRST equ 03E0h
WM_DDE_INITIATE equ (WM_DDE_FIRST)
WM_DDE_TERMINATE equ (WM_DDE_FIRST+1)
WM_DDE_ADVISE equ (WM_DDE_FIRST+2)
WM_DDE_UNADVISE equ (WM_DDE_FIRST+3)
WM_DDE_ACK equ (WM_DDE_FIRST+4)
WM_DDE_DATA equ (WM_DDE_FIRST+5)
WM_DDE_REQUEST equ (WM_DDE_FIRST+6)
WM_DDE_POKE equ (WM_DDE_FIRST+7)
WM_DDE_EXECUTE equ (WM_DDE_FIRST+8)
WM_DDE_LAST equ (WM_DDE_FIRST+8)
;==================================================
VLmopen = 0
VLmpoff = 0
VLmname equ <>
VLmcont equ <>
DGROUP group _DATA
sBegin DATA
assume ds:_DATA
;extrn atomSysClass:word
sEnd DATA
ExternFP IsMenu
IFNDEF WOW
ExternFP IsGDIObject
ENDIF
ExternFP IsWindow
MESSAGE_START macro seg
_SwitchSeg <seg>,%VLseg
IFNDEF WOW
ExternNP VHWND&seg
ExternNP VHWND0&seg
ExternNP VHMENU&seg
ExternNP VHMENU0&seg
ExternNP GHANDLE&seg
ExternNP GHANDLE0&seg
ENDIF
ExternNP LP&seg
ExternNP LP0&seg
ExternNP CLP&seg
ExternNP CLP0&seg
ExternNP LPFN&seg
ExternNP LPFN0&seg
ExternNP CLPSZ&seg
ExternNP CLPSZ0&seg
ExternNP Inval_Param_&seg
hwnd equ <[bp].0eh>
msg equ <[bp].0ch>
wParam equ <[bp].0ah>
lParam equ <dword ptr [bp]+06h>
;cProc ValidateMessage,<FAR, PUBLIC>
;ParmW hwnd
;ParmW msg
;ParmW wParam
;ParmD lParam
;cBegin
public ValidateMessage
ValidateMessage proc far
push bp
mov bp,sp
push offset VM_ERROR ; push error handler address
IFNDEF WOW
mov bx,hwnd ; validate the window handle
lcall VHWND
ENDIF
mov ax,msg
cmp ax,WM_USER
jb VM_COMMON
jmp SHORT VM_VALID ;
IFNDEF WOW
mov bx,_DATA
mov es,bx
assume es:_DATA
mov bx,hwnd ; ax = hwnd->pcls->atomClassName
mov bx,es:[bx].wndPcls
mov ax,es:[bx].uclsAtomClassName
mov cx,ICLS_CTL_MAX ; look up the class name
push di ; in the atomSysClass array
mov di,offset DGROUP:atomSysClass+(ICLS_CTL_MAX-1)*2
std
repnz scasw
pop di
cld
jnz VM_VALID ; Not special window class: just return.
mov bx,cx ; cx has ICLS index
add bx,bx
mov ax,msg
jmp word ptr cs:vmjump[bx]
ENDIF
VM_VALID:
mov ax,1 ; return TRUE
VM_EXIT:
pop dx ; strip off error handler address
assume es:NOTHING
pop bp
VM_ERROR:
retf 2+2+2+4 ; error handler jmps here, with clean stack
ValidateMessage endp
;
; NOTE: The order of the following jump table is dependent
; on the order of the ICLS_* values defined in user.h
;
IFNDEF WOW
vmjump:
dw VM_BUTTON
errnz <ICLS_BUTTON-0>
dw VM_EDIT
errnz <ICLS_EDIT-1>
dw VM_STATIC
errnz <ICLS_STATIC-2>
dw VM_LISTBOX
errnz <ICLS_LISTBOX-3>
dw VM_VALID ; No scrollbar messages
errnz <ICLS_SCROLLBAR-4>
dw VM_COMBOBOX
errnz <ICLS_COMBOBOX-5>
ENDIF
endm ; MESSAGE_START
MESSAGE_END macro
if VLmopen
ENDMESSAGE
endif
sEnd %VLseg
endm
;
; MESSAGE - begins a structure declaration
;
MESSAGE macro name,opts
if VLmopen
ENDMESSAGE
endif
VLmopen=1
VLmpoff = 4
VLmjmp = 0
_MOpts <opts>
concat VLmcont,<VLm>,name
concat VLmname,name
VLcbstruct = 0
endm
_MOpts macro opts
VLnogen = 0
VLnogenparm = 0
irp opt,<opts>
ifidni <opt>,<NOGEN>
VLnogen = 1
endif
ifidni <opt>,<DEBUGONLY>
ifndef DEBUG
VLnogen = 1
endif
endif
ifidni <opt>,<POSTED>
endif
ifidni <opt>,<INTERNAL>
endif
endm
VLgen = 0
endm
;
; ENDMESSAGE - Terminates a message declaration
;
ENDMESSAGE macro
VLmopen = 0
ife VLmjmp
;_print <Nothing to validate for >,%VLmname
else
jmp VM_VALID
endif
irp label,<VLmcont>
label:
endm
endm
;
; MESSAGE_CLASS - Announce
;
MESSAGE_CLASS macro cls
VM_&cls:
endm
MESSAGE_CLASS_END macro
if VLmopen
ENDMESSAGE
endif
jmp VM_VALID
endm
_FlsMJmp2 macro name
public PV_&name
PV_&name:
endm
_FlsMJmp macro
ife VLmjmp
_FlsMJmp2 %VLmname
cmp ax,VLmname
jnz VLmcont
VLmjmp = 1
endif
endm
;
; Increment mpOff: 4 -> 0 -> 2
;
_IncMpOff macro size
ife VLmpoff-99
_print <Too many message parameters>
errnz 1
else
ife size-2
ife VLmpoff-4
VLmpoff = 0
else
ife VLmpoff-0
VLmpoff = 2
else
VLmpoff = 99
endif
endif
else
ife VLmpoff-4
_print <First message parameter must be 16 bits>
errnz 1
else
ife VLmpoff-0
VLmpoff = 99
else
_print <Too many message parameters>
errnz 1
endif
endif
endif
endif
endm
;
;
;
_GenMP macro name,size,opts
VLnogenparm = 0
irp opt,<opts>
ifidni opt,<NOGEN>
VLnogenparm = 1
endif
ifidni opt,<DEBUGONLY>
ifndef DEBUG
VLnogenparm = 1
endif
endif
endm
VLgen = 1
if VLnogenparm or VLnogen
VLgen = 0
endif
concat _P_&name,<[bp]+2+4+>,%VLmpoff
_IncMpOff size
endm
;
; Message parameter macros
;
MP_2 macro name,opts
_GenMP <name>,2,<opts>
endm
MP_4 macro name,opts
_GenMP <name>,4,<opts>
endm
MP_WMBZ macro name,opts
_GenMP <name>,2,<opts>
if VLgen
ifdef DEBUG
_FlsMJmp
mov ax,_P_&name
or ax,ax
jz @F
mov bx,ERR_BAD_VALUE or ERR_WARNING
lcall Inval_Param_
@@:
endif
endif
endm
MP_LMBZ macro name,opts
_GenMP <name>,4,<opts>
if VLgen
ifdef DEBUG
_FlsMJmp
mov bx,_P_&name
mov cx,_P_&name+2
or bx,cx
jz @F
mov ax,_P_&name
mov bx,ERR_BAD_DVALUE or ERR_WARNING
lcall Inval_Param_
@@:
endif ; DEBUG
endif
endm
; Simple types
MP_int equ <MP_2>
MP_BOOL equ <MP_2>
MP_LONG equ <MP_4>
MP_DWORD equ <MP_4>
MP_WORD equ <MP_2>
MP_POINT equ <MP_4>
MP_RVALUE macro val, min, max, opts
MP_2 <flags>,<opts>
endm
MP_VALUE macro val, max, opts
MP_2 <flags>,<opts>
endm
MP_FLAGS macro flags, valid, opts
MP_2 <flags>,<opts>
endm
; Handles
;
; 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.
;
_GenMPHGDI macro name,nullok,min,max,except
name &macro hObj,opts
local badobj
local objok
_GenMP <hObj>,2,<opts>
if VLgen
_FlsMJmp
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_HANDLE
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
_GenMPHGDI <MP_HDC>,0,OBJ_DC,OBJ_METAFILE
_GenMPHGDI <MP_HDC0>,1,OBJ_DC,OBJ_METAFILE
_GenMPHGDI <MP_HPEN>,0,OBJ_PEN,OBJ_PEN
_GenMPHGDI <MP_HPEN0>,1,OBJ_PEN,OBJ_PEN
_GenMPHGDI <MP_HBRUSH>,0,OBJ_BRUSH,OBJ_BRUSH
_GenMPHGDI <MP_HBRUSH0>,1,OBJ_BRUSH,OBJ_BRUSH
_GenMPHGDI <MP_HFONT>,0,OBJ_FONT,OBJ_FONT
_GenMPHGDI <MP_HFONT0>,1,OBJ_FONT,OBJ_FONT
_GenMPHGDI <MP_HPALETTE>,0,OBJ_PALETTE,OBJ_PALETTE
_GenMPHGDI <MP_HPALETTE0>,1,OBJ_PALETTE,OBJ_PALETTE
_GenMPHGDI <MP_HBITMAP>,0,OBJ_BITMAP,OBJ_BITMAP
_GenMPHGDI <MP_HBITMAP0>,1,OBJ_BITMAP,OBJ_BITMAP
_GenMPHGDI <MP_HRGN>,0,OBJ_RGN,OBJ_RGN
_GenMPHGDI <MP_HRGN0>,1,OBJ_RGN,OBJ_RGN
MP_HRGN01 equ <MP_2> ; hrgn, NULL, or (HRGN)1
MP_HMENU macro hMenu,opts
_GenMP <hMenu>,2,<opts>
if VLgen
_FlsMJmp
IFNDEF WOW
mov bx,_P_&hMenu
lcall VHMENU
ENDIF
_gensub VHMENU
@@:
endif
endm
MP_HMENU0 macro hMenu,opts
_GenMP <hMenu>,2,<opts>
if VLgen
_FlsMJmp
IFNDEF WOW
mov bx,_P_&hMenu
lcall VHMENU0
ENDIF
_gensub VHMENU
endif
endm
MP_HWND macro hwnd,opts
_GenMP <hwnd>,2,<opts>
if VLgen
_FlsMJmp
IFNDEF WOW
mov bx,_P_&hwnd
lcall VHWND
ENDIF
_gensub VHWND
endif
endm
MP_HWND0 macro hwnd,opts
_GenMP <hwnd>,2,<opts>
if VLgen
_FlsMJmp
IFNDEF WOW
mov bx,_P_&hwnd
lcall VHWND0
ENDIF
_gensub VHWND
endif
endm
; Warn if the window handle is 0 or a bad window handle
MP_HWNDW macro hwnd,opts
Local ZeroHandle
_GenMP <hwnd>,2,<opts>
ifdef DEBUG
if VLgen
_FlsMJmp
mov cx,_P_&hwnd
mov ax, cx ;; Error reporting expects window handle in AX
jcxz ZeroHandle
jmp @F
IFNDEF WOW
push cx ;; Save window handle
push cx
call IsWindow
or ax,ax
pop ax ;; Resore the window handle to AX
jnz @F
ENDIF
ZeroHandle:
;; AX must have the bad Window handle
mov bx,ERR_BAD_HWND or ERR_WARNING
lcall Inval_Param_
@@:
endif
endif
endm
; Warning only.
MP_HWNDW0 macro hwnd,opts
_GenMP <hwnd>,2,<opts>
ifdef DEBUG
if VLgen
_FlsMJmp
IFNDEF WOW
mov cx,_P_&hwnd
jcxz @F
push cx
push cx
call IsWindow
or ax,ax
pop ax
jnz @F
mov bx,ERR_BAD_HWND or ERR_WARNING
lcall Inval_Param_
@@:
ENDIF
endif
endif
endm
MP_HWND01 macro hwnd,opts ; hwnd, 0, or 1
_GenMP <hwnd>,2,<opts>
if VLgen
_FlsMJmp
IFNDEF WOW
mov bx,_P_&hwnd
cmp bx,1
jbe @F
lcall VHWND
ENDIF
_gensub VHWND
@@:
endif
endm
MP_HWNDCLIP equ <MP_HWND>
MP_LHANDLE macro name,opts
_GenMP <name>,2,<opts>
if VLgen
_FlsMJmp
mov ax,_P_&name
or ax,ax
jnz @F
mov bx,ERR_BAD_LOCAL_HANDLE
lcall Inval_Param_
@@:
endif
endm
MP_LHANDLE0 equ <MP_2>
MP_GHANDLE macro h,opts
_GenMP <h>,2,<opts>
if VLgen
_FlsMJmp
IFNDEF WOW
mov ax,_P_&h
lcall GHANDLE
ENDIF
endif
endm
MP_GHANDLE0 macro h,opts
_GenMP <h>,2,<opts>
if VLgen
_FlsMJmp
IFNDEF WOW
mov ax,_P_&h
lcall GHANDLE0
ENDIF
endif
endm
MP_GHANDLEDDE equ <MP_GHANDLE>
MP_GHANDLEDDE0 equ <MP_GHANDLE0>
MP_GHANDLEDDEW macro h,opts
local GHexit
_GenMP <h>,2,<opts>
ifdef DEBUG
if VLgen
_FlsMJmp
mov ax,_P_&h
test al,0100b ; Reject GDT selectors
jz @F
cmp ax,0ffffh ; special case: -1 -> DS
jz GHexit
lar dx,ax ; is it a valid selector?
jz GHexit
@@:
mov bx,ERR_BAD_GLOBAL_HANDLE or ERR_WARNING
lcall Inval_Param_
GHexit:
endif
endif
endm
MP_HICON equ <MP_GHANDLE>
MP_HICON0 equ <MP_GHANDLE0>
MP_HTASK equ <MP_GHANDLE>
MP_HTASK0 equ <MP_GHANDLE0>
; Pointers
MP_LP macro lptr,opts
_GenMP <lptr>,4,<opts>
if VLgen
_FlsMJmp
mov ax,_P_&lptr
mov cx,_P_&lptr+2
mov bx,1
lcall LP
_gensub LP
endif
endm
MP_CLP macro lp,opts
_GenMP <lp>,4,<opts>
if VLgen
_FlsMJmp
mov ax,_P_&lp
mov cx,_P_&lp+2
mov bx,1
lcall CLP
_gensub LP
endif
endm
MP_LP0 macro lp,opts
_GenMP <lp>,4,<opts>
if VLgen
_FlsMJmp
mov ax,_P_&lp
mov cx,_P_&lp+2
mov bx,1
lcall LP0
_gensub LP
endif
endm
MP_CLP0 macro lp,opts
_GenMP <lp>,4,<opts>
if VLgen
_FlsMJmp
mov ax,_P_&lp
mov cx,_P_&lp+2
mov bx,1
lcall CLP0
_gensub LP
endif
endm
MP_LPBUFFERCNT equ <MP_LP>
MP_CLPSTR macro lpsz,opts
_GenMP <lpsz>,4,<opts>
if VLgen
_FlsMJmp
mov ax,_P_&lpsz
mov cx,_P_&lpsz+2
mov bx,-1
lcall CLPSZ
_gensub LPSZ
endif
endm
MP_CLPSTR0 macro lpsz,opts
_GenMP <lpsz>,4,<opts>
if VLgen
_FlsMJmp
mov ax,_P_&lpsz
mov cx,_P_&lpsz+2
mov bx,-1
lcall CLPSZ0
_gensub LPSZ
endif
endm
MP_LPSTRCB equ <MP_4> ; may be arbitrary 32-bit value
MP_CLPSTRCB equ <MP_4>
MP_CLPSTRLB equ <MP_4> ; may be arbitrary 32-bit value
MP_CLPMSG0 equ <MP_CLP0>
MP_LPRECT equ <MP_LP>
MP_CLPRECT equ <MP_LP>
MP_LPBUFFERX macro count, lpBuffer, opts
MP_int <count>,<opts>
MP_LP <lpBuffer>,<opts>
endm
MP_LPTSBUFFER0 macro cTabs, lpTabs, opts
MP_int <cTabs>,<opts>
MP_LP0 <lpTabs>,<opts>
endm
MP_LPWBUFFERX macro wCount, lpBuf, opts ;** lpBuf is int. buffer
MP_int <count>,<opts>
MP_LP <lpTabs>,<opts>
endm
MP_LPMEASUREITEMSTRUCT equ <MP_LP>
MP_LPCREATESTRUCT equ <MP_LP>
MP_CLPCOMPAREITEMSTRUCT equ <MP_CLP>
MP_CLPDELETEITEMSTRUCT equ <MP_CLP>
MP_CLPDRAWITEMSTRUCT equ <MP_CLP>
MP_CLPMDICREATESTRUCT equ <MP_CLP>
MP_CLP5POINTBUFFER equ <MP_CLP> ; array of 5 points
; Function pointers
MP_LPFNWORDBREAK0 macro pfn,opts
_GenMP <pfn>,4,<opts>
if VLgen
_FlsMJmp
mov ax,_P_&pfn
mov cx,_P_&pfn+2
lcall LPFN0
_gensub LPFN
endif
endm
MP_LPFNTIMER0 macro pfn,opts
_GenMP <pfn>,4,<opts>
if VLgen
_FlsMJmp
mov ax,_P_&pfn
mov cx,_P_&pfn+2
lcall LPFN0
_gensub LPFN
endif
endm
; More types
MP_ATOM equ <MP_2>
MP_ATOM0 equ <MP_2>
MP_BIVALUE macro val,v1,v2,opts
MP_2 <val>,<opts>
endm
MP_CBINDEX equ <MP_2>
MP_CBINDEXFFFF equ <MP_2>
MP_CBITEMHEIGHTFFFF equ <MP_2>
MP_CHARINDEXFFFF equ <MP_2>
MP_CHARVALUE equ <MP_2>
MP_CID equ <MP_2>
MP_CONST macro val, constant, opts ;** set to SMP_JOBSTATUS
MP_2 <val>,<opts>
endm
MP_CTRLID equ <MP_2>
MP_EDITPOS equ <MP_2>
MP_EMCHARPOS equ <MP_2>
MP_EMLINE equ <MP_2>
MP_EMLINEFFFF equ <MP_2>
MP_EMLINEFFFF equ <MP_2>
MP_EMCLINE equ <MP_2>
MP_LBINDEX equ <MP_2>
MP_LBINDEXFFFF equ <MP_2>
MP_LBLPBUFFERINDEX macro wIndex, lpBuf, opts
MP_2 <wIndex>,<opts>
MP_4 <lpBuf>,<opts>
endm
MP_SHOWVALUE equ <MP_WORD>
MP_SYSCOMMAND equ <MP_WORD>
MP_VKEY equ <MP_WORD>
MP_WMMENUSELECT macro idOrHandle, flags, opts
MP_2 idOrHMenu ; id or menu handle
MP_2 flags ; may be -1
MP_2 hMenu ; may be NULL
endm
MP_WMNEXTDLGCTL macro hwndOrFPrev, fHandle, opts ;** if lParam is 0 wParam is a flag
MP_2 <hwndOrFPrev>,<opts>
MP_BOOL <fHandle>,<opts>
MP_WMBZ lParamH,<opts>
endm