home *** CD-ROM | disk | FTP | other *** search
/ Computer Club Elmshorn Atari PD / CCE_PD.iso / pc / 0400 / CCE_0475.ZIP / CCE_0475.PD / VIRENDET.3-1 / WPROTECT / WPROTECT.S < prev    next >
Text File  |  1992-10-29  |  27KB  |  851 lines

  1. *******************************************************************************
  2. *
  3. *         >>  WPROTECT.S <<                  V1.02      25.10.1992
  4. *
  5. *   PD © by
  6. *   P*ST:
  7. *         Christoph Conrad
  8. *         Adalbertsteinweg 113
  9. *         5100 Aachen
  10. *
  11. *         E-Mail (lieber die als P*ST) direkt über
  12. *         MAUS: Christoph Conrad @ AC3
  13. *         ...und die Gateways
  14. *         FIDO: Christoph Conrad % Maus AC3 2:242/2.6
  15. *       USEnet: Christoph_Conrad@ac3.maus.de
  16. *     Zerberus: Christoph_Conrad%ac3@zermaus.zer
  17. *       Pronet: MAUS:AC3:Christoph_Conrad
  18. *     Internet: conrad@rama.Informatik.RWTH-Aachen.DE      (ca. 1 mal/Woche)
  19. *          BTX: Seite *35008024#, im Formular ausfüllen
  20. *               Christoph_Conrad@AC3.MAUS.DE.UUCP
  21. *               (kostet 90 Pfennig)
  22. *
  23. * Dieses Programm liegt auch dem VIRENDETEKTOR bei, _DEM_ Virensuchprogramm
  24. * auf dem ATARI ST/TT von Volker Soehnitz @ AC. Keiner bietet mehr!
  25. * Lassen Sie sich registrieren und geniessen Schutz vor allen aktuellen
  26. * Viren durch den Updateservice.
  27. *
  28. * WProtect kann und soll weiterkopiert werden, allerdings nur
  29. * _MIT_
  30. * WPROTECT.S
  31. * WPRORSC.S
  32. * Veränderungen an Source/Programm NUR zu privaten Zwecken!!
  33. * Wer veränderte Versionen von Source oder Programm öffentlich zugänglich
  34. * macht, wird von mir ganz schönen Ärger bekommen!
  35. * WPROTECT.PRG (Unter GEM/Autoordner, durch Umbenennen auch Accessory)
  36. * WPROTECT.RSC
  37. * WPROTECT.RSD (Kuma NRCS)
  38. * WPROTECT.TXT
  39. *
  40. * Liebe Leute, diese Source entstand vor grauer Vorzeit. Also verzeiht mir
  41. * die nicht ganz so übersichtliche Programmierung (in der nächsten Version
  42. * komplett überarbeitet).
  43. *
  44. * Im folgenden bedeute
  45. *
  46. * + Neues Feature
  47. * - Beseitigter Bug / Unschönheit / Inkompatibilität
  48. *
  49. * History:
  50. * 0.97/f: - Sicherungslaufwerk jetzt aus _bootdev ($446)
  51. *         - _drvbits / ProtDrive / ProtDouble wird jetzt als 32 Bit behandelt
  52. *           (Laufwerke A-Z)
  53. *         - Im Accessory werden jetzt bei jeder Aktivierung die aktuellen
  54. *           Schutzwerte aus dem CurrentVec übernommen (sonst würde eine
  55. *           zwischenzeitliche Änderung über einen Programmaufruf ignoriert)
  56. *         + Nachfrage bei Sichern auf X:\AUTO\WPROTECT.PRG (X == Bootlaufwerk),
  57. *           falls Bootlaufwerk als geschützt gilt.
  58. *         + Accessory erkennt nachträglich installierten Schutz.
  59. *         + Unterstützung des VA-Protokolls (VA_START)
  60. *
  61. * Die magische Grenze...
  62. *
  63. * 1.00:   (internal release, not distributed)
  64. *         + GEM-Dialogbox
  65. *           Zum Umwandeln der Resource in Assemblerquellcode verwende
  66. *           ich RSC_TO_S.PRG von
  67. *           »Bernd Eckstein« @ AC (Shareware, 10,- die sich lohnen!)
  68. *           Version >= 1.18!! ( Hallo Bernd =:^} )
  69. *         + Erkennung des residenten Prg über Cookies anstatt XBRA
  70. *           COOKIE-Library von
  71. *           »Arnd Beissner« @ MS (PD, sehr einfach in der Anwendung)
  72. *           Version >= 1.03!!
  73. *           In Version 1.03 sind noch eine Menge bra, die sich in bra.s
  74. *           umwandeln lassen.
  75. *         + Anpassung des Resourcefiles an Letemfly von
  76. *           »Oliver Scheel« @ K (PD, 'man fliegt nicht mehr ohne...')
  77. *           Version >= 1.14!!
  78. *           Die Laufwerksbuttons 'A'-'Z' sind über ALT-A - ALT-Z erreichbar.
  79. *           UNDO entspricht dem Abbruchbutton, HELP dem Sichernbutton.
  80. *           In V1.14 verhält sich die Letemfly-form_alert-Routine bezüglich
  81. *           innerhalb der Box zentrierter Texte anders als die Original-
  82. *           AES-Routine. Dies ist ein rein kosmetisches Problem.
  83. *
  84. * Alle über MAUS E-Mail addressierbaren Leute können auch über die
  85. * Gateways erreicht werden, indem mein Name und mein Mausknoten (@AC3)
  86. * gegen ihren Namen/MAUS-Knoten ausgetauscht wird, also etwa
  87. *         FIDO: Bernd Eckstein % Maus AC @ 2:242/2.6
  88. *
  89. * 1.01:   + Für das Sichern der Konfiguration wird das Bootlaufwerk
  90. *           DGetDrv (GEMDOS 25) im Autoordner-Programm ermittelt.
  91. *         + Versionsnummer abfragbar (siehe Source Label 'Version')
  92. *         + LinksShift+[Button]Nochmal in der Critical-Error-Handler-Box
  93. *           hebt den Schreibschutz für dieses Laufwerk auf!
  94. *
  95. * 1.02:  +- WPROTECT.INF-Datei auf der Wurzel des Bootlaufwerkes
  96. *           für das Speichern zu schützender Laufwerke anstatt
  97. *           im Programm selbst.
  98. *
  99. * Future Releases (bei genügender Programierermotivation)
  100. *         * MetaDOS-Laufwerke werden evt. unterstützt
  101. *         * CPX-Modul (wenn es dazu ein vernünftiges Assembler-Toolkit gibt)
  102. *         * Kommandozeile a la
  103. *           WPROTECT +ABC-EFG schützt A/B/C, entschützt E/F/G
  104. *           und lässt den Schutzstatus aller anderen Laufwerke unangetastet
  105. *           WPROTECT ++-EF schütze alle ausser E und F
  106. *           WPROTECT --+EF entschütze alle, schütze E und F
  107. *         * Buttons [ Schütze alle ] / [ Entschütze alle ]
  108. *         + aufgeräumterer Source
  109. *         + bessere Dokumentation
  110. *
  111. * mfg chris.
  112. *
  113. * Assemblieren mit MadMac V 0.13 (uralt, aber schnell & zuverlässig)
  114. * Kommandozeile: -p wprotect
  115. *
  116. * WPRORSC.S (das umgewandelte Resourcefile) + COOKIE.S
  117. * müssen sich in demselben Verzeichnis wie WPROTECT.S befinden!
  118. *
  119. * Noch einige Bemerkungen zur RESOURCE. Die Objekte müssen mit 'Erst X, dann Y'
  120. * sortiert sein, damit die Laufwerksknöpfe aufsteigende Objektindize haben.
  121. *
  122. * In der umgewandelten Resource bezeichnet
  123. * OBJCs000    Anzahl Objekte in Baum 1
  124. * Objc000000  Label des ersten Objekts in Baum 1
  125. * Falls Ihr Resourcekonverter andere Bezeichnungen wählt, müssen Sie
  126. * diese anpassen.
  127. *
  128. *******************************************************************************
  129.  
  130. WRITE_PROTECT   EQU     -13         ; Bios-Fehlermeldung
  131. _bootdev        EQU     $446
  132. hdv_rw          EQU     $476        ; Harddisk Schreiben-Lesen
  133. _drvbits        EQU     $4C2
  134.  
  135. NrOfDrives      EQU     26
  136.  
  137.             .macro AES  func
  138.             lea         \func(pc),a0
  139.             bsr         CallAES
  140.             .endm
  141.  
  142.             .macro SupExec  func
  143.             lea         \func(pc),a0
  144.             bsr         SupExec
  145.             .endm
  146.  
  147.             .macro ZeigeAlert  func
  148.             move.l  #\func,addrin
  149.             move.w  #1,intin           ; Defaultbutton 1
  150.             AES     FormAlert
  151.             .endm
  152.  
  153.            .macro GEMDOS trpno, clean
  154.            .if \trpno != 0
  155.             move.w  #\trpno,-(sp)
  156.            .else
  157.             clr.w   -(sp)
  158.            .endif
  159.             trap    #1
  160.            .if \# = 2
  161.               .if  \clean <= 6         ; -2 wegen trpno
  162.                addq.w  #2+\clean,sp    ; .w ok, da Extension automatisch!
  163.               .else
  164.                lea     2+\clean(sp),sp
  165.               .endif
  166.            .endif
  167.            .endm
  168.  
  169.            .TEXT
  170. Anfang:     bra     Install
  171.  
  172. *---------------------------
  173. *---------------------------
  174.  
  175. Version:    DC.L    '1.02'      ; Position: -18(NewHdvRW)
  176.  
  177. AutoBootDrv:DC.W    0           ; aktuelles Laufwerk bei Autoordner-Programm
  178. * Bitstring zu schützender Laufwerke Bit 0 == A:, Bit 1 == B: etc.
  179. ProtDrive:  DC.L    0           ; Position: -16(NewHdvRW)
  180.  
  181. *
  182. * XBRA-Struktur
  183. *
  184. XBRA:       DC.B    "XBRA"      ; Position: -12(NewHdvRW)
  185. Ident:      DC.B    "WPRO"      ; Position: -8(NewHdvRW)
  186. ; alter hdv_rw-Vektor
  187. OldHdvRW:   DC.L    0           ; Position: -4(NewHdvRW)
  188.  
  189. * Neuer hdv_rw-Vektor
  190. NewHdvRW:
  191. ProtDriveOffs   EQU   ProtDrive   - *
  192. AutoBootDrvOffs EQU   AutoBootDrv - *
  193.  
  194.             movem.l d1-a6,RegSave
  195.  
  196.             btst.b  #0,5(sp)    ; Read-Write-Flag
  197.             beq.s   gotoOld     ; es wird nur gelesen
  198.  
  199.             move.w  14(sp),d3   ; Laufwerk 0=A:, 1=B: etc.
  200.             move.l  _drvbits.w,d4
  201.             btst.l  d3,d4       ; gibt's das Laufwerk überhaupt ?
  202.             beq.s   gotoOld     ; nein
  203.             move.l  ProtDrive(pc),d4
  204.             btst.l  d3,d4       ; soll Laufwerk geschützt werden ?
  205.             beq.s   gotoOld     ; nein
  206.     .loop:  moveq   #WRITE_PROTECT,d0
  207.           ; D3-D7 / A3-A6 werden vom Critical-Error-Handler gerettet
  208.             bsr.s   CallCritErr ; critical-error-handler aufrufen
  209.             cmp.l   #$10000,d0  ; Retry ?
  210.             bne.s   .wpro
  211.  
  212.           ; Bei Linksshift+Button[Nochmal] wird der Laufwerksschutz
  213.           ; für das betreffende Laufwerk aufgehoben
  214.             lea     $E1B.w,a1          ; Vorannahme TOS 1.00
  215.             move.l  $4F2.w,a0          ; _sysbase
  216.           ; TOS >= 1.02?
  217.             cmp.w   #$102,2(a0)
  218.             bcs.s   .tos10
  219.             move.l  $24(a0),a1         ; *pkbshift
  220.           ; LinksShift gedrückt?
  221.     .tos10: cmp.b   #2,(a1)
  222.             bne.s   .loop
  223.           ; Laufwerksschutz aufheben
  224.             move.w  14(sp),d3   ; Laufwerk 0=A:, 1=B: etc.
  225.             move.l  ProtDrive(pc),d4
  226.             bclr    d3,d4
  227.             move.l  d4,ProtDrive
  228.             bra.s   gotoOld
  229.  
  230.      .wpro: movem.l RegSave(pc),d1-a6
  231.             moveq   #WRITE_PROTECT,d0
  232.             rts
  233. gotoOld:    movem.l RegSave(pc),d1-a6
  234.             move.l  OldHdvRW(pc),-(sp)
  235.             rts
  236.  
  237. CallCritErr:move.w  d3,-(sp)    ; Laufwerk
  238.             move.w  d0,-(sp)    ; Fehlercode
  239.             moveq   #-1,d0      ; Kompatibilität zum Bios
  240.             move.l  $404.w,a0   ; etv_critic
  241.             jsr     (a0)
  242.             addq.w  #4,sp
  243.             rts
  244.  
  245. RegSave:    .DCB.L   14,0 ; D1-D7/a0-a6
  246.  
  247. AutoResident    EQU     *
  248. *----------------------------
  249.  
  250. *
  251. * Resource einbinden
  252. *
  253.             .include "WPRORSC.S"
  254.  
  255. AESPB:      DC.L    control, global, intin, intout, addrin, addrout
  256.  
  257. NotResident:DC.B    "[1][WProtect 1.02:|Bleibe nicht resident.][Ok]",0
  258.             .even
  259.  
  260. AlertNotInstalled:
  261.             DC.B    "[1][WProtect 1.02:|Bitte installieren!][Ok]",0
  262.             .even
  263.  
  264. Widmung:    DC.B    "[0][~~~~~~~~~~~~~~~  |  Widmung  an|    Barbara|"
  265.             DC.B    "~~~~~~~~~~~~~~~  ][ Ok ]",0
  266.             .even
  267.  
  268. NoCookie:   DC.B    "[1][WProtect 1.02:|Kann keinen Cookie anlegen.][Ok]",0
  269.             .even
  270.  
  271. AlertBootProt:
  272.             DC.B    "[2][WProtect 1.02:|Laufwerk "
  273. AlertBootDrv:
  274.             DC.B    0," ist geschützt.|Trotzdem sichern?]"
  275.             DC.B    "[Ok|Abbruch]",0
  276.             .even
  277.  
  278. Menu_entry: DC.B    "  ",3," WProtect 1.02  ",0
  279.             .even
  280.  
  281. FileError:  DC.B    "[1][ Dateifehler beim Speichern | auf "
  282. FileErrDrv: DC.B    "X:\\WPROTECT.INF!][ Ok ]",0
  283.             .even
  284.  
  285. FName:      DC.B    "X:\\WPROTECT.INF",0   ; 1. Byte == Laufwerk
  286.             .even
  287.  
  288. * Worte für's control-Feld
  289. * contrl[0..4] = opcode / #intin / #intout / #addrin / #addrout
  290. * O-Ton Profibuch 10te Auflage:
  291. * "Darüber, welche Werte vor einem AES-Aufruf gesetzt werden müssen, gibt es
  292. * keine klaren Informationen. Nötig ist es auf jeden Fall für contrl[0],
  293. * contrl[1] und contrl[3]. Wenig sinnvoll erscheint es für contrl[2] und
  294. * contrl[4] - schliesslich wissen ja die AES-Funktionen selbst, wie viele
  295. * Werte sie in den Ausgabefeldern zurückliefern.
  296. * Die mit dem Original-Entwicklungspaket mitgelieferten Bindings [...] setzen
  297. * allerdings alle Werte des Arrays."
  298. * ...und tatsächlich: Unterlasse ich das Vorbesetzen von contrl[2] und
  299. * contrl[4] funktioniert der Aufruf über Anklicken der Accessory-Menüleiste
  300. * nicht mehr.
  301. ApplicationInit:
  302.             DC.W    10,0,1,0,0
  303. ApplExit:   DC.W    19,0,1,0,0
  304. EvntMesag:  DC.W    23,0,1,1,0
  305. MenuRegister:DC.W  35,1,1,1,0
  306.  
  307. FormAlert:  DC.W    52,1,1,1,0
  308. FormDo:     DC.W    50,1,1,1,0
  309. FormDial:   DC.W    51,9,1,0,0
  310. FormCenter: DC.W    54,0,5,1,0
  311.  
  312. GrafMouse:  DC.W    78,1,1,1,0
  313. WindUpdate: DC.W    107,1,1,0,0
  314.  
  315. RSRCObFix:  DC.W    114,1,1,1,0
  316.  
  317. OBJC_Change:DC.W    47,8,1,1,0
  318. OBJC_Draw:  DC.W    42,6,1,1,0
  319.  
  320.            .BSS
  321. control:    DS.W    12
  322. global:     DS.W    15
  323. intin:      DS.W    128
  324. intout:     DS.W    128
  325. addrin:     DS.W    128
  326. addrout:    DS.W    128
  327.  
  328. CurrentVec: DS.L    1   ; NewHdvRW-Vektor
  329. Installed:  DS.B    1   ; 0 : Installiert !
  330. Accessory:  DS.B    1   ; Falls 0 -> Accessory
  331. * beim Abspeichern von ProtDrive darf das Laufwerk, auf dem
  332. * gespeichert wird, nicht geschützt sein. ProtDouble dient als
  333. * Buffer, während in ProtDrive das entsprechende Bit gelöscht wird
  334. ProtDouble: DS.L    1
  335. BootDrv:    DS.W    1
  336. ActDrive:   DS.B    1   ; Aktuell zu bearbeitendes Laufwerk
  337. DrvBits:    DS.L    1   ; Kopie von _drvbits ($4C2)
  338. Keep:       DS.L    1
  339.  
  340. * Per FormCenter ermittelte zentrierte Koordinaten der Dialogbox
  341. xClip:      DS.W    1
  342. yClip:      DS.W    1
  343. wClip:      DS.W    1
  344. hClip:      DS.W    1
  345.  
  346. MsgBuf:     DS.B    16  ; Nachrichtenbuffer AES
  347.  
  348.             DS.B    $190    ; 400 Byte Stack reichen dicke
  349. Stack       EQU     *
  350.  
  351.  
  352.            .TEXT
  353. *-------------------------
  354. ObjcChange:
  355. * Vorzubesetzen sind
  356. * intin     Objektnummer
  357. * intin+12  newstate
  358. * intin+14  (0) 1 = (nicht) neuzeichnen
  359. * Parameterfelder für OBJC_Change setzen
  360.             clr.w   intin+2         ; reserved
  361.           ; Clipping setzen (quasi abschalten)
  362.             clr.l   intin+4
  363.             move.l  #$7FFF7FFF,intin+8
  364.  
  365.             move.l  #Objc000000,addrin ; Objektbaumadresse
  366.             AES     OBJC_Change
  367.             rts
  368.  
  369. ObFixCenter:
  370. * Anpassung Koordinaten Zeichen- in Pixeldarstellung
  371.             move.l  #Objc000000,addrin
  372.             move.w  #OBJCs000-1,d3
  373.  
  374.   .convert: move.w  d3,intin
  375.             AES     RSRCObFix
  376.             dbra    d3,.convert
  377.             rts
  378.  
  379. DialogInit: move.l  #Objc000000,addrin
  380.             AES     FormCenter
  381.             move.l  intout+2,xClip
  382.             move.l  intout+6,wClip
  383.  
  384.             SupExec GetDrvBits
  385.             move.l  DrvBits,d4
  386.             move.l  ProtDrive(pc),d5
  387.             move.w  #NrOfDrives-1,d3      ; 26 Laufwerke testen
  388.  
  389.             clr.w   intin+14    ; nicht neuzeichnen
  390.  
  391.      .loop: btst.l  d3,d4       ; gibt's das Laufwerk überhaupt ?
  392.             bne.s   .protect    ; ja
  393.  
  394.             move.w  #8,intin+12     ; DISABLED
  395.  
  396.             bra.s   .change
  397.  
  398.   .protect: btst.l  d3,d5           ; soll Laufwerk geschützt werden ?
  399.             bne.s   .prot           ; ja
  400.             clr.w   intin+12        ; NOT SELECTED
  401.             bra.s   .change
  402.  
  403.      .prot: move.w  #1,intin+12     ; SELECTED
  404.  
  405.    .change: move.w  d3,d6
  406.             addq.w  #DRIVEA,d6
  407.             move.w  d6,intin        ; Objektnummer
  408.             bsr     ObjcChange
  409.     .loop1: dbra    d3,.loop
  410.  
  411.             move.w  #1,intin        ; BEG_UPDATE
  412.             AES     WindUpdate
  413.  
  414. DrawDialog: clr.w   intin           ; Mauszeiger als Pfeil
  415.             AES     GrafMouse
  416.  
  417.             clr.w   intin           ; FMD_START
  418.             clr.l   intin+2
  419.             clr.l   intin+6
  420.             move.l  xClip,intin+10
  421.             move.l  wClip,intin+14
  422.             AES     FormDial
  423.  
  424.             clr.w   intin           ; Startobjekt 0
  425.             move.w  #8,intin+2      ; Alle Objektebenen zeichnen
  426.             move.l  xClip,intin+4
  427.             move.l  wClip,intin+8
  428.             AES     OBJC_Draw
  429.  
  430. Dialog:     clr.w   intin
  431.             move.l  #Objc000000,addrin ; Objektbaumadresse
  432.             AES     FormDo
  433.             move.w  intout,d0
  434.  
  435.             cmp.w   #WIDMUNG,d0
  436.             bne.s   .weiter
  437.             ZeigeAlert Widmung
  438.             move.w  #WIDMUNG,intin
  439.    .change: clr.w   intin+12
  440.             move.w  #1,intin+14
  441.             bsr     ObjcChange
  442.             bra.s   Dialog
  443.  
  444.    .weiter: cmp.w   #EXIT,d0
  445.             beq.s   ExitButton
  446.  
  447.             cmp.w   #SAVE,d0
  448.             bne.s   IsOk?
  449.             bsr     SaveConfig
  450.             move.w  #SAVE,intin
  451.             bra.s   .change
  452.  
  453.      IsOk?: cmp.w   #OK,d0
  454.             beq.s   OkButton
  455.  
  456.             bra     Dialog
  457. *------------------------
  458. NewProtDrv: lea     Objc000000(pc),a0   ; Objektbaumadresse
  459.             move.w  #DRIVEA+NrOfDrives-1,d0
  460.             mulu    #24,d0
  461.             adda.l  d0,a0
  462.  
  463.             move.w  #NrOfDrives-1,d0
  464.             clr.l   d1                 ; Default: alle deselektiert
  465.  
  466. * Laufwerke durchgehen
  467.      .test: btst.b  #0,11(a0)          ; Selected?
  468.             beq.s   .weiter            ; nein
  469.             bset.l  d0,d1
  470.    .weiter: suba.l  #24,a0             ; nächstes Objekt
  471.             dbra    d0,.test
  472.             rts
  473.  
  474. OkButton:   move.w  d0,intin
  475.             clr.l   intin+12
  476.             bsr     ObjcChange
  477.  
  478.             bsr     NewProtDrv
  479.  
  480.             move.l  CurrentVec,a0    ; die neuen Schutzwerte übernehmen
  481.             move.l  d1,ProtDriveOffs(a0)
  482.  
  483. ExitButton: move.w  d0,intin
  484.             clr.l   intin+12
  485.             bsr     ObjcChange
  486.  
  487.             move.w  #3,intin        ; FMD_FINISH
  488.             clr.l   intin+2
  489.             clr.l   intin+6
  490.             move.l  xClip,intin+10
  491.             move.l  wClip,intin+14
  492.             AES     FormDial
  493.  
  494.             clr.w   intin           ; END_UPDATE
  495.             AES     WindUpdate
  496.  
  497.     IsAcc?: tst.b   Accessory
  498.             beq.s   WaitForAC_OPEN
  499.  
  500. * Wir sind ein Programm!
  501.             tst.b   Installed
  502.             bne.s   .Protected?     ; brancht falls NICHT installiert
  503.             bra.s   .terminate
  504.  
  505. * Sind überhaupt irgendwelche Laufwerke zum Schützen gekennzeichnet worden ?
  506. * Falls nicht, brauchen wir nicht resident zu verbleiben
  507. .Protected?:tst.l   ProtDrive
  508.             bne.s   .install
  509.  
  510.             ZeigeAlert NotResident
  511.  
  512.         ; ApplExit - Vom AES abmelden
  513. .terminate: AES     ApplExit
  514.  
  515.             GEMDOS  0               ; PTerm
  516.  
  517.   .install: SupExec InstallVecs
  518.             bne.s   .raus
  519.             ZeigeAlert NoCookie
  520.             bra.s   .terminate
  521.  
  522.         ; ApplExit - Vom AES abmelden
  523.      .raus: AES     ApplExit
  524.             clr.w   -(sp)
  525.             move.l  Keep,-(sp)
  526.             GEMDOS  49              ; PTermRes
  527.  
  528.  
  529. WaitForAC_OPEN:
  530.         ; EvntMesag - auf Mitteilung warten
  531.             move.l  #MsgBuf,addrin
  532.             AES     EvntMesag
  533.  
  534.             cmp.w   #40,MsgBuf            ; AC_OPEN
  535.             beq.s   .test
  536.             cmp.w   #$4711,MsgBuf         ; VA_START (Gemini)
  537.             bne.s   WaitForAC_OPEN
  538.  
  539. * Falls Accessory ohne installiertes Autoordnerprogramm gestartet
  540. * immer mal wieder nachschauen ob nicht inzwischen über WPROTECT.PRG
  541. * (nachträglich gestartet) ein residentes WProtect drin ist.
  542.      .test: bsr     IsInstalled?
  543.  
  544.             tst.b   Installed
  545.             bne.s   AccNotInstEntry   ; Nicht installiert
  546.  
  547.             move.l  CurrentVec,a0
  548.             move.l  ProtDriveOffs(a0),ProtDrive
  549.  
  550.             bra     DialogInit
  551.  
  552. AccNotInstEntry:
  553.           ; Nicht installiert
  554.             ZeigeAlert AlertNotInstalled
  555.  
  556.             bra     WaitForAC_OPEN
  557.  
  558. *-------------------------
  559. CallAES:    movem.l d0-a6,-(sp)
  560.             move.w  (a0)+,control
  561.             move.l  (a0)+,control+2
  562.             move.l  (a0),control+6
  563.             move.l  #AESPB,d1
  564.             move.w  #200,d0
  565.             trap    #2
  566.             movem.l (sp)+,d0-a6
  567.             rts
  568.  
  569. *-----------------------------------
  570. Install:
  571. * Offiziell dokumentiert:
  572. * Bei Accessories steht in a0 ein Zeiger auf die Basepage.
  573. * Sonst (alles ausser Accessories) ist a0 == 0.
  574.             cmpa.l  #0,a0       ; Basepageadresse in a0?
  575.             seq     Accessory   ; Nein ---> Wir sind ein Programm
  576.             bne.s   .weiter0
  577.             move.l  4(sp),a0    ; Basepageadresse
  578.  
  579.   .weiter0: move.l  #Stack,sp
  580.             tst.b   Accessory
  581.             beq.s   .cookie
  582.  
  583.             lea     Stack,a1
  584.             suba.l  a0,a1
  585.             move.l  a1,Keep     ; Anzahl evt. resident zu haltender Bytes
  586.  
  587.             move.l  Keep,-(sp)
  588.             pea     (a0)        ; ab Basepage
  589.             clr.w   -(sp)       ; Dummy
  590.             GEMDOS  74,10       ; MShrink
  591.  
  592. ** Cookietest - sind wir schonmal installiert ?
  593.    .cookie: bsr     IsInstalled?
  594.  
  595. *-------------------------------------------------------------
  596. ** Beim AES anmelden
  597.             clr.w   global
  598.             AES     ApplicationInit
  599.             tst.w   global
  600.           ; global[0] (GEM-Version) wurde ja vorher auf 0 gesetzt
  601.           ; falls immer noch 0 kann das AES noch nicht initialisiert sein
  602.           ; d.h. wir sind im AUTO-Ordner
  603.             beq.s   AutoOrd
  604.  
  605.             tst.b   Accessory
  606.             bne.s   .weiter                  ; bne -> Programm
  607.  
  608. ** MenuRegister - In die Menüzeile eintragen
  609.             move.w  intout,intin
  610.             move.l  #Menu_entry,addrin
  611.             AES     MenuRegister
  612.  
  613.    .weiter: bsr     ObFixCenter
  614.             tst.b   Accessory
  615.             bne     DialogInit               ; Programm
  616.             tst.b   Installed
  617.             beq     WaitForAC_OPEN
  618.             bra     AccNotInstEntry          ; Accessory
  619.  
  620. *--------------------------------------------------------
  621. ; Auto-Ordner-Programm
  622. AutoOrd:    tst.b   Installed
  623.             bne.s   .install
  624.             move.l  CurrentVec,a0
  625.             move.l  ProtDrive(pc),ProtDriveOffs(a0)
  626. .terminate: GEMDOS  0               ; PTerm
  627.  
  628.   .install: SupExec InstallVecs
  629.             bne.s   .weiter
  630.  
  631.             pea     AutoInf1(pc)
  632.             GEMDOS  9,4
  633.  
  634.             bra.s   .terminate
  635.  
  636.    .weiter: GEMDOS  25,0            ; DGetDrv, aktuelles Laufwerk
  637.             move.w  d0,AutoBootDrv
  638.  
  639.             bsr     ReadConfig
  640.  
  641.             pea     AutoInf0(pc)
  642.             GEMDOS  9,4
  643.  
  644. *----------
  645.             move.l  ProtDrive(pc),d7
  646.             beq.s   .raus
  647.  
  648.             pea     ProtectStr(pc)
  649.             GEMDOS  9,4
  650.  
  651.             clr.w   d5
  652.             lea     Drives+1(pc),a3
  653.      .test: btst    d5,d7
  654.             beq.s   .loopD
  655.             move    d5,d6
  656.             addi.b  #'A',d6
  657.             move.b  d6,(a3)
  658.  
  659.             pea     Drives(pc)
  660.             GEMDOS  9,4
  661.  
  662.     .loopD: addq.w  #1,d5
  663.             cmp.b   #NrOfDrives,d5
  664.             blt.s   .test
  665. *----------
  666.  
  667.      .raus: pea     CRLFCRLF(pc)
  668.             GEMDOS  9,4
  669.  
  670.             clr.w   -(sp)
  671.             pea     AutoResident-Anfang+$100
  672.             GEMDOS  49
  673.  
  674. Drives:     DC.B    " A",0
  675. ProtectStr: DC.B    " Schütze: ",0
  676. AutoInf0:   DC.B    13,10,"*** WProtect 1.02 RESIDENT.",0
  677. CRLFCRLF:   DC.B    13,10,13,10,0
  678. AutoInf1:   DC.B    "*** WProtect 1.02: kein COOKIE anlegbar.",13,10
  679.             DC.B    "***                NICHT RESIDENT!",13,10,0
  680.             .even
  681.  
  682. *----------------------
  683.  
  684. * Bitstring der angemeldeten Laufwerke holen
  685. GetDrvBits: move.l  _drvbits.w,DrvBits       ; angemeldete Laufwerke
  686.             rts
  687.  
  688. *-------------------
  689.  
  690. **** Per XBios(38) im Supervisormode ausgeführte Funktionen
  691. SupExec:    pea     (a0)
  692.             move.w  #38,-(sp)
  693.             trap    #14
  694.             addq.w  #6,sp
  695.             rts
  696.  
  697. *----------------------------------------------------
  698. *  IN: -
  699. * OUT: d0.w == 0 Installation schlug fehl
  700. InstallVecs:move.l  #'WPRO',d0
  701.             move.l  #NewHdvRW,d1
  702.             bsr     CK_WriteJar
  703.             tst.w   d0
  704.             beq.s   .return
  705.  
  706.             move.l  hdv_rw.w,OldHdvRW
  707.             move.l  #NewHdvRW,hdv_rw.w
  708.    .return: rts
  709.  
  710. Get_bootdev:tst.b   Installed
  711.             beq.s   .weiter
  712.             move.w  _bootdev.w,BootDrv
  713.             rts
  714.    .weiter: move.l  CurrentVec,a0
  715.             move.w  AutoBootDrvOffs(a0),BootDrv
  716.             rts
  717.  
  718. *-------------------
  719. SaveConfig:
  720. * Sichern der Konfiguration
  721.             bsr     NewProtDrv
  722.             move.l  d1,d4
  723.             move.l  d1,ProtDrive
  724.  
  725.         ; ProtDrive zum Sichern retten
  726.             move.l  ProtDrive(pc),ProtDouble
  727.  
  728.             SupExec Get_bootdev
  729.             move.w  BootDrv,d3
  730.  
  731.         ; das Laufwerk, auf dem gesichert wird, darf nicht als
  732.         ; geschützt gelten
  733.             bclr.l  d3,d4
  734.             beq.s   .noprot            ; war nicht geschützt
  735.  
  736. * Bei geschütztem Bootlaufwerk nochmal nachfragen, ob wirklich gesichert
  737. * werden soll! Dies auch bei NICHT installiertem WProtect.
  738.             move.b  d3,AlertBootDrv
  739.             addi.b  #'A',AlertBootDrv
  740.             ZeigeAlert AlertBootProt
  741.  
  742.             cmpi.w  #2,intout
  743.             beq     SaveRet
  744.  
  745.    .noprot: move.l  CurrentVec,a0
  746.             move.l  d4,ProtDriveOffs(a0)
  747.             addi.b  #'A',d3
  748.  
  749.             lea     FName(pc),a0   ; 'X:\\WPROTECT.INF'
  750.             move.b  d3,(a0)
  751.             move.b  d3,FileErrDrv
  752.  
  753.           ; FCreate
  754.             clr.w   -(sp)
  755.             pea     (a0)
  756.             GEMDOS  60,6
  757.             tst.w   d0
  758.             bmi     FileErr
  759.  
  760.           ; D3 wird bei GemDos-Aufrufen automatisch gerettet
  761.             move.w  d0,d3
  762.  
  763.           ; FWrite
  764.             pea     ProtDouble
  765.             pea     4
  766.             move.w  d3,-(sp)
  767.             GEMDOS  64,10
  768.             tst.w   d0
  769.             bmi.s   FileErr
  770.  
  771.             bsr     FClose
  772.  
  773.             move.l  ProtDouble,ProtDrive
  774.             move.l  CurrentVec,a0
  775.             move.l  ProtDrive(pc),ProtDriveOffs(a0)
  776. SaveRet:    rts
  777.  
  778. *-------------------
  779. ReadConfig:
  780. * Einlesen der Konfiguration
  781.             SupExec Get_bootdev
  782.             move.w  BootDrv,d3
  783.             addi.b  #'A',d3
  784.  
  785.             lea     FName(pc),a0   ; 'X:\\WPROTECT.INF'
  786.             move.b  d3,(a0)
  787.  
  788.           ; FOpen
  789.             move.w  #1,-(sp)
  790.             pea     (a0)
  791.             GEMDOS  61,6
  792.             tst.w   d0
  793.             bmi     ReadErrAuto
  794.  
  795.           ; D3 wird bei GemDos-Aufrufen automatisch gerettet
  796.             move.w  d0,d3
  797.  
  798.           ; FRead
  799.             pea     ProtDrive(pc)
  800.             pea     4
  801.             move.w  d3,-(sp)
  802.             GEMDOS  63,10
  803.             tst.w   d0
  804.             bpl.s   FClose
  805.  
  806.             bsr     ReadErrAuto
  807.             bra.s   FClose
  808.  
  809. *--------------------------------------------------
  810. * Ein Dateifehler ist aufgetreten
  811.    FileErr:ZeigeAlert FileError
  812.    FClose: move.w  d3,-(sp)
  813.            GEMDOS  62,2
  814.            rts
  815.  
  816. *--------------------------------------------------
  817. CookieVal:  DC.L    0
  818. IsInstalled?:
  819.           ; Ab in den Supervisormode
  820.             pea     0
  821.             GEMDOS  32,4
  822.             move.l  d0,-(sp)
  823.  
  824.             move.l  #'WPRO',d0
  825.             lea     CookieVal(pc),a0
  826.             bsr     CK_ReadJar
  827.             tst.w   d0
  828.             seq     Installed
  829.             bne.s   .installed
  830.             move.l  #NewHdvRW,CurrentVec
  831.             bra.s   .weiter
  832.  
  833. .installed: move.l  CookieVal(pc),a0
  834.             move.l  a0,CurrentVec
  835.             move.l  ProtDriveOffs(a0),ProtDrive
  836.  
  837.           ; Zurück in den Usermode
  838.    .weiter: GEMDOS  32,4
  839.             rts
  840.  
  841. ReadErr:    DC.B    "*** WProtect 1.02: "
  842.             DC.B    "Fehler beim Lesen der Konfiguration!",13,10
  843.             DC.B    "Bleibe resident!",0
  844. ReadErrAuto:pea     ReadErr(pc)
  845.             GEMDOS  9,4
  846.             rts
  847.  
  848.            .include "COOKIE.S"
  849.  
  850.            .END
  851.