; NetPatch V1.0
; by Matthias Scheler 1992
;
; use "BASM" to assemble
;
; SYNOPSIS: NetPatch DEVICE:

		INCDIR "Include:"
		INCLUDE "exec/memory.i"
		INCLUDE "exec/execbase.i"
		INCLUDE "libraries/dos.i"
		INCLUDE "libraries/dosextens.i"
		INCLUDE "workbench/startup.i"

; Makros

CALL:		MACRO
		jsr _LVO\1(a6)
		ENDM

; Konstanten

_AbsExecBase		EQU 4

_LVOForbid		EQU -132
_LVOPermit		EQU -138
_LVOAllocMem		EQU -198
_LVOFreeMem		EQU -210
_LVOPutMsg		EQU -366
_LVOCloseLibrary	EQU -414
_LVOSetFunction		EQU -420
_LVOOpenLibrary		EQU -552

_LVOWrite		EQU -48
_LVOOutput		EQU -60
_LVOLock		EQU -84
_LVOUnLock		EQU -90
_LVODupLock		EQU -96
_LVOCurrentDir		EQU -126
_LVODeviceProc		EQU -174

; open "dos.library"

Install:	move.l a0,a2
		move.l (_AbsExecBase).w,a6
		lea DOSName(pc),a1
		moveq #33,d0
		CALL OpenLibrary
		tst.l d0
		beq.s Error

; check Argument

		move.l a6,a5
		move.l d0,a6

Skip:		cmp.b #' ',(a2)+
		beq.s Skip

		lea -1(a2),a2
		move.l a2,a3
Scan:		cmp.b #':',(a2)
		beq.s GotName
		cmp.b #10,(a2)+
		bne.s Scan

		move.l #ErrorWrongArg,d2
		move.l #DOSName-ErrorWrongArg,d3
		bra.s Error

; find requested Process

GotName:	clr.b 1(a2)
		move.l a3,d1
		CALL DeviceProc
		move.l d0,NewPutMsg+2
		bne.s Patch

		move.l #ErrorNoDevice,d2
		move.l #ErrorWrongArg-ErrorNoDevice,d3

Error:		move #10,d4

Finish:		CALL Output
		move.l d0,d1
		CALL Write

		move.l a6,a1
		move.l a5,a6
		CALL CloseLibrary

		move.l d4,d0
		rts

; patch "dos.library"

Patch:		exg a5,a6
		CALL Forbid

		move.l a6,a1
		lea _LVOPutMsg,a0
		move.l #NewPutMsg,d0
		CALL SetFunction
		move.l d0,CallRealPutMsg+2

		CALL Permit

		clr.l Install-4
		exg a5,a6

		move.l #PatchDone,d2
		move.l #ErrorNoDevice-PatchDone,d3
		moveq #0,d4
		bra.s Finish

; Texte

VersionString:	dc.b "$VER: NetPatch 1.0 (30.08.92)",0
PatchDone:	dc.b "NetPatch installed",10
ErrorNoDevice:	dc.b "Device not mounted",10
ErrorWrongArg:	dc.b "Wrong arguments",10,10,"Usage: NetPatch DEVICE:",10,10
DOSName:	dc.b "dos.library",0
		ds.w 0

; new PutMsg() function

		SECTION Patch,CODE

NewPutMsg:	cmp.l #$12345678,a0
		bne.s CallRealPutMsg

		movem.l a0/a2,-(sp)
		move.l LN_NAME(a1),a2

; Lock() ?

		cmp.l #ACTION_LOCATE_OBJECT,dp_Type(a2)
		bne.s NoLocateObj

		move.l dp_Arg2(a2),d0
		add.l d0,d0
		add.l d0,d0
		move.l d0,a0
		tst.b (a0)
		bne.s NoModification

		move.l #ACTION_COPY_DIR,dp_Type(a2)
		bra.s NoModification

; ExAll() ?

NoLocateObj:	cmp.l #ACTION_EXAMINE_ALL,dp_Type(a2)
		bne.s NoModification

		move.l #0,dp_Res1(a2)
		move.l #ERROR_ACTION_NOT_KNOWN,dp_Res2(a2)

		move.l dp_Port(a2),(sp)

; dont' modify packet

NoModification: movem.l (sp)+,a0/a2

CallRealPutMsg:	jmp $12345678

		END
