mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
369 lines
11 KiB
369 lines
11 KiB
/*++
|
|
|
|
Copyright (c) 1991-1993 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
ReplStub.c
|
|
|
|
Abstract:
|
|
|
|
Client stubs of the replicator service config APIs.
|
|
|
|
Author:
|
|
|
|
John Rogers (JohnRo) 17-Dec-1991
|
|
|
|
Environment:
|
|
|
|
User Mode - Win32
|
|
|
|
Revision History:
|
|
|
|
17-Dec-1991 JohnRo
|
|
Created dummy file.
|
|
17-Dec-1991 JohnRo
|
|
Actually include my header file (LmRepl.h) so we can test against it.
|
|
17-Jan-1992 JohnRo
|
|
Wrote stubs for first 3 RPCable APIs.
|
|
20-Jan-1992 JohnRo
|
|
Added import APIs, config APIs, and rest of export APIs.
|
|
27-Jan-1992 JohnRo
|
|
Split stubs into 3 files: ReplStub.c, ImpStub.c, and ExpStub.c.
|
|
Changed to use LPTSTR etc.
|
|
Added handling of getinfo and setinfo APIs when service isn't started.
|
|
Tell NetRpc.h macros that we need replicator service.
|
|
05-Feb-1992 JohnRo
|
|
Added debug messages when service is not started.
|
|
18-Feb-1992 JohnRo
|
|
NetReplGetInfo() does too much with bad info level.
|
|
Fixed usage of union/container.
|
|
Added code for NetReplSetInfo() when service is not started.
|
|
15-Mar-1992 JohnRo
|
|
Added support for setinfo info levels in ReplConfigIsLevelValid().
|
|
19-Jul-1992 JohnRo
|
|
RAID 10503: srv mgr: repl dialog doesn't come up.
|
|
Use PREFIX_ equates.
|
|
20-Jul-1992 JohnRo
|
|
RAID 2252: repl should prevent export on Windows/NT.
|
|
14-Aug-1992 JohnRo
|
|
RAID 3601: repl APIs should checked import & export lists.
|
|
Use PREFIX_NETAPI instead of PREFIX_REPL for repl API stubs.
|
|
01-Dec-1992 JohnRo
|
|
RAID 3844: remote NetReplSetInfo uses local machine type.
|
|
05-Jan-1993 JohnRo
|
|
Repl WAN support (get rid of repl name list limits).
|
|
Made changes suggested by PC-LINT 5.0
|
|
Corrected debug bit usage.
|
|
Removed some obsolete comments about retrying APIs.
|
|
|
|
--*/
|
|
|
|
|
|
// These must be included first:
|
|
|
|
#include <windows.h>
|
|
#include <lmcons.h> // NET_API_STATUS, etc.
|
|
#include <netdebug.h> // NetpKdPrint(), needed by <netrpc.h>, etc.
|
|
#include <rpc.h> // Needed by <netrpc.h>.
|
|
|
|
// These may be included in any order:
|
|
|
|
#include <lmrepl.h> // My prototypes, etc.
|
|
#include <lmerr.h> // NERR_ and ERROR_ equates, NO_ERROR.
|
|
#include <lmsname.h> // SERVICE_ name equates.
|
|
#include <netlib.h> // NetpMemoryFree(), NetpSetParmError().
|
|
#include <netrpc.h> // NET_REMOTE macros.
|
|
#include <prefix.h> // PREFIX_ equates.
|
|
#include <repl.h> // MIDL-generated NetrRepl prototypes.
|
|
#include <replconf.h> // ReplConfig API workers.
|
|
#include <repldefs.h> // IF_DEBUG(), etc.
|
|
|
|
|
|
|
|
NET_API_STATUS NET_API_FUNCTION
|
|
NetReplGetInfo (
|
|
IN LPCWSTR UncServerName OPTIONAL,
|
|
IN DWORD Level,
|
|
OUT LPBYTE * BufPtr
|
|
)
|
|
{
|
|
NET_API_STATUS ApiStatus;
|
|
LPTSTR ExportList = NULL;
|
|
LPTSTR ImportList = NULL;
|
|
|
|
*BufPtr = NULL; // Must be NULL so RPC knows to fill it in.
|
|
|
|
NET_REMOTE_TRY_RPC
|
|
|
|
//
|
|
// Try RPC (local or remote) version of API.
|
|
//
|
|
ApiStatus = NetrReplGetInfo(
|
|
(LPWSTR)UncServerName,
|
|
Level,
|
|
(LPCONFIG_CONTAINER) (LPVOID) BufPtr);
|
|
|
|
NET_REMOTE_RPC_FAILED("NetReplGetInfo",
|
|
(LPWSTR)UncServerName,
|
|
ApiStatus,
|
|
NET_REMOTE_FLAG_NORMAL,
|
|
SERVICE_REPL )
|
|
|
|
//
|
|
// No downlevel version to call
|
|
//
|
|
ApiStatus = ERROR_NOT_SUPPORTED;
|
|
|
|
NET_REMOTE_END
|
|
|
|
if (ApiStatus == NERR_ServiceNotInstalled) {
|
|
LPVOID ApiRecord = NULL;
|
|
DWORD Role, Interval, Pulse, GuardTime, Random;
|
|
TCHAR ExportPath[PATHLEN+1];
|
|
TCHAR ImportPath[PATHLEN+1];
|
|
TCHAR LogonUserName[UNLEN+1];
|
|
|
|
IF_DEBUG(DLLSTUB) {
|
|
NetpKdPrint(( PREFIX_NETAPI
|
|
"NetReplGetInfo: running w/o service.\n" ));
|
|
}
|
|
|
|
if ( !ReplConfigIsLevelValid( Level, FALSE /* not setinfo */ )) {
|
|
ApiStatus = ERROR_INVALID_LEVEL;
|
|
} else {
|
|
NetpAssert( *BufPtr == NULL );
|
|
|
|
// Read config data for the replicator.
|
|
ApiStatus = ReplConfigRead(
|
|
(LPWSTR)UncServerName,
|
|
& Role,
|
|
ExportPath,
|
|
&ExportList, // Alloc and set ptr.
|
|
ImportPath,
|
|
&ImportList, // Alloc and set ptr.
|
|
LogonUserName,
|
|
& Interval,
|
|
& Pulse,
|
|
& GuardTime,
|
|
& Random );
|
|
if (ApiStatus == NO_ERROR) {
|
|
|
|
ApiStatus = ReplConfigAllocAndBuildApiRecord (
|
|
Level,
|
|
Role,
|
|
ExportPath,
|
|
ExportList,
|
|
ImportPath,
|
|
ImportList,
|
|
LogonUserName,
|
|
Interval,
|
|
Pulse,
|
|
GuardTime,
|
|
Random,
|
|
(LPBYTE *) & ApiRecord ); // alloc and set ptr
|
|
if (ApiStatus == NO_ERROR) {
|
|
NetpAssert( ApiRecord != NULL );
|
|
NetpAssert(
|
|
ReplConfigIsApiRecordValid(
|
|
Level, ApiRecord, NULL ) );
|
|
}
|
|
}
|
|
|
|
}
|
|
*BufPtr = ApiRecord; // will be NULL on error.
|
|
|
|
}
|
|
|
|
if (ExportList != NULL) {
|
|
NetpMemoryFree( ExportList );
|
|
}
|
|
if (ImportList != NULL) {
|
|
NetpMemoryFree( ImportList );
|
|
}
|
|
|
|
return ApiStatus;
|
|
|
|
} // NetReplGetInfo
|
|
|
|
|
|
NET_API_STATUS NET_API_FUNCTION
|
|
NetReplSetInfo (
|
|
IN LPCWSTR UncServerName OPTIONAL,
|
|
IN DWORD Level,
|
|
IN const LPBYTE Buf,
|
|
OUT LPDWORD ParmError OPTIONAL
|
|
)
|
|
{
|
|
NET_API_STATUS ApiStatus;
|
|
LPCONFIG_CONTAINER ApiUnion = (LPVOID) &Buf;
|
|
LPTSTR ExportList = NULL;
|
|
LPTSTR ImportList = NULL;
|
|
|
|
NET_REMOTE_TRY_RPC
|
|
|
|
//
|
|
// Try RPC (local or remote) version of API.
|
|
//
|
|
ApiStatus = NetrReplSetInfo(
|
|
(LPWSTR)UncServerName,
|
|
Level,
|
|
ApiUnion,
|
|
ParmError);
|
|
|
|
NET_REMOTE_RPC_FAILED("NetReplSetInfo",
|
|
UncServerName,
|
|
ApiStatus,
|
|
NET_REMOTE_FLAG_NORMAL,
|
|
SERVICE_REPL )
|
|
|
|
//
|
|
// No downlevel version to call
|
|
//
|
|
ApiStatus = ERROR_NOT_SUPPORTED;
|
|
|
|
NET_REMOTE_END
|
|
|
|
if (ApiStatus == NERR_ServiceNotInstalled) {
|
|
|
|
IF_DEBUG(DLLSTUB) {
|
|
NetpKdPrint(( PREFIX_NETAPI
|
|
"NetReplSetInfo: running w/o service.\n" ));
|
|
}
|
|
|
|
NetpSetParmError( PARM_ERROR_UNKNOWN );
|
|
NetpAssert( ApiUnion != NULL );
|
|
if ((ApiUnion->Info0) == NULL) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (Level == 0) {
|
|
|
|
LPREPL_INFO_0 ApiRecord = ApiUnion->Info0;
|
|
if ( !ReplConfigIsApiRecordValid( Level,ApiRecord,ParmError ) ) {
|
|
ApiStatus = ERROR_INVALID_PARAMETER;
|
|
} else if ( !ReplConfigIsRoleAllowed(
|
|
(LPWSTR)UncServerName,
|
|
ApiRecord->rp0_role ) ) {
|
|
|
|
ApiStatus = ERROR_INVALID_PARAMETER;
|
|
|
|
} else {
|
|
|
|
IF_DEBUG( DLLSTUB ) {
|
|
NetpKdPrint(( PREFIX_NETAPI
|
|
"NetReplSetInfo: got structure:\n" ));
|
|
NetpDbgDisplayRepl( Level, ApiRecord );
|
|
}
|
|
|
|
// Change config data for the replicator.
|
|
ApiStatus = ReplConfigWrite(
|
|
(LPWSTR)UncServerName,
|
|
ApiRecord->rp0_role,
|
|
ApiRecord->rp0_exportpath,
|
|
ApiRecord->rp0_exportlist,
|
|
ApiRecord->rp0_importpath,
|
|
ApiRecord->rp0_importlist,
|
|
ApiRecord->rp0_logonusername,
|
|
ApiRecord->rp0_interval,
|
|
ApiRecord->rp0_pulse,
|
|
ApiRecord->rp0_guardtime,
|
|
ApiRecord->rp0_random );
|
|
}
|
|
|
|
} else if ( (Level >= 1000) && (Level <= 1003) ) {
|
|
|
|
DWORD Role, Interval, Pulse, GuardTime, Random;
|
|
TCHAR ExportPath[PATHLEN+1];
|
|
TCHAR ImportPath[PATHLEN+1];
|
|
TCHAR LogonUserName[UNLEN+1];
|
|
|
|
// Read config data for the replicator.
|
|
ApiStatus = ReplConfigRead(
|
|
(LPWSTR)UncServerName,
|
|
& Role,
|
|
ExportPath,
|
|
&ExportList, // Alloc and set ptr.
|
|
ImportPath,
|
|
&ImportList, // Alloc and set ptr.
|
|
LogonUserName,
|
|
& Interval,
|
|
& Pulse,
|
|
& GuardTime,
|
|
& Random );
|
|
if (ApiStatus == NO_ERROR) {
|
|
|
|
if (Level == 1000) {
|
|
LPREPL_INFO_1000 SetInfoRecord = ApiUnion->Info1000;
|
|
|
|
if ( !ReplIsIntervalValid(SetInfoRecord->rp1000_interval)) {
|
|
NetpSetParmError( 1 ); // first field is in error.
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
Interval = SetInfoRecord->rp1000_interval;
|
|
} else if (Level == 1001) {
|
|
LPREPL_INFO_1001 SetInfoRecord = ApiUnion->Info1001;
|
|
|
|
if ( !ReplIsPulseValid(SetInfoRecord->rp1001_pulse)) {
|
|
NetpSetParmError( 1 ); // first field is in error.
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
Pulse = SetInfoRecord->rp1001_pulse;
|
|
} else if (Level == 1002) {
|
|
LPREPL_INFO_1002 SetInfoRecord = ApiUnion->Info1002;
|
|
|
|
if (!ReplIsGuardTimeValid(SetInfoRecord->rp1002_guardtime)){
|
|
NetpSetParmError( 1 ); // first field is in error.
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
GuardTime = SetInfoRecord->rp1002_guardtime;
|
|
} else {
|
|
LPREPL_INFO_1003 SetInfoRecord = ApiUnion->Info1003;
|
|
NetpAssert( Level == 1003 );
|
|
if ( !ReplIsRandomValid( SetInfoRecord->rp1003_random ) ) {
|
|
NetpSetParmError( 1 ); // first field is in error.
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
Random = SetInfoRecord->rp1003_random;
|
|
}
|
|
|
|
// Change config data for the replicator.
|
|
ApiStatus = ReplConfigWrite(
|
|
(LPWSTR)UncServerName,
|
|
Role,
|
|
ExportPath,
|
|
ExportList,
|
|
ImportPath,
|
|
ImportList,
|
|
LogonUserName,
|
|
Interval,
|
|
Pulse,
|
|
GuardTime,
|
|
Random );
|
|
|
|
} // read of old data was OK
|
|
|
|
} else {
|
|
ApiStatus = ERROR_INVALID_LEVEL;
|
|
}
|
|
|
|
if (ApiStatus == NO_ERROR) {
|
|
NetpSetParmError( PARM_ERROR_NONE );
|
|
}
|
|
|
|
}
|
|
|
|
if (ExportList != NULL) {
|
|
NetpMemoryFree( ExportList );
|
|
}
|
|
if (ImportList != NULL) {
|
|
NetpMemoryFree( ImportList );
|
|
}
|
|
|
|
return ApiStatus;
|
|
|
|
} // NetReplSetInfo
|