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;
|
|||
|
}
|