windows-nt/Source/XPSP1/NT/ds/netapi/netlib/conffail.c
2020-09-26 16:20:57 +08:00

162 lines
4.5 KiB
C

/*++
Copyright (c) 1991-92 Microsoft Corporation
Module Name:
ConfFail.c
Abstract:
This routine is only used by the NetConfig API DLL stubs.
See Net/API/ConfStub.c for more info.
Author:
John Rogers (JohnRo) 26-Nov-1991
Environment:
User Mode - Win32
Only runs under NT; has an NT-specific interface (with Win32 types).
Requires ANSI C extensions: slash-slash comments, long external names.
Revision History:
26-Nov-1991 JohnRo
Implement local NetConfig APIs.
07-Jan-1992 JohnRo
Handle wksta not started better.
09-Mar-1992 JohnRo
Fixed a bug or two.
--*/
// These must be included first:
#include <nt.h> // IN, etc. (Only needed by temporary config.h)
#include <ntrtl.h> // (Only needed by temporary config.h)
#include <windef.h> // LPVOID, etc.
#include <lmcons.h> // NET_API_STATUS, etc.
#include <netdebug.h> // (Needed by config.h)
// These may be included in any order:
#include <config.h> // My prototype.
#include <debuglib.h> // IF_DEBUG().
#include <lmerr.h> // NERR_Success, etc.
#include <lmremutl.h> // NetpRemoteComputerSupports(), SUPPORTS_ stuff
#include <lmsname.h> // SERVICE_ equates.
#include <netlib.h> // NetpIsServiceStarted().
#define UnexpectedConfigMsg( debugString ) \
{ \
NetpKdPrint(( FORMAT_LPDEBUG_STRING ": unexpected situation... " \
debugString "; original api status is " FORMAT_API_STATUS \
".\n", DebugName, OriginalApiStatus )); \
}
NET_API_STATUS
NetpHandleConfigFailure(
IN LPDEBUG_STRING DebugName, // Used by UnexpectedConfigMsg().
IN NET_API_STATUS OriginalApiStatus, // Used by UnexpectedConfigMsg().
IN LPTSTR ServerNameValue OPTIONAL,
OUT LPBOOL TryDownlevel
)
{
DWORD OptionsSupported = 0;
NET_API_STATUS TempApiStatus;
*TryDownlevel = FALSE; // Be pesimistic until we know for sure.
switch (OriginalApiStatus) {
case NERR_CfgCompNotFound : /*FALLTHROUGH*/
case NERR_CfgParamNotFound : /*FALLTHROUGH*/
case ERROR_INVALID_PARAMETER : /*FALLTHROUGH*/
case ERROR_INVALID_LEVEL : /*FALLTHROUGH*/
*TryDownlevel = FALSE;
return (OriginalApiStatus);
}
NetpAssert( OriginalApiStatus != NERR_Success );
//
// Learn about the machine. This is fairly easy since the
// NetRemoteComputerSupports also handles the local machine (whether
// or not a server name is given).
//
TempApiStatus = NetRemoteComputerSupports(
ServerNameValue,
SUPPORTS_RPC | SUPPORTS_LOCAL, // options wanted
&OptionsSupported);
if (TempApiStatus != NERR_Success) {
// This is where machine not found gets handled.
return (TempApiStatus);
}
if (OptionsSupported & SUPPORTS_LOCAL) {
// We'll get here if ServerNameValue is NULL
UnexpectedConfigMsg( "local, can't connect" );
return (OriginalApiStatus);
} else { // remote machine
//
// Local workstation is not started? (It must be in order to
// remote APIs to the other system.)
//
if (! NetpIsServiceStarted( (LPTSTR) SERVICE_WORKSTATION) ) {
return (NERR_WkstaNotStarted);
} else { // local wksta is started
//
// Remote registry call failed. Try call to downlevel.
//
IF_DEBUG(CONFIG) {
NetpKdPrint((FORMAT_LPDEBUG_STRING
": Remote registry call failed.\n", DebugName));
}
//
// See if the machine supports RPC. If it does, we do not
// try the downlevel calls, but just return the error.
//
if (OptionsSupported & SUPPORTS_RPC) {
UnexpectedConfigMsg( "machine supports RPC, or other error." );
return (OriginalApiStatus);
} else { // need to call downlevel
// NetpKdPrint((FORMAT_LPDEBUG_STRING
// ": call downlevel.\n", DebugName));
// Tell caller to try calling downlevel routine.
*TryDownlevel = TRUE;
return (ERROR_NOT_SUPPORTED); // any error code will do.
} // need to call downlevel
/*NOTREACHED*/
} // local wksta is started
/*NOTREACHED*/
} // remote machine
/*NOTREACHED*/
} // NetpHandleConfigFailure