269 lines
6.7 KiB
C
269 lines
6.7 KiB
C
|
||
/*************************************************************************
|
||
*
|
||
* DRVSTAT.C
|
||
*
|
||
* Drive status routines, ported from DOS
|
||
*
|
||
* Copyright (c) 1995 Microsoft Corporation
|
||
*
|
||
* $Log: N:\NT\PRIVATE\NW4\NWSCRIPT\VCS\DRVSTAT.C $
|
||
*
|
||
* Rev 1.2 10 Apr 1996 14:22:20 terryt
|
||
* Hotfix for 21181hq
|
||
*
|
||
* Rev 1.2 12 Mar 1996 19:53:36 terryt
|
||
* Relative NDS names and merge
|
||
*
|
||
* Rev 1.1 22 Dec 1995 14:24:32 terryt
|
||
* Add Microsoft headers
|
||
*
|
||
* Rev 1.0 15 Nov 1995 18:06:54 terryt
|
||
* Initial revision.
|
||
*
|
||
* Rev 1.1 25 Aug 1995 16:22:44 terryt
|
||
* Capture support
|
||
*
|
||
* Rev 1.0 15 May 1995 19:10:32 terryt
|
||
* Initial revision.
|
||
*
|
||
*************************************************************************/
|
||
|
||
/*++
|
||
|
||
Copyright (c) 1994 Micro Computer Systems, Inc.
|
||
|
||
Module Name:
|
||
|
||
nwlibs\drvstat.c
|
||
|
||
Abstract:
|
||
|
||
Directory APIs.
|
||
|
||
Author:
|
||
|
||
Shawn Walker (v-swalk) 10-10-1994
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
#include "common.h"
|
||
|
||
|
||
/*++
|
||
*******************************************************************
|
||
|
||
GetDriveStatus
|
||
|
||
Routine Description:
|
||
|
||
Get the drive status.
|
||
|
||
Arguments:
|
||
|
||
DriveNumber = The drive to number to use. (1=A,2=B,C=3,...)
|
||
PathFormat = Format for the return path.
|
||
NW_FORMAT_NETWARE - volume:path
|
||
NW_FORMAT_SERVER_VOLUME - server\volume:path
|
||
NW_FORMAT_DRIVE - G:\path
|
||
NW_FORMAT_UNC - \\server\volume\path
|
||
pStatus = A pointer to return the status of the drive.
|
||
pConnectionHandle = A pointer to return the connection handle
|
||
for the drive.
|
||
pRootPath = The pointer to return the base root path. OPTIONAL
|
||
pRelativePath = The pointer to return the relative to root path.
|
||
pFullPath = The pointer to return the full path.
|
||
|
||
Return Value:
|
||
|
||
0x0000 SUCCESSFUL
|
||
0x00FF INVALID_DRIVE
|
||
|
||
*******************************************************************
|
||
--*/
|
||
unsigned int
|
||
GetDriveStatus(
|
||
unsigned short DriveNumber,
|
||
unsigned short PathFormat,
|
||
unsigned short *pStatus,
|
||
unsigned int *pConnectionHandle,
|
||
unsigned char *pRootPath,
|
||
unsigned char *pRelativePath,
|
||
unsigned char *pFullPath
|
||
)
|
||
{
|
||
unsigned char *p;
|
||
unsigned int Result;
|
||
unsigned short Status;
|
||
unsigned char Path[NCP_MAX_PATH_LENGTH + 1];
|
||
unsigned char WorkPath[NCP_MAX_PATH_LENGTH + 1];
|
||
unsigned char ServerName[NCP_SERVER_NAME_LENGTH + 1];
|
||
|
||
/** Make sure the drive number is valid **/
|
||
|
||
if (DriveNumber < 1 || DriveNumber > 32) {
|
||
return 0x000F; /* INVALID_DRIVE */
|
||
}
|
||
|
||
Status = 0;
|
||
|
||
DriveNumber--;
|
||
|
||
|
||
if (pConnectionHandle) {
|
||
/*
|
||
* This should never occur.
|
||
*/
|
||
DisplayError (0xff, "GetDriveStatus");
|
||
return 0xff;
|
||
}
|
||
|
||
/** Get the directory path from the server **/
|
||
Result = NTGetNWDrivePath( DriveNumber, ServerName, Path );
|
||
if ( Result ) {
|
||
*Path = 0;
|
||
*ServerName = 0;
|
||
}
|
||
|
||
/** Convert the / in the path to \ **/
|
||
for (p = Path; *p != 0 ; p++)
|
||
{
|
||
if (*p == '/')
|
||
*p = '\\';
|
||
}
|
||
|
||
/** Get the status of the drive if we need to **/
|
||
Status = NTNetWareDriveStatus( DriveNumber );
|
||
|
||
/** Get the status of the drive if we need to **/
|
||
|
||
if (pStatus) {
|
||
*pStatus = Status;
|
||
}
|
||
|
||
/** Get the full path if we need to **/
|
||
|
||
if (pFullPath) {
|
||
|
||
if (Status & NETWARE_LOCAL_FREE_DRIVE) {
|
||
*pFullPath = 0;
|
||
}
|
||
else {
|
||
strcpy(WorkPath, Path);
|
||
|
||
/** Build the NetWare path format (volume:path) **/
|
||
|
||
if (PathFormat == NETWARE_FORMAT_NETWARE) {
|
||
strcpy(pFullPath, WorkPath);
|
||
}
|
||
|
||
/** Build the server volume path (server\volume:path) **/
|
||
|
||
else if (PathFormat == NETWARE_FORMAT_SERVER_VOLUME) {
|
||
sprintf(pFullPath, "%s\\%s", ServerName, WorkPath);
|
||
}
|
||
|
||
/** Build the drive path (G:\path) **/
|
||
|
||
else if (PathFormat == NETWARE_FORMAT_DRIVE) {
|
||
|
||
p = WorkPath;
|
||
while (*p != ':' && *p) {
|
||
p++;
|
||
}
|
||
|
||
if (*p == ':') {
|
||
p++;
|
||
}
|
||
|
||
sprintf(pFullPath, "%c:\\%s", DriveNumber + 'A', p);
|
||
}
|
||
|
||
/** Build the UNC path (\\server\volume\path) **/
|
||
|
||
else if (PathFormat == NETWARE_FORMAT_UNC) {
|
||
|
||
p = WorkPath;
|
||
while (*p != ':' && *p) {
|
||
p++;
|
||
}
|
||
|
||
if (*p == ':') {
|
||
*p = '\\';
|
||
}
|
||
|
||
sprintf(pFullPath, "\\\\%s\\%s", ServerName, WorkPath);
|
||
}
|
||
}
|
||
}
|
||
|
||
strcpy(WorkPath, Path);
|
||
/*
|
||
* Path does not have the relative path (current directory) in it.
|
||
*/
|
||
|
||
/** Get the root path if we need to **/
|
||
|
||
if (pRootPath) {
|
||
|
||
if (Status & NETWARE_LOCAL_FREE_DRIVE) {
|
||
*pRootPath = 0;
|
||
}
|
||
else {
|
||
|
||
/** Build the NetWare root path format (volume:) **/
|
||
|
||
if (PathFormat == NETWARE_FORMAT_NETWARE) {
|
||
sprintf(pRootPath, strchr(WorkPath, ':')? "%s" : "%s:", WorkPath);
|
||
}
|
||
|
||
/** Build the server volume root path (server\volume:) **/
|
||
|
||
else if (PathFormat == NETWARE_FORMAT_SERVER_VOLUME) {
|
||
if ( fNDS && !_strcmpi( ServerName, NDSTREE) )
|
||
sprintf(pRootPath, strchr (WorkPath, ':')? "%s" : "%s:", WorkPath);
|
||
else
|
||
sprintf(pRootPath, strchr (WorkPath, ':')? "%s\\%s" : "%s\\%s:", ServerName, WorkPath);
|
||
}
|
||
|
||
/** Build the drive root path (G:\) **/
|
||
|
||
else if (PathFormat == NETWARE_FORMAT_DRIVE) {
|
||
sprintf(pRootPath, "%c:\\", DriveNumber + 'A');
|
||
}
|
||
|
||
/** Build the UNC root path (\\server\volume) **/
|
||
|
||
else if (PathFormat == NETWARE_FORMAT_UNC) {
|
||
sprintf(pRootPath, "\\\\%s\\%s", ServerName, WorkPath);
|
||
}
|
||
}
|
||
}
|
||
|
||
/** Get the relative path if we need to **/
|
||
|
||
if (pRelativePath) {
|
||
|
||
if (Status & NETWARE_LOCAL_FREE_DRIVE) {
|
||
*pRelativePath = 0;
|
||
}
|
||
else {
|
||
int i;
|
||
NTGetCurrentDirectory( (unsigned char)DriveNumber, pRelativePath );
|
||
/*
|
||
* Skip the drive letter
|
||
*/
|
||
if ( pRelativePath[0] ) {
|
||
for ( i = 0; ;i++ ) {
|
||
pRelativePath[i] = pRelativePath[i+3];
|
||
if ( !pRelativePath[i] )
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return 0x0000;
|
||
}
|