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

    {
    > Does anyone know if there is a way For a Pascal Program to determine
    > whether a drive is a local hard drive, a network drive, a Dos
    > SUBSTituted drive, or a RAMDRIVE?

    Hmm... I'm reading this one week after it got posted. and a month after the
    original question. I haven't read last week's messages, hope you hadn't
    recieved to many answers about this now. But because you apparently hadn't got
    anything two weeks after asking, I thought you may want this, so here comes...

    There is a service in Dos that identifies a given drive as local or remote.
    This service also tells you if the drive is SUBSTed. You can also get info
    about whether it Uses removable media from another service. There is no way to
    detect a RAM-drive, as Far as I know, and I've got the facts from Microsoft's
    own MSJ! The Dos 5 DosSHELL simple checks the volume identifier. if it's
    'MS-RAMDRIVE', 'RDV' or 'VDISK', the drive is ASSUMED to be a RAM-disk. But
    it's, again according to Microsoft Systems Journal, impossible to foolproof
    check if a drive is a logical RAM-drive. A design flaw in Dos.

    However, I will show a few lines of TP-code For checking if a drive is remote
    or local, and SUBSTed or not. I use the TP 5.5 (and older) method of Intr-calls
    For simulating Asm, of course if could be written clearer With TP6's
    Asm-keyWord. The code consists of the actual Function and a test stub, cut the
    stub when you have looked at it. Code Compiles and runs fine on my system; I
    couldn't test if it work With remote drives, but it should. I've used similar
    code that worked With that too, so...

    }
    Program TestDrv;

    { --- A very short test-Program For Dos-IOCTL, Jacob Stedman 930223 --- }

    Uses
      Dos;

    Function IsDriveValid(cDrive: Char; Var bLocal, bSUBST: Boolean): Boolean;
    {
      Parameters: cDrive is the drive letter, 'A' to 'Z', that's about
      to be checked. if not in this range, the Function will return False.

      Returns: Function returns True if the given drive is valid, else
      False (!). bLocal is set if drive is local, bSUBST if drive is
      substituted. if Function returns False, the Booleans are undefined.
    }
    Var
      rCPU: Dos.Registers;
    begin
      { --- Call Dos and process returns --- }
      if not (UpCase(cDrive) in ['A'..'Z']) then { --- letter OK?--- }
        IsDriveValid := False
      else
      begin
        { --- Valid letter, set up For the Dos-call --- }
        rCPU.bx := ord(UpCase(cDrive))-ord('A')+1;
        rCPU.ax := $4409;
        { --- Call the Dos IOCTL (InOutConTroL)-Functions --- }
        Intr($21, rCPU);
        if (rCPU.ax and FCarry) = FCarry then
          IsDriveValid := False
        else
        begin { --- drive is valid, check status --- }
          IsDriveValid := True;
          bLocal := ((rCPU.dx and $1000) = $0000);
          if bLocal then
            bSUBST := ((rCPU.dx and $8000) = $8000)
          else
            bSUBST := False;
        end;
      end;
    end;

    Var
      cCurChar : Char;          { loop counter, drive }
      bLocal,
      bSUBST   : Boolean;       { drive local/remote?; SUBSTed or not? }

    begin
      { --- Write header --- }
      Writeln; Writeln('  VALID DRIVES:'); Writeln;
      { --- Loop from 'A' to 'Z', For each iteration check a drive --- }
      For cCurChar := 'A' to 'Z' do
        if IsDriveValid(cCurChar, bLocal, bSUBST) then
        begin
          Write(cCurChar, ': ');
          if bLocal then
            Write(' local ')
          else
            Write(' remote');
          if bSUBST then
            Write('   SUBSTed ')
          else
            Write('   not SUBSTed');
          Writeln;
        end;
      { --- Write footer --- }
      Writeln;
    end.

    {
    The code is simple. It calls the Dos IOCTL-service #09h, 'Is Drive Remote',
    with the drive number (1-A:, 2-B:, ...) in the bl-register. if the drive isn't
    valid, the carry flag is set. if valid, carry is clear, and the dx-register
    contains bit-fields you're interested in. Bit 12 is 1 if remote, 0 if local. if
    local, bit 15 is 1 if the drive is a substitution. In TP, you get access to
    them, in this Case, by using the 'and'-binary operator.

    I guess you're interested in making a Filemanager or a report util or that
    like. then, you're maybe interested to get source For detection of CD-ROM
    drives and floppys? if so, post me a new msg. I always like to recieve new
    mail... I didn't include this here, this msg is too long without that extra
    code. Feel free to Write if you get any problems.
    }

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