;NoRO löscht die Schreibschutzbits von CD-Dateien
;Wenn kein Laufwerksbuchstabe angegeben: Nach MSCDEX zu laden!
;Nur für die Handlefunktionen!? Nur CD-Laufwerk 0 betreffend!
include prolog.asm
REQfunc equ 4b49h ;in AX
REQcode equ 987Ah ;in DX, modifiziert zu NORO 1.01
ANScode equ 8767h ;in AX; DX=Segmentadresse
ResPara equ (ISRBase-PSPOrg+ISRE-ISRA+0fh)/16
org 5ch
ctrl0 db ? ;Ein/Aus-Schalter
ahstore db ?
fill db ? ;ehemals CDROM-LW-Buchstabe
curdrive db ? ;Aktuelles Laufwerk
cddrive dd ? ;Diesmal: Bitregister
;Bit7: global ein/aus
ISRBase: ;FCB's überschreiben
org 100h
print Text0 ;Meldung
mov [ctrl0],80h ;Standard laden
xor ax,ax
mov [word LOW cddrive],ax
mov [word HIGH cddrive],ax ;Bits löschen
call InstChk
;nun ch=Statusregister:
;Bit0: Deinstallation nicht möglich
;Bit6: MSCDEX nicht installiert
;Bit7: Noch nicht installiert
mov bp,4c00h ;Normaler DOS-Exit
mov si,81h
cld
scancl: lodsw ;AH=2.Buchstabe
dec si
call UpCase
cmp ah,'+'
je plus
cmp ah,'-'
je plus
cmp ah,':'
jnz sca1
plus:
sub al,'A'
jc scancl
cmp al,26
jnc scancl ;Nur für gültige LW-Buchstaben
call BitMaske
or [es:bx],al ;im residenten Teil patchen, falls vorhanden
and ch,not 40h ;MSCDEX vorgaukeln
cmp ah,'-'
jnz scancl
not al
and [es:bx],al ;Laufwerk aus Liste löschen
jr scancl
sca1: cmp al,'?'
je help
cmp al,'H'
je help
cmp al,'U'
je UnInst
cmp al,'D'
je DisActiv
cmp al,0dh
jne scancl
jmp Install
help: ;Hilfe Option "H" oder "?"
mov dx,offset TextH
jr TXTO1
UnInst: ;Deinstallation(sversuch) Option "U"
test ch,80h
mov dx,offset Text5
jnz TXTO1 ;Wenn nicht nötig!
and ch,0fh ;LOW-Teil (HookedInt-Zähler)
jz Raus
PRINT Text4
mov dx,offset Text4a
disab: and [es:Ctrl0],not 80h
jmp TXTOut
DisActiv:;Deaktivieren Option "D"
test ch,80h
mov dx,ofs Text5
jnz TXTO1
mov dx,ofs Text4
jr disab
;Deinstallation
Raus: lds dx,[es:ofs OldInt21-ISRA+ISRBASE]
DOS 2521h
DOS 49h ;den Speicher ab es freigeben
push cs
pop ds
mov dx,ofs Text3 ;removed...
TXTO1: jmp TXTOut
InstChk:;Installationscheck, ES=Zeiger auf installierte Routine oder n.a.!,
;Bit7(CH)=0: Installationscheck erfolgreich, dann:
;ES: Segmentadresse der residenten Routine
;Bit6(CH)=0: MSCDEX installiert
;Bit0(CH)=0: Zeiger nicht von anderen verbogen, dh. deinstallierbar
DOS 19h ;akt. Laufwerk
mov [curdrive],al
xor bx,bx
INTR 2fh,1500h ;MSCDEX-Laufwerke
mov ch,40h
or bx,bx ;BX=Anzahl CD-Laufwerke
jz notcd
mov ch,bl
loopcd: mov al,cl
call BitMaske
or [bx],al
inc cl ;nächstes Laufwerk
dec ch
jnz loopcd
;xor ch,ch ;unnötig!
notcd:
mov ax,REQfunc
mov dx,REQcode
int 21h
cmp ax,ANScode ;gleich?
jz T21I
or ch,80h
mov dx,ds
T21I: push dx ;Segment der TSR
;Segment retten
DOS 3521h ;Get Int21
SES <OldInt21>,bx
cmp bx,ofs NewInt21-ISRA+ISRBASE
jnz T21FLT
mov bx,es
cmp bx,dx
je T21OK
T21FLT: inc ch ;ch <>0 wenn andere TSR stört
T21OK: pop es
ret
Install:
test ch,80h ;Installationscheck
mov dx,ofs Text2 ;Schon mal laden
jz enab
test ch,40h ;MSCDEX aktiv?
jz DoInst
mov dx,ofs Text2a
mov bp,4c01h ;Fehlercode
jr TXTOut ;Ohne MSCDEX kein NoRO
DoInst: ;ISR nach vorn schaufeln
cld
push cs
pop es
mov si,ofs ISRA
mov di,ofs ISRBase
mov cx,(ISRE-ISRA+1)/2
rep movsw
;Zeiger verbiegen
mov dx,ofs NewInt21-ISRA+ISRBASE
DOS 2521h ;Set Int21
;Environment freigeben
mov es,[2ch] ;Segment Environment
DOS 49h ;ENV-Speicher ab es freigeben
;Test des Hochladens
mov ax,cs
mov es,ax ;Eigenes Programm=Resident!
cmp ax,0a000h
mov dx,ofs Text1
jc NoHi ;unten
mov dx,ofs Text1a
NoHi: ;enabeln
mov bp,3100h ;Residentes Ende
enab: ;DX ist schon OK!
or [es:Ctrl0],80h ;Bit 7 setzen: enabled
DOS 9
PRINT Text6
mov dl,'A'
outloop:mov al,dl
sub al,'A'
call BitMaske
test [es:bx],al
jz notset
DOS 2 ;Laufwerksbuchstaben hintereinander ausgeben
notset:
inc dl
cmp dl,'Z'
jbe outloop
mov dx,ofs Text6a
;dx-adressierten Text ausgeben
TXTOut: DOS 9 ;Textausgabe
;Programm beenden
LFOut: PRINT NL$
mov ax,bp
mov dx,ResPara
int 21h
_UPCASE
ISRA:
BitMaske: ;PE: AL=Bit-Nummer (0..31), PA: BX=Zeiger, AL=Maske
push cx
mov bx,offset cddrive
mov ch,al
mov cl,3
shr ch,cl
add bl,ch
mov cl,al
and cl,7
mov al,1
shl al,cl
pop cx
ret
IsBitSet: push bx
call BitMaske
test [cs:bx],al
pop bx
ret
NewInt21: ;Neue INT21-Routine
pushf
cmp ax,REQfunc ;Installationscheck?
jne I21cont
cmp dx,REQcode
jne I21cont
mov ax,ANScode
mov dx,cs
popf
iret
I21cont:
test [cs:ctrl0],80h
jz isrend
cmp ah,4eh ;FindFirst?
jz Mani
cmp ah,4fh ;FindNext?
jz Mani
cmp ax,4300h ;GetAttr?
je Mani
cmp ah,0eh ;Laufwerk wählen?
jz Mani
isrend: popf
JMPF ;jmp far
OldInt21 dd ?
Mani: mov [cs:AHStore],ah ;speichern
popf
clc
pushf
call [cs:OldInt21+(ISRBase-ISRA)]
jc isre2
pushf
push ax es bx
mov ah,[cs:AHStore] ;holen
cmp ah,0eh ;Laufwerk wählen?
jz AktDrv
cmp ah,43h ;GetAttr?
je ManiAttr
;weiter mit Manipulation der DTA
DOS 2fh ;GetDTA
mov al,[cs:curdrive]
cmp [by es:bx],0 ;CurDrv?
jz nodrv2
mov al,[es:bx] ;Laufwerk aus DTA entnehmen!
dec al
nodrv2: call IsBitSet
jz pops
resbit: and [by es:bx+15h],not 1 ;R/O löschen
pops: pop bx es ax
popf
isre2: sti
retf 2
ManiAttr:
mov bx,dx ;zum Zeigern
mov al,[cs:curdrive]
cmp [by bx+1],':' ;Laufwerksangabe?
jnz nodrv
mov al,[bx]
and al,not 20h ;upcase
sub al,'A' ;A=0
nodrv: call IsBitSet
jz pops
and cl,not 1 ;R/O-Bit löschen
jr pops
AktDrv: DOS 19h
mov [cs:curdrive],al
jr pops
ISRE:
Text0 db 'NoRO 1.1 (haftmann#software): $'
Text1a db 'hoch'
Text1 db 'geladen$'
Text2 db 'reaktiviert$'
Text6 db ', Dateien auf $'
Text6a db ': ohne Schreibschutz$'
Text2a db 'Fehler: MSCDEX nicht geladen!$'
Text3 db 'vom Speicher entfernt.$'
Text4 db 'deaktiviert.$'
Text4a db ' (Andere TSR stahl Int21)$'
Text5 db 'Noch nicht installiert!$'
TextH db ' ++ FREEWARE ++',nl
db 'Programm entfernt lästige Schreibschutzbits von Dateien auf der CD-ROM.',nl
db '(Nur für Handlefunktionen, mehrere Laufwerke)',nl
db 'Parameter: - (keiner) TSR laden oder aktivieren',nl
db ' - Laufwerk: Laufwerk festlegen oder hinzufügen',nl
db ' - Laufwerk+ dito',nl
db ' - Laufwerk- Laufwerk wegnehmen',nl
db ' - h oder ? diese Hilfe',nl
db ' - d NoRO deaktivieren',nl
db ' - u TSR entfernen$'
nl$ db nl,'$'
endc
Detected encoding: OEM (CP437) | 1
|
|