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

    unit FileInfo;
    (* FILEINFO scans DOS' "list of lists" to retrieve valuable file information.
       It does this by calling undocumented MSDOS call 52h.  It should be noted
       that this only works for DOS versions 2.0 and higher.  No error checking
       for this is performed.
    *)
    interface
    uses
      dos;
    type
      FileTblPtr     = ^FileTables;
      FileTables     = record
        Next:               FileTblPtr;
        NumFiles:           word;
        NumHandles:         byte;
      end;  { FileTables }
      ListofListsRec = record
        DOSDriveParamBlock: pointer;
        DOSFileTbl:         FileTblPtr;
        ClockDevice:        pointer;
        ConDevice:          pointer;
        MaxBytes:           word;
        DiskBuffer:         pointer;
        SubDirectory:       pointer;
        FCBTable:           pointer;
        FCBsProtected:      word;
        NumBlocks:          byte;
        LastDrive:          byte;
      end;  { ListofLists }
      DOSFilesObj = object
        ListOfLists : ^ListofListsRec;
        constructor Init;
        function    LastDrive   : char;
        function    FilesUsed   : integer;
        function    ConfigFiles : integer;
      end;  { ConfigObj }

    implementation

    constructor DOSFilesObj.Init;
    var
      regs:   registers;
    begin
      regs.ah := $52;
      MsDos(regs);       { call undocumented function 52h                    }
                         { returns pointer to list of lists @Regs.ES,Regs.BX }
      ListofLists := Ptr(regs.ES,regs.BX);
    end;  { DOSFilesObj.Init }

    function DOSFilesObj.LastDrive : char;
    begin
      LastDrive   := Char(ListofLists^.LastDrive+64);
    end;  { DOSFilesObj.LastDrive }

    function DOSFilesObj.FilesUsed : integer;
    var
      n:   integer;
      p:   FileTblPtr;
    begin
      n := 0;
      p := ListOfLists^.DOSFileTbl;
      while ofs(p^)<>$FFFF do
      begin
        inc(n,p^.NumHandles);
        p := p^.Next;
      end;  { while }
      FilesUsed := n;
    end;  { DOSFilesObj.FilesUsed }

    function DOSFilesObj.ConfigFiles : integer;
    var
      n:   integer;
      p:   FileTblPtr;
    begin
      n := 0;
      p := ListOfLists^.DOSFileTbl;
      while ofs(p^)<>$FFFF do
      begin
        inc(n,p^.NumFiles);
        p := p^.Next;
      end;  { while }
      ConfigFiles := n;
    end;  { DOSFilesObj.ConfigFiles }

    end.  { FileInfo }

    {--------------     DEMO ------------------ }

    program filetest;
    uses fileinfo;
    var
      DOSFiles : DOSFilesObj;
    begin
      DOSFiles.Init;
      Writeln('LASTDRIVE=',DOSFiles.LastDrive);
      Writeln('DOS FILES USED=',DOSFiles.FilesUsed);
      Writeln('DOS FILES=',DOSFiles.ConfigFiles);
    end.  { FileInfo }

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