MAG Disk (Mar 1991) : SnoopDos / SnoopDos.doc

                SnoopDos V1.2 -- Monitors AmigaDOS function calls

         (C) Copyright Eddy Carroll, January 1991. Freely Distributable.


INTRODUCTION

    Have you ever wondered why a particular program won't seem to run?
    It could be looking for some special files which you've forgotten to
    install in the appropriate place. SnoopDos was designed to let you
    resolve situations like this, though it's probably useful for other
    things too.

    For those who don't like long instruction files, simply run SnoopDos
    with no options, then run a few application programs and look at the
    output displayed in SnoopDos's window. Interesting, eh? For those who'd
    like a more detailed explanation, read on...

    When you start SnoopDos, it opens a console window. In this window
    appears details of all calls made by any program on the system to the
    CurrentDir(), DeleteFile, Execute(), LoadSeg(), Lock() and Open()
    functions in the AmigaDOS library. The exception (as usual) is any
    program written in BCPL; this includes most of the commands in the C:
    directory.

    SnoopDos will tell you about all attempts to load libraries, devices
    and fonts. It will also tell you if a program looks for a specific file
    (for example in S:) or a specific disk volume or directory. This can be
    very useful when you're playing with new software which may require
    certain fonts or other support files.

    An unexpected bonus is that since AmigaDOS environment variables are
    stored as files, SnoopDos will tell you the names of any environment
    variables a program tries to read; if you see references to ENV:<name>
    in the SnoopDos window, then a program is trying to access an environment
    variable called <name>.


