|
|
/*++
Copyright (c) 1991-1992 Microsoft Corporation
Module Name:
Domain.c
Abstract:
This file contains routines to implement remote versions of the LanMan domain APIs on downlevel servers. The APIs are RxNetGetDCName and RxNetLogonEnum.
Author:
John Rogers (JohnRo) 18-Jul-1991
Environment:
Portable to any flat, 32-bit environment. (Uses Win32 typedefs.) Requires ANSI C extensions: slash-slash comments, long external names.
Revision History:
18-Jul-1991 JohnRo Implement downlevel NetGetDCName. 27-Jul-1991 JohnRo Made changes suggested by PC-LINT. 07-Feb-1992 JohnRo Use NetApiBufferAllocate() instead of private version. 01-Sep-1992 JohnRo RAID 5088: NetGetDCName to downlevel doesn't UNICODE translate. Minor debug output fix. Changed to use _PREFIX equates.
--*/
// These must be included first:
#include <windef.h> // IN, LPTSTR, DWORD, TCHAR, etc.
#include <lmcons.h> // NET_API_STATUS, UNCLEN.
// These may be included in any order:
#include <apinums.h> // API_ equates.
#include <lmapibuf.h> // NetApiBufferAllocate(), NetApiBufferFree().
#include <lmerr.h> // NERR_ and ERROR_ equates.
#include <lmwksta.h> // NetWkstaGetInfo(), LPWKSTA_INFO_100.
#include <netdebug.h> // NetpAssert().
#include <prefix.h> // PREFIX_ equates.
#include <remdef.h> // REM16_, REM32_, REMSmb_ equates.
#include <rx.h> // RxRemoteApi().
#include <rxpdebug.h> // IF_DEBUG().
#include <rxdomain.h> // My prototypes.
#define MAX_DCNAME_BYTE_COUNT ( MAX_PATH * sizeof(TCHAR) )
NET_API_STATUS RxNetGetDCName ( IN LPTSTR UncServerName, IN LPTSTR OptionalDomain OPTIONAL, OUT LPBYTE *BufPtr )
/*++
Routine Description:
RxNetGetDCName performs the same function as NetGetDCName, except that the server name is known to refer to a downlevel server.
Arguments:
UncServerName - Same as NetGetDCName, except UncServerName must not be null, and must not refer to the local computer.
OptionalDomain - Same as NetGetDCName.
BufPtr - Same as NetGetDCName.
Return Value:
NET_API_STATUS - Same as NetGetDCName.
--*/
{ LPTSTR DCName = NULL; LPTSTR Domain; // filled-in with domain name (not left NULL).
NET_API_STATUS Status; LPWKSTA_INFO_100 WkstaInfo = NULL;
// Assume something might go wrong, and make error paths easier to
// code. Also, check for a bad pointer before we do anything.
*BufPtr = NULL;
//
// Get actual domain name.
//
if ( (OptionalDomain != NULL) && (*OptionalDomain != '\0') ) { Domain = OptionalDomain; } else { // Do NetWkstaGetInfo to get primary domain.
Status = NetWkstaGetInfo ( NULL, // no server name (want LOCAL idea of primary domain)
100, // level
(LPBYTE *) (LPVOID *) & WkstaInfo // output buffer (allocated)
); if (Status != NERR_Success) { IF_DEBUG(DOMAIN) { NetpKdPrint(( PREFIX_NETAPI "RxNetGetDCName: wksta get info failed, stat=" FORMAT_API_STATUS ".\n", Status)); } goto Done; } NetpAssert( WkstaInfo->wki100_langroup != NULL ); IF_DEBUG(DOMAIN) { NetpKdPrint(( PREFIX_NETAPI "RxNetGetDCName: wksta says domain is:\n" )); NetpDbgHexDump( (LPVOID) WkstaInfo->wki100_langroup, UNLEN+1 ); } Domain = WkstaInfo->wki100_langroup; } NetpAssert( Domain != NULL ); NetpAssert( *Domain != '\0' );
//
// Allocate memory for DCName.
//
Status = NetApiBufferAllocate ( MAX_DCNAME_BYTE_COUNT, (LPVOID *) & DCName ); if (Status != NERR_Success) { goto Done; }
//
// Actually remote the API to the downlevel server, to get DCName.
//
Status = RxRemoteApi( API_WGetDCName, // API number
UncServerName, REMSmb_NetGetDCName_P, // parm desc
REM16_dc_name, // data desc 16
REM32_dc_name, // data desc 32
REMSmb_dc_name, // data desc SMB
NULL, // no aux desc 16
NULL, // no aux desc 32
NULL, // no aux desc SMB
FALSE, // not a null session API
// rest of API's arguments, in LM 2.x 32-bit format:
Domain, // domain name (filled-in already)
DCName, // response
MAX_DCNAME_BYTE_COUNT // size of response buffer
);
// It's safe to free WkstaInfo now (we've been using it with Domain until
// now.)
Done:
//
// Tell caller how things went. Clean up as necessary.
//
if (Status == NERR_Success) { *BufPtr = (LPBYTE) DCName; } else { if (DCName != NULL) { (void) NetApiBufferFree ( DCName ); } }
if (WkstaInfo != NULL) { // Free memory which NetWkstaGetInfo allocated for us.
(void) NetApiBufferFree ( WkstaInfo ); }
return (Status);
} // RxNetGetDCName
|