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

    PROGRAM SFTFilesCount (Input, Output);

    { AUTHOR : John Drabik, Draper, Utah

      Feel free to use this code as you wish.  I'd appreciate it if you'd mention
      me, and SWAG, however.  But if you don't, it's your karma...

    There have been several snippets regarding how to increase the number of
    available file handles in a program.  However, you may get into trouble
    if you extend the handles beyond the value of the FILES=xxx in CONFIG.SYS.
    This snippet will tell you the value of FILES=.  If the value is lower than
    what your program needs (before creating extended handle space), you should
    tell the user to edit their CONFIG.SYS, and then reboot.

    The program walks from one "mini" SFT to the next.  This is because there can
    be multiple SFTs under DOS, so you need to get the total for all SFTs.

    The value of FILES= should be at least 5 more than your program requires (to
    allow for stdin, stdout, NULL:, etc.).

    If your program will use the stdin, stdout, or lst (printer) defaults, you must
    copy the existing SFT into your (newly allocated) SFT - this will be the
    subject of another snippet.  Otherwise, you won't be able to access defaults.

    This snippet does not include the SFT fields which change from version to
    version of DOS (this includes the filename and other useful pieces of data).
    As a result, if you need to walk the true SFT to get such data, you'll need a
    more complex SFT record (a variant), and a test for the DOS version.  This
    code was derived in part from works by Andy Schulman and Neil Rubenking.  Get
    one of their books if you need to access extended SFT info.

    Finally, this snippet works under vanilla DOS, OS/2, QEMM (with extra files),
    and should work with the various flavors of Windoze (though I don't use 'doze
    anymore, and have not tested this "cleaned-up" version of the code there.)
    }

    TYPE MiniSFTPtr = ^MiniSFT;
         MiniSFT = RECORD           { System File Table "mini" pointer, which }
            Next : MiniSFTPtr;      { accesses only the pointer to the next SFT }
            Num  : WORD;            { entry, and the available handle count. }
         END;

    FUNCTION FirstSFT : MiniSFTPtr; ASSEMBLER;
    ASM
       MOV  AH, 52H
       INT  21H
       MOV  AX, ES:[BX+4]
       MOV  DX, ES:[BX+6]
    END;

    VAR SFT  : MiniSFTPtr;
        FTot : WORD;

    BEGIN
       FTot := 0;
       SFT  := FirstSFT;
       REPEAT
          FTot := FTot + SFT^.Num;
          SFT  := SFT^.Next;
       UNTIL OFS(SFT^) = $FFFF;

       WRITELN ('FILES=', FTot, ' in CONFIG.SYS');
       READLN;
    END.

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