;=========================================================================== ; ; 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 16 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 TEMPLY !!!!!!!!!!! ChandanC ;ExternFP TEMPLY !!!!!!!!!!! ChandanC ;ExternFP 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 ExternFP ENDIF P_LPSIZE equ P_LPSIZE0 equ ; ; 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 ¯o hObj,opts _GenParm ,2, if VLgen IFNDEF WOW mov bx,_P_&&hObj lcall V&name _gensub name _gensub VGOT ENDIF endif &endm P_&name&0 ¯o hObj,opts _GenParm ,2, if VLgen IFNDEF WOW mov bx,_P_&&hObj lcall V&name&0 _gensub name _gensub VGOT ENDIF endif &endm endm _GenHGDI _GenHGDI _GenHGDI _GenHGDI _GenHGDI _GenHGDI _GenHGDI ; HDC variants: HDC - Any kind of DC except a metafile DC _GenHGDI ; Anything including a metafile DC _GenHGDI P_HDCNOTMEM equ ; output-only DC - metafiles ok but no ICs allowed _GenHGDI ; output-only DC - neither metafiles nor ICs allowed _GenHGDI ; GetObject(): Pen, brush, font, palette, or bitmap. ; _GenHGDI ; UnrealizeObject(): Brush or palette ; _GenHGDI ; SelectObject(): pen, brush, font, bitmap, region (no palette) ; _GenHGDI ; Metafile handle ; P_HMETAFILE macro hmf,opts _GenParm ,2, 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 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 ,GDI_OBJECT,lseg,OBJ_PEN,OBJ_METAFILE ; DeleteObject: any kind of object endif ifdef genHPEN&lseg _GenHGDIX ,lseg,HPEN,OBJ_PEN,OBJ_PEN endif ifdef genHBRUSH&lseg _GenHGDIX ,HBRUSH,lseg,OBJ_BRUSH,OBJ_BRUSH endif ifdef genHFONT&lseg _GenHGDIX ,HFONT,lseg,OBJ_FONT,OBJ_FONT endif ifdef genHPALETTE&lseg _GenHGDIX ,HPALETTE,lseg,OBJ_PALETTE,OBJ_PALETTE endif ifdef genHBITMAP&lseg _GenHGDIX ,HBITMAP,lseg,OBJ_BITMAP,OBJ_BITMAP endif ifdef genHRGN&lseg _GenHGDIX ,HRGN,lseg,OBJ_RGN,OBJ_RGN endif ; GetObject(): Pen, brush, font, palette, or bitmap. ; ifdef genHGDIOBJGET&lseg _GenHGDIX ,GDI_OBJECT,lseg,OBJ_PEN,OBJ_BITMAP endif ; UnrealizeObject(): Brush or palette ; ifdef genHGDIOBJUNR&lseg _GenHGDIX ,GDI_OBJECT,lseg,OBJ_BRUSH,OBJ_PALETTE,OBJ_FONT endif ; SelectObject(): pen, brush, font, bitmap, region (no palette) ; ifdef genHGDIOBJSEL&lseg _GenHGDIX ,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,lseg,OBJ_DC,OBJ_METADC endif ; Anything including a metafile DC ifdef genHDCMETA&lseg _GenHGDIX ,HDC,lseg,OBJ_DC,OBJ_METAFILE endif ; output-only DC - metafiles ok but no ICs allowed ifdef genHDCNOIC&lseg _GenHGDIX ,HDC,lseg,OBJ_DC,OBJ_METAFILE,OBJ_IC endif ; output-only DC - neither metafiles nor ICs allowed ifdef genHDCNOICNOMETA&lseg _GenHGDIX ,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_COLORREF equ _GenLP ,,1 _GenLP ,,1 _GenLP ,,2 _GenLP ,,1 P_CLPSTRHRSRC equ _GenLP ,,1 P_CLPFACENAME equ P_CLPFACENAME0 equ P_LPFNABORT0 equ P_LPFNMENUM equ P_LPFNOENUM equ P_LPFNFENUM equ P_LPFNLENUM equ P_intN0 equ P_DEVCAP equ P_PITCHFAMILY equ P_LPPOINTBUFFER macro p, c, opts _DefParm

,4, _DefParm ,2, 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 ,4, _DefParm ,2, 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 F_BYTE peRed F_BYTE peGreen F_BYTE peBlue F_BFLAGS peFlags, PC_VALID ENDSTRUCT P_LPPALENTRYBUFFER macro c, p, opts _DefParm ,2, _DefParm

