                ____               _____                               
       o______ / _ /__ ____________\   _|______ ________ ____________ o
       :\___  \  //___)\  __/ _  \  _  \_   __//  __/___)\  __/_  _  \:
       ::/  \  \ / _\ \   _)_ \   \ \   |   _)_\____  \ \/  \  _\ \   \
       :/   _\  \  // \\ /   \/   /  \  |  /   \  _/ // \\  _\ // /   /
       /_________\ /____\_____\ //:\____|_______\____/____\____/_/  //:
       o--/_______/---- - --/___/--- ----- -- - --- ---- -- ----/___/-o

                                  PRESENTS

                              PatchControl V1.0

                   (C) Copyright 1994-1995 by ALiENDESiGN

Introduction:
------------
 Do you know the problem: a program cannot be removed, because it can't remove
 there patches. (such as MCP when you save the prefs) This programs will solve
 all  problems with systempatches. All programs can remove there patches. It's
 compatible to Setman.


Difference between Setman and PatchControl:
------------------------------------------
 Without  Setman or PatchControl  only  the last program that patches a vector
 can  remove itself. All programs that support Setman (like MCP) can always be
 removed.But there are programs (like Snoopy or Enforcer) that doesn't support
 Setman  cannot be removed. This meens that  programs without a Setman support
 can never be removed. PatchControl solved this problem.


Installation:
------------
 Start it right after Setpatch in your startup-sequence.
 for Example:
        C:SetPatch QUIET
        C:PatchControl
        .... all other calls follow here


For programers:
--------------
 It's very easy to use. Make Findport() "SetMan". If the "SetMan" port exists,
 remove the patches ( with SetFunction() ) without checking. PatchControl will
 do the rest.


Developers: (Viruskiller coders)
----------
 You can get a list of all patches:
 Make Findport ("SetMan")  and the read out the MP_SIGTASK APTR (in old SetMan
 this will be zero). In the SIGTASK ( named PatchControl ) read out the
 TC_USERDATA. This is a pointer to a patchlist.

 Patchlist:
   APTR  LibraryBase
   ULONG Offset
   APTR  PatchNode         ;First Node

   APTR  LibraryBase
   ULONG Offset
   APTR  PatchNode
    .                      ;Here will follow a number of this structures.
    .                      ;With a zero in APTR Library the list ends.
    .

  PatchNode:
   APTR  Next_Node         ;Offset 00
   APTR  Previous_Node     ;Offset 04
  JMP    Next_Program      ;Offset 08    adress of the next program
   APTR  Program           ;Offset 14    the program from this node
   APTR  Task              ;Offset 18    the task-structure of this program
   LABEL PatchNode_SizeOf


Author:
------
                         Stefan "zerocom" Sommerfeld
                               Kaulbachstr. 3
                               14612 Falkensee
                                   Germany

                          Phone: +49-[0]3322-202452
                       EMail: zerocom@cs.tu-berlin.de

 or call our support BBS: eViL M00n! +49-[0]3322-208768 ( 2400-28800 )
