boot3/Patches/InactiveAppleTalkPatches.a

141 lines
4.5 KiB
Plaintext
Raw Normal View History

;
; File: InactiveAppleTalkOpenPatch.a
;
; Contains: A patch on _Open that prevents existing AppleTalk drivers <20>
; .MPP, .ATP, .DSP, .XPP, & .AFPTranslator <20> from being opened
; if AppleTalk is inactive, and a patch on _Gestalt to return that the 'atkv' selector is undefined. These patches are only applied if
; AppleTalk is inactive on startup.
;
; Written by: Dean Yu
;
; Copyright: <09> 1992 by Apple Computer, Inc., all rights reserved.
;
; Change History (most recent first):
;
; <1> 1/19/92 DTY first checked in
load 'StandardEqu.d'
include 'GestaltEqu.a'
include 'PackMacs.a'
include 'GestaltPrivateEqu.a'
include 'LinkedPatchMacros.a'
kOpenTrap equ $A000
kGestaltTrap equ $A0AD
; ApplyOpenPatchIfAppleTalkIsInactive checks to see if Port B is configured
; for AppleTalk use. If it is, it patches _Open, otherwise, it does nothing.
ApplyOpenPatchIfAppleTalkIsInactive InstallProc (Plus,SE,Portable,II,IIci)
Import DontLetAppleTalkDriversOpen
Import UndefineGestaltAppleTalkSelector
move.l ExpandMem,a0 ;
tst.w ExpandMemRec.emAppleTalkInactiveOnBoot(a0) ; If AppleTalk is active, don<6F>t patch _Open
bz.s @exit ; AppleTalk is active. Bail out.
; AppleTalk is inactive. Apply the patch to _Open that prevents AppleTalk drivers
; from being opened and the patch to _Gestalt to return gestaltUndefSelectorErr for
; requests for the 'atkv' selector.
move.w #kOpenTrap,d0
_GetTrapAddress ; Get address of original _Open
leaResident DontLetAppleTalkDriversOpen,a1 ; Get patch routine
move.l a0,2(a1) ; Save the old _Open
move.w #kOpenTrap,d0
move.l a1,a0
_SetTrapAddress ; Patch _Open
move.w #kGestaltTrap,d0
_GetTrapAddress ,NewOS ; Get address of original _Gestalt
leaResident UndefineGestaltAppleTalkSelector,a1 ; Get patch routine
move.l a0,2(a1) ; Remember real _Gestalt
move.w #kGestaltTrap,d0
move.l a1,a0
_SetTrapAddress ,NewOS
@exit
rts
EndProc
; This is the _Open patch. It checks the ioNamePtr field of the parameter block in A0
; to see if the name is of an AppleTalk driver that should not be opened. If it is,
; _Open is not called, and notOpenErr is returned. If _Open is being called for something
; else, the call is left alone.
DontLetAppleTalkDriversOpen Proc Export
bra.s PatchStart
OldOpenAddress
ds.l 1 ; Fixed up with address of old _Open
PatchStart
movem.l a0/a3-a4/d6-d7,-(sp) ; Save some registers?
move.l ioNamePtr(a0),d0 ; Is there a name?
bz.s @callOldOpen ; No, let this call through
move.l d0,a3
moveq #0,d6
move.b (a3)+,d6 ; Save length of driver name
cmp.b #'.',(a3) ; Driver names always being with a period.
bne.s @callOldOpen ; If it<69>s not a driver that<61>s being opened, let it through.
lea DriversOfInterest,a4 ; Get table of drivers not to open.
moveq #0,d7 ; Used for length of driver name in table
@checkDriverNameLoop
move.b (a4)+,d7 ; Check length byte
bz.s @callOldOpen ; If 0, end of table was reached without a match. Let the driver open.
move.l a3,a0 ; Pointer to first string
move.l a4,a1 ; Pointer to second string
move.w d6,d0 ; Length of first string
swap d0
move.w d7,d0 ; Length of second string
_CmpString ; Are they equal?
tst.l d0
beq.s @dontLetThisDriverOpen ; If equal, don<6F>t let it open.
add.l d7,a4 ; Point to next driver name in table.
bra.s @checkDriverNameLoop ; And check it out.
@dontLetThisDriverOpen
move.w #notOpenErr,d0 ; Report an error
movem.l (sp)+,a0/a3-a4/d6-d7
move.w d0,ioResult(a0) ; Return the error
tst.w d0 ; Set up the condition code
rts ; And return to the caller
@callOldOpen
movem.l (sp)+,a0/a3-a4/d6-d7
move.l OldOpenAddress,-(sp)
rts ; Call the orginal _Open
DriversOfInterest
String Pascal
dc.b '.MPP'
dc.b '.ATP'
dc.b '.XPP'
dc.b '.DSP'
dc.b '.AFPTranslator'
dc.b 0
ALIGN
EndProc
UndefineGestaltAppleTalkSelector Proc Export
bra.s PatchStart
OldGestaltAddress
ds.l 1 ; Placeholder for real _Gestalt routine
PatchStart
cmp.w #kGestaltTrap,d1 ; Gestalt? (As opposed to _NewGestalt or _ReplaceGestalt)
bne.s @toRealGestalt ; No.
cmpi.l #gestaltATalkVersion,d0 ; gestaltATalkVersion?
bne.s @toRealGestalt ; No.
move.w #gestaltUndefSelectorErr,d0 ; Pretend this selector is undefined.
moveq #0,a0
rts
@toRealGestalt
move.l OldGestaltAddress,-(sp)
rts ; Jump to real _Gestalt routine
EndProc
End