,4, 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 ,2, _DefParm ,4, 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 , P_LPINT , P_int , endm ifdef WOW P_POLYPOLYLARGEPOINTS macro lppt, lpcpt, ccpt, opts P_LPLARGEPOINT , P_LPDWORD , P_DWORD , endm endif P_XY1XY2 macro x1,y1,x2,y2, opts P_int , P_int , P_int , P_int , endm P_LPBUFFERDW macro cb, lp, opts P_DWORD , P_LPBYTE , endm P_LPBUFFERDW0 macro cb, lp, opts P_DWORD , P_LPBYTE0 , endm P_CLPBUFFERDW macro cb, lp, opts P_DWORD , P_CLPBYTE , endm P_LPBUFFERX macro cb, pb, opts P_int , P_LPBYTE , endm ValidateHugeLP macro cch, lp, r, null local exit ifnb 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 ,2, _GenParm ,2, _GenParm ,4, 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 ,2, _GenParm ,2, 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 ,4, 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 ,4, _DefParm ,4, _DefParm ,4, _DefParm ,2, 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 , P_int , P_int , P_int , P_CLPBYTE0 , endm P_CLPETOBUF macro lpsz, cch, lpdx, opts P_CLPBUFFER0 ,, P_CLPINT0 , endm P_TEXTEXTEX macro lpsz, cch, nMaxExt, lpnFit, lpDx, opts P_CLPBUFFER ,, P_int , P_LPINT0 , P_LPINT0 , 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 F_BYTE rgbBlue F_BYTE rgbGreen F_BYTE rgbRed F_BYTE rgbReserved ENDSTRUCT STRUCT F_BYTE rgbtBlue F_BYTE rgbtGreen F_BYTE rgbtRed ENDSTRUCT STRUCT F_VALUE lbStyle, BS_MAX F_LBCOLOR lbColor F_VALUE lbHatch, HS_MAX ENDSTRUCT _GenLP ,,%VLcbsLOGBRUSH _GenLP ,,%VLcbsLOGBRUSH _GenLP ,,%VLcbsLOGBRUSH _GenLP ,,%VLcbsLOGBRUSH STRUCT 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 ,,%VLcbsLOGFONT _GenLP ,,%VLcbsLOGFONT _GenLP ,,%VLcbsLOGFONT _GenLP ,,%VLcbsLOGFONT STRUCT F_VALUE lopnStyle, PS_MAX F_POINT lopnWidth F_DWORD lopnColor ENDSTRUCT _GenLP ,,%VLcbsLOGPEN _GenLP ,,%VLcbsLOGPEN _GenLP ,,%VLcbsLOGPEN _GenLP ,,%VLcbsLOGPEN STRUCT F_RVALUE nMapMode, MM_MIN, MM_MAX F_int xExt F_int yExt F_HMF hMF ENDSTRUCT _GenLP ,,%VLcbsMETAFILEPICT _GenLP ,,%VLcbsMETAFILEPICT _GenLP ,,%VLcbsMETAFILEPICT _GenLP ,,%VLcbsMETAFILEPICT STRUCT ;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 ,,%VLcbsTEXTMETRIC _GenLP ,,%VLcbsTEXTMETRIC _GenLP ,,%VLcbsTEXTMETRIC _GenLP ,,%VLcbsTEXTMETRIC ; OutlineTextMetrics return buffer ; P_LPETM0 macro cch, lpch, opts _DefParm ,2, _DefParm ,4, 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 ,4, _DefParm ,4, 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 ,4, _DefParm ,4, if VLgen _FlsFrame ValidateHugeLP _P_&cch, _P_&lpch, IsBadHugeWritePtr, NULL endif endm ;---------------------------------------------------------------------------; ; hugw pointer validation routine. STRUCT ;only used for output F_WORD gmBlackBoxX F_WORD gmBlackBoxY F_POINT gmptGlyphOrigin F_short gmCellIncX F_short gmCellIncY ENDSTRUCT _GenLP ,,%VLcbsGLYPHMETRICS _GenLP ,,%VLcbsGLYPHMETRICS _GenLP ,,%VLcbsGLYPHMETRICS _GenLP ,,%VLcbsGLYPHMETRICS STRUCT METARECORD F_DWORD rdSize F_WORD rdFunction F_WORD rdParm ;var. length field ENDSTRUCT _GenLP ,,%VLcbsMETARECORD _GenLP ,,%VLcbsMETARECORD _GenLP ,,%VLcbsMETARECORD _GenLP ,,%VLcbsMETARECORD ;------------------------------- ; special-case macro definitions STRUCT 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 ,4, 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 F_DWSIZE bcSize F_WORD bcWidth F_WORD bcHeight F_CONST bcPlanes, 1 F_BITCOUNT bcBitCount ENDSTRUCT STRUCT 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 ,2, _DefParm ,2, _DefParm ,2, _DefParm ,2, endif if fn and DIB_PART_DIB _DefParm ,2, endif _DefParm ,4, _DefParm ,4, _DefParm ,2, 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 ;fixed-size portion of struct. F_VERSION palVersion F_WORD wEntries ENDSTRUCT P_CLPLOGPALETTE macro lp, opts _GenParm ,4, 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 ,4, 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, 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, P_CLPLOGPALETTE lpLogPal ;** ; in PALETTE.ASM API WORD, GetPaletteEntries, TEXT, 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, P_HPALETTE hPalette ;validated by VALID? (3.0 and 3.1) P_DWORD color ; in PALETTE.ASM API WORD, GetSystemPaletteEntries, TEXT, 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, P_HDC hdc ;validated by VALID? (3.0 and 3.1) ; in PALETTE.ASM API BOOL, ResizePalette, TEXT, P_HPALETTE hPalette ;validated by VALID? (3.0 and 3.1) P_WORD nNumEntries ; in PALETTE.ASM API WORD, SetPaletteEntries, TEXT, 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, P_HDC hdc ;validated by VALID? (3.0 and 3.1) P_WORD wUsage ; in PALETTE.ASM API int, UpdateColors, TEXT, 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 F_int cbSize F_CLPSTR lpszDocName F_CLPSTR0 lpszOutput ENDSTRUCT _GenLP ,,%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, P_HDC0 hdc ; 0 => use screen DC ; in DCMAN1.ASM API HDC, CreateIC ,TEXT, ;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, ;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, P_HDC hdc ; Validated by VALIDDEBUG? (3.1), VALID? (3.0) APIEND ATM_LPFN DeleteDC_lpfn, FreeLibrary ; in DCMAN2.ASM API BOOL, RestoreDC, TEXT, P_HDCMETA hdc P_int level ;number of DC on context stack or -1 ; in DCMAN2.ASM API int, SaveDC, TEXT, 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, 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, P_VALUE style, PS_MAX ; ** range 0-6 P_int cx P_COLORREF color ; ** DWORD ; in OBJMAN.ASM API HPEN, CreatePenIndirect, TEXT, P_CLPLOGPEN lpLogPen ; ** ; in OBJMAN.ASM API HBRUSH, CreateSolidBrush, TEXT, P_COLORREF color ; in OBJMAN.ASM API HBRUSH, CreateHatchBrush, TEXT, P_VALUE nIndex, HS_MAX ; ** range 0-5 P_COLORREF color ; ; in OBJMAN.ASM API HBRUSH, CreatePatternBrush, TEXT, P_HBITMAP hBitmap ; ; in OBJMAN.ASM API HBRUSH, CreateBrushIndirect, TEXT, P_CLPLOGBRUSH lpLogBrush ; ** ; in OBJMAN.ASM API HBITMAP, CreateBitmap, TEXT, ; 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, ; in 3.0 P_CLPBITMAP lpBitmap ; ** ; in OBJMAN.ASM API HBITMAP, CreateCompatibleBitmap, TEXT, ;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, ;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, 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, P_CLPLOGFONT lpLogFont ;** ; in OBJMAN.ASM API HBRUSH, CreateDIBPatternBrush, TEXT, P_GHPACKEDDIB hPackedDIB, wUsage ; in OBJMAN.ASM API DWORD, SetBitmapDimension, TEXT, 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, 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, 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, P_HDCMETA hdc ;validated by VALID? (3.0 and 3.1) P_int nBreakExtra P_int nBreakCount ; in OBJMAN.ASM API int, SetTextCharacterExtra, TEXT, 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, ; is NODATA P_HMETAFILE hMF ; in METAPLAY.ASM API BOOL, PlayMetaFile, TEXT, P_HDCMETA hdc ;validated by Valid() (3.1 only) P_HMETAFILE hMF ; in METAPLAY.ASM API GHANDLE, GetMetaFile, TEXT, 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, ;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, ;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, P_CLPRECT lpRect ; in ARC.ASM API HRGN, CreateEllipticRgn, TEXT, P_XY1XY2 x1,y1,x2,y2 ;X2-X1 and Y2-Y1 under 32,767 units ; in ARC.ASM API HRGN, CreatePolygonRgn, TEXT, P_CLPPOINTBUFFER lpPoints, nCount ;** P_RVALUE nPolyFillMode, PFILL_MIN, PFILL_MAX ;** range 1-2 ; in ARC.ASM API HRGN, CreatePolyPolygonRgn, TEXT, 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, 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, P_HDCNOIC hdc ;validated by VALID? (3.0 and 3.1) P_XY1XY2 x1,y1,x2,y2 ; in ARC.ASM API BOOL, Arc, TEXT, 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, 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, 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, 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, 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, ; calls ExtFloodFill P_HDCNOIC hdc P_int x P_int y P_COLORREF color ; in FLOOD.ASM API BOOL, ExtFloodFill, TEXT, 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 ,2, _DefParm ,2, _DefParm ,4, 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, 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, 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, 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, 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, ;nogen P_HDC hdc ;validated by VALID? (3.0 and 3.1) in GSV ; in WIN32.C API BOOL GetCurrentPositionEx, TEXT, ;nogen P_HDC hdc P_LPPOINT lpPoint ; in GETSTUFF.ASM API DWORD, GetDCOrg, TEXT, ;nogen P_HDC hdc ;validated by VALID? (3.0 and 3.1) in GSV ; in GETSTUFF.ASM API DWORD, GetBrushOrg, TEXT, ; nogen P_HDC hdc ; validated by VALID? (3.0 and 3.1) in GSV ; in WIN32.C API BOOL, GetBrushOrgEx, TEXT, ; nogen P_HDC hdc P_LPPOINT lpPoint ; in GETSTUFF.ASM API DWORD, GetBkColor, TEXT, ; nogen P_HDC hdc ;validated by VALID? (3.0 and 3.1) by GSV ; in GETSTUFF.ASM API int, GetBkMode, TEXT, ;nogen P_HDC hdc ;validated by VALID? (3.0 and 3.1) by GSV ; in GETSTUFF.ASM API DWORD, GetTextColor, TEXT, ;nogen P_HDC hdc ;validated by VALID? (3.0 and 3.1) by GSV ; in GETSTUFF.ASM API WORD, GetTextAlign, TEXT, ;nogen P_HDC hdc ;validated by VALID? (3.0 and 3.1) by GSV ; in GETSTUFF.ASM API int, GetROP2, TEXT, P_HDC hdc ;validated by VALID? (3.0 and 3.1) by GSV ; in GETSTUFF.ASM API int, GetStretchBltMode, TEXT, ;nogen P_HDC hdc ;validated by VALID? (3.0 and 3.1) by GSV ; in GETSTUFF.ASM API int, GetPolyFillMode, TEXT, ;nogen P_HDC hdc ;validated by VALID? (3.0 and 3.1) by GSV ; in GETSTUFF.ASM API int, GetMapMode, TEXT, ;nogen P_HDC hdc ;validated by VALID? (3.0 and 3.1) by GSV ; in GETSTUFF.ASM API DWORD, GetWindowOrg, TEXT, ;nogen P_HDC hdc ;validated by VALID? (3.0 and 3.1) by GSV ;in WIN32.C API BOOL, GetWindowOrgEx, TEXT, ;nogen P_HDC hdc P_LPPOINT lpPoint ; in GETSTUFF.ASM API DWORD, GetWindowExt, TEXT, ;nogen P_HDC hdc ;validated by VALID? (3.0 and 3.1) by GSV ; in WIN32.C API BOOL, GetWindowExtEx, TEXT, ;nogen P_HDC hdc P_LPSIZE lpSize ; in GETSTUFF.ASM API DWORD, GetViewportOrg, TEXT, ;nogen P_HDC hdc ;validated by VALID? (3.0 and 3.1) by GSV ; in WIN32.C API BOOL, GetViewportOrgEx, TEXT, ;nogen P_HDC hdc P_LPPOINT lpPoint ; in WIN32.C API BOOL, GetViewportExtEx, TEXT, ;nogen P_HDC hdc P_LPSIZE lpSize ; in GETSTUFF.ASM API DWORD, GetViewportExt, TEXT, ;nogen P_HDC hdc ;validated by VALID? (3.0 and 3.1) by GSV ; in CHARWID.ASM API BOOL, GetCharWidth, TEXT, 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, P_HDC hdc ;validated by VALID? (3.0 and 3.1) P_int x P_int y ; in SETPIXEL.ASM API DWORD, SetPixel, TEXT, 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, P_VALUE nIndex, STOCK_MAX ; ** range 0-16 ; in GDIINQ1.ASM API LONG, GetBitmapBits, TEXT, 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, 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, ;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, 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, 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, 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, P_HDC hdc ; validated by VALID? (3.0 and 3.1) P_COLORREF color ; in XFORMMAN.ASM API DWORD, OffsetViewportOrg, TEXT, ;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, ;nogen P_HDCMETA hdc P_int x P_int y P_LPPOINT0 lpPoint ; in XFORMMAN.ASM API DWORD, OffsetWindowOrg, TEXT, ;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, ;nogen P_HDCMETA hdc P_int x P_int y P_LPPOINT0 lpPoint ; in XFORMMAN.ASM API int, SetMapMode, TEXT, 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, ;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, ;nogen P_HDCMETA hdc P_int x P_int y P_LPSIZE0 lpSize ; in XFORMMAN.ASM API DWORD, SetViewportExt, TEXT, ;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, ;nogen P_HDCMETA hdc P_int x P_int y P_LPSIZE0 lpSize ; in XFORMMAN.ASM API DWORD, ScaleViewportExt, TEXT, ;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, ;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, ;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, ;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, 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, 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, P_HDC hdc ;validated by VALID? (3.0 and 3.1) ; in GETTEXTF.ASM API int, GetTextFace, TEXT, 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, 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, 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, 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, P_CLPSTRHRSRC lpFileName ; ** null-terminated filename or handle to ; loaded resource handle in LOWORD ; in DELFONT.ASM API BOOL, RemoveFontResource, TEXT, 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, F_VALUE fEmbed, 1 P_CLPSTR lpResFileName P_CLPSTR lpFntFileName P_CLPSTR0 lpCurrentPath STRUCT 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 ,,%VLcbsMAT2 ; in FONTENG2.ASM (new for Win 3.1) API DWORD, GetGlyphOutline, TEXT, 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, 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, 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, P_HDC hdc ;validated by VALID? P_LPETM0 cb, lpBuffer ;** NULL ptr. is valid ;Buffer filled in DEBUG Win 3.1 STRUCT F_WORD wFirst F_WORD wSecond F_int iKernAmount ENDSTRUCT P_LPKERNINGPAIRS0 macro ckp, lpkp _DefParm ,2, _DefParm ,4, 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, P_HDCNOIC hdc ;validated by VALID? (3.0 and 3.1) P_int x P_int y ; in OUTMAN.ASM API DWORD, MoveTo, TEXT, 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, P_HDCNOIC hdc ;validated by VALID? (3.0 and 3.1) P_CLPPOINTBUFFER lpPoints, nCount ; in LINEDDA.ASM API void, LineDDA, TEXT, 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, P_int a P_int b P_intN0 c ;** MulDiv checks for overflow ; in POLYGON.ASM API BOOL, Polygon, TEXT, P_HDCNOIC hdc ;validated by VALID? (3.0 and 3.1) P_CLPPOINTBUFFER lpPoints, nCount ; in POLYGON.ASM API BOOL, PolyPolygon, TEXT, 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, P_HDCNOIC hdc ;validated by VALID? (3.0 and 3.1) P_POLYPOLYLARGEPOINTS lpPoints, lpPolyCounts, nCount endif ; in PATBL.ASM API BOOL, StretchBlt, TEXT, 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, 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, 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, P_HDC hdc ; validated by VALID? (3.0 and 3.1) P_int x P_int y ; in GETPOBJ.ASM API BOOL, UnrealizeObject, TEXT, P_HGDIOBJUNR hObject ;** brush or palette ;cannot be selected into any DC ; in CLIPMAN.ASM API int, ExcludeClipRect, TEXT, 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, 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, ; 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, 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, P_CLPRECT lpRect ; in RG.ASM API BOOL, EqualRgn, TEXT, 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, ;nogen P_HRGN hrgn ;validated by VALID? (3.0), ValidDebug? (3.1) StuffInRegion P_CLPRECT lpRect ; in RG.ASM API BOOL, RectVisible, TEXT, ; nogen P_HDC hdc ;validated by VALID? (3.0), ValidDebug? (3.1) StuffVisible P_CLPRECT lpRect ; in RG.ASM API int, OffsetRgn, TEXT, P_HRGN hrgn ;validated by VALID? (3.0 and 3.1) P_int x P_int y ; in RG.ASM API int, OffsetClipRgn, TEXT, P_HDCMETA hdc ;validated by VALID? (3.0 and 3.1) P_int x P_int y ; in REGION.ASM API HRGN, CreateRectRgn, TEXT, P_XY1XY2 x1,y1,x2,y2 ; X2-X1 and Y2-Y1 under 32,767 units ; in REGION.ASM API int, CombineRgn, TEXT, 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, 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, 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, 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, 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, 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, P_HDCMETA hdc ; validated by VALID? (3.0 and 3.1) P_COLORREF color ; in COLOR.ASM API DWORD, SetBkColor, TEXT, 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, ;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, ;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, ;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, ;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, ;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, 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, 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, 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, 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, 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, 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, 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, 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