[Back to INTERRUP SWAG index] [Back to Main SWAG index] [Original]

    ===========================================================================
     BBS: Canada Remote Systems
    Date: 07-15-93 (18:15)             Number: 26295
    From: CHRIS PRIEDE                 Refer#: 26227
      To: PIERRE DARMON                 Recvd: NO
    Subj: DOS interrupt handler          Conf: (552) R-TP
    ---------------------------------------------------------------------------
    PD>What additional steps need to be taken for $21? I even tried to remove
    PD>the clicking part, which boils down to installing a new handler that just
    PD>calls the old one. Still no go. What's wrong?

    PD>My ultimate goal is to trap file opens (function 3Dh), check the SHAREing
    PD>mode used (in AL), modify it if necessary, and execute the old handler.
    PD>Doesn't sound like a very complicated thing to do but ... I am stuck.

        Your handler is changing some registers or suffering from some
    registers being changed by INT 21. DOS EXEC service trashes everything,
    including SS:SP, for example. In my opinion, one can't write a stable
    INT 21 handler in Pascal or any other HLL. HLL interrupt handlers are
    usable to certain extent, but this is too low level.

        It can be done in BASM, though. We will declare interrupt handler as
    simple procedure with no arguments to avoid entry/exit code TP generates
    for interrupt handlers. Our handler will force all files to be opened in
    Deny Write mode (modify for your needs).

    const
      shCompatibility = $00;
      shDenyAll       = $10;
      shDenyWrite     = $20;
      shDenyRead      = $30;
      shDenyNone      = $40;

    procedure NewInt21; assembler;
    asm
      cmp   ah, 3Dh         {open file?}
      je    @CheckModeAL
      cmp   ah, 6Ch         {DOS 4.0+ extended open?}
      je    @CheckModeBL    {extended takes mode in BX}
      jmp   @Chain

    @CheckModeAL:
      and   al, 10001111b     {clear sharing mode bits}
      or    al, shDenyWrite   {set to our mode}
      jmp   @Chain

    @CheckModeBL:
      and   bl, 10001111b
      or    bl, shDenyWrite
      jmp   @Chain

    @I21:
      DD      0       {temp. var. for old vector -- must be in code seg.}

    @Chain:
      push  ds
      push  ax
      mov   ax, SEG @Data
      mov   ds, ax
      mov   ax, WORD PTR OldInt21
      mov   WORD PTR cs:[offset @I21], ax
      mov   ax, WORD PTR OldInt21 +2
      mov   WORD PTR cs:[offset @I21 +2], ax
      pop   ax
      pop   ds
      jmp   DWORD PTR cs:[offset @I21]
    end;

        To try this save old vector in a global variable named OldInt21 and
    install this handler as usual. It also traps function 6Ch, DOS 4.0+
    extended open/create. Very few programs use it, but why not...
    ---
     * Faster-Than-Light (FTL) þ Atlanta, GA þ 404-292-8761/299-3930
     * PostLink(tm) v1.06  FTL (#93) : RelayNet (tm)

[Back to INTERRUP SWAG index] [Back to Main SWAG index] [Original]