home *** CD-ROM | disk | FTP | other *** search
- ; (c) 199 G. Blumert, Hochdonner Ch. 16, W-2224 Burg/Dithm.
- ;
- ; Dieses Programm stellt die Verbindung zwischen Windows-Anwendung und
- ; IPX her.
- ; Es muß vor dem Start von Windows resident geladen sein.
-
-
- ; Zeichenkettenausgabe per Int 21h
- WriteDOS MACRO
- MOV AH, 9
- INT 21H
- ENDM
-
- MyFunc EQU 0BDC5H ; Int-2F-Kennung
- MyResponse EQU 0A5A5H ; Erkennungszeichen für Rückgabe
-
- CODE SEGMENT BYTE PUBLIC
- ASSUME CS: CODE, DS: CODE
- ORG 2CH
- UmgebungsAdr DW ?
- ORG 100H ; COM-Programm
- Start: JMP anfang
-
- IntNo DB ? ; belegter Interrupt
-
- NewInt2F PROC FAR
- PUSHF
- CMP AX, MyFunc ; Bin ich gemeint?
- JE ItsMe
- POPF ; nein, dann alten Int anspringen
- DB 0EAH ; jmp far
- OldInt2F DW ?, ?
- ItsMe: POPF
- MOV AX, MyResponse ; Kennung zurückgeben
- MOV DL, CS:[IntNo] ; Installierte Interrupnummer
- CMP SI, MyFunc ; Nur Test auf Installation?
- JE InstallTest
- MOV CS:[pEventHdl], BX ; in CX:BX protected mode - Einsprung
- MOV CS:[pEventHdl+2], CX
- MOV BX, OFFSET CallIPX ; eigene Adresse zurückgeben
- MOV CX, CS
- InstallTest: IRET
- NewInt2F ENDP
-
- ; Diese Prozedur von vom IPX-Eventhandler angesprungen.
- ; Hier findet dann der Sprung in die protected-mode-Routine statt
- CallIPX PROC FAR
- DB 9AH ; Call Far
- pEventHdl DW ?, ? ; Prot.-mode-Einsprung
- RET
- CallIPX ENDP
-
- ; Diese Prozedur wird vom protected-mode aus aufgerufen und springt
- ; dann den IPX-Einsprung an
- NewInt PROC FAR
- DB 9AH ; Call Far
- IPX_Adr DW ?, ? ; IPX-Einsprung
- IRET
- NewInt ENDP
-
- resEnde EQU $ ; Ende des residenten Teils
-
- Msg DB 13,10,'WinNet 1.0 (c) 1992 G. Blumert',13,10,13,10
- DB 'Stellt die Verbindung zwischen Windows-Anwendung und '
- DB 'IPX (Netzwerk) her',13,10,13,10,,13,10,'$'
- ErfolgMsg DB 'WinNet installiert!',13,10,13,10,'$'
- NoIPXMsg DB 'IPX nicht geladen',13,10,'$'
- IsInstalledMsg DB 'WinNet ist bereits installiert!',13,10,'$'
- ConflictMsg DB 'Ein anderes Programm benutzt die gleiche Int 2F-Funktion!',13,10,'$'
- NoIntFoundMsg DB 'Kein freier Interrupt gefunden!',13,10,'$'
-
- anfang: MOV DX, OFFSET Msg
- WriteDOS
- MOV AX, 7A00H
- INT 2FH
- CMP AL, 0FFH ; IPX geladen?
- JE IPX_Vorhanden
- MOV DX, OFFSET NoIPXMsg ; Nein
- EndNotRes: WriteDOS ; Meldung ausgeben
- MOV AX, 4C01H
- INT 21H ; Nicht resident machen
- IPX_Vorhanden:
- MOV [IPX_Adr], DI ; IPX-Einsprung merken
- MOV [IPX_Adr+2], ES
- MOV AX, MyFunc ; Schon installiert?
- MOV SI, MyFunc ; --> Nur Installationstest
- INT 2FH ; Eigene Funktion aufrufen
- CMP AX, MyFunc ; AX unverändert?
- JE NotInstalled ; Alles klar
- CMP AX, MyResponse ; Eigene Antwort?
- JE IsInstalled
- MOV DX, OFFSET ConflictMsg ; nein
- JMP EndNotRes
- IsInstalled: MOV DX, OFFSET IsInstalledMsg ; ja
- JMP EndNotRes
- NotInstalled: ; Freien Interrupt suchen
- MOV AX, 3560H
- INT 21H
- MOV DX, ES
- OR DX, BX ; Int belegt?
- JZ IntFound
- INC AL ; nächsten versuchen
- CMP AL, 80H ; Noch unter 80h?
- JB NotInstalled ; dann alles von vorne
- MOV DX, OFFSET NoIntFoundMsg ; sonst Fehlermeldung
- JMP EndNotRes
-
- IntFound: MOV [IntNo], AL ; Neuen Int setzen
- MOV AH, 25H
- MOV DX, OFFSET NewInt
- INT 21H
- MOV AX, 352FH ; Alten Int 2Fh merken
- INT 21H
- MOV [OldInt2F], BX
- MOV [OldInt2F+2], ES
- MOV AX, 252FH ; Neuen Int 2Fh setzen
- MOV DX, OFFSET NewInt2F
- INT 21H
- MOV DX, OFFSET ErfolgMsg
- WriteDOS
- MOV ES, [UmgebungsAdr]
- MOV AH, 49H ; Umgebung freigeben
- INT 21H
- MOV DX, OFFSET resEnde
- MOV CL, 4
- SHR DX, CL
- INC DX
- MOV AX, 3100H
- INT 21H ; Resident beenden
- CODE ENDS
- END Start
-
-