windows-nt/Source/XPSP1/NT/base/mvdm/wow16/toolhelp/class2.asm
2020-09-26 16:20:57 +08:00

93 lines
2.8 KiB
NASM

;**************************************************************************
;* CLASS2.ASM
;*
;* Assembly support for the class enumeration routines.
;*
;**************************************************************************
INCLUDE TOOLPRIV.INC
PMODE32 = 0
PMODE = 0
SWAPPRO = 0
INCLUDE TDB.INC
;** Class structure
CLS STRUC
cls_pclsNext DW ?
cls_clsMagic DW ?
cls_atom DW ?
cls_pdce DW ?
cls_RefCount DW ?
cls_style DW ?
cls_lpfnWndProc DD ?
cls_cbclsExtra DW ?
cls_cbwndExtra DW ?
cls_hInstance DW ?
cls_hIcon DW ?
cls_hCursor DW ?
cls_hbrBackgr DW ?
cls_lpszMnName DW ?
cls_lpszClsName DW ?
CLS ENDS
;** External functions
externNP HelperVerifySeg
externFP GetAtomName
;** Functions
sBegin CODE
assumes CS,CODE
; ClassInfo
;
; Returns information about the class with the given block handle
cProc ClassInfo, <PUBLIC,NEAR>, <si,di,ds>
parmD lpClass
parmW wOffset
cBegin
;** Start by verifying that we can read the segment here
mov ax,hUserHeap ;Get the selector
mov bx,wOffset ; and the desired offset
cCall HelperVerifySeg, <ax,bx>
or ax,ax ;FALSE return?
jnz CI_SelOk ;We're OK
xor ax,ax ;Return FALSE
jmp CI_End
CI_SelOk:
;** Point to the CLS structure with DS:SI. Note that using DS to
;** point to USER's DS is useful to get USER's local atoms
mov ax,hUserHeap ;User's heap is User's DGROUP
mov ds,ax
mov si,wOffset ;Get a pointer to the CLS structure
;** Copy the hInstance
les di,lpClass ;Get the structure
mov ax,[si].cls_hInstance ;Get the hInst of the class owner
mov es:[di].ce_hInst,ax ;Save in the CLASSENTRY struct
;** Get the string from the atom and copy the next pointer
mov ax,[si].cls_atom ;Get the desired atom number
lea bx,[di].ce_szClassName ;Get the offset to copy string to
push es ;Save ES (GetAtomName may trash)
mov cx,MAX_CLASSNAME ;Get max classname length
cCall GetAtomName, <ax,es,bx,cx> ;Copy the atom string
pop es
or ax,ax ;OK?
jnz CI_20 ;Yes
mov es:[di].ce_szClassName,0 ;No. Clear the string
CI_20: mov ax,[si].cls_pclsNext ;Get the next pointer
mov es:[di].ce_wNext,ax ;Save it
;** Return TRUE on success
mov ax,TRUE
CI_End:
cEnd
sEnd
END