[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]