;-------------------------------------------------------------------------- ifdef DEBUG DEBUG_RETAIL equ 1 endif ; ifdef DEBUG ;-------------------------------------------------------------------------- ?PLM = 1 ?WIN = 0 PMODE = 1 .xlist include cmacros.inc include windows.inc include mmsystem.inc ; include logerror.inc include mmddk.inc .list ;-------------------------------------------------------------------------- ;/* Error modifier bits */ ERR_WARNING equ 08000h ERR_PARAM equ 04000h ;/* Generic parameter values */ ERR_BAD_VALUE equ 06001h ERR_BAD_FLAGS equ 06002h ERR_BAD_INDEX equ 06003h ERR_BAD_DVALUE equ 07004h ERR_BAD_DFLAGS equ 07005h ERR_BAD_DINDEX equ 07006h ERR_BAD_PTR equ 07007h ERR_BAD_FUNC_PTR equ 07008h ERR_BAD_SELECTOR equ 06009h ERR_BAD_STRING_PTR equ 0700ah ERR_BAD_HANDLE equ 0600bh ;/* KERNEL parameter errors */ ERR_BAD_HINSTANCE equ 06020h ERR_BAD_HMODULE equ 06021h ERR_BAD_GLOBAL_HANDLE equ 06022h ERR_BAD_LOCAL_HANDLE equ 06023h ERR_BAD_ATOM equ 06024h ERR_BAD_HFILE equ 06025h ;/* USER parameter errors */ ERR_BAD_HWND equ 06040h ERR_BAD_HMENU equ 06041h ERR_BAD_HCURSOR equ 06042h ERR_BAD_HICON equ 06043h ERR_BAD_HDWP equ 06044h ERR_BAD_CID equ 06045h ERR_BAD_HDRVR equ 06046h DBF_TRACE equ 00000h DBF_WARNING equ 04000h DBF_ERROR equ 08000h DBF_FATAL equ 0c000h ; [Windows] DebugFilter and flags values DBF_KERNEL equ 01000h DBF_USER equ 00800h DBF_GDI equ 00400h DBF_MMSYSTEM equ 00040h DBF_PENWIN equ 00020h DBF_APPLICATION equ 00010h DBF_DRIVER equ 00008h ;-------------------------------------------------------------------------- AssertF macro reg local assert_ok ifdef DEBUG or reg,reg jnz assert_ok int 3 assert_ok: endif endm AssertT macro reg local assert_ok ifdef DEBUG or reg,reg jz assert_ok int 3 assert_ok: endif endm ;-------------------------------------------------------------------------- ; ; DebugErr() macro ; ifdef DEBUG_RETAIL externFP _DebugOutput ; in KERNEL (3.1 or above) DebugErr macro flags,msg local a,b push cs push offset a push flags or DBF_DRIVER call _DebugOutput add sp,6 jmp short b a: db "MSVIDEO: " db msg db 13,10,0 b: endm else ; DEBUG DebugErr macro flags,msg endm endif ; DEBUG ;-------------------------------------------------------------------------- ; Define the return address as a type using the DefD macro in order to ; be able to pass it as a parameter to the LogParamError function. ReturnAddr equ (dword ptr [bp+2]) DefD ReturnAddr ;-------------------------------------------------------------------------- NSTYPE equ 00007h ; Segment type mask NSCODE equ 00000h ; Code segment NSDATA equ 00001h ; Data segment NSITER equ 00008h ; Iterated segment flag NSMOVE equ 00010h ; Movable segment flag NSPURE equ 00020h ; Pure segment flag NSPRELOAD equ 00040h ; Preload segment flag NSRELOC equ 00100h ; Segment has relocations NSDEBUG equ 00200h ; Segment has debug info NSDPL equ 00C00h ; 286 DPL bits NSDISCARD equ 01000h ; Discard bit for segment CODEINFO struc ns_sector dw ? ; File sector of start of segment ns_cbseg dw ? ; Number of bytes in file ns_flags dw ? ; Attribute flags ns_minalloc dw ? ; Minimum allocation in bytes ns_handle dw ? ; handle to object ns_align dw ? ; file alignment CODEINFO ends DSC_CODE_BIT equ 08h ;-------------------------------------------------------------------------- externA __AHINCR externA __WINFLAGS externFP LogParamError ;(WORD wError, FARPROC lpfn, DWORD dValue); externFP IsWindow ;(HWND hwnd); externFP GetCodeInfo ;(FARPROC lpfnProc, LPVOID lpSegInfo); externFP GetCurrentTask ;(void); externFP IsTask ;(HANDLE hTask); ; Windows internal pointer validation tools. externFP IsBadReadPtr ;(LPVOID lp, WORD cb); externFP IsBadWritePtr ;(LPVOID lp, WORD cb); externFP IsBadHugeReadPtr ;(LPVOID lp, DWORD cb); externFP IsBadHugeWritePtr ;(LPVOID lp, DWORD cb); externFP IsBadCodePtr ;(FARPROC lp); externFP IsBadStringPtr ;(LPSTR lpsz, WORD wMaxLen); externFP IsSharedSelector ;(WORD wSelector); ;-------------------------------------------------------------------------- sBegin Data sEnd Data ;-------------------------------------------------------------------------- ;;;createSeg _TEXT, CodeRes, word, public, CODE ;;;createSeg FIX, CodeFix, word, public, CODE createSeg MSVIDEO, CodeRes, word, public, CODE sBegin CodeRes assumes cs, CodeRes assumes ds, Data ;-------------------------------------------------------------------------- ; @doc INTERNAL ; ; @func BOOL | ValidateReadPointer | validates that a pointer is valid to ; read from. ; ; @parm LPVOID | lpPoint| pointer to validate ; @parm DWORD | dLen | supposed length of said pointer ; ; @rdesc Returns TRUE if