USAGE

    When you start SnoopDos, it automatically detaches itself from the CLI
    and runs in the background. You can specify a number of options on the
    command line, either at this time or later on by running SnoopDos again.
    Each option can be given in lower case or upper case to respectively
    enable or disable that setting. Alternatively, you can follow the option
    by `1' or `0' which has the same effect. So, `-d' and `-d1' both enable
    the "Monitor DeleteFile()" option, whereas `-d' and `-d0' both disable
    that option. Without further ado, here's an explanation of each setting:

    -a  Normally, SnoopDos uses different colours when displaying messages,
        to allow events to be easily distinguished from each other. You can
        force SnoopDos not to use any colour by disabling this option. This
        can be useful if you only have a 2-colour workbench. If SnoopDos is
        sending its output to a file, it turns off this option by default
        (but you can turn it back on again if you like).

    -c  When this option is enabled, SnoopDos prints details of all calls
        to the CurrentDir() function. A program calls CurrentDir() when it
        wants to change its current directory to somewhere else. Note that
        no result is displayed for this function, since AmigaDOS does not
        allow for the possibility of it ever failing.

    -d  This option allows you to see all calls to the DeleteFile() function,
        which is called whenever a program wants to delete a file. This can
        be useful with unknown programs, to make sure that they don't do
        anything nasty (though in fairness, there are much more effective
        ways for a rogue program to do damage than by deleting a few files).

    -f  When enabled, this option causes SnoopDos to print out the full
        path names for files. For example, if a program's current directory
        is SYS:TOOLS and it tries to open a file called FOO, then the
        filename would be displayed as SYS:TOOLS/FOO. Normally, it would
        just be displayed as FOO. Filenames which are so expanded are
        prefixed by a `>' character. Filenames which already included a full
        path specification don't have this prefix. This allows you to
        determine if the calling program specified the full path or not.

    -g  This option enables or disables the monitoring of AmigaDOS's
        LoadSeg() function. This is used to read in a binary loadfile and is
        most commonly used for loading in libraries, devices, fonts and
        handlers, and by third-party DOS shells to load in external commands.

    -l  This option enables or disables the monitoring of AmigaDOS's Lock()
        function. Programs usually call this function to see if a particular
        file exists, or as a prelude to some more sophisticated operation on
        the file.

    -m  This option allows SnoopDos to be activated or deactivated while
        still leaving it running. It is included merely for completeness;
        a much easier way to achieve the same affect is to type CTRL-D or
        CTRL-E in the SnoopDos window.

    -o  This option enables or disables the monitoring of AmigaDOS's Open()
        function. Whenever a program wants to open a file for reading or
        writing, it calls this function.

    -w  If several tasks try to call a particular DOS function at the same
        time, SnoopDos can only handle them one at a time. Normally, what
        will happen is that the other tasks speed on without waiting for
        SnoopDos and you see a warning message saying that some function
        calls were missed (this doesn't happen very often anyway). When the
        `-w' option is enabled however, SnoopDos will make all the
        different tasks queue up and take their turn.

        There is one important consequence of this: if a program tries to
        access a file on a volume not currently mounted (causing AmigaDOS to
        display a "Please insert volume xyzzy" requester), then SnoopDos will
        print out the details about the file requested but not whether the
        request succeeded or not; it can't do this until you respond to the
        requester. In the meantime, other tasks may now be trying to call
        AmigaDOS. For example, if you might try to pop open a new CLI with
        Dmouse or PopCLI, so that you can do an ASSIGN to fake the requested
        volume. All these tasks will have to wait until the original DOS
        call has been completed.

        Since this can confuse things (though only for the user), the option
        is disabled by default. You should only need it if you have to be
        absolutely sure of catching every action made by several tasks.

    -x  This option enables or disables monitoring of Execute() calls.
        Unlike most other DOS function calls, the return value from the
        Execute() is NOT displayed; this is because when an Execute suceeds,
        the command being executed will most likely making AmigaDOS calls of
        of its own and if SnoopDos was waiting for Execute() to return, it
        would skip printing these out.

        Some forms of Execute() will appear to have no associated command
        to execute. This is normal, and occurs when a program redirects
        command input from another file.


    By default, Snoopdos operates as if you had started it with:

        SnoopDos -a1 -c1 -d1 -f0 -g1 -l0 -m1 -o1 -w0 -x1

    or for those who prefer to use the other command format:

        SnoopDos -a -c -d -F -g -L -m -o -w -x

    There are four additional options as well, which cause immediate
    actions to be performed. These are:

    -h  Prints out a help screen for SnoopDos. Actually, typing any
        unrecognised garbage after SnoopDos prints the help screen.

    -q  Sends a message to the version of SnoopDos currently running telling
        it to remove itself. This is one way to quit SnoopDos, the other
        way being to type CTRL-C in its window.

    -r  Prints out a brief report giving all the current settings for
        SnoopDos (eagle-eyed users may spot a striking resemblance between
        this display and the middle section of the help screen :-). Note
        that all other command line options are ignored when you use -r.

    -z  Allows you to specify an alternative output file for SnoopDos to
        send messages to. The filename can follow immediately after the -z,
        or you can leave a space if you like.

        There are several uses for this function. First of all, you can use
        it to change the location of the SnoopDos window when it opens, by
        specifying a filename like -zCON:0/0/640/60/SnoopDos) (for a very
        short window). You should always make sure the window is at least 77
        columns wide or the output will look pretty messed up.

        If you specify -zSER: or -zAUX: then SnoopDos will send output to
        the serial port at the baud rate specified in Preferences. AUX: is
        slightly preferable to SER: since SnoopDos will then recognise the
        CTRL-C, CTRL-D and CTRL-E characters when typed on the remote
        terminal. If you are using a colour ANSI terminal, you may like to
        re-enable colour by specifying `-a' in conjunction with this option.

        Finally, you can of course redirect output to a normal AmigaDOS file.
        You would only want to do this if you wanted to keep a permanent
        record of what went on on your system. This could be useful if you
        allow remote access to your Amiga and want a record of what people
        do on your system.


THE SNOOPDOS WINDOW

    The SnoopDos window is divided into a number of columns, as follows:

    Process name
        The name of the process (or CLI command) that is executing the
        DOS call in question. If the DOS call is nested (see Res. below)
        then the process name will be prefixed by '> '.

    Func
        The function being executed (Open, Lock or Load). Open is printed
        in white, Lock in orange and Load in black, to allow rows to be
        quickly identifed at a glance. (Of course, if you've changed your
        Preferences, the actual colours may be different.) Other values
        which can appear here are Exec (for Execute), CD (for CurrentDir)
        and Del (for DeleteFile).

    Filename
        The name of the file being accessed. Remember that when the `-f'
        option is enabled, this will be prefixed by a `>' character if the
        filename displayed was expanded by SnoopDos to include the current
        directory of the calling process.

    Mode
        For Open(), this is OLD if an existing file is being opened or NEW
        if a new file is being opened. For Lock(), this is SHAR if the lock
        is a shared lock (i.e. several processes can access the same file) or
        EXCL if it is an exclusive lock (only this process can access the
        file). It remains empty for LoadSeg().

    Res.
        The result of the DOS call. This is either `Okay' in white or
        `Fail' in orange. In general, you learn much more from the `Fail'
        entries (i.e. the things the program tried to find but couldn't).

        Occasionally, you may see a `>>>>' appearing here. This happens if
        some other program has also patched DOS library in such a way that
        the function currently being called calls another DOS function
        itself. One such program is Rez, which tries to open a program file
        for reading if you LoadSeg() it. In this case, the `>>>>' indicates
        that DOS calls are being nested. The DOS calls which are nested
        will have the associated process name prefixed by `> ' when they
        are displayed. `> (Done)' is displayed when the top level DOS
        function exits, and the exit status is displayed on the same
        line in the Res. column as normal.

    You can type several keys into the SnoopDos window. CTRL-C will terminate
    SnoopDos. CTRL-D will disable monitoring temporarily (and print a brief
    message to that effect); CTRL-E enables it again. Pressing Space or any
    other key will pause the output to the window, as in a CLI window. Press
    BackSpace to continue. Note that if you have the `-w' option enabled and
    you pause the output, all functions for which monitoring is enabled will
    cause the calling process to go to sleep until you restart output again.

    When SnoopDos wants to quit, it makes sure that nobody else has patched
    the DOS library after it. If something has, SnoopDos will refuse to exit
    immediately. Instead, it will check approximately every 5 seconds to
    see if it is safe to exit and as soon as it can, it will.


AUTHOR

    Eddy Carroll

    Email:     ecarroll@maths.tcd.ie
    Phone:     +353-1-874540
    Snailmail: The Old Rectory, Delgany, Co. Wicklow, Ireland.


DISTRIBUTION

    SnoopDos may be freely distributed as long as no charge is made other
    than to cover time and copying costs. If you want to include SnoopDos
    as part of a commercial package (somehow I doubt it but it never hurts
    to mention :-) then contact the author listed above. Fred Fish is
    specifically given permission to include SnoopDos in his fine disk
    collection.