Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

229 lines
8.0 KiB

// BUGBUG: Avoid %ws for UNICODE
/*
NETCNFG.C -- a sample program demonstrating NetConfig API functions.
This program requires that you have admin privilege or any
type of operator privilege on the specified server.
usage: netcnfg [-s \\server] [-p parameter] [-c component] [-v value]
where \\server = Name of the server. A servername must be
preceded by two backslashes (\\).
parameter = Name of the LANMAN.INI parameter to get.
component = Name of the component from which the
parameter is to be retrieved.
value = New string value for parameter.
API Used to...
================ ===========================================
NetConfigGet Retrieve a parameter in the LANMAN.INI file
on the specified server
NetConfigGetAll Retrieve complete component info from the
specified LANMAN.INI file
NetConfigSet Change or add a parameter in the LANMAN.INI file
on the specified server
This code sample is provided for demonstration purposes only.
Microsoft makes no warranty, either express or implied,
as to its usability in any given situation.
25-Oct-1991 JohnRo
Revised from LanMan 2.0 SDK to use NT/LAN APIs, etc.
30-Oct-1991 JohnRo
Reduce unnecessary recompiles.
07-Jan-1992 JohnRo
Added use of NetConfigSet to test repl stuff. Added -v flag for value.
14-Jun-1992 JohnRo
Changed net APIs to UNICODE.
*/
// These must be included first:
#ifndef UNICODE
#define UNICODE // net APIs are only supported in UNICODE.
#endif
#define NOMINMAX // Avoid windows vs. stdlib.h conflicts.
#include <windef.h> // DWORD, etc.
#include <lmcons.h> // NET_API_STATUS, etc.
// These may be included in any order:
#include <lmapibuf.h> // NetApiBufferFree().
#include <lmconfig.h> // NetConfig APIs and structures.
#include <lmerr.h> // NERR_ and ERROR_ equates.
#include "samples.h" // Internal routine header file
#include <stdio.h> // C run-time header files
#include <stdlib.h> // EXIT_FAILURE, EXIT_SUCCESS, _CRTAPI1.
#include <wchar.h> // wcslen().
#define DEFAULT_COMPONENT L"Workstation"
#define DEFAULT_PARAMETER L"Domain"
#define SMALL_BUFF 64
#define BIG_BUFF 4096
void Usage (char * pszProgram);
int _CRTAPI1
main(
int argc,
char *argv[]
)
{
LPWSTR pszServer = L""; // Server name
LPWSTR pszComponent = DEFAULT_COMPONENT; // Component to list
LPWSTR pszParameter = DEFAULT_PARAMETER; // Parameter within component
LPWSTR pszValue = NULL; // No new value (don't change)
// char *pszBuffer, *p; // String pointers
int iCount; // Index counter
API_RET_TYPE uReturnCode; // API return code
LPWSTR BufferW;
LPWSTR p;
for (iCount = 1; iCount < argc; iCount++)
{
if ((*argv[iCount] == '-') || (*argv[iCount] == '/'))
{
switch (tolower(*(argv[iCount]+1))) // Process switches
{
case 's': // -s servername
pszServer = SafeMallocWStrFromStr( argv[++iCount] );
break;
case 'c': // -c component
pszComponent = SafeMallocWStrFromStr( argv[++iCount] );
break;
case 'p': // -p parameter
pszParameter = SafeMallocWStrFromStr( argv[++iCount] );
break;
case 'v': // -v value
pszValue = SafeMallocWStrFromStr( argv[++iCount] );
break;
case 'h':
default:
Usage(argv[0]);
}
}
else
Usage(argv[0]);
}
//========================================================================
// NetConfigGet
//
// This API retrieves a single entry from the LANMAN.INI file on a
// specified server. If no servername is given, the local LANMAN.INI
// file is used. When executed remotely, the user must have admin
// privilege or at least one operator privilege on the remote server.
//========================================================================
uReturnCode = NetConfigGet(
pszServer, // Servername
pszComponent, // Component in LANMAN.INI
pszParameter, // Parameter in component
(LPBYTE *) (LPVOID) & BufferW); // Buffer (will be alloc'ed).
printf("NetConfigGet returned %lu \n", uReturnCode);
if (uReturnCode == NERR_Success)
{
printf(" %ws = %ws\n\n", pszParameter, BufferW);
(void) NetApiBufferFree(BufferW);
}
//========================================================================
// NetConfigGetAll
//
// This API returns information for an entire LANMAN.INI component such
// as [networks] or [workstation]. The returned information is a
// sequence of null-terminated strings followed by a null string.
//========================================================================
uReturnCode = NetConfigGetAll(
pszServer, // Name of remote server
pszComponent, // Component of LANMAN.INI
(LPBYTE *) (LPVOID) & BufferW); // Buffer (will be alloc'ed).
printf("NetConfigGetAll returned %lu \n", uReturnCode);
switch(uReturnCode)
{
case NERR_Success: // It worked
if (BufferW) {
p = BufferW;
while (*p) // While not at null string
{
printf(" %ws\n", p); // Print string
p += (wcslen(p) + 1); // Step past trailing NUL
}
(void) NetApiBufferFree( BufferW );
} else {
printf( "(no keywords for that component)\n" );
}
break;
case ERROR_BAD_NETPATH:
printf(" Server %ws not found.\n", pszServer);
break;
case NERR_InvalidAPI:
printf(" The remote server %ws does not support this API.\n",
pszServer);
break;
default:
break;
}
//========================================================================
// NetConfigSet
//
// This API changes the value for a single parameter (keyword) of a
// single component.
//========================================================================
if (pszValue != NULL) // New value given on command line.
{
CONFIG_INFO_0 Info;
Info.cfgi0_key = pszParameter;
Info.cfgi0_data = pszValue;
uReturnCode = NetConfigSet(
pszServer, // Name of remote server
NULL, // reserved 1
pszComponent, // Component of LANMAN.INI
0, // level
0, // reserved 2
(LPBYTE) (LPVOID) & Info, // info level 0 struct
0); // reserved 3
printf("NetConfigSet returned %lu \n", uReturnCode);
uReturnCode = NetConfigGet(
pszServer, // Servername
pszComponent, // Component in LANMAN.INI
pszParameter, // Parameter in component
(LPBYTE *) (LPVOID) & BufferW); // Buffer (will be alloc'ed).
printf("NetConfigGet returned %lu \n", uReturnCode);
if (uReturnCode == NERR_Success)
{
printf(" %ws = %ws\n\n", pszParameter, BufferW);
(void) NetApiBufferFree(BufferW);
}
}
return (EXIT_SUCCESS);
}
void Usage (char * pszProgram)
{
fprintf(stderr, "NetConfig API sample program (32-bit, Unicode version).\n");
fprintf(stderr, "Usage: %s [-s \\\\server] [-c component]"
" [-p parameter] [-v value]\n", pszProgram);
exit( EXIT_FAILURE );
}