;Die Verkorkstheit von mexPrintf erfordert eine unsch”ne und leider
;nicht reentranzf„hige Methode, das Datensegmentregister zu retten,
;ohne den Stack zu verwenden. Reentrante mexPrintf-Aufrufe werden
;kurzerhand unterbunden, um schwereren Schaden zu vermeiden
;Oder aber, wenn mexPrintf mit ^C abgebrochen werden kann, ist kein
;solcher Schutz m”glich.
ideal
model large,c
P386
;TEST_REENTER equ 1 ;#define: Variante mit oder ohne Reenter-Test
extrn mexPrintf:far ;Import (mit Unterstrich)
extrn _AHINCR:far
extrn _AHSHIFT:far
publicdll DLLMEXPRINTF ;Export (mit Unterstrich)
publicdll pascal INCHP, pascal DECHP, pascal INCHPL
IFDEF TEST_REENTER
DATASEG
RLock db -1
ENDIF
UDATASEG
SaveDS dw ?
RetAdr dd ?
CODESEG
proc DLLMEXPRINTF far
push ds
push @data
pop ds ;Datensegment der CMEX.DLL
IFDEF TEST_REENTER
inc [RLock] ;Wiedereintritts-Z„hler
jnz @@skip ;ungleich Null: Reenter! Sprung!
ENDIF
pop [SaveDS] ;Aufrufers Datensegment
pop [RetAdr] ;Aufrufers Returnadresse (32bit)
call mexPrintf ;gleiche Stack-Schicht: korrekter Aufruf
push [RetAdr]
IFDEF TEST_REENTER
push [SaveDS]
@@skip: dec [RLock]
pop ds
ELSE
mov ds,[SaveDS]
ENDIF
ret
endp
;IncHugePointer - Erh”hen eines Zeigers
proc INCHP pascal
arg P:DWord, By:Word
les bx,[P] ;Adresse von P
mov ax,[By]
add [word LOW es:bx],ax ;Offset inkrementieren
jnc @@e ;kein šberlauf: Selektor belassen!
add [word HIGH es:bx],offset _AHINCR ;Selektor erh”hen
@@e: ret
endp
;DecHugePointer - Erniedrigen eines Zeigers
proc DECHP pascal
arg P:DWord, By:Word
les bx,[P] ;Adresse von P
mov ax,[By]
sub [word LOW es:bx],ax ;Offset dekrementieren
jnc @@e ;kein šberlauf: Selektor belassen!
sub [word HIGH es:bx],offset _AHINCR ;Selektor erniedrigen
@@e: ret
endp
;IncHugePointerLong - Erh”hen und Erniedrigen eines Zeigers
proc INCHPL pascal
arg P:DWord, By:DWord
les bx,[P] ;Adresse von P
mov cx,[word LOW By] ;Hier AX:CX: ungew”hnlich!
mov ax,[word HIGH By]
add [word LOW es:bx],cx ;Offset inkrementieren
adc ax,0 ;Anzahl der 64-K-šberg„nge
shl ax,offset _AHSHIFT ;Vielfaches erzeugen
add [word HIGH es:bx],ax ;Selektor erh”hen bzw. erniedrigen
ret
endp
end
Detected encoding: ANSI (CP1252) | 4
|
|