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

    {
      >Hi, I'm interested in trying to identify what type of drive a
      >logical drive is (specifically, whether or not a hard drive is
      >a network drive; I want the installation program I'm writing
      >to prevent the user from installing to a network drive).

     Hi Jim,

     I don't have access to a network, but the following code will
     consistently assure me that my drives are all local ;) ... }

    (************************* NETDRV.PAS ******************************)
    PROGRAM NetDrive;                     { compiler: Turbo Pascal 4.0+ }
                                          { Jan.17.94 Greg Vigneault    }

    USES  Dos;                            { import MsDos, Registers     }

    CONST Beep          = CHR(7);         { ASCII bell-tone             }

    VAR   Reg           : Registers;      { to use CPU registers        }
          DosErrorCode  : WORD;           { MsDos function error code   }
          DriveID       : String[1];      { for PC/AT drive 'A'..'Z'    }
          DriveIsRemote : BOOLEAN;        { TRUE or FALSE, of course    }

    (*-----------------------------------------------------------------*)
    (* Return PC/MS-DOS version, times 100 (eg. 310 = version 3.1) ... *)

    FUNCTION DosVersion : WORD;
      BEGIN
        Reg.AX := $3000;                  { Dos fn: get Dos version   }
        MsDos (Reg);                      { call the Dos services     }
        DosVersion := WORD(Reg.AL) * 100 + WORD(Reg.AH);  { convert   }
      END {DosVersion};

    (*-----------------------------------------------------------------*)
    (*  Return TRUE if Drive is redirected to a network server...      *)

    FUNCTION NetworkDrive (Drive:CHAR):BOOLEAN;
      BEGIN
        Drive := UpCase (Drive);            { Drive _must_ be 'A'..'Z'  }
        IF (Drive IN ['A'..'Z']) THEN BEGIN { make sure of 'A'..'Z'     }
          Reg.BL := ORD(Drive) - 64;      { 1 = A:, 2 = B:, 3 = C: etc. }
          Reg.AX := $4409;                { Dos fn: check if dev remote }
          MsDos (Reg);                    { call Dos' services          }
          IF ODD(Reg.FLAGS) THEN          { Dos reports function error? }
            DosErrorCode := Reg.AX        { yes: return Dos' error code }
          ELSE BEGIN                      {   else ...                  }
            DosErrorCode := 0;            { 0 = no error was detected   }
            IF ODD(Reg.DX SHR 12) THEN    { is Drive remote?            }
              NetworkDrive := TRUE        { yes: return TRUE            }
            ELSE
              NetworkDrive := FALSE;      { no: return FALSE            }
            {END IF ODD(Reg.DX...}
          END; {IF ODD(Reg.FLAGS)}
        END; {IF Drive}
      END {NetworkDrive};

    (*-----------------------------------------------------------------*)
    BEGIN {NetDrive}

      WriteLn;

      IF (ParamCount <> 1) THEN BEGIN                 { user input?     }
        WriteLn ('Usage: NETDRV <DriveLetter>',Beep); { no: offer hint  }
        HALT (1);                                     { abort program   }
      END;

      IF (DosVersion < 310) THEN BEGIN                { check DOS ver   }
        WriteLn ('DOS version 3.1+ is needed.',Beep); { version too low }
        HALT (2);                                     { abort program   }
      END;

      DriveID := ParamStr(1);                       { get user's input  }
      DriveID[1] := UpCase (DriveID[1]);            { to uppercase      }
      DriveIsRemote := NetWorkDrive (DriveID[1]);   { check per netwrok }

      { _ALWAYS_ check if the function call failed....................  }

      IF (DosErrorCode <> 0) THEN BEGIN             { any DOS errors?   }
        WriteLn ('!DOS error #',DosErrorCode,Beep); { DOS fn failed     }
        HALT (3);                                   { abort program     }
      END;

      Write ('Drive ',DriveID[1],': is ');          { inform user of    }
      IF NOT DriveIsRemote THEN Write ('NOT ');     {  the drive status }
      WriteLn ('redirected to a network.');

    END {NetDrive}.
    (*******************************************************************)

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