354 lines
10 KiB
C
354 lines
10 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1991-92 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
ConfStub.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module contains stubs for the NetConfig APIs.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
John Rogers (JohnRo) 23-Oct-1991
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
Portable to any flat, 32-bit environment. (Uses Win32 typedefs.)
|
||
|
Requires ANSI C extensions: slash-slash comments, long external names.
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
23-Oct-1991 JohnRo
|
||
|
Created.
|
||
|
28-Oct-1991 JohnRo
|
||
|
Use <winerror.h> if <lmerr.h> isn't needed.
|
||
|
20-Nov-1991 JohnRo
|
||
|
Work with old or new lmconfig.h for now (based on REVISED_CONFIG_APIS).
|
||
|
02-Dec-1991 JohnRo
|
||
|
Implement local NetConfig APIs.
|
||
|
11-Mar-1992 JohnRo
|
||
|
Fixed bug in get all where array wasn't terminated.
|
||
|
Added real NetConfigSet() handling.
|
||
|
21-Oct-1992 JohnRo
|
||
|
RAID 9357: server mgr: can't add to alerts list on downlevel.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
// 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> // IN, DWORD, etc.
|
||
|
#include <lmcons.h> // DEVLEN, NET_API_STATUS, etc.
|
||
|
#include <netdebug.h> // (Needed by config.h)
|
||
|
|
||
|
// These may be included in any order:
|
||
|
|
||
|
#include <config.h> // NetpOpenConfigData(), etc.
|
||
|
#include <lmapibuf.h> // NetApiBufferFree().
|
||
|
#include <lmerr.h> // NERR_ and ERROR_ equates.
|
||
|
#include <lmconfig.h> // NetConfig APIs.
|
||
|
#include <netlib.h> // NetpMemoryReallocate().
|
||
|
#include <rxconfig.h> // RxNetConfig APIs.
|
||
|
#include <tstring.h> // STRSIZE(), TCHAR_EOS, etc.
|
||
|
|
||
|
|
||
|
#define INITIAL_ALLOC_AMOUNT 512 // arbitrary
|
||
|
#define INCR_ALLOC_AMOUNT 512 // arbitrary
|
||
|
|
||
|
|
||
|
NET_API_STATUS NET_API_FUNCTION
|
||
|
NetConfigGet (
|
||
|
IN LPCWSTR UncServerName OPTIONAL,
|
||
|
IN LPCWSTR Component,
|
||
|
IN LPCWSTR Parameter,
|
||
|
#ifdef REVISED_CONFIG_APIS
|
||
|
OUT LPBYTE *BufPtr
|
||
|
#else
|
||
|
OUT LPBYTE *BufPtr,
|
||
|
OUT LPDWORD TotalAvailable
|
||
|
#endif
|
||
|
)
|
||
|
|
||
|
{
|
||
|
NET_API_STATUS Status;
|
||
|
LPNET_CONFIG_HANDLE ConfigHandle;
|
||
|
BOOL TryDownLevel;
|
||
|
|
||
|
#ifndef REVISED_CONFIG_APIS
|
||
|
UNREFERENCED_PARAMETER(TotalAvailable);
|
||
|
#endif
|
||
|
|
||
|
*BufPtr = NULL; // Check caller and make error handling easier.
|
||
|
|
||
|
Status = NetpOpenConfigData(
|
||
|
& ConfigHandle,
|
||
|
(LPWSTR)UncServerName,
|
||
|
(LPWSTR)Component,
|
||
|
TRUE); // just want read-only access
|
||
|
|
||
|
if (Status != NERR_Success) {
|
||
|
|
||
|
Status = NetpHandleConfigFailure(
|
||
|
"NetConfigGet", // debug name
|
||
|
Status, // result of NetpOpenConfigData
|
||
|
(LPWSTR)UncServerName,
|
||
|
& TryDownLevel);
|
||
|
|
||
|
if (TryDownLevel) {
|
||
|
return (RxNetConfigGet(
|
||
|
(LPWSTR)UncServerName,
|
||
|
(LPWSTR)Component,
|
||
|
(LPWSTR)Parameter,
|
||
|
BufPtr));
|
||
|
} else {
|
||
|
return (Status); // result of NetpHandleConfigFailure
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Status = NetpGetConfigValue(
|
||
|
ConfigHandle,
|
||
|
(LPWSTR)Parameter, // keyword
|
||
|
(LPTSTR *) (LPVOID) BufPtr); // alloc and set ptr
|
||
|
|
||
|
if (Status == NERR_Success) {
|
||
|
Status = NetpCloseConfigData( ConfigHandle );
|
||
|
NetpAssert(Status == NERR_Success);
|
||
|
} else {
|
||
|
NetpAssert(*BufPtr == NULL);
|
||
|
(void) NetpCloseConfigData( ConfigHandle );
|
||
|
}
|
||
|
|
||
|
return (Status);
|
||
|
|
||
|
} // NetConfigGet
|
||
|
|
||
|
|
||
|
|
||
|
NET_API_STATUS NET_API_FUNCTION
|
||
|
NetConfigGetAll (
|
||
|
IN LPCWSTR UncServerName OPTIONAL,
|
||
|
IN LPCWSTR Component,
|
||
|
#ifdef REVISED_CONFIG_APIS
|
||
|
OUT LPBYTE *BufPtr
|
||
|
#else
|
||
|
OUT LPBYTE *BufPtr,
|
||
|
OUT LPDWORD TotalAvailable
|
||
|
#endif
|
||
|
)
|
||
|
|
||
|
{
|
||
|
DWORD BufSize; // Bytes allocated at *BufPtr (so far).
|
||
|
DWORD BufUsed; // Bytes used at *BufPtr (so far).
|
||
|
LPNET_CONFIG_HANDLE ConfigHandle;
|
||
|
BOOL FirstTime;
|
||
|
LPVOID NewBuffPtr;
|
||
|
NET_API_STATUS Status;
|
||
|
BOOL TryDownLevel;
|
||
|
|
||
|
#ifndef REVISED_CONFIG_APIS
|
||
|
UNREFERENCED_PARAMETER(TotalAvailable);
|
||
|
#endif
|
||
|
|
||
|
*BufPtr = NULL; // Check caller and make error handling easier.
|
||
|
|
||
|
Status = NetpOpenConfigData(
|
||
|
& ConfigHandle,
|
||
|
(LPWSTR)UncServerName,
|
||
|
(LPWSTR)Component,
|
||
|
TRUE); // just want read-only access
|
||
|
|
||
|
if (Status != NERR_Success) {
|
||
|
|
||
|
Status = NetpHandleConfigFailure(
|
||
|
"NetConfigGetAll", // debug name
|
||
|
Status, // result of NetpOpenConfigData
|
||
|
(LPWSTR)UncServerName,
|
||
|
& TryDownLevel);
|
||
|
|
||
|
if (TryDownLevel) {
|
||
|
return (RxNetConfigGetAll(
|
||
|
(LPWSTR)UncServerName,
|
||
|
(LPWSTR)Component,
|
||
|
BufPtr));
|
||
|
|
||
|
} else {
|
||
|
return (Status); // result of NetpHandleConfigFailure
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Even if there aren't any entries, we'll need to store a null at
|
||
|
// end of array. So allocate initial one now.
|
||
|
BufSize = INITIAL_ALLOC_AMOUNT;
|
||
|
NewBuffPtr = NetpMemoryReallocate(
|
||
|
(LPVOID) *BufPtr, // old address
|
||
|
BufSize); // new size
|
||
|
if (NewBuffPtr == NULL) { // out of memory
|
||
|
(void) NetpCloseConfigData( ConfigHandle );
|
||
|
return (ERROR_NOT_ENOUGH_MEMORY);
|
||
|
}
|
||
|
*BufPtr = NewBuffPtr;
|
||
|
BufUsed = 0;
|
||
|
|
||
|
// Loop once per entry (at least once if no entries).
|
||
|
FirstTime = TRUE;
|
||
|
do {
|
||
|
LPTSTR KeywordBuffer;
|
||
|
LPTSTR ValueBuffer;
|
||
|
|
||
|
Status = NetpEnumConfigSectionValues(
|
||
|
ConfigHandle,
|
||
|
& KeywordBuffer, // Alloc and set ptr.
|
||
|
& ValueBuffer, // Alloc and set ptr.
|
||
|
FirstTime);
|
||
|
|
||
|
FirstTime = FALSE;
|
||
|
|
||
|
if (Status == NERR_Success) {
|
||
|
|
||
|
DWORD SrcSize =
|
||
|
(STRLEN(KeywordBuffer) + 1 + STRLEN(ValueBuffer) + 1)
|
||
|
* sizeof(TCHAR);
|
||
|
if (BufSize < (BufUsed+SrcSize) ) {
|
||
|
if (SrcSize <= INCR_ALLOC_AMOUNT) {
|
||
|
BufSize += INCR_ALLOC_AMOUNT;
|
||
|
} else {
|
||
|
BufSize += SrcSize;
|
||
|
}
|
||
|
NewBuffPtr = NetpMemoryReallocate(
|
||
|
(LPVOID) *BufPtr, /* old address */
|
||
|
BufSize); /* new size */
|
||
|
if (NewBuffPtr == NULL) { /* out of memory */
|
||
|
(void) NetpCloseConfigData( ConfigHandle );
|
||
|
return (ERROR_NOT_ENOUGH_MEMORY);
|
||
|
}
|
||
|
*BufPtr = NewBuffPtr;
|
||
|
}
|
||
|
|
||
|
#define AddString( lptstrSrc, CharCount ) \
|
||
|
{ \
|
||
|
LPTSTR lptstrDest; \
|
||
|
NetpAssert( CharCount > 0 ); \
|
||
|
lptstrDest = (LPTSTR)NetpPointerPlusSomeBytes( *BufPtr, BufUsed); \
|
||
|
NetpAssert( lptstrDest != NULL ); \
|
||
|
(void) STRNCPY( lptstrDest, lptstrSrc, CharCount ); \
|
||
|
BufUsed += (CharCount * sizeof(TCHAR) ); \
|
||
|
NetpAssert( BufUsed <= BufSize ); \
|
||
|
}
|
||
|
|
||
|
AddString( KeywordBuffer, STRLEN(KeywordBuffer) );
|
||
|
(void) NetApiBufferFree( KeywordBuffer );
|
||
|
|
||
|
AddString( TEXT("="), 1 );
|
||
|
|
||
|
AddString( ValueBuffer, STRLEN(ValueBuffer) );
|
||
|
(void) NetApiBufferFree( ValueBuffer );
|
||
|
|
||
|
#define AddNullChar( ) \
|
||
|
{ \
|
||
|
AddString( TEXT(""), 1 ); \
|
||
|
}
|
||
|
|
||
|
AddNullChar(); // Terminate this entry.
|
||
|
|
||
|
}
|
||
|
|
||
|
} while (Status == NERR_Success);
|
||
|
|
||
|
if (Status == NERR_CfgParamNotFound) {
|
||
|
AddNullChar(); // Terminate the array.
|
||
|
Status = NetpCloseConfigData( ConfigHandle );
|
||
|
NetpAssert(Status == NERR_Success);
|
||
|
} else {
|
||
|
NetpAssert( Status != NO_ERROR );
|
||
|
NetpAssert( *BufPtr != NULL );
|
||
|
NetpMemoryFree( *BufPtr );
|
||
|
*BufPtr = NULL;
|
||
|
(void) NetpCloseConfigData( ConfigHandle );
|
||
|
}
|
||
|
|
||
|
return (Status);
|
||
|
|
||
|
} // NetConfigGetAll
|
||
|
|
||
|
|
||
|
|
||
|
NET_API_STATUS NET_API_FUNCTION
|
||
|
NetConfigSet (
|
||
|
IN LPCWSTR UncServerName OPTIONAL,
|
||
|
IN LPCWSTR Reserved1 OPTIONAL,
|
||
|
IN LPCWSTR Component,
|
||
|
IN DWORD Level,
|
||
|
IN DWORD Reserved2,
|
||
|
IN LPBYTE Buf,
|
||
|
IN DWORD Reserved3
|
||
|
)
|
||
|
{
|
||
|
LPCONFIG_INFO_0 Info = (LPVOID) Buf;
|
||
|
LPNET_CONFIG_HANDLE ConfigHandle;
|
||
|
NET_API_STATUS Status;
|
||
|
BOOL TryDownLevel;
|
||
|
|
||
|
if (Buf == NULL) {
|
||
|
return (ERROR_INVALID_PARAMETER);
|
||
|
} else if (Level != 0) {
|
||
|
return (ERROR_INVALID_LEVEL);
|
||
|
} else if (Info->cfgi0_key == NULL) {
|
||
|
return (ERROR_INVALID_PARAMETER);
|
||
|
} else if (Info->cfgi0_data == NULL) {
|
||
|
return (ERROR_INVALID_PARAMETER);
|
||
|
} else if (Reserved1 != NULL) {
|
||
|
return (ERROR_INVALID_PARAMETER);
|
||
|
} else if (Reserved2 != 0) {
|
||
|
return (ERROR_INVALID_PARAMETER);
|
||
|
} else if (Reserved3 != 0) {
|
||
|
return (ERROR_INVALID_PARAMETER);
|
||
|
}
|
||
|
|
||
|
Status = NetpOpenConfigData(
|
||
|
& ConfigHandle,
|
||
|
(LPWSTR)UncServerName,
|
||
|
(LPWSTR)Component,
|
||
|
FALSE); // don't want _read-only _access
|
||
|
|
||
|
if (Status != NERR_Success) {
|
||
|
|
||
|
Status = NetpHandleConfigFailure(
|
||
|
"NetConfigSet", // debug name
|
||
|
Status, // result of NetpOpenConfigData
|
||
|
(LPWSTR)UncServerName,
|
||
|
& TryDownLevel);
|
||
|
|
||
|
if (TryDownLevel) {
|
||
|
return (RxNetConfigSet(
|
||
|
(LPWSTR)UncServerName,
|
||
|
(LPWSTR)Reserved1,
|
||
|
(LPWSTR)Component,
|
||
|
Level,
|
||
|
Reserved2,
|
||
|
Buf,
|
||
|
Reserved3));
|
||
|
} else {
|
||
|
return (Status); // result of NetpHandleConfigFailure
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Status = NetpSetConfigValue(
|
||
|
ConfigHandle,
|
||
|
Info->cfgi0_key, // keyword
|
||
|
Info->cfgi0_data); // new value
|
||
|
|
||
|
if (Status == NERR_Success) {
|
||
|
Status = NetpCloseConfigData( ConfigHandle );
|
||
|
NetpAssert(Status == NERR_Success);
|
||
|
} else {
|
||
|
(void) NetpCloseConfigData( ConfigHandle );
|
||
|
}
|
||
|
|
||
|
return (Status);
|
||
|
|
||
|
} // NetConfigSet
|