is a valid pointer ; Returns FALSE if

is not a valid pointer ; ; @comm will generate error if the pointer is invalid ; cProc ValidateReadPointer, <> parmD lpPoint parmD dLen cBegin cCall IsBadHugeReadPtr, or ax,ax jz ValidateReadPointer_Exit ; Return TRUE cCall LogParamError, mov ax,-1 ; Return FALSE ValidateReadPointer_Exit: not ax cEnd ;-------------------------------------------------------------------------- ; @doc INTERNAL ; ; @func BOOL | ValidateWritePointer | validates that a pointer is valid to ; write to. ; ; @parm LPVOID | lpPoint| pointer to validate ; @parm DWORD | dLen | supposed length of said pointer ; ; @rdesc Returns TRUE if

is a valid pointer ; Returns FALSE if

is not a valid pointer ; ; @comm will generate error if the pointer is invalid ; cProc ValidateWritePointer, <> parmD lpPoint parmD dLen cBegin cCall IsBadHugeWritePtr, or ax,ax ; If not fail, jz ValidateWritePointer_Exit ; Return TRUE cCall LogParamError, mov ax,-1 ; Return FALSE ValidateWritePointer_Exit: not ax cEnd ;-------------------------------------------------------------------------- ; @doc INTERNAL ; ; @func WORD | ValidDriverCallback | ; ; validates that a driver callback is valid, to be valid a driver ; callback must be a valid window, task, or a function in a FIXED DLL ; code segment. ; ; @parm DWORD | dwCallback | callback to validate ; @parm WORD | wFlags | driver callback flags ; ; @rdesc Returns 0 if is a valid callback ; Returns error condition if is not a valid callback ; cProc ValidDriverCallback, <> parmD dCallback parmW wFlags localV ci, %(SIZE CODEINFO) cBegin mov ax, wFlags ; switch on callback type and ax, DCB_TYPEMASK errnz jnz ValidDriverCallback_Window ; case DCB_NULL jmp ValidDriverCallback_Exit ; return zero for success ValidDriverCallback_Window: dec ax errnz jnz ValidDriverCallback_Task ; case DCB_WINDOW cmp dCallback.hi, 0 ; HIWORD must be NULL jnz ValidDriverCallback_BadWindow ; Set error push dCallback.lo ; Check for valid HWND cCall IsWindow, <> or ax, ax ; If HWND, jnz ValidDriverCallback_Success ; Set successful return ValidDriverCallback_BadWindow: ; Else set error return mov ax, ERR_BAD_HWND jmp ValidDriverCallback_Exit ; Return error ValidDriverCallback_Task: dec ax errnz jnz ValidDriverCallback_Function ; case DCB_TASK cmp dCallback.hi, 0 ; HIWORD must be NULL jnz ValidDriverCallback_BadTask ; Set error push dCallback.lo ; Check for valid Task cCall IsTask, <> or ax, ax ; If Task, jnz ValidDriverCallback_Success ; Set successful return ValidDriverCallback_BadTask: ; Else set error return mov ax, ERR_BAD_HANDLE jmp ValidDriverCallback_Exit ; Return error ValidDriverCallback_Function: dec ax errnz ; case DCB_FUNCTION jnz ValidDriverCallback_Default lea ax, ci cCall GetCodeInfo, or ax, ax jz ValidDriverCallback_BadFunction ; Set error return mov ax, ci.ns_flags ; Check for valid flags and ax, NSDATA or NSMOVE or NSDISCARD jz ValidDriverCallback_Exit ; Return zero for success jnz ValidDriverCallback_BadFunction ValidDriverCallback_Default: mov ax, ERR_BAD_FLAGS ; default to error condition jmp ValidDriverCallback_Exit ValidDriverCallback_Success: xor ax, ax ValidDriverCallback_Exit: cEnd ValidDriverCallback_BadFunction: ; Else set error return DebugErr DBF_ERROR, "Driver callbacks MUST be in a FIXED segment of a DLL." mov ax, ERR_BAD_FUNC_PTR jmp ValidDriverCallback_Exit ; Return error ;-------------------------------------------------------------------------- ; @doc INTERNAL ; ; @func BOOL | ValidateDriverCallback | ; ; validates that a driver callback is valid, to be valid a driver ; callback must be a valid window, task, or a function in a FIXED DLL ; code segment. ; ; @parm DWORD | dwCallback | callback to validate ; @parm WORD | wFlags | driver callback flags ; ; @rdesc Returns TRUE if is a valid callback ; Returns FALSE if is not a valid callback ; ; @comm will generate error if the callback is invalid ; cProc ValidateDriverCallback, <> parmD dCallback parmW wFlags cBegin cCall ValidDriverCallback, or ax, ax ; If no error return jz ValidateDriverCallback_Exit ; Return TRUE cCall LogParamError, mov ax, -1 ; Return FALSE ValidateDriverCallback_Exit: not ax cEnd ;-------------------------------------------------------------------------- ; @doc INTERNAL ; ; @func BOOL | ValidateCallback | ; ; validates that a callback is valid. ; ; @parm FARPROC | dCallback | callback to validate ; ; @rdesc Returns TRUE if is a valid callback ; Returns FALSE if is not a valid callback ; ; @comm will generate error if the callback is invalid ; cProc ValidateCallback, <> parmD dCallback cBegin cCall IsBadCodePtr, or ax,ax ; If not fail, jz ValidateCallback_Exit ; Return TRUE cCall LogParamError, mov ax, -1 ; Return FALSE ValidateCallback_Exit: not ax cEnd ;-------------------------------------------------------------------------- ; @doc INTERNAL ; ; @func BOOL | ValidateString | Validates taht a string is valid ; ; ; validates that a callback is valid. cProc ValidateString, <> parmD lsz parmW max_len cBegin cCall IsBadStringPtr, ; Maximum length or ax,ax ; If not fail, jz ValidateString_Exit ; Return TRUE cCall LogParamError, mov ax, -1 ; Return FALSE ValidateString_Exit: not ax cEnd sEnd end