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

                                  PRESENTS

                              PatchControl V2.1

                   (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 program will solve
 all problems with systempatches. All programs can remove there patches at
 every time. It's fully compatible to the Setman program.


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


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

Usage:
------
 In the commandline you can select tasknames after PatchControl. These tasks
 will include there patches before all other programs. It's very useful for
 ARQ or similar programs. Example for ARQ:
  C:PatchControl ARQ
 The tasknames are noncasesensitive and wildcards are supported.


For programmers:
--------------
 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 with the following code:
 Make Findport ("SetMan")  and 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    address of the next program
   APTR  Program           ;Offset 14    the program from this node
   APTR  TaskName          ;Offset 18    the taskname 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 moOn! +49-[0]3322-208768 ( 2400-33600 )
