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.
 
 
 
 
 
 

3053 lines
80 KiB

;===========================================================================
;
; For WOW only
;
;===========================================================================
;
; Validation constants
;
PS_MAX equ 6
HS_MAX equ 5
BS_MAX equ 5
FW_MAX equ 1000
OUT_MAX equ 7
CLIP_MAX equ 2
QUALITY_MAX equ 2
DIB_MAX equ 1
PFILL_MIN equ 1
PFILL_MAX equ 2
EFF_MAX equ 1
OBJ_MIN equ 1
OBJ_MAX equ 2
STOCK_MAX equ 19 ; should match sdk\inc\wingdi.h\STOCK_LAST
RGN_MIN equ 1
RGN_MAX equ 5
BK_MIN equ 1
BK_MAX equ 3 ;SHOULD let TRANSPARENT1 ROP code go through.
R2_MIN equ 1
R2_MAX equ 16
STR_MIN equ 1
STR_MAX equ 3
PFILL_MIN equ 1
PFILL_MAX equ 2
MM_MIN equ 1
MM_MAX equ 8
DIB_MAX equ 1
PR_MAX equ 4
RM_MAX equ 2
DIB_RGB_COLORS equ 0
CBM_INIT equ 4
BI_RGB equ 0
TA_VALID equ 0001fh
GLYPH_VALID equ 00003h
MAPFLG_VALID_L equ 00001h
MAPFLG_VALID_H equ 00000h
CBM_VALID_L equ 00004h
CBM_VALID_H equ 00000h
ETO_VALID equ 00007h
PC_VALID equ 00007h
CCHDEVICENAME equ 32
;special error codes
SP_ERROR equ -1
;============================================================================
;
; Special ATM hackery (See ATM HACK comments in dcman1.asm)
;
;ExternFP <LoadLibrary> TEMPLY !!!!!!!!!!! ChandanC
;ExternFP <FreeLibrary> TEMPLY !!!!!!!!!!! ChandanC
;ExternFP <GetProcAddress> TEMPLY !!!!!!!!!!! ChandanC
;
; Macro to set up stubs required for ATM's GDI patching code
;
ATM_LPFN macro gdifunc, kernfunc
IFNDEF WOW
db 09ah ; call far instruction
public gdifunc&kernfunc
gdifunc&kernfunc:
dd kernfunc
ENDIF
endm
;
; Argument types
;
IFNDEF WOW
ExternFP <IsGDIObject>
ExternFP <IsValidMetaFile>
ENDIF
P_LPSIZE equ <P_LPPOINT>
P_LPSIZE0 equ <P_LPPOINT0>
;
; 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,func
P_&name &macro hObj,opts
_GenParm <hObj>,2,<opts>
if VLgen
IFNDEF WOW
mov bx,_P_&&hObj
lcall V&name
_gensub name
_gensub VGOT
ENDIF
endif
&endm
P_&name&0 &macro hObj,opts
_GenParm <hObj>,2,<opts>
if VLgen
IFNDEF WOW
mov bx,_P_&&hObj
lcall V&name&0
_gensub name
_gensub VGOT
ENDIF
endif
&endm
endm
_GenHGDI <HGDIOBJ>
_GenHGDI <HPEN>
_GenHGDI <HBRUSH>
_GenHGDI <HFONT>
_GenHGDI <HPALETTE>
_GenHGDI <HBITMAP>
_GenHGDI <HRGN>
; HDC variants: HDC - Any kind of DC except a metafile DC
_GenHGDI <HDC>
; Anything including a metafile DC
_GenHGDI <HDCMETA>
P_HDCNOTMEM equ <P_HDCMETA>
; output-only DC - metafiles ok but no ICs allowed
_GenHGDI <HDCNOIC>
; output-only DC - neither metafiles nor ICs allowed
_GenHGDI <HDCNOICNOMETA>
; GetObject(): Pen, brush, font, palette, or bitmap.
;
_GenHGDI <HGDIOBJGET>
; UnrealizeObject(): Brush or palette
;
_GenHGDI <HGDIOBJUNR>
; SelectObject(): pen, brush, font, bitmap, region (no palette)
;
_GenHGDI <HGDIOBJSEL>
; Metafile handle
;
P_HMETAFILE macro hmf,opts
_GenParm <hmf>,2,<opts>
if VLgen
IFNDEF WOW
mov ax,_P_&hmf
lcall VHMETAFILE
_gensub VHMETAFILE
ENDIF
endif
endm
_GenHGDIX macro name,errtyp,lseg,min,max,except
local badobj
local objok
local trap
IFNDEF WOW
public V&name&0&lseg
V&name&0&lseg:
or bx,bx
jz objok
public V&name&lseg
V&name&lseg:
lcall VGetObjType
ifnb <except>
cmp ax,except
jz badobj
endif
ife min-max
cmp ax,min
jne badobj
errnz $-objok
else
cmp ax,min
jb badobj
cmp ax,max
ja badobj
endif
objok:
ret
badobj:
mov ax,cx
mov bx,ERR_BAD_&errtyp
ljmp Inval_Param_
ENDIF
endm ; _GenHGDIX
;
; Macro that gets expanded in each LAYER_EXPAND invocation. Includes common
; subroutines for parameter validation.
;
EXTRA_EXPAND macro lseg
ifdef genHGDIOBJ&lseg
_GenHGDIX <HGDIOBJ>,GDI_OBJECT,lseg,OBJ_PEN,OBJ_METAFILE ; DeleteObject: any kind of object
endif
ifdef genHPEN&lseg
_GenHGDIX <HPEN>,lseg,HPEN,OBJ_PEN,OBJ_PEN
endif
ifdef genHBRUSH&lseg
_GenHGDIX <HBRUSH>,HBRUSH,lseg,OBJ_BRUSH,OBJ_BRUSH
endif
ifdef genHFONT&lseg
_GenHGDIX <HFONT>,HFONT,lseg,OBJ_FONT,OBJ_FONT
endif
ifdef genHPALETTE&lseg
_GenHGDIX <HPALETTE>,HPALETTE,lseg,OBJ_PALETTE,OBJ_PALETTE
endif
ifdef genHBITMAP&lseg
_GenHGDIX <HBITMAP>,HBITMAP,lseg,OBJ_BITMAP,OBJ_BITMAP
endif
ifdef genHRGN&lseg
_GenHGDIX <HRGN>,HRGN,lseg,OBJ_RGN,OBJ_RGN
endif
; GetObject(): Pen, brush, font, palette, or bitmap.
;
ifdef genHGDIOBJGET&lseg
_GenHGDIX <HGDIOBJGET>,GDI_OBJECT,lseg,OBJ_PEN,OBJ_BITMAP
endif
; UnrealizeObject(): Brush or palette
;
ifdef genHGDIOBJUNR&lseg
_GenHGDIX <HGDIOBJUNR>,GDI_OBJECT,lseg,OBJ_BRUSH,OBJ_PALETTE,OBJ_FONT
endif
; SelectObject(): pen, brush, font, bitmap, region (no palette)
;
ifdef genHGDIOBJSEL&lseg
_GenHGDIX <HGDIOBJSEL>,GDI_OBJECT,lseg,OBJ_PEN,OBJ_RGN,OBJ_PALETTE
endif
; HDC variants: HDC - Any kind of DC except a metafile DC
ifdef genHDC&lseg
_GenHGDIX <HDC>,HDC,lseg,OBJ_DC,OBJ_METADC
endif
; Anything including a metafile DC
ifdef genHDCMETA&lseg
_GenHGDIX <HDCMETA>,HDC,lseg,OBJ_DC,OBJ_METAFILE
endif
; output-only DC - metafiles ok but no ICs allowed
ifdef genHDCNOIC&lseg
_GenHGDIX <HDCNOIC>,HDC,lseg,OBJ_DC,OBJ_METAFILE,OBJ_IC
endif
; output-only DC - neither metafiles nor ICs allowed
ifdef genHDCNOICNOMETA&lseg
_GenHGDIX <HDCNOICNOMETA>,HDC,lseg,OBJ_DC,OBJ_DC
endif
IFNDEF WOW
ifdef genVGOT&lseg
public VGetObjType&lseg
VGetObjType&lseg:
mov cx,bx
jcxz VGOTbad&lseg
beg_fault_trap VGOTtrap&lseg
mov ax,_DATA
mov es,ax
mov bx,es:[bx]
mov ax,es:[bx].ilObjType
end_fault_trap
and ah,high(not OBJ_FLAGS)
errnz low(Stock)
ret
VGOTtrap&lseg:
fault_fix_stack
VGOTbad&lseg:
xor ax,ax
ret
endif ; genVGOT&lseg
ifdef genVHMETAFILE&lseg
public VHMETAFILE&lseg
VHMETAFILE&lseg:
push ax
push ax
call IsValidMetaFile
or ax,ax
pop ax
jz @F
ret
@@:
mov bx,ERR_BAD_HMETAFILE
jmp short Inval_Param_&lseg
endif ; genVHMETAFILE&lseg
ENDIF
endm ; EXTRA_EXPAND
P_ROP equ <P_DWORD>
P_COLORREF equ <P_DWORD>
_GenLP <P_CLPLOGPALETTE>,<CLP>,1
_GenLP <P_CLPBITMAP>,<CLP>,1
_GenLP <P_LPHANDLETABLE0>,<LP0>,2
_GenLP <P_CLPBITMAPINFOHEADER>,<CLP>,1
P_CLPSTRHRSRC equ <P_CLPSTRATOM>
_GenLP <P_CLPDOCINFO>,<CLP>,1
P_CLPFACENAME equ <P_CLPSTR>
P_CLPFACENAME0 equ <P_CLPSTR0>
P_LPFNABORT0 equ <P_LPFN0>
P_LPFNMENUM equ <P_LPFN>
P_LPFNOENUM equ <P_LPFN>
P_LPFNFENUM equ <P_LPFN>
P_LPFNLENUM equ <P_LPFN>
P_intN0 equ <P_WORDMBNZ>
P_DEVCAP equ <P_int>
P_PITCHFAMILY equ <P_BYTE>
P_LPPOINTBUFFER macro p, c, opts
_DefParm <p>,4,<opts>
_DefParm <c>,2,<opts>
if VLgen
_FlsFrame
mov ax,_P_&p
mov cx,_P_&p+2
mov bx,_P_&c
shl bx,2
errnz VLcbsPOINT-4
lcall LP
_gensub LP
endif
endm
P_CLPPOINTBUFFER macro lptr, c, opts
_DefParm <lptr>,4,<opts>
_DefParm <c>,2,<opts>
if VLgen
_FlsFrame
mov ax,_P_&lptr
mov cx,_P_&lptr+2
mov bx,_P_&c
shl bx,2
errnz VLcbsPOINT-4
lcall CLP
_gensub LP
endif
endm
STRUCT <PALETTEENTRY>
F_BYTE peRed
F_BYTE peGreen
F_BYTE peBlue
F_BFLAGS peFlags, PC_VALID
ENDSTRUCT
P_LPPALENTRYBUFFER macro c, p, opts
_DefParm <c>,2,<opts>
_DefParm <p>,4,<opts>
if VLgen
_FlsFrame
mov ax,_P_&p
mov cx,_P_&p+2
mov bx,_P_&c
shl bx,2
errnz VLcbsPALETTEENTRY-4
lcall LP
_gensub LP
endif
endm
P_CLPPALENTRYBUFFER macro c, lp, opts
_DefParm <c>,2,<opts>
_DefParm <lp>,4,<opts>
if VLgen
_FlsFrame
mov ax,_P_&lp
mov cx,_P_&lp+2
mov bx,_P_&c
shl bx,2
errnz VLcbsPALETTEENTRY-4
lcall CLP
_gensub LP
endif
endm
;
; lppt - pointer to array of points: size = sum(lpcpt).
; lpcpt - pointer to array of counts of points
; ccpt - number of point counts in *lpcpt.
;
P_POLYPOLYPOINTS macro lppt, lpcpt, ccpt, opts
P_LPPOINT <lppt>,<opts>
P_LPINT <lpcpt>,<opts>
P_int <ccpt>,<opts>
endm
ifdef WOW
P_POLYPOLYLARGEPOINTS macro lppt, lpcpt, ccpt, opts
P_LPLARGEPOINT <lppt>,<opts>
P_LPDWORD <lpcpt>,<opts>
P_DWORD <ccpt>,<opts>
endm
endif
P_XY1XY2 macro x1,y1,x2,y2, opts
P_int <x1>,<opts>
P_int <y1>,<opts>
P_int <x2>,<opts>
P_int <y2>,<opts>
endm
P_LPBUFFERDW macro cb, lp, opts
P_DWORD <cb>,<opts>
P_LPBYTE <lp>,<opts>
endm
P_LPBUFFERDW0 macro cb, lp, opts
P_DWORD <cb>,<opts>
P_LPBYTE0 <lp>,<opts>
endm
P_CLPBUFFERDW macro cb, lp, opts
P_DWORD <cb>,<opts>
P_CLPBYTE <lp>,<opts>
endm
P_LPBUFFERX macro cb, pb, opts
P_int <cb>,<opts>
P_LPBYTE <pb>,<opts>
endm
ValidateHugeLP macro cch, lp, r, null
local exit
ifnb <null>
mov ax,lp
or ax,lp+2
jz exit
endif
push lp+2
push lp
push cch+2
push cch
call &r
or ax,ax
jz exit
mov cx, lp+2
mov ax, lp
mov bx,ERR_BAD_PTR
lcall Inval_Param_
exit:
endm
;----------------------------------------------------------------------------;
; This macro is used to validate the buffer length for the two APIs
; GetCharWidth and GetABCWidths. The 'size' parameter is not a part of the
; API. It is the size of each entry in the buffer. The number of entries are
; dictated by the character range passed in.
P_LPRWBUFFER macro chFirst, chLast, lpBuffer, size, opts
local exit
_GenParm <chFirst>,2,<opts>
_GenParm <chLast>,2,<opts>
_GenParm <lpBuffer>,4,<opts>
if VLgen
_FlsFrame
;; first validate that the character range is not inverted.
mov ax,_P_&chLast ;;last character in range
cmp ax,_P_&chFirst ;;should not be < than first character
jae @F ;;range is proper
;; character range is not valid.
mov bx,ERR_BAD_VALUE ;;invalid parameter error.
lcall Inval_Param_
jmp exit
@@:
;; the size of the buffer should atleast be (chLast-chFirst+1)*size
sub ax,_P_&chFirst
inc ax ;;no of entries
mov bx,size ;;size of each entry
mul bx
mov bx,ax ;;total size (ignore DX)
mov ax,_P_&lpBuffer
mov cx,_P_&lpBuffer+2
lcall LP
_gensub LP
exit:
endif
endm
;----------------------------------------------------------------------------;
P_CLPRECTBITSINFOBUFFER macro cyDst, xSrc, ySrc, nStartScan,nNumScans, lpBits, lpBitsInfo, wUsage, opts
P_VALIDATEBITSINFOBUFFER DIB_DIBTODEV, cyDst, xSrc, ySrc, nStartScan, nNumScans, lpBits, lpBitsInfo, wUsage, DIB_PTR_CLP, DIB_PTR_CLP, opts
endm
;----------------------------------------------------------------------------;
P_CLPBITSINFOBUFFER macro cscan, lpBits, lpBitsInfo, wUsage, opts
P_VALIDATEBITSINFOBUFFER DIB_PART_DIB, 0, 0, 0, 0, cscans, lpBits, lpBitsInfo, wUsage, DIB_PTR_CLP, DIB_PTR_CLP, opts
endm
;----------------------------------------------------------------------------;
P_LPBITSINFOBUFFER macro cScans, lpBits, lpBitsInfo, wUsage, opts
P_VALIDATEBITSINFOBUFFER DIB_PART_DIB, 0, 0, 0, 0, cscans, lpBits, lpBitsInfo, wUsage, DIB_PTR_LP, DIB_PTR_LP, opts
endm
;----------------------------------------------------------------------------;
;NOTE: It is assumed that this macro is only called from GetDIBits. The flag
;DIB_PTR_GETDIBITS is a special one which tells the ValidateDIBHeader routine
;to ignore the biClrUsed field.
P_LPBITSINFOBUFFER0 macro cScans, lpBits, lpBitsInfo, wUsage, opts
P_VALIDATEBITSINFOBUFFER DIB_PART_DIB, 0, 0, 0, 0, cscans, lpBits, lpBitsInfo, wUsage, DIB_PTR_LP0, DIB_PTR_GETDIBITS, opts
endm
;----------------------------------------------------------------------------;
P_CFULLLPBITSINFOBUFFER macro lpBits, lpBitsInfo, wUsage, opts
P_VALIDATEBITSINFOBUFFER DIB_FULL_DIB, 0, 0, 0, 0, 0, lpBits, lpBitsInfo, wUsage, DIB_PTR_CLP, DIB_PTR_CLP, opts
endm
;----------------------------------------------------------------------------;
P_GHPACKEDDIB macro hDIB, wUsage, opts
local exit
local errexit
;; hDIB is a global handle to a apacked DIB.
_GenParm <hDIB>,2,<opts>
_GenParm <wUsage>,2,<opts>
if VLgen
;; first validate the handle itself.
IFNDEF WOW
mov ax,_P_&hDIB
lcall GHANDLE
_gensub GHANDLE
ENDIF
;; validate wUsage
mov ax,_P_&wUsage
cmp ax,DIB_MAX
jbe @F ;; unsigned comparison to catch < 0.
mov bx,ERR_BAD_VALUE
lcall Inval_Param_
jmp exit
@@:
push si
push di ;;save
;; validate the header.
mov dx,_P_&wUsage
xor ax,ax
mov cx,_P_&hDIB ;;CX:AX has a pointer to the DIB
mov di, DIB_VALIDATE_COLOR + DIB_PTR_CLP
call ValidateDIBHeader
or ax,ax
jz @f ;;valid header
pop di
pop si ;;restore
mov bx,ERR_BAD_PTR
lcall Inval_Param_
jmp exit
@@:
;; the header has been validated. DI:SI returns the pointer past the end of
;; the DIB header and the color table. For a packed DIB this is the start of
;; the bits.
mov es,_P_&hDIB
xor bx,bx ;;es:bx-> header, di:si -> bits
mov cx, DIB_FULL_DIB+DIB_PTR_CLP
call ValidateDIBSize
pop di
pop si
or ax,ax
jz exit ;;valid size
mov bx,ERR_BAD_PTR
lcall Inval_Param_
exit:
endif
endm
;----------------------------------------------------------------------------;
P_CLPBITMAPINFOHEADER macro lpBi, opts
local exit
;; lpBi - pointer to bitmap info header which does not have a color table
_GenParm <lpBi>,4,<opts>
if VLgen
push si
push di
mov ax,word ptr _P_&lpBi
mov cx,word ptr _P_&lpBi+2
mov di, DIB_NO_COLOR + DIB_PTR_CLP
call ValidateDIBHeader
pop di
pop si
or ax,ax
jz exit
mov bx,ERR_BAD_PTR
lcall Inval_Param_
exit:
endif
endm
;----------------------------------------------------------------------------;
P_CLPDIBITMAP0 macro dwUsage, lpInitBits, lpInitInfo, wUsage, opts
local validate_dib
local no_init
local exit
local flags_ok
_DefParm <dwUsage>,4,<opts>
_DefParm <lpInitBits>,4,<opts>
_DefParm <lpInitInfo>,4,<opts>
_DefParm <wUsage>,2,<opts>
if VLgen
_FlsFrame
ifdef DEBUG
mov ax,_P_&dwUsage
mov cx,_P_&dwUsage+2
test ax,not(CBM_VALID_L)
jnz @F
test cx,not(CBM_VALID_H)
jz flags_ok
@@:
mov bx,ERR_BAD_DFLAGS
lcall Inval_Param_
flags_ok:
endif ;DEBUG
;; the rest of the validation depends on the value of dwUsage.
cmp word ptr _P_&dwUsage+2,0
jne no_init
mov ax, word ptr _P_&dwUsage
cmp ax,CBM_INIT
je validate_dib
no_init:
mov ax,_P_&lpInitBits
mov cx,_P_&lpInitBits+2
xor bx,bx
lcall CLP0
_gensub LP
mov ax,_P_&lpInitInfo
mov cx,_P_&lpInitInfo+2
xor bx,bx
lcall CLP0
mov ax,_P_&wUsage
cmp ax,DIB_MAX
jbe @F ;; unsigned comparison to catch < 0.
mov bx,ERR_BAD_VALUE
lcall Inval_Param_
@@:
jmp exit
validate_dib:
;; validate the bitmap info header first. Validate the color table size too.
push si
push di
mov ax,word ptr _P_&lpInitInfo
mov cx,word ptr _P_&lpInitInfo+2
mov dx,_P_&wUsage
mov di, DIB_VALIDATE_COLOR + DIB_PTR_CLP
call ValidateDIBHeader
or ax,ax
jz @f
pop di
pop si
mov bx,ERR_BAD_PTR
lcall Inval_Param_
jmp exit
@@:
;; now validate the size of the bitsbuffer. Use complete height
mov si, word ptr _P_&lpInitBits
mov di, word ptr _P_&lpInitBits+2
les bx,_P_&lpInitInfo
mov cx, DIB_FULL_DIB+DIB_PTR_CLP
call ValidateDIBSize
pop di
pop si
or ax,ax
jz exit
mov bx,ERR_BAD_PTR
lcall Inval_Param_
exit:
endif
endm
;----------------------------------------------------------------------------;
P_CLPBITBUFFER0 macro cx, cy, cPlanes, cBitsPixel, lpBits, opts
P_int <cx>,<opts>
P_int <cy>,<opts>
P_int <cPlanes>,<opts>
P_int <cBitsPixel>,<opts>
P_CLPBYTE0 <lpBits>,<opts>
endm
P_CLPETOBUF macro lpsz, cch, lpdx, opts
P_CLPBUFFER0 <lpsz>,<cch>,<opts>
P_CLPINT0 <lpdx>,<opts>
endm
P_TEXTEXTEX macro lpsz, cch, nMaxExt, lpnFit, lpDx, opts
P_CLPBUFFER <lpsz>,<cch>,<opts>
P_int <nMaxExt>,<opts>
P_LPINT0 <lpnFit>,<opts>
P_LPINT0 <lpDX>,<opts>
endm
;
; GDI structures
;
_DefSimpleF F_LBCOLOR,4
_DefSimpleF F_CLPBITS,4
_DefSimpleF F_DWSIZE,4
_DefSimpleF F_COMPRESS,4
_DefSimpleF F_DIBSIZE0,4
_DefSimpleF F_HMF,2
_DefSimpleF F_VALUE,2
_DefSimpleF F_WMBZ,2
_DefSimpleF F_WSIZE,2
_DefSimpleF F_CONST,2
_DefSimpleF F_BITCOUNT,2
_DefSimpleF F_RVALUE,2
_DefSimpleF F_short,2
_DefSimpleF F_VERSION,2
_DefSimpleF F_PITCHFAMILY,1
_DefSimpleF F_BVALUE,1
_DefSimpleF F_BFLAGS,1
STRUCT <RGBQUAD>
F_BYTE rgbBlue
F_BYTE rgbGreen
F_BYTE rgbRed
F_BYTE rgbReserved
ENDSTRUCT
STRUCT <RGBTRIPLE>
F_BYTE rgbtBlue
F_BYTE rgbtGreen
F_BYTE rgbtRed
ENDSTRUCT
STRUCT <LOGBRUSH>
F_VALUE lbStyle, BS_MAX
F_LBCOLOR lbColor
F_VALUE lbHatch, HS_MAX
ENDSTRUCT
_GenLP <P_CLPLOGBRUSH>,<CLP>,%VLcbsLOGBRUSH
_GenLP <P_CLPLOGBRUSH0>,<CLP0>,%VLcbsLOGBRUSH
_GenLP <P_LPLOGBRUSH>,<LP>,%VLcbsLOGBRUSH
_GenLP <P_LPLOGBRUSH0>,<LP0>,%VLcbsLOGBRUSH
STRUCT <LOGFONT>
F_int lfHeight
F_int lfWidth
F_int lfEscapement
F_int lfOrientation
F_VALUE lfWeight, FW_MAX
F_BYTE lfItalic
F_BYTE lfUnderline
F_BYTE lfStrikeOut
F_BYTE lfCharSet
F_BVALUE lfOutPrecision, OUT_MAX
F_BVALUE lfClipPrecision, CLIP_MAX
F_BVALUE lfQuality, QUALITY_MAX
F_PITCHFAMILY lfPitchAndFamily
F_BYTE lfFaceName ;var-length field
ENDSTRUCT
_GenLP <P_CLPLOGFONT>,<CLP>,%VLcbsLOGFONT
_GenLP <P_CLPLOGFONT0>,<CLP0>,%VLcbsLOGFONT
_GenLP <P_LPLOGFONT>,<LP>,%VLcbsLOGFONT
_GenLP <P_LPLOGFONT0>,<LP0>,%VLcbsLOGFONT
STRUCT <LOGPEN>
F_VALUE lopnStyle, PS_MAX
F_POINT lopnWidth
F_DWORD lopnColor
ENDSTRUCT
_GenLP <P_CLPLOGPEN>,<CLP>,%VLcbsLOGPEN
_GenLP <P_CLPLOGPEN0>,<CLP0>,%VLcbsLOGPEN
_GenLP <P_LPLOGPEN>,<LP>,%VLcbsLOGPEN
_GenLP <P_LPLOGPEN0>,<LP0>,%VLcbsLOGPEN
STRUCT <METAFILEPICT>
F_RVALUE nMapMode, MM_MIN, MM_MAX
F_int xExt
F_int yExt
F_HMF hMF
ENDSTRUCT
_GenLP <P_CLPMETAFILEPICT>,<CLP>,%VLcbsMETAFILEPICT
_GenLP <P_CLPMETAFILEPICT0>,<CLP0>,%VLcbsMETAFILEPICT
_GenLP <P_LPMETAFILEPICT>,<LP>,%VLcbsMETAFILEPICT
_GenLP <P_LPMETAFILEPICT0>,<LP0>,%VLcbsMETAFILEPICT
STRUCT <TEXTMETRIC> ;currently used only for output
F_int tmHeight
F_int tmAscent
F_int tmDescent
F_int tmInternalLeading
F_int tmExternalLeading
F_int tmAveCharWidth
F_int tmMaxCharWidth
F_int tmWeight
F_BYTE tmItalic
F_BYTE tmUnderlined
F_BYTE tmStruckOut
F_BYTE tmFirstChar
F_BYTE tmLastChar
F_BYTE tmDefaultChar
F_BYTE tmBreakChar
F_BYTE tmPitchAndFamily
F_BYTE tmCharSet
F_int tmOverhang
F_int tmDigitizedAspectX
F_int tmDigitizedAspectY
ENDSTRUCT
_GenLP <P_CLPTEXTMETRIC>,<CLP>,%VLcbsTEXTMETRIC
_GenLP <P_CLPTEXTMETRIC0>,<CLP0>,%VLcbsTEXTMETRIC
_GenLP <P_LPTEXTMETRIC>,<LP>,%VLcbsTEXTMETRIC
_GenLP <P_LPTEXTMETRIC0>,<LP0>,%VLcbsTEXTMETRIC
; OutlineTextMetrics return buffer
;
P_LPETM0 macro cch, lpch, opts
_DefParm <cch>,2,<opts>
_DefParm <lpch>,4,<opts>
if VLgen
_FlsFrame
mov ax,_P_&lpch
mov cx,_P_&lpch+2
mov bx,_P_&cch
lcall LP0
_gensub LP
endif
endm
; GetGlyphOutline return buffer.
;
P_LPGGO0 macro cch, lpch, opts
_DefParm <cch>,4,<opts>
_DefParm <lpch>,4,<opts>
if VLgen
_FlsFrame
;; The buffer should be atleast of the given size.
ValidateHugeLP _P_&cch, _P_&lpch, IsBadHugeWritePtr, NULL
endif
endm
; GetFontData return buffer
;
P_LPFDATA0 macro lpch, cch, opts
_DefParm <lpch>,4,<opts>
_DefParm <cch>,4,<opts>
if VLgen
_FlsFrame
ValidateHugeLP _P_&cch, _P_&lpch, IsBadHugeWritePtr, NULL
endif
endm
;---------------------------------------------------------------------------;
; hugw pointer validation routine.
STRUCT <GLYPHMETRICS> ;only used for output
F_WORD gmBlackBoxX
F_WORD gmBlackBoxY
F_POINT gmptGlyphOrigin
F_short gmCellIncX
F_short gmCellIncY
ENDSTRUCT
_GenLP <P_CLPGLYPHMETRICS>,<CLP>,%VLcbsGLYPHMETRICS
_GenLP <P_CLPGLYPHMETRICS0>,<CLP0>,%VLcbsGLYPHMETRICS
_GenLP <P_LPGLYPHMETRICS>,<LP>,%VLcbsGLYPHMETRICS
_GenLP <P_LPGLYPHMETRICS0>,<LP0>,%VLcbsGLYPHMETRICS
STRUCT METARECORD
F_DWORD rdSize
F_WORD rdFunction
F_WORD rdParm ;var. length field
ENDSTRUCT
_GenLP <P_CLPMETARECORD>,<CLP>,%VLcbsMETARECORD
_GenLP <P_CLPMETARECORD>,<CLP0>,%VLcbsMETARECORD
_GenLP <P_LPMETARECORD>,<LP>,%VLcbsMETARECORD
_GenLP <P_LPMETARECORD>,<LP0>,%VLcbsMETARECORD
;-------------------------------
; special-case macro definitions
STRUCT <BITMAP>
F_intMBZ bmType
F_int bmWidth
F_int bmHeight
F_int bmWidthBytes
F_BYTE bmPlanes
F_BYTE bmBitsPixel
F_CLPBITS bmBits
ENDSTRUCT
P_CLPBITMAP macro lp, opts
_GenParm <lp>,4,<opts>
if VLgen
mov ax,_P_&lp
mov cx,_P_&lp+2
mov bx,VLcbsBITMAP
lcall CLP
_gensub LP
les bx,_P_&lp ; Accept bmBits == NULL
mov ax,es:[bx]._F_bmBits
mov cx,es:[bx]._F_bmBits+2
or ax,cx
jz @F
xor ax,ax
mov al,es:[bx]._F_bmPlanes ;bmPlanes
mul word ptr es:[bx]._F_bmHeight
mul word ptr es:[bx]._F_bmWidthBytes
xchg ax,dx
mov ax,es:[bx]._F_bmBits
mov bx,dx ;bx = size
lcall CLP
_gensub LP
@@:
endif
endm
STRUCT <BITMAPCOREHEADER>
F_DWSIZE bcSize
F_WORD bcWidth
F_WORD bcHeight
F_CONST bcPlanes, 1
F_BITCOUNT bcBitCount
ENDSTRUCT
STRUCT <BITMAPINFOHEADER>
F_DWSIZE biSize
F_WORD biWidthLo
F_WMBZ biWidthHi
F_WORD biHeightLo
F_WMBZ biHeightHi
F_CONST biPlanes, 1
F_BITCOUNT biBitCount
F_COMPRESS biCompression
F_DIBSIZE0 biSizeImage
F_DWORD biXPelsPerMeter
F_DWORD biYPelsPerMeter
F_DWORD biClrUsed
F_DWORD biClrImportant
ENDSTRUCT
;----------------------------------------------------------------------------;
P_VALIDATEBITSINFOBUFFER macro fn, yE, xS, yS, nStart, n, lpBits, lpBi, wUse, rBits, rBi, opts
local exit
local total_clip
;; NOTE: The first 4 parameters are defined only when fn & DIB_RECT_DIB is
;; TRUE (they are 0 otherwise).
;; The 5th parameter is undefined if fn & DIB_FULL_DIB is TRUE.
;; yE - yExtent in DIB (only when fn & DIB_RECT_DIB is TRUE)
;; xS - xStart in DIB (only when fn & DIB_RECT_DIB is TRUE)
;; yS - yStart in DIB (only when fn & DIB_RECT_DIB is TRUE)
;; nStart - start DIB scan (only when fn & DIB_RECT_DIB is TRUE)
;;
;; n - numScans parameter. If fn & DIB_FULL_DIB is TRUE, n is not defined.
;; lpBits - pointer to the bits
;; lpBi - pointer to bitmap info
;; wUse - the wUsage parameter
;; rBits - routine to validate length of lpBits buffer
;; rBi - routine to validate length of lpBi buffer.
;; opts - optional parameters
if fn and DIB_RECT_DIB
_DefParm <yE>,2,<opts>
_DefParm <xS>,2,<opts>
_DefParm <yS>,2,<opts>
_DefParm <nStart>,2,<opts>
endif
if fn and DIB_PART_DIB
_DefParm <n>,2,<opts>
endif
_DefParm <lpBits>,4,<opts>
_DefParm <lpBi>,4,<opts>
_DefParm <wUsage>,2,<opts>
if VLgen
_FlsFrame
;; validate wUsage
mov ax,_P_&wUsage
cmp ax,DIB_MAX
jbe @F ;; unsigned comparison to catch < 0.
mov bx,ERR_BAD_VALUE
lcall Inval_Param_
@@:
push si
push di
;; validate the bitmap info header first. Validate the color table size too.
mov ax,word ptr _P_&lpBi
mov cx,word ptr _P_&lpBi+2
mov dx,_P_&wUsage
mov di, DIB_VALIDATE_COLOR
or di, rBi
call ValidateDIBHeader
or ax,ax
jz @f
pop di
pop si
mov bx,ERR_BAD_PTR
lcall Inval_Param_
jmp exit
@@:
;; now validate the size of the bitsbuffer.
mov si, word ptr _P_&lpBits
mov di, word ptr _P_&lpBits+2
les bx,_P_&lpBi
if fn and DIB_PART_DIB
mov dx,_P_&n
endif
if fn and DIB_RECT_DIB
;; for a call which specifies a rectangular area in the DIB (SetDIBitsToDevice),
;; compute the size of the DIB that will actually be validated.
;;
;; The cases are:
;;
;; (1) If (yS > (nStart + n) : The DIB RECT will be totally clipped. Do not
;; validate the DIB size in this case.
;; (2) If (yS + yE) < nStart : The DIB rect will totally be clipped. Do not
;; validate the DIB size in this case.
;; (3) Else, compute the min of (yS+yE-nStart) and (n) and use it to validate
;; the size of the DIB buffer.
mov dx, _P_&yS
mov cx, _P_&nStart
add cx, _P_&n
cmp dx, cx
ja total_clip ;; case (1)
add dx, _P_&yE
cmp dx, _P_&nStart
jb total_clip ;; case (2)
sub dx, _P_&nStart
cmp dx, _P_&n ;; compute min in case (3)
jb @f ;; (yS+yE-nStart) is < n
mov dx, _P_&n ;; validate only n scans
jmp short @f
total_clip:
pop di
pop si ;; will not validate DIB size
jmp short exit
@@:
endif
mov cx, fn
or cx, rBits
call ValidateDIBSize
pop di
pop si
or ax,ax
jz exit
mov bx,ERR_BAD_PTR
lcall Inval_Param_
exit:
endif
endm
;----------------------------------------------------------------------------;
STRUCT <LOGPALETTE> ;fixed-size portion of struct.
F_VERSION palVersion
F_WORD wEntries
ENDSTRUCT
P_CLPLOGPALETTE macro lp, opts
_GenParm <lp>,4,<opts>
if VLgen
mov ax,_P_&lp
mov cx,_P_&lp+2
mov bx,VLcbsLOGPALETTE
lcall CLP
_gensub LP
les bx,_P_&lp
mov cx,es
mov ax,VLcbsPALETTEENTRY
mul word ptr es:[bx]._F_wEntries ; ax = size of all palette entries
add ax,VLcbsLOGPALETTE ; ax = total size of struct
xchg ax,bx
lcall CLP
_gensub LP
endif
endm
STRUCT DEVMODE ;fixed-size fields
F_RGCH dmDeviceName, CCHDEVICENAME
F_VERSION dmSpecVersion
F_WORD dmDriverVersion ;value assigned by driver developer
F_WSIZE dmSize ;size of DEVMODE struct.
F_WORD dmDriverExtra ;size of dmDriverData field.
F_DWORD dmFields
F_RVALUE dmOrientation, DMORIENT_PORTRAIT, DMORIENT_LANDSCAPE
F_RVALUE dmPaperSize, DMPAPER_FIRST, DMPAPER_LAST
F_short dmPaperLength
F_short dmPaperWidth
F_short dmScale
F_short dmCopies
F_RVALUE dmDefaultSource, DMBIN_FIRST, DMBIN_LAST
F_RVALUE dmPrintQuality, DMPRINT_FIRST, DMPRINT_LAST ;** range -4 to -1
F_RVALUE dmColor, DMCOLOR_FIRST, DMCOLOR_LAST ;** range 1-2
F_RVALUE dmDuplex, DMDUP_FIRST, DMDUP_LAST ;** range 1-3
ENDSTRUCT
P_CLPDEVMODE0 macro lp, opts
local dmexit
local dmbad
local dmbad1
_GenParm <lp>,4,<opts>
if VLgen
mov ax,_P_&lp
mov cx,_P_&lp+2
mov bx,ax
or bx,cx
jz dmexit ;allow NULL pointer
mov bx,VLcbsDEVMODE
lcall CLP ;verify fixed-size fields
_gensub LP
les bx,_P_&lp
mov ax,es:[bx]._F_dmDriverExtra
or ax,ax
jz dmexit ;if 0 extra bytes, we're done
add ax,VLcbsDEVMODE
xchg ax,bx ;bx=size of DEVMODE+extra bytes
mov cx,es
;; MICROGRAFIX draw uses CreateDC to load one of thier format conversion DLLs.
;; The pass in a DevMode structure which is either a private structure, or
;; has a bogus value in the _F_dmDriverExtra field. We need to loosen the
;; validation and turn an invalid DevMode detection into a warning.
beg_fault_trap dmbad
mov es,cx
or bx,bx ; cb == 0?
jz dmexit ; yes: just check selector
dec bx
add bx,ax
jc dmbad1 ; check 16 bit overflow
mov bl,es:[bx] ; check read permission, limit
end_fault_trap
jmp short dmexit ; structure is valid
dmbad:
fault_fix_stack
dmbad1:
mov bx,ERR_BAD_PTR or ERR_WARNING
lcall Inval_Param_
dmexit:
endif
endm
;----------------------------------------------------------------------------;
; P A R A M E T E R V A L I D A T I O N R O U T I N E S ;
;----------------------------------------------------------------------------;
; DIB validation flag constants. Do not change these constants without
; changing them in GDI.API.
DIB_RGB_COLORS equ 0
DIB_VALIDATE_COLOR equ 1
DIB_VALIDATE_RW equ 2
DIB_PTR0 equ 4
DIB_FULL_DIB equ 8
DIB_FULL_COLOR equ 16
DIB_RECT_DIB equ 32
DIB_PART_DIB equ 64
; derived DIB flag constants
DIB_PTR_CLP equ 0
DIB_NO_COLOR equ 0
DIB_PTR_LP equ DIB_VALIDATE_RW
DIB_PTR_CLP0 equ DIB_PTR0
DIB_PTR_LP0 equ DIB_VALIDATE_RW+DIB_PTR0
ERR_BAD_PTR equ 07007h
DIB_DIBTODEV equ DIB_PART_DIB+DIB_RECT_DIB
DIB_PTR_GETDIBITS equ DIB_VALIDATE_RW+DIB_FULL_COLOR
NO_COLOR_TABLE equ 9
BITMAP struc
bmType DW ?
bmWidth DW ?
bmHeight DW ?
bmWidthBytes DW ?
bmPlanes DB ?
bmBitsPixel DB ?
bmBits DD ?
BITMAP ends
RGBTRIPLE struc
rgbBlue db ?
rgbGreen db ?
rgbRed db ?
RGBTRIPLE ends
RGBQUAD struc
rgbqBlue db ?
rgbqGreen db ?
rgbqRed db ?
rgbqReserved db ?
RGBQUAD ends
; structures for defining DIBs
BITMAPCOREHEADER struc
bcSize dd ?
bcWidth dw ?
bcHeight dw ?
bcPlanes dw ?
bcBitCount dw ?
BITMAPCOREHEADER ends
BITMAPINFOHEADER struc
biSize dd ?
biWidth dd ?
biHeight dd ?
biPlanes dw ?
biBitCount dw ?
biCompression dd ?
biSizeImage dd ?
biXPelsPerMeter dd ?
biYPelsPerMeter dd ?
biClrUsed dd ?
biClrImportant dd ?
BITMAPINFOHEADER ends
BITMAPINFO struc
bmiHeader db (SIZE BITMAPINFOHEADER) DUP (?)
bmiColors db ? ; array of RGBQUADs
BITMAPINFO ends
BITMAPCOREINFO struc
bmciHeader db (SIZE BITMAPCOREHEADER) DUP (?)
bmciColors db ? ; array of RGBTRIPLEs
BITMAPCOREINFO ends
BITMAPFILEHEADER struc
bfType dw ?
bfSize dd ?
bfReserved1 dw ?
bfReserved2 dw ?
bfOffBits dd ?
BITMAPFILEHEADER ends
externFP IsBadReadPtr ;(KERNEL)
externFP IsBadWritePtr ;(KERNEL)
externFP IsBadHugeReadPtr ;(KERNEL)
externFP IsBadHugeWritePtr ;(KERNEL)
;createseg _TEXT,TEXT,BYTE,PUBLIC,CODE
createseg _TEXT,TEXT,WORD,PUBLIC,CODE
sBegin TEXT
;----------------------------------------------------------------------------;
; ValidateDIBHeader: ;
; ;
; This routine validates the DIB header: ;
; ;
; Entry: ;
; CX:AX -- pointer to DIB header (either core or info header) ;
; DX: -- wUsage parameter ;
; DI: -- Flags: ;
; BIT0 - (DIB_VALIDATE_COLOR) set if no color table validatio ;
; to be done. ;
; BIT1 - (DIB_VALIDATE_RW) set if R-W validation to be done. ;
; BIT2 _ (DIB_PTR0) set if NULL pointer OK ;
; BIT3 _ (DIB_FULL_DIB) set if complete DIB (not used here);
; BIT4 - (DIB_FULL_COLOR) ignore biClrUsed if set. ;
; Returns: ;
; AX = 0 if valid header. ;
; DI:SI: will point just past the end of the buffer. ;
; ;
; Uses: ;
; Free to use AX,BX,CX,DX,SI,DI and ES. ;
; ;
;----------------------------------------------------------------------------;
public ValidateDIBHeader
ValidateDIBHeader proc near
; the header must atleast be the size of COREHEADER.
mov bx,SIZE BitmapCoreHeader
push cx
push ax ;save the pointer to header
call DIB_Validate_Pointer ;is it a valid pointer ?
or ax,ax
pop ax
pop cx ;restore pointer
jz VDH_cont ;base size ok
jmp VDH_bad_header ;invalid size
VDH_cont:
; now it is safe to load the pointer to the header and validate the actual
; size.
mov es,cx
mov bx,ax ;es:bx -> dib header
mov si,word ptr es:[bx].biSize ;load and keep the size
mov cx, SIZE RGBTriple ;assume COREHEADER.
cmp si,SIZE BitmapCoreHeader ;COREHEADER ?
jz VDH_core ;it is a core header
mov cx, SIZE RGBQuad ;assume INFOHEADER
cmp si, SIZE BitmapInfoHeader ;is it an info header ?
jnz VDH_bad_header ;header is not right.
; we have a new header. Make sure that some of the fields that the code
; expects to be 0 are 0.
cmp word ptr es:[bx].biWidth+2,0
jne VDH_bad_header ;invalid
mov ax,word ptr es:[bx].biHeight+2
test ax,ax ;is it a negative number ?
js VDH_get_bit_count ;yes, must be a top-down dib.
jnz VDH_bad_header ;it it is not signed, it should be 0.
VDH_get_bit_count:
cmp es:[bx].biPlanes,1
jne VDH_bad_header ;no.
mov ax,es:[bx].biBitCount ;load the bits per pel
jmp short VDH_check_color ;validate color
VDH_core:
cmp es:[bx].bcPlanes,1
jne VDH_bad_header ;no.
mov ax,es:[bx].bcBitCount ;load the bits per pel
VDH_check_color:
; if the bits per pel is >= NO_COLOR_TABLE, we do not have a color table in
; the DIB.
cmp ax,NO_COLOR_TABLE
jae VDH_no_color_table
; if color table validation is not needed, we can return if the header is
; a core header (we have validated size) or validate the size of the
; basic header and return.
test di, DIB_VALIDATE_COLOR ;color validation needed ?
jnz VDH_validate_color ;yes.
VDH_no_color_table:
; color table validation is not needed. We are done if this is a core header.
cmp si, SIZE BitmapCoreHeader ;core header ?
jz VDH_return_OK ;is, validation done. valid.
mov ax,bx ;get offset
mov bx,si ;get base header size
jmp short VDH_validate_size ;validate the total size
VDH_bad_header:
mov ax,1 ;return from here with error
jmp short VDH_return ;error return
VDH_validate_color:
cmp dx,DIB_RGB_COLORS ;is the usage RGB values
jz VDH_color_entry_size_in_cx ;cx has size of each entry
mov cx,2 ;size per entry for palettes
VDH_color_entry_size_in_cx:
mov dx,ax ;get the bit count in dx
; if DIB_FULL_COLOR bit is set, we will ignore the value if biClrUsed.
test di,DIB_FULL_COLOR ;validate complete color table ?
jnz VDH_get_num_colors ;yes.
; check out the biClrUsed value.
cmp si, SIZE BitmapInfoHeader ;is this an info header ?
jnz VDH_get_num_colors ;no.
mov ax,word ptr es:[bx].biClrUsed ;is this specified ?
or ax,ax
jnz VDH_num_colors_got ;yes. ax has num colors
VDH_get_num_colors:
xchg dx,cx
mov ax,1
shl ax,cl ;number of color entries in ax
xchg dx,cx
VDH_num_colors_got:
mul cx ;cx had size of each entry
add ax,si ;add size of header
xchg ax,bx ;size in bx, offset in ax
VDH_validate_size:
mov cx,es ;cx:ax has ptr, bx has size
; store the pointer past the header in DI:SI
mov di,cx
mov si,ax
add si,bx ;past the end. Assume no wrap
call DIB_Validate_Pointer ;validate pointer
jmp short VDH_return ;ax has status
VDH_return_OK:
xor ax,ax ;valid return
VDH_return:
ret
ValidateDIBHeader endp
;----------------------------------------------------------------------------;
; ValidateDIBSize: ;
; ;
; Validates the size of the DIB bits. ;
; ;
; Entry: ;
; DI:SI -- pointer to DIB bits (either core or info header) ;
; ES:BX -- pointer to DIB header (already validated) ;
; DX: -- num scans. ;
; CX: -- Flags: ;
; BIT1 - (DIB_VALIDATE_RW) set if R-W validation to be done. ;
; BIT2 _ (DIB_PTR0) set if NULL pointer OK ;
; BIT3 - (DIB_FULL_DIB) set if full DIB bit size to be ;
; validated. ;
; Returns: ;
; AX = 0 if valid header. ;
; ;
; Uses: ;
; Free to use AX,BX,CX,DX,SI,DI and ES. ;
; ;
; Assumes: ;
; Caller has done a PUSH SI/PUSH DI on the frame. ;
;----------------------------------------------------------------------------;
public ValidateDIBSize
ValidateDIBSize proc near
push cx ;save
cmp word ptr es:[bx].biSize, SIZE BitmapInfoHeader
jz VDB_info ;info header
mov cx,es:[bx].bcBitCount ;get the bit count
mov ax,es:[bx].bcWidth ;and width in pels
jmp short VDB_get_scan_size ;calculate scan size
VDB_info:
cmp word ptr es:[bx].biCompression+2,0
jnz VDB_check_size_image
cmp word ptr es:[bx].biCompression, BI_RGB
jz VDB_not_rle ;not an RLE DIB
VDB_check_size_image:
mov ax,word ptr es:[bx].biSizeImage
mov cx,ax
or cx,word ptr es:[bx].biSizeImage+2
jz VDB_unknown_size ;unknown size
pop cx ;restore saved cx
mov dx,word ptr es:[bx].biSizeImage+2
jmp short VDB_validate_size ;size is in dx:ax
VDB_unknown_size:
mov ax,1 ;validate for 1byte
cwd
pop cx ;restore flags
jmp short VDB_validate_size
VDB_not_rle:
; calculate the size of the scan. Assume that the width is a word
mov cx,es:[bx].biBitCount
mov ax,word ptr es:[bx].biWidth
VDB_get_scan_size:
push dx ;save
mul cx ;dx:ax = num of bits
add ax,31
adc dx,0
and ax, NOT 31 ;round up to multiple of 32
ror dx,3 ;get ls 3 bits into upper byte
and dh,0e0h ;keep the ms 3 bits
shr ax,3 ;ignore ls 3 bits
or ah,dh ;ax = num bytes per scan
pop dx
VDB_scan_width_in_ax:
pop cx ;restore flags
xchg cx,dx ;get flags into dx, scan in cx
push di ;save
mov di,word ptr es:[bx].bcHeight ;assume core header
cmp word ptr es:[bx].biSize, SIZE BitmapCoreHeader
jz VDB_total_scans_in_di ;di has total height of DIB
mov di,word ptr es:[bx].biHeight ;get low word of height
VDB_total_scans_in_di:
mov bx,di ;get total height in BX
pop di ;restore
test dx,DIB_FULL_DIB ;is full DIB to be validated ?
jnz VDB_num_scans_in_bx ;yes, bx has num scans.
; when we are validating partial DIBs, we want to make sure that the
; numScan parameter passed in (now in cx) is not greater than the total
; height. If it is, we will simply validate for the full DIB.
cmp cx,bx ;is numScan > total scans ?
ja VDB_num_scans_in_bx ;yes, invalid numScans. Use total scans
mov bx,cx ;use numScans
VDB_num_scans_in_bx:
push dx ;save flags
mul bx ;dx:ax has size
pop cx ;get the flags in cx
VDB_validate_size:
; dx:ax has size of the buffer. di:si is the ptr, cx has flags.
call DIB_Validate_Huge_Pointer
ret
ValidateDIBSize endp
;----------------------------------------------------------------------------;
; DIB_Validate_Pointer: ;
; ;
; Validates the size and access of a pointer. ;
; ;
; Entry: ;
; CX:AX -- pointer to be validate ;
; BX: -- size of buffer ;
; DI: -- flags: ;
; BIT1 - (DIB_VALIDATE_RW) set if R-W validation to be done. ;
; BIT2 _ (DIB_PTR0) set if NULL pointer OK ;
; ;
; Uses: None ;
; returns AX = 0 if valid. ;
; ;
;----------------------------------------------------------------------------;
public DIB_Validate_Pointer
DIB_Validate_Pointer proc near
test di,DIB_PTR0 ;NULL pointer allowed ?
jz DBP_not_null ;no.
push ax ;save
or ax,cx ;is the pointer NULL ?
pop ax ;restore
jz DBP_return_ok ;pointer is NULL and is valid
DBP_not_null:
push cx
push ax
push bx
test di, DIB_VALIDATE_RW ;read/write validation ?
jnz DBP_rw_validation ;yes.
; do read only validation:
call IsBadReadPtr
jmp short DBP_return
DBP_rw_validation:
call IsBadWritePtr
jmp short DBP_return
DBP_return_ok:
xor ax,ax ;valid pointer
DBP_return:
ret
DIB_Validate_Pointer endp
;----------------------------------------------------------------------------;
; DIB_Validate_Huge_Pointer: ;
; ;
; Validates the size and access of a pointer. ;
; ;
; Entry: ;
; DI:SI -- pointer to be validate ;
; DX:AX -- size of buffer ;
; CX: -- flags: ;
; BIT1 - (DIB_VALIDATE_RW) set if R-W validation to be done. ;
; BIT2 _ (DIB_PTR0) set if NULL pointer OK ;
; ;
; Uses: None ;
; returns AX = 0 if valid. ;
; ;
;----------------------------------------------------------------------------;
public DIB_Validate_Huge_Pointer
DIB_Validate_Huge_Pointer proc near
test cx,DIB_PTR0 ;NULL pointer allowed ?
jz DBPH_not_null ;no.
push si ;save
or si,di ;is the pointer NULL ?
pop si ;restore
jz DBPH_return_ok ;pointer is NULL and is valid
DBPH_not_null:
push di
push si ;ds:si is pointer to bits
push dx
push ax ;dx:ax is the dword size
test cx, DIB_VALIDATE_RW ;read/write validation ?
jnz DBPH_rw_validation ;yes.
; do read only validation:
call IsBadHugeReadPtr
jmp short DBPH_return
DBPH_rw_validation:
call IsBadHugeWritePtr
jmp short DBPH_return
DBPH_return_ok:
xor ax,ax ;valid pointer
DBPH_return:
ret
DIB_Validate_Huge_Pointer endp
sEnd TEXT
;=======================================================================
;
; API Descriptions
;
; in PALETTE.ASM
API void, AnimatePalette, TEXT, <ASM>
P_HPALETTE hPal ; validated by VALID? (3.0 and 3.1)
P_WORD wStartIndex
P_CLPPALENTRYBUFFER nEntries,lpPalColors ; **
; in PALETTE.ASM
API HPALETTE, CreatePalette, TEXT, <ASM>
P_CLPLOGPALETTE lpLogPal ;**
; in PALETTE.ASM
API WORD, GetPaletteEntries, TEXT, <ASM>
P_HPALETTE hPalette ;validated by VALID? (3.0 and 3.1)
P_WORD wStartIndex
P_LPPALENTRYBUFFER wEntries, lpPalColors ; buffer filled in DEBUG Win 3.1
; in PALETTE.ASM
API WORD, GetNearestPaletteIndex, TEXT, <ASM>
P_HPALETTE hPalette ;validated by VALID? (3.0 and 3.1)
P_DWORD color
; in PALETTE.ASM
API WORD, GetSystemPaletteEntries, TEXT, <ASM>
P_HDC hdc ;validated by VALID? (3.0 and 3.1)
P_WORD wStartIndex
P_LPPALENTRYBUFFER wEntries,lpPalColors ;buffer filled in DEBUG Win 3.1
; in PALETTE.ASM
API WORD, GetSystemPaletteUse, TEXT, <ASM>
P_HDC hdc ;validated by VALID? (3.0 and 3.1)
; in PALETTE.ASM
API BOOL, ResizePalette, TEXT, <ASM>
P_HPALETTE hPalette ;validated by VALID? (3.0 and 3.1)
P_WORD nNumEntries
; in PALETTE.ASM
API WORD, SetPaletteEntries, TEXT, <ASM>
P_HPALETTE hPalette ;validated by VALID? (3.0 and 3.1)
P_WORD wStartIndex
P_CLPPALENTRYBUFFER wEntries, lpPalColors
; in PALETTE.ASM
API WORD, SetSystemPaletteUse, TEXT, <ASM>
P_HDC hdc ;validated by VALID? (3.0 and 3.1)
P_WORD wUsage
; in PALETTE.ASM
API int, UpdateColors, TEXT, <ASM>
P_HDCMETA hdc ;validated by VALID? (3.0 and 3.1)
; in PRNTCTL.C (new for Win 3.1)
API int, AbortDoc, TEXT
P_HDCMETA hdc ; validated by Valid()
APIERR
mov ax, SP_ERROR ;General escape error
APIEND
; in PRNTCTL.C (New for Win 3.1)
API int, EndPage, TEXT
P_HDCMETA hdc ; Checked by Valid(). Encapsulates ENDPAGE escape
APIERR
mov ax, SP_ERROR ;General escape error
APIEND
; in PRNTCTL.C (New for Win 3.1)
API int, EndDoc, TEXT
P_HDCMETA hdc ; Checked by Valid(). Encapsulates NEWFRAME escape
APIERR
mov ax, SP_ERROR ;General escape error
APIEND
STRUCT <DOCINFO>
F_int cbSize
F_CLPSTR lpszDocName
F_CLPSTR0 lpszOutput
ENDSTRUCT
_GenLP <P_CLPDOCINFO>,<CLP>,%VLcbsDOCINFO
; in PRNTCTL.C (new for 3.1)
API int, StartDoc, TEXT
P_HDCMETA hdc ;checked by Valid()
P_CLPDOCINFO lpDocInfo
APIERR
mov ax, SP_ERROR ;General escape error
APIEND
; in PRNTCTL.C (new for 3.1)
API int, StartPage, TEXT
P_HDCMETA hdc ;checked by Valid(). Null error return
; in PRNTCTL.C (new for 3.1)
API int, SetAbortProc, TEXT
P_HDCMETA hdc
P_LPFNABORT0 lpProc ;**
APIERR
mov ax, SP_ERROR ;General escape error
APIEND
; in DCMAN1.ASM
API HDC, CreateCompatibleDC, TEXT, <ASM>
P_HDC0 hdc ; 0 => use screen DC
; in DCMAN1.ASM
API HDC, CreateIC ,TEXT, <ASM,FUNNYFRAME,NODATA> ;nogen
P_CLPSTR lpDriverName
P_CLPSTR0 lpDeviceName
P_CLPSTR0 lpOutput
P_DWORD lpInitData ; Driver-dependent data or NULL
APIEND
; in DCMAN1.ASM
API HDC, CreateDC, TEXT, <ASM,FUNNYFRAME,NODATA> ;nogen
;
; START of special ATM hackery.
;
jmp short SkipATMHackery
;
; Addresses of certain kernel functions patched by ATM loader.
;
;ATM_LPFN CreateDC_lpfn, LoadLibrary
;ATM_LPFN CreateDC_lpfn, GetProcAddress
;ATM_LPFN CreateDC_lpfn, FreeLibrary
;
; InternalCreateDC() hook that gets patched by ATM
;
;public ATMInternalCreateDC
;ATMInternalCreateDC:
;
; Old Windows prolog code that will be properly
; recognized by the ATM installation code...
;
; mov ax,_DATA
; inc bp
; push bp
; mov bp,sp
; push ds ; push ds and pop it off.
; pop ds ; (we need to pop DS rather than
; ; something fast like pop AX because
; ; ATM doesn't preserve DS itself)
; pop bp ; Take down the frame completely.
; dec bp
;ExternNP InternalCreateDC ; (in dcman1.asm)
; jmp InternalCreateDC ; now go to the real code
SkipATMHackery:
;
; END of special ATM hackery
;
P_CLPSTR lpDriverName
P_CLPSTR0 lpDeviceName ; can be NULL if lpDriverName is "DISPLAY"
P_CLPSTR0 lpOutput ; can be NULL if lpDriverName is "DISPLAY"
P_CLPDEVMODE0 lpInitData ; ** points to DEVMODE struct.
; in DCMAN2.ASM
API BOOL, DeleteDC, TEXT, <ASM,ATMFRAMEDS>
P_HDC hdc ; Validated by VALIDDEBUG? (3.1), VALID? (3.0)
APIEND
ATM_LPFN DeleteDC_lpfn, FreeLibrary
; in DCMAN2.ASM
API BOOL, RestoreDC, TEXT, <ASM>
P_HDCMETA hdc
P_int level ;number of DC on context stack or -1
; in DCMAN2.ASM
API int, SaveDC, TEXT, <ASM>
P_HDCMETA hdc ; validated by VALID? (3.0 and 3.1)
; in RESETDC.C
API BOOL, RESETDC, TEXT
P_HDC hdc
P_CLPDEVMODE0 lpInitData ; ** points to DEVMODE struct.
; in OBJDEL.ASM
API BOOL, DeleteObject, TEXT, <ASM>
P_HGDIOBJ hObject ; ** Validated by VALID? (3.0 and 3.1)
; object shouldn't be selected into a DC
; Pens, brushes, fonts, bitmaps &
; palettes and regions.
; in OBJMAN.ASM
API HPEN, CreatePen, TEXT, <ASM>
P_VALUE style, PS_MAX ; ** range 0-6
P_int cx
P_COLORREF color ; ** DWORD
; in OBJMAN.ASM
API HPEN, CreatePenIndirect, TEXT, <ASM>
P_CLPLOGPEN lpLogPen ; **
; in OBJMAN.ASM
API HBRUSH, CreateSolidBrush, TEXT, <ASM, NOGEN>
P_COLORREF color
; in OBJMAN.ASM
API HBRUSH, CreateHatchBrush, TEXT, <ASM>
P_VALUE nIndex, HS_MAX ; ** range 0-5
P_COLORREF color ;
; in OBJMAN.ASM
API HBRUSH, CreatePatternBrush, TEXT, <ASM>
P_HBITMAP hBitmap ;
; in OBJMAN.ASM
API HBRUSH, CreateBrushIndirect, TEXT, <ASM>
P_CLPLOGBRUSH lpLogBrush ; **
; in OBJMAN.ASM
API HBITMAP, CreateBitmap, TEXT, <ASM> ;<FUNNYFRAME> in 3.0
P_CLPBITBUFFER0 cx, cy, bPlanes, bBitC, lpBits ; ** buffer size
;determined by bitmap attributes
;cx and cy are int. values
;bPlanes and bBitC are BYTE values
; in OBJMAN.ASM
API HBITMAP, CreateBitmapIndirect, TEXT, <ASM> ;<FUNNYFRAME> in 3.0
P_CLPBITMAP lpBitmap ; **
; in OBJMAN.ASM
API HBITMAP, CreateCompatibleBitmap, TEXT, <ASM, FUNNYFRAME,NODATA> ;nogen
P_HDC hdc ; validated by VALID? (3.0 and 3.1) in CompatibleBitmap
P_int cx
P_int cy
; in OBJMAN.ASM
API HBITMAP, CreateDiscardableBitmap, TEXT, <ASM,FUNNYFRAME,NODATA> ;nogen
P_HDC hdc ; validated by VALID? (3.0 and 3.1) in CompatibleBitmap
P_int cx
P_int cy
; in OBJMAN.ASM
API HFONT, CreateFont, TEXT, <ASM>
P_int cy
P_int cx
P_int nEscapement
P_int nOrientation
P_VALUE nWeight, FW_MAX ;** range 0-1000
P_BYTE cItalic
P_BYTE cUnderline
P_BYTE cStrikeOut
P_BYTE cCharSet
P_BVALUE cOutPrecis, OUT_MAX ;** range 0-3
P_BVALUE cClipPrecis, CLIP_MAX ;** range 0-2
P_BVALUE cQuality, QUALITY_MAX ;** range 0-2
P_PITCHFAMILY cPitchAndFamily ;** BYTE. Flags in upper and lower nibbles
P_CLPFACENAME0 lpFaceName ;** null-terminated string length
;not > LF_FACESIZE
; in OBJMAN.ASM
API HFONT, CreateFontIndirect, TEXT, <ASM>
P_CLPLOGFONT lpLogFont ;**
; in OBJMAN.ASM
API HBRUSH, CreateDIBPatternBrush, TEXT, <ASM>
P_GHPACKEDDIB hPackedDIB, wUsage
; in OBJMAN.ASM
API DWORD, SetBitmapDimension, TEXT, <ASM>
P_HBITMAP hBitmap ; validated by VALID? (3.0 and 3.1)
P_int x
P_int y
; in FONTASC.ASM
ifdef DBCS
API int, GetFontAssocStatus, TEXT, <ASM>
P_HDCMETA hdc ; validated by VALID?
endif ;DBCS
; in WIN32.C
API BOOL, SetBitmapDimensionEx, TEXT
P_HBITMAP hBitmap
P_int x
P_int y
P_LPSIZE0 lpSize
; in OBJMAN.ASM
API DWORD, GetBitmapDimension, TEXT, <ASM>
P_HBITMAP hBitmap ;validated by VALID? (3.0 and 3.1)
; in WIN32.C
API BOOL, GetBitmapDimensionEx, TEXT
P_HBITMAP hBitmap
P_LPSIZE lpDimension
; in OBJMAN.ASM
API int, SetTextJustification, TEXT, <ASM>
P_HDCMETA hdc ;validated by VALID? (3.0 and 3.1)
P_int nBreakExtra
P_int nBreakCount
; in OBJMAN.ASM
API int, SetTextCharacterExtra, TEXT, <ASM>
P_HDCMETA hdc ;validated by VALID? (3.0 and 3.1)
P_int nCharExtra
; in METAREC.C
API GHANDLE, CopyMetaFile, TEXT
P_GHANDLE hMeta ;checked by IsValidMetaFile()
P_CLPSTR0 lpFileName ;0 => use memory metafile
; in METAREC.C
API HDC, CreateMetaFile, TEXT
P_CLPSTR0 lpFileName ;0 => return memory metafile DC
; in METAREC.C
API GHANDLE, CloseMetaFile, TEXT
P_HDCMETA hdc
; in METAPLAY.ASM
API BOOL, DeleteMetaFile, TEXT, <ASM,FUNNYFRAME> ; is NODATA
P_HMETAFILE hMF
; in METAPLAY.ASM
API BOOL, PlayMetaFile, TEXT, <ASM, ATMFRAMEDS>
P_HDCMETA hdc ;validated by Valid() (3.1 only)
P_HMETAFILE hMF
; in METAPLAY.ASM
API GHANDLE, GetMetaFile, TEXT, <ASM>
P_CLPSTR lpFileName
; in META.C
API void, PlayMetaFileRecord, TEXT
P_HDCMETA hdc ;validated by Valid() (3.1 only)
P_LPHANDLETABLE0 lpHT
P_CLPMETARECORD lpMR
P_WORD nhandles
; in META.C
API BOOL, EnumMetaFile, TEXT
P_HDCMETA0 hdc ; NULL DC is OK. Checked by Valid() (3.0 and 3.1)
P_HMETAFILE hMF
P_LPFNMENUM lpfnEnum ; **
P_DWORD lpClientData ; CLPVOID0 ?, but often just contains data
; in METAREC.C
API GHANDLE, GetMetaFileBits, TEXT
P_HMETAFILE hMF
; in METAREC.C
API HANDLE, SetMetaFileBits, TEXT
P_HMETAFILE hMem ; just returns hMem
; in METAREC.C
API HANDLE, SetMetaFileBitsBetter, TEXT
P_HMETAFILE hMem ; just returns hMem, new for 3.1
; in XLATE.ASM
API BOOL, DPtoLP, TEXT, <ASM, FUNNYFRAME,NODATA> ;nogen
P_HDC hdc ;validated by VALID? (3.0 and 3.1) by DPXlate
P_LPPOINTBUFFER lpPoints, nCount ;**
; in XLATE.ASM
API BOOL, LPtoDP, TEXT, <ASM, FUNNYFRAME,NODATA> ;nogen
P_HDC hdc ;validated by VALID? (3.0 and 3.1) in DPXlate
P_LPPOINTBUFFER lpPoints, nCount
; in ARC.ASM
API HRGN, CreateEllipticRgnIndirect, TEXT, <ASM>
P_CLPRECT lpRect
; in ARC.ASM
API HRGN, CreateEllipticRgn, TEXT, <ASM, NOGEN>
P_XY1XY2 x1,y1,x2,y2 ;X2-X1 and Y2-Y1 under 32,767 units
; in ARC.ASM
API HRGN, CreatePolygonRgn, TEXT, <ASM>
P_CLPPOINTBUFFER lpPoints, nCount ;**
P_RVALUE nPolyFillMode, PFILL_MIN, PFILL_MAX ;** range 1-2
; in ARC.ASM
API HRGN, CreatePolyPolygonRgn, TEXT, <ASM>
P_POLYPOLYPOINTS lpPoints, lpPolyCounts, nCount ;**lpPolyCounts is a buffer
;of nCount Integers. lpPoints
;is a buffer of POINTS. Size of
;lpPoints det. by sum of all
;integers in lpPolyCounts
P_RVALUE nPolyFillMode, PFILL_MIN, PFILL_MAX ;** range 1-2
; in ARC.ASM
API HRGN, CreateRoundRectRgn, TEXT, <ASM, NOGEN>
P_XY1XY2 x1,y1,x2,y2 ;X2-X1 and Y2-Y1 under 32,767 units
P_int x3
P_int y3
; in ARC.ASM
API BOOL, Ellipse, TEXT, <ASM>
P_HDCNOIC hdc ;validated by VALID? (3.0 and 3.1)
P_XY1XY2 x1,y1,x2,y2
; in ARC.ASM
API BOOL, Arc, TEXT, <ASM>
P_HDCNOIC hdc ; validated by VALID? (3.0 and 3.1)
P_XY1XY2 x1,y1,x2,y2
P_int x3
P_int y3
P_int x4
P_int y4
; in ARC.ASM
API BOOL, Pie, TEXT, <ASM>
P_HDCNOIC hdc ;validated by VALID? (3.0 and 3.1)
P_XY1XY2 x1,y1,x2,y2
P_int x3
P_int y3
P_int x4
P_int y4
; in ARC.ASM
API BOOL, Chord, TEXT, <ASM>
P_HDCNOIC hdc ; validated by VALID? (3.0 and 3.1)
P_XY1XY2 x1,y1,x2,y2 ; ** X2-X1 and Y2-Y1 under 32,767 units
P_int x3
P_int y3
P_int x4
P_int y4
; in ARC.ASM
API BOOL, RoundRect, TEXT, <ASM>
P_HDCNOIC hdc ;validated by VALID? (3.0 and 3.1)
P_XY1XY2 x1,y1,x2,y2
P_int x3
P_int y3
; in RECT.C
API BOOL, Rectangle, TEXT, <RECT>
P_HDCNOIC hdc ;validated by Valid() (3.0 and 3.1) in RectangleBody
P_XY1XY2 x1,y1,x2,y2
; in FLOOD.ASM
API BOOL, FloodFill, TEXT, <ASM> ; calls ExtFloodFill
P_HDCNOIC hdc
P_int x
P_int y
P_COLORREF color
; in FLOOD.ASM
API BOOL, ExtFloodFill, TEXT, <ASM>
P_HDCNOIC hdc ;validated by VALID? (3.0 and 3.1)
P_int x
P_int y
P_COLORREF color
P_UVALUE fillType, EFF_MAX ;** range 0-1
P_LPESCPARMS macro code, cb, lp, opts
_DefParm <code>,2,<opts>
_DefParm <cb>,2,<opts>
_DefParm <lp>,4,<opts>
if VLgen
_FlsFrame
mov ax,_P_&lp
mov cx,_P_&lp+2
mov bx,_P_&cb
lcall CLP0
_gensub LP
endif
endm
; in ESC.ASM
API int, Escape, TEXT, <ASM, ATMFRAMEDS>
P_HDCNOTMEM hdc ; ** not mem. DC. VALID? (3.0 and 3.1)
P_LPESCPARMS code, cbInData, lpInData
P_LPVOID0 lpOutData
APIERR
mov ax,SP_ERROR ;General escape error
APIEND
; in ENUMOBJE.ASM
API int, EnumObjects, TEXT, <ASM>
P_HDC hdc ; validated by VALID? (3.0 and 3.1)
P_RVALUE nObjectType, OBJ_MIN, OBJ_MAX ; ** range 1-2
P_LPFNOENUM lpCallBack ; **
P_DWORD lpClientData ; CLPVOID0 ?, but often just contains data
; in ENUMFONT.ASM
API int, EnumFonts, TEXT, <ASM,ATMFRAMEDS>
P_HDC hdc ; validated by VALID? (3.0 and 3.1) in RectStuff
P_CLPFACENAME0 lpFaceName
P_LPFNFENUM lpFontFunc ; **
P_DWORD lpData ; CLPVOID0 ?, but often just contains data
; in ENUMFONT.ASM (new for Win 3.1)
API int EnumFontFamilies, TEXT, <ASM>
P_HDC hdc ; validated by VALID?
P_CLPFACENAME0 lpFaceName
P_LPFNFENUM lpFontFunc ;
P_DWORD lpData ; CLPVOID0 ?, but often just contains data
; in GETSTUFF.ASM
API DWORD, GetCurrentPosition, TEXT, <ASM,FUNNYFRAME,NODATA,DEBUGONLY> ;nogen
P_HDC hdc ;validated by VALID? (3.0 and 3.1) in GSV
; in WIN32.C
API BOOL GetCurrentPositionEx, TEXT, <FUNNYFRAME, NODATA, DEBUGONLY> ;nogen
P_HDC hdc
P_LPPOINT lpPoint
; in GETSTUFF.ASM
API DWORD, GetDCOrg, TEXT, <ASM,FUNNYFRAME,NODATA,DEBUGONLY> ;nogen
P_HDC hdc ;validated by VALID? (3.0 and 3.1) in GSV
; in GETSTUFF.ASM
API DWORD, GetBrushOrg, TEXT, <ASM,FUNNYFRAME,NODATA,DEBUGONLY> ; nogen
P_HDC hdc ; validated by VALID? (3.0 and 3.1) in GSV
; in WIN32.C
API BOOL, GetBrushOrgEx, TEXT, <FUNNYFRAME, NODATA, DEBUGONLY> ; nogen
P_HDC hdc
P_LPPOINT lpPoint
; in GETSTUFF.ASM
API DWORD, GetBkColor, TEXT, <ASM, FUNNYFRAME,NODATA,DEBUGONLY> ; nogen
P_HDC hdc ;validated by VALID? (3.0 and 3.1) by GSV
; in GETSTUFF.ASM
API int, GetBkMode, TEXT, <ASM,FUNNYFRAME,NODATA,DEBUGONLY> ;nogen
P_HDC hdc ;validated by VALID? (3.0 and 3.1) by GSV
; in GETSTUFF.ASM
API DWORD, GetTextColor, TEXT, <ASM,FUNNYFRAME,NODATA,DEBUGONLY>;nogen
P_HDC hdc ;validated by VALID? (3.0 and 3.1) by GSV
; in GETSTUFF.ASM
API WORD, GetTextAlign, TEXT, <ASM, FUNNYFRAME,DEBUGONLY> ;nogen
P_HDC hdc ;validated by VALID? (3.0 and 3.1) by GSV
; in GETSTUFF.ASM
API int, GetROP2, TEXT, <ASM, FUNNYFRAME, NODATA, DEBUGONLY>
P_HDC hdc ;validated by VALID? (3.0 and 3.1) by GSV
; in GETSTUFF.ASM
API int, GetStretchBltMode, TEXT, <ASM, FUNNYFRAME,NODATA,DEBUGONLY> ;nogen
P_HDC hdc ;validated by VALID? (3.0 and 3.1) by GSV
; in GETSTUFF.ASM
API int, GetPolyFillMode, TEXT, <ASM, FUNNYFRAME,NODATA,DEBUGONLY> ;nogen
P_HDC hdc ;validated by VALID? (3.0 and 3.1) by GSV
; in GETSTUFF.ASM
API int, GetMapMode, TEXT, <ASM, FUNNYFRAME,NODATA,DEBUGONLY> ;nogen
P_HDC hdc ;validated by VALID? (3.0 and 3.1) by GSV
; in GETSTUFF.ASM
API DWORD, GetWindowOrg, TEXT, <ASM, FUNNYFRAME,NODATA,DEBUGONLY> ;nogen
P_HDC hdc ;validated by VALID? (3.0 and 3.1) by GSV
;in WIN32.C
API BOOL, GetWindowOrgEx, TEXT, <FUNNYFRAME,NODATA,DEBUGONLY> ;nogen
P_HDC hdc
P_LPPOINT lpPoint
; in GETSTUFF.ASM
API DWORD, GetWindowExt, TEXT, <ASM, FUNNYFRAME,NODATA,DEBUGONLY> ;nogen
P_HDC hdc ;validated by VALID? (3.0 and 3.1) by GSV
; in WIN32.C
API BOOL, GetWindowExtEx, TEXT, <FUNNYFRAME,NODATA,DEBUGONLY> ;nogen
P_HDC hdc
P_LPSIZE lpSize
; in GETSTUFF.ASM
API DWORD, GetViewportOrg, TEXT, <ASM, FUNNYFRAME,NODATA,DEBUGONLY> ;nogen
P_HDC hdc ;validated by VALID? (3.0 and 3.1) by GSV
; in WIN32.C
API BOOL, GetViewportOrgEx, TEXT, <FUNNYFRAME,NODATA,DEBUGONLY> ;nogen
P_HDC hdc
P_LPPOINT lpPoint
; in WIN32.C
API BOOL, GetViewportExtEx, TEXT, <FUNNYFRAME,NODATA,DEBUGONLY> ;nogen
P_HDC hdc
P_LPSIZE lpSize
; in GETSTUFF.ASM
API DWORD, GetViewportExt, TEXT, <ASM, FUNNYFRAME,NODATA,DEBUGONLY> ;nogen
P_HDC hdc ;validated by VALID? (3.0 and 3.1) by GSV
; in CHARWID.ASM
API BOOL, GetCharWidth, TEXT, <ASM, ATMFRAMEDS>
P_HDC hdc ;validated by VALID? (3.0 and 3.1)
P_LPRWBUFFER chFirst, chLast, lpBuffer, 2 ;** size dictated by
;char. range. Each entry in
;buffer is 2 bytes. Buffer
;filled in DEBUG Win 3.1 only
;lpBuffer is an int. buffer
; in SETPIXEL.ASM
API DWORD, GetPixel, TEXT, <ASM>
P_HDC hdc ;validated by VALID? (3.0 and 3.1)
P_int x
P_int y
; in SETPIXEL.ASM
API DWORD, SetPixel, TEXT, <ASM>
P_HDCMETA hdc ; validated by VALID? (3.0 and 3.1)
P_int x
P_int y
P_COLORREF color
APIERR
mov ax, -1
cwd
APIEND
; in STOCK.ASM
API HANDLE, GetStockObject, TEXT, <ASM>
P_VALUE nIndex, STOCK_MAX ; ** range 0-STOCK_MAX
; in GDIINQ1.ASM
API LONG, GetBitmapBits, TEXT, <ASM, FUNNYFRAME,NODATA>
P_HBITMAP hBitmap ;validated by VALID? (3.0 and 3.1)
P_LPBUFFERDW dwCount, lpBits ;** buffer size a DWORD
;buffer filled in DEBUG Win 3.1
; in GDIINQ1.ASM
API int, GetDeviceCaps, TEXT, <ASM>
P_HDCMETA hdc ;validated by VALID? (3.0 and 3.1)
P_DEVCAP nIndex ;** valid int. indices even-numbered
;ranges 0-44, 88-90, 104-108.
; in GDIINQ1.ASM
API LONG, SetBitmapBits, TEXT, <ASM, FUNNYFRAME,NODATA> ;nogen
P_HBITMAP hBitmap ; validated by VALID? (3.0 and 3.1) in BitmapBits
P_CLPBUFFERDW dwCount, lpBits ;** buffer size a DWORD
;buffer filled in DEBUG Win 3.1
; in GDIINQ2.ASM
API int, GetObject, TEXT, <ASM>
P_HGDIOBJGET hObject ;** Validated by VALID? (3.0 and 3.1)
; pens, brushes, fonts, bitmaps &
; palettes.
P_LPBUFFERX nCount, lpObject ;** nCount occurs before lpBits
;buffer filled in DEBUG Win 3.1
; in FASPECT.ASM
API DWORD, GetAspectRatioFilter, TEXT, <ASM>
P_HDC hdc ;validated by VALID? (3.0 and 3.1)
; in WIN32.C
API BOOL, GetAspectRatioFilterEx, TEXT
P_HDC hdc
P_LPSIZE lpSize
; in FASPECT.ASM
API DWORD, SetMapperFlags, TEXT, <ASM>
P_HDCMETA hdc ; validated by VALID? (3.0 and 3.1) in WordSet
P_DFLAGS dwFlag, MAPFLG_VALID_L, MAPFLG_VALID_H ; ** only bit #1 is recognized
; in XFORMMAN.ASM
API DWORD, GetNearestColor, TEXT, <ASM>
P_HDC hdc ; validated by VALID? (3.0 and 3.1)
P_COLORREF color
; in XFORMMAN.ASM
API DWORD, OffsetViewportOrg, TEXT, <ASM, FUNNYFRAME,NODATA> ;nogen
P_HDCMETA hdc ;validated by VALID? (3.0 and 3.1) in OffsetOrg
P_int x
P_int y
; in WIN32.C
API BOOL, OffsetViewportOrgEx, TEXT, <FUNNYFRAME,NODATA> ;nogen
P_HDCMETA hdc
P_int x
P_int y
P_LPPOINT0 lpPoint
; in XFORMMAN.ASM
API DWORD, OffsetWindowOrg, TEXT, <ASM, FUNNYFRAME,NODATA> ;nogen
P_HDCMETA hdc ;validated by VALID? (3.0 and 3.1) in OffsetOrg
P_int x
P_int y
; in WIN32.C
API BOOL, OffsetWindowOrgEx, TEXT, <FUNNYFRAME,NODATA> ;nogen
P_HDCMETA hdc
P_int x
P_int y
P_LPPOINT0 lpPoint
; in XFORMMAN.ASM
API int, SetMapMode, TEXT, <ASM>
P_HDCMETA hdc ;validated by VALID? (3.0 and 3.1)
P_RVALUE nMapMode, MM_MIN, MM_MAX ;** range 1-8
; in XFORMMAN.ASM
API DWORD, SetWindowExt, TEXT, <ASM,FUNNYFRAME,NODATA> ;nogen
P_HDCMETA hdc ;validated by VALID? (3.0 and 3.1) in SetWinViewExt
P_int x
P_int y
; in WIN32.C
API BOOL SetWindowExtEx, TEXT, <FUNNYFRAME,NODATA> ;nogen
P_HDCMETA hdc
P_int x
P_int y
P_LPSIZE0 lpSize
; in XFORMMAN.ASM
API DWORD, SetViewportExt, TEXT, <ASM,FUNNYFRAME,NODATA> ;nogen
P_HDCMETA hdc ;validated by VALID? (3.0 and 3.1) in SetWinViewExt
P_int x
P_int y
; in WIN32.C
API BOOL, SetViewportExtEx, TEXT, <FUNNYFRAME,NODATA> ;nogen
P_HDCMETA hdc
P_int x
P_int y
P_LPSIZE0 lpSize
; in XFORMMAN.ASM
API DWORD, ScaleViewportExt, TEXT, <ASM,FUNNYFRAME,NODATA> ;nogen
P_HDCMETA hdc ;validated by VALID? (3.0 and 3.1) in ScaleExt
P_int xNum
P_intN0 XDenom ;calls MulDiv
P_int yNum
P_intN0 YDenom ;calls MulDiv
; in WIN32.C
API BOOL, ScaleViewportExtEx, TEXT, <FUNNYFRAME,NODATA> ;nogen
P_HDCMETA hdc ;validated by VALID? (3.0 and 3.1) in ScaleExt
P_int xNum
P_intN0 XDenom ;calls MulDiv
P_int yNum
P_intN0 YDenom ;calls MulDiv
P_LPSIZE0 lpSize
; in XFORMMAN.ASM
API DWORD, ScaleWindowExt, TEXT, <ASM,FUNNYFRAME,NODATA> ;nogen
P_HDCMETA hdc ;validated by VALID? (3.0 and 3.1) in ScaleExt
P_int xNum
P_intN0 XDenom ;calls MulDiv
P_int yNum
P_intN0 YDenom ;calls MulDiv
; in WIN32.C
API BOOL, ScaleWindowExtEx, TEXT, <FUNNYFRAME,NODATA> ;nogen
P_HDCMETA hdc ;validated by VALID? (3.0 and 3.1) in ScaleExt
P_int xNum
P_intN0 XDenom ;calls MulDiv
P_int yNum
P_intN0 YDenom ;calls MulDiv
P_LPSIZE0 lpSize
; in CLIPMAN.ASM
API int, GetRgnBox, TEXT, <ASM>
P_HRGN hrgn ;validated by VALID? (3.0 and 3.1)
P_LPRECT lpRect ;buffer filled in DEBUG Win 3.1
; in GETTEXTE.ASM
API DWORD, GetTextExtent, TEXT, <ASM, ATMFRAMEDS>
P_HDC hdc ;validated by VALID? (3.0 and 3.1)
P_CLPBUFFER lpString, nCount
; win WIN32.C
API BOOL, GetTextExtentPoint, TEXT
P_HDC hdc
P_CLPBUFFER lpString, nCount
P_LPSIZE lpSize
; in TEXTATTS.ASM
API int, GetTextCharacterExtra, TEXT, <ASM>
P_HDC hdc ;validated by VALID? (3.0 and 3.1)
; in GETTEXTF.ASM
API int, GetTextFace, TEXT, <ASM>
P_HDC hdc ;validated by VALID? (3.0 and 3.1)
P_LPBUFFERX lpFaceName, nBytes ;nBytes occurs before lpFaceName
;buffer filled in DEBUG Win 3.1
APIERR
E_SETEMPTY lpFaceName, nBytes
APIEND
; in GETTEXTM.ASM
API BOOL, GetTextMetrics, TEXT, <ASM>
P_HDC hdc ;validated by VALID? (3.0 and 3.1)
P_LPTEXTMETRIC lptm ;**buffer filled in DEBUG Win 3.1
; in ENVIRON.ASM
API int, GetEnvironment, TEXT, <ASM>
P_CLPSTR lpPortName ; ** converted to atom after
; stripping off colons
P_LPBUFFER0 lpEnviron, nBytes ; NULL => return env. block size
; buffer filled in DEBUG Win 3.1
APIERR
E_SETEMPTY lpEnviron, nBytes
APIEND
; in ENVIRON.ASM
API int, SetEnvironment, TEXT, <ASM>
P_CLPSTR lpPortName ; converted to atom after stripping off ":"s
P_CLPBUFFER lpEnviron, wCount ; buffer filled in DEBUG Win 3.1
; in ADDFONTR.ASM
API int, AddFontResource, TEXT, <ASM>
P_CLPSTRHRSRC lpFileName ; ** null-terminated filename or handle to
; loaded resource handle in LOWORD
; in DELFONT.ASM
API BOOL, RemoveFontResource, TEXT, <ASM>
P_CLPSTRHRSRC lpFileName ; ** null-terminated filename or handle to
; loaded resource handle in LOWORD
; in FONTENG2.ASM (new for Win 3.1)
API BOOL, CreateScalableFontResource, TEXT, <ASM>
F_VALUE fEmbed, 1
P_CLPSTR lpResFileName
P_CLPSTR lpFntFileName
P_CLPSTR0 lpCurrentPath
STRUCT <MAT2>
F_WORD fract1
F_int value1
F_WORD fract2
F_int value2
F_WORD fract2
F_int value4
F_WORD fract4
F_int value4
ENDSTRUCT
_GenLP <P_LPMAT2>,<LP>,%VLcbsMAT2
; in FONTENG2.ASM (new for Win 3.1)
API DWORD, GetGlyphOutline, TEXT, <ASM>
P_HDC hdc ; validated by VALID?
P_WORD cch
P_FLAGS wFlags, GLYPH_VALID ; ** 0,1,2
P_LPGLYPHMETRICS lpMetrics
P_LPGGO0 cbBuffer, lpPoints
P_LPMAT2 lpXForm
APIERR
mov ax,-1
cwd
APIEND
; in FONTENG2.ASM (new for Win 3.1)
API DWORD, GetFontData, TEXT, <ASM>
P_HDC hdc ; validated by VALID?
P_DWORD dwTable
P_DWORD dwOffset
P_LPFDATA0 lpBuffer, cbBuffer
APIERR
mov ax,-1
cwd
APIEND
; in FONTENG2.ASM (new for Win 3.1)
API BOOL, GetCharABCWidths, TEXT, <ASM>
P_HDC hdc ; validated by VALID?
P_LPRWBUFFER chFirst, chLast, lpBuffer, 6 ;size dictated by
;char. range. Buffer filled
;in DEBUG Win 3.1 only
;Each entry in lpBuffer is
;of 6 bytes.
; in FONTENG2.ASM (new for Win 3.1)
API BOOL GetOutlineTextMetrics, TEXT, <ASM>
P_HDC hdc ;validated by VALID?
P_LPETM0 cb, lpBuffer ;** NULL ptr. is valid
;Buffer filled in DEBUG Win 3.1
STRUCT <KERNINGPAIR>
F_WORD wFirst
F_WORD wSecond
F_int iKernAmount
ENDSTRUCT
P_LPKERNINGPAIRS0 macro ckp, lpkp
_DefParm <ckp>,2,<opts>
_DefParm <lpkp>,4,<opts>
if VLgen
_FlsFrame
mov ax,VLcbsKERNINGPAIR ; bx = ckp * sizeof(KERNINGPAIR)
mul word ptr _P_&ckp
xchg ax,bx
mov ax,_P_&lpkp ; cx:ax = lpkp
mov cx,_P_&lpkp+2
lcall LP0
endif
endm
API int GetKerningPairs, TEXT
P_HDC hdc
P_LPKERNINGPAIRS0 ckp, lpkp
; in OUTMAN.ASM
API BOOL, LineTo, TEXT, <ASM>
P_HDCNOIC hdc ;validated by VALID? (3.0 and 3.1)
P_int x
P_int y
; in OUTMAN.ASM
API DWORD, MoveTo, TEXT, <ASM>
P_HDCMETA hdc ;validated by VALID? (3.0 and 3.1) in DPXlate
P_int x
P_int y
; in WIN32.C
API BOOL, MoveToEx, TEXT
P_HDCMETA hdc
P_int x
P_int y
P_LPPOINT0 lpPoint
; in OUTMAN.ASM
API BOOL, Polyline, TEXT, <ASM>
P_HDCNOIC hdc ;validated by VALID? (3.0 and 3.1)
P_CLPPOINTBUFFER lpPoints, nCount
; in LINEDDA.ASM
API void, LineDDA, TEXT, <ASM, FUNNYFRAME>
P_XY1XY2 x1,y1,x2,y2 ; overflow problem here too?
P_LPFNLENUM lpFontFunc ; **
P_DWORD lpData ; CLPVOID0 ?, but often just contains data
; in MULDIV.ASM
API int, MulDiv, TEXT, <ASM, NOGEN>
P_int a
P_int b
P_intN0 c ;** MulDiv checks for overflow
; in POLYGON.ASM
API BOOL, Polygon, TEXT, <ASM>
P_HDCNOIC hdc ;validated by VALID? (3.0 and 3.1)
P_CLPPOINTBUFFER lpPoints, nCount
; in POLYGON.ASM
API BOOL, PolyPolygon, TEXT, <ASM>
P_HDCNOIC hdc ;validated by VALID? (3.0 and 3.1)
P_POLYPOLYPOINTS lpPoints, lpPolyCounts, nCount ;lpPolyCounts is a buffer
;of nCount Integers. lpPoints
;is a buffer of POINTS. Size of
;lpPoints det. by sum of all
;integers in lpPolyCounts
ifdef WOW
API BOOL, PolyPolylineWOW, TEXT, <ASM>
P_HDCNOIC hdc ;validated by VALID? (3.0 and 3.1)
P_POLYPOLYLARGEPOINTS lpPoints, lpPolyCounts, nCount
endif
; in PATBL.ASM
API BOOL, StretchBlt, TEXT, <ASM>
P_HDCNOIC hdcDst ; validated by VALID? (3.0 and 3.1)
P_int xDst
P_int yDst
P_int cxDst
P_int cyDst
P_HDC hdcSrc ; validated by VALID? (3.0 and 3.1)
P_int xSrc
P_int ySrc
P_int cxSrc
P_int cySrc
P_ROP rop
; in PATBL.ASM
API BOOL, BitBlt, TEXT, <ASM>
P_HDCNOIC hdcDst ; validated by VALID? (3.0 and 3.1)
P_int xDst
P_int yDst
P_int cxDst
P_int cyDst
P_HDC0 hdcSrc ; ** hSrcDC Used only if higher 2 bits of each
P_int cxSrc ; nibble of HIWORD(rop) != lower 2 bis of
P_int cySrc ; same nibble. Validated by VALID? (3.1 only)
P_ROP rop ; XSrc and YSrc are int. values.
; in PATBL.ASM
API BOOL, PatBlt, TEXT, <ASM>
P_HDCNOIC hdc ;validated by VALID? (3.0 and 3.1)
P_int x
P_int y
P_int cx
P_int cy
P_ROP rop ; ** Only HIWORD used. LOWORD carried
; around for 1.x driver compatiblity
; in GETPOBJ.ASM
API DWORD, SetBrushOrg, TEXT, <ASM>
P_HDC hdc ; validated by VALID? (3.0 and 3.1)
P_int x
P_int y
; in GETPOBJ.ASM
API BOOL, UnrealizeObject, TEXT, <ASM>
P_HGDIOBJUNR hObject ;** brush or palette
;cannot be selected into any DC
; in CLIPMAN.ASM
API int, ExcludeClipRect, TEXT, <ASM, FUNNYFRAME,NODATA>
P_HDCMETA hdc ;validated by VALID? (3.0 and 3.1) in RectStuff
P_XY1XY2 x1,y1,x2,y2
; in CLIPMAN.ASM
API int, GetClipBox, TEXT, <ASM>
P_HDC hdc ;validated by VALID? (3.0 and 3.1)
P_LPRECT lpRect ;buffer filled in DEBUG Win 3.1
; in CLIPMAN.ASM
API int, IntersectClipRect, TEXT, <ASM, FUNNYFRAME,NODATA> ; nogen
P_HDCMETA hdc ;validated by VALID? (3.0 and 3.1) in RectStuff
P_XY1XY2 x1,y1,x2,y2
; in CLIPMAN.ASM
API int, SelectClipRgn, TEXT, <ASM>
P_HDCMETA hdc ; validated by VALID? (3.0 and 3.1)
P_HRGN0 hrgn ; validated by VALID? (3.0), VALIDDEBUG? (3.1)
; in RG.ASM
API HRGN, CreateRectRgnIndirect, TEXT, <ASM>
P_CLPRECT lpRect
; in RG.ASM
API BOOL, EqualRgn, TEXT, <ASM>
P_HRGN hrgn1 ;validated by VALID? (3.0 and 3.1) in RectStuff
P_HRGN hrgn2 ;validated by VALID? (3.0 and 3.1) in RectStuff
; in RG.ASM
API BOOL, RectInRegion, TEXT, <ASM, FUNNYFRAME> ;nogen
P_HRGN hrgn ;validated by VALID? (3.0), ValidDebug? (3.1) StuffInRegion
P_CLPRECT lpRect
; in RG.ASM
API BOOL, RectVisible, TEXT, <ASM, FUNNYFRAME> ; nogen
P_HDC hdc ;validated by VALID? (3.0), ValidDebug? (3.1) StuffVisible
P_CLPRECT lpRect
; in RG.ASM
API int, OffsetRgn, TEXT, <ASM>
P_HRGN hrgn ;validated by VALID? (3.0 and 3.1)
P_int x
P_int y
; in RG.ASM
API int, OffsetClipRgn, TEXT, <ASM>
P_HDCMETA hdc ;validated by VALID? (3.0 and 3.1)
P_int x
P_int y
; in REGION.ASM
API HRGN, CreateRectRgn, TEXT, <ASM, NOGEN>
P_XY1XY2 x1,y1,x2,y2 ; X2-X1 and Y2-Y1 under 32,767 units
; in REGION.ASM
API int, CombineRgn, TEXT, <ASM>
P_HRGN hrgnDst ;validated by VALID? (3.0 and 3.1)
P_HRGN hrgnSrc1 ;validated by VALID? (3.0 and 3.1)
P_HRGN0 hrgnSrc2 ;validated by VALID? (3.0 and 3.1)
; Can be NULL if code is RGN_COPY
P_RVALUE code, RGN_MIN, RGN_MAX ;** range 1-5
; in REGION.ASM
API void, SetRectRgn, TEXT, <ASM>
P_HRGN hrgn ; validated by VALID? (3.0 and 3.1)
P_XY1XY2 x1,y1,x2,y2
; in RGOUT.C
API BOOL, FillRgn, TEXT
P_HDCNOIC hdc ; Checked by Valid()
P_HRGN hrgn ; Checked by Valid()
P_HBRUSH hBrush ; Checked by Valid()
; in RG.ASM
API BOOL, PtInRegion, TEXT, <ASM>
P_HRGN hrgn ;checked by Valid() (3.0 and 3.1)
P_int x
P_int y
; in RGOUT.C
API BOOL, PaintRgn, TEXT
P_HDCNOIC hdc ;checked by Valid() (3.0 and 3.1)
P_HRGN hrgn ;checked by Valid() (3.0 and 3.1)
; in RG.ASM
API BOOL, PtVisible, TEXT, <ASM>
P_HDC hdc ;validated by Valid() (3.0 and 3.1)
P_int x
P_int y
; in RGOUT.C
API BOOL, FrameRgn, TEXT
P_HDCNOIC hdc ; Checked by Valid()
P_HRGN hrgn ; Checked by Valid()
P_HBRUSH hBrush ; Checked by Valid()
P_int cx
P_int cy
; in RGOUTZ.ASM
API BOOL, InvertRgn, TEXT, <ASM>
P_HDCNOIC hdc ;validated by VALID? (3.0 and 3.1)
P_HRGN hrgn ;validated by VALID? (3.0 and 3.1)
; in OBJSEL.ASM
API HANDLE, SelectObject, TEXT, <ASM, ATMFRAMEDS>
P_HDCMETA hdc ; validated by VALID? (3.0 and 3.1)
P_HGDIOBJSEL hObj ; ** validated by VALID? (3.0 and 3.1)
; only pens, brushes, fonts, bitmaps &
; regions (no palettes)
; in COLOR.ASM
API DWORD, SetTextColor, TEXT, <ASM>
P_HDCMETA hdc ; validated by VALID? (3.0 and 3.1)
P_COLORREF color
; in COLOR.ASM
API DWORD, SetBkColor, TEXT, <ASM>
P_HDCMETA hdc ; validated by VALID? (3.0 and 3.1)
P_COLORREF color
APIERR
mov dh,80h ;; return 0x8000:0x0000
APIEND
; in NEWXFORM.ASM
API int, SetBkMode, TEXT, <ASM,FUNNYFRAME,NODATA> ;nogen
P_HDCMETA hdc ; validated by VALID? (3.0 and 3.1) in WordSet
P_RVALUE nBkMode, BK_MIN, BK_MAX ; range 1-2
; in NEWXFORM.ASM
API WORD, SetTextAlign, TEXT, <ASM,FUNNYFRAME> ;nogen
P_HDCMETA hdc ; validated by VALID? (3.0 and 3.1) in WordSet
P_FLAGS wFlags, TA_VALID ; **
; in NEWXFORM.ASM
API int, SetROP2, TEXT, <ASM, FUNNYFRAME,NODATA> ;nogen
P_HDCMETA hdc ; validated by VALID? (3.0 and 3.1) in WordSet
P_RVALUE nDrawMode, R2_MIN,R2_MAX ; ** range 1-16
; in NEWXFORM.ASM
API int, SetStretchBltMode, TEXT, <ASM, FUNNYFRAME,NODATA> ;nogen
P_HDCMETA hdc ;validated by VALID? (3.0 and 3.1) in WordSet
P_RVALUE nStrMode, STR_MIN, STR_MAX ;** range 1-3
; in NEWXFORM.ASM
API int, SetPolyFillMode, TEXT, <ASM,FUNNYFRAME,NODATA> ;nogen
P_HDCMETA hdc ;validated by VALID? (3.0 and 3.1) in WordSet
P_RVALUE nPolyFillMode,PFILL_MIN, PFILL_MAX ; ** range 1-2
; in NEWXFORM.ASM
API DWORD, SetWindowOrg, TEXT, <ASM>
P_HDCMETA hdc ;validated by VALID? (3.0 and 3.1)
P_int x
P_int y
; in WIN32.C
API BOOL, SetWindowOrgEx, TEXT
P_HDCMETA hdc
P_int x
P_int y
P_LPPOINT0 lpPoint
; in NEWXFORM.ASM
API DWORD, SetViewportOrg, TEXT, <ASM>
P_HDCMETA hdc ;validated by VALID? (3.0 and 3.1)
P_int x
P_int y
; in WIN32.C
API BOOL, SetViewportOrgEx, TEXT
P_HDCMETA hdc
P_int x
P_int y
P_LPPOINT0 lpPoint
;----------------------------------------------------------------------------;
; D I B V A L I D A T I O N R O U T I N E S ;
;----------------------------------------------------------------------------;
; NOTES: ;
; ;
; (1). The size of a color table entry is sizeof RGB_TRIPLE for a core DIB ;
; header and RGB_QUAD for a info DIB header. However, if wUsage ;
; indicates a npalette usage, the size per entry is 2 bytes. ;
; ;
; (2). The lpInfoHeader paramater in CreateDIBitmap may not have a color ;
; table in the header. ;
; ;
; (3). For SetDIBits/GetDIBits and SetDIBitsToDevice, a 'numScans' parameter ;
; specifies the size of the DIBits. The buffer may not contain the ;
; complete DIB. ;
; ;
; However, in the case of StretchDIBits, the entire DIB buffer should ;
; be present and the height of the DIB should be picked up from the ;
; associated header. Likewise, if an initializer DIB is provided in the ;
; CreateDIBitmap call, it has to have a complete DIB buffer. ;
; ;
; (4). SetDIBitsToDevice specifies a rectangle in the DIB. This is the only ;
; part of the DIB that will be accessed. The validation code should ;
; figure out the amount of the DIB buffer that will need to ve accessed ;
; and validate that the buffer is big enough for it. ;
; ;
; (5). If the DIB is RLE compressed and the biSizeImage field is non zero, ;
; we will use that size to validate the length of the DIB buffer. ;
; ;
; (6). The validation code will not validate the bits per pixel and the ;
; biCompression fields. This is to allow expansion of these fields in ;
; the future. The validation code for these would instead be done in ;
; the DIB simulation code. ;
;----------------------------------------------------------------------------;
; in DIBITM.ASM
API int, SetDIBits, TEXT, <ASM>
P_HDCNOIC hdc ;validated by VALID? (3.0 and 3.1)
P_HANDLE hBitmap ;validated by VALID? (3.1 only)
;must not be selected into a DC
P_WORD nStartScan
P_CLPBITSINFOBUFFER nNumScans, lpBits, lpBitsInfo, wUsage
;** lpBits size depends on number of
;scans and info. in lpBitsInfo
;lpBitsInfo points to BITMAPINFO
;or BITMAPCOREINFO
; in DIBITM.ASM
API HBITMAP, CreateDIBitmap, TEXT, <ASM>
P_HDCNOIC hdc ; validated by VALID? (3.0 and 3.1)
P_CLPBITMAPINFOHEADER lpInfoHeader ; ** ptr. to BITMAPINFOHEADER or BITMAPCOREHEADER
P_CLPDIBITMAP0 dwUsage, lpInitBits, lpInitInfo, wUsage
; ** lpInitBits NULL if
; dwUsage is not CBM_INIT
; Size of lpInitBits depends
; on fields in info. block
; lpInitInfo points to BITMAPINFO
; or BITMAPCOREINFO
; in DIBITM.ASM
API int, SetDIBitsToDevice, TEXT, <ASM>
P_HDCNOIC hdc ;validated by VALID? (3.0 and 3.1)
P_WORD xDst
P_WORD yDst
P_WORD cxDst
P_CLPRECTBITSINFOBUFFER cyDst, xSrc, ySrc, nStartScan,nNumScans, lpBits, lpBitsInfo, wUsage
;** lpBits size depends on number of
;scans and info. in lpBitsInfo
;lpBitsInfo points to BITMAPINFO
;or BITMAPCOREINFO
; in DIBITM.ASM
API int, GetDIBits, TEXT, <ASM>
P_HDC hdc ;validated by VALID? (3.0 and 3.1)
P_HANDLE hBitmap ;validated by VALID? (3.1 only)
P_WORD nStartScan
P_LPBITSINFOBUFFER0 nNumScans, lpBits, lpBitsInfo, wUsage
;**lpBits
;can be NULL.
;buffer size depends on number of
;scans and info. in lpBitsInfo
;lpBitsInfo is a ptr. to
;BITMAPINFO or BITMAPCOREINFO
; in DIBSTRCH.ASM
API int, StretchDIBits, TEXT, <ASM>
P_HDCNOIC hdc ;validated by VALID? (3.0 and 3.1)
P_WORD xDst
P_WORD yDst
P_WORD cxDst
P_WORD cyDst
P_WORD xSrc
P_WORD ySrc
P_WORD cxSrc
P_WORD cySrc
P_CFULLLPBITSINFOBUFFER lpBits, lpBitsInfo, wUsage
;** lpBits size depends on height
;and info. in lpBitsInfo
;lpBitsInfo points to BITMAPINFO
;or BITMAPCOREINFO
P_ROP rop
;----------------------------------------------------------------------------;
; in TEXTOUT.C
API BOOL, ExtTextOut, TEXT, <ATMFRAMEDS>
P_HDCNOIC hdc ; checked by Valid()
P_int x
P_int y
P_FLAGS flags, ETO_VALID ; ** (1,2,4)
P_CLPRECT0 lprc
P_CLPETOBUF lpString, nCount, lpDx ;lpDx is NULL or has nCount integers
; in TEXTOUT.C
API BOOL, TextOut, TEXT
P_HDCNOIC hdc
P_int X
P_int Y
P_CLPBUFFER lpString, nCount