893 lines
22 KiB
C
893 lines
22 KiB
C
|
//================================================================================
|
||
|
// Copyright (C) 1997 Microsoft Corporation
|
||
|
// Author: RameshV
|
||
|
// Description: generic testing engine
|
||
|
//================================================================================
|
||
|
|
||
|
//===============================
|
||
|
// headers
|
||
|
//===============================
|
||
|
#include <hdrmacro.h>
|
||
|
#include <store.h>
|
||
|
#include <dhcpmsg.h>
|
||
|
#include <wchar.h>
|
||
|
#include <dhcpbas.h>
|
||
|
#include <mm\opt.h>
|
||
|
#include <mm\optl.h>
|
||
|
#include <mm\optdefl.h>
|
||
|
#include <mm\optclass.h>
|
||
|
#include <mm\classdefl.h>
|
||
|
#include <mm\bitmask.h>
|
||
|
#include <mm\reserve.h>
|
||
|
#include <mm\range.h>
|
||
|
#include <mm\subnet.h>
|
||
|
#include <mm\sscope.h>
|
||
|
#include <mm\oclassdl.h>
|
||
|
#include <mm\server.h>
|
||
|
#include <mm\address.h>
|
||
|
#include <mm\server2.h>
|
||
|
#include <mm\memfree.h>
|
||
|
#include <mmreg\regutil.h>
|
||
|
#include <mmreg\regread.h>
|
||
|
#include <mmreg\regsave.h>
|
||
|
#include <dhcpread.h>
|
||
|
#include <dhcpapi.h>
|
||
|
#include <rpcapi1.h>
|
||
|
#include <rpcapi2.h>
|
||
|
|
||
|
//BeginExport(typedefs)
|
||
|
// supported data types are listed. any new datatypes should be added here.
|
||
|
typedef enum /* anonymous */ {
|
||
|
Char,
|
||
|
wChar,
|
||
|
Word,
|
||
|
DWord,
|
||
|
String,
|
||
|
wString,
|
||
|
IpAddress,
|
||
|
xBytes,
|
||
|
Invalid
|
||
|
} NJIN_TYPES, *LPNJIN_TYPES;
|
||
|
|
||
|
typedef struct /* anonymous */ {
|
||
|
union /* anonymous */ {
|
||
|
CHAR *Char;
|
||
|
WCHAR *wChar;
|
||
|
WORD *Word;
|
||
|
DWORD *DWord;
|
||
|
LPSTR String;
|
||
|
LPWSTR wString;
|
||
|
DWORD *IpAddress;
|
||
|
struct /* anonymous */ {
|
||
|
DWORD *xBytesLen;
|
||
|
LPBYTE xBytesBuf;
|
||
|
};
|
||
|
};
|
||
|
} NJIN_DATA, *LPNJIN_DATA;
|
||
|
|
||
|
typedef struct /* anonymous */ {
|
||
|
LPWSTR VarName;
|
||
|
NJIN_TYPES VarType;
|
||
|
NJIN_DATA VarData;
|
||
|
VOID (*VarFunc)(LPWSTR VarName);
|
||
|
BOOL ReadOnly;
|
||
|
} NJIN_VAR, *LPNJIN_VAR;
|
||
|
|
||
|
typedef struct /* anonymous */ {
|
||
|
WCHAR cComment;
|
||
|
WCHAR cEquals;
|
||
|
WCHAR cReturn;
|
||
|
WCHAR cEndOfLine;
|
||
|
WCHAR cCharFmtActual;
|
||
|
WCHAR cCharFmtNum;
|
||
|
BOOL fEcho;
|
||
|
BOOL fVerbose;
|
||
|
} NJIN_ENV, *LPNJIN_ENV;
|
||
|
//EndExport(typedefs)
|
||
|
|
||
|
#define verbose if( Env->fVerbose) printf
|
||
|
#define echo if( Env->fEcho) printf
|
||
|
|
||
|
DWORD
|
||
|
ConvertToIntegral(
|
||
|
IN LPWSTR Str
|
||
|
)
|
||
|
{
|
||
|
return _wtol(Str);
|
||
|
}
|
||
|
|
||
|
DWORD
|
||
|
ConvertToAddress(
|
||
|
IN LPWSTR Str
|
||
|
)
|
||
|
{
|
||
|
CHAR Buf[1000];
|
||
|
LPSTR s;
|
||
|
|
||
|
s = Buf;
|
||
|
while(*s ++ = (CHAR) *Str++ )
|
||
|
/* skip */;
|
||
|
|
||
|
return inet_addr(Buf);
|
||
|
}
|
||
|
|
||
|
DWORD
|
||
|
CloneWString(
|
||
|
IN LPWSTR Buf,
|
||
|
IN LPWSTR Dest
|
||
|
)
|
||
|
{
|
||
|
wcscpy(Dest, Buf);
|
||
|
return ERROR_SUCCESS;
|
||
|
}
|
||
|
|
||
|
DWORD
|
||
|
CloneString(
|
||
|
IN LPWSTR Str,
|
||
|
IN LPSTR s
|
||
|
)
|
||
|
{
|
||
|
while(*s ++ = (CHAR) *Str ++ )
|
||
|
/* skip */;
|
||
|
|
||
|
return ERROR_SUCCESS;
|
||
|
}
|
||
|
|
||
|
BYTE
|
||
|
Hex(
|
||
|
IN WCHAR C
|
||
|
)
|
||
|
{
|
||
|
if( C >= L'0' && C <= L'9' ) return C - L'0';
|
||
|
if( C >= L'A' && C <= L'F' ) return C - L'A' + 10;
|
||
|
if( C >= L'a' && C <= L'f' ) return C - L'a' + 10;
|
||
|
return 0x55;
|
||
|
}
|
||
|
|
||
|
DWORD
|
||
|
ConvertToHexBytes(
|
||
|
IN LPWSTR Str,
|
||
|
IN OUT LPBYTE Buf,
|
||
|
IN OUT LPDWORD BufLen
|
||
|
)
|
||
|
{
|
||
|
BYTE ch, ch2;
|
||
|
|
||
|
*BufLen = 0;
|
||
|
while( (ch = Hex(*Str++)) <= 0xF) {
|
||
|
ch2 = Hex(*Str++);
|
||
|
if( ch2 > 0xF ) {
|
||
|
printf("illegal character found, ignored\n");
|
||
|
ch2 = 0;
|
||
|
}
|
||
|
Buf[(*BufLen)++] = (ch <<4) | ch2;
|
||
|
}
|
||
|
|
||
|
return ERROR_SUCCESS;
|
||
|
}
|
||
|
|
||
|
DWORD
|
||
|
ConvertDataType(
|
||
|
IN LPNJIN_ENV Env,
|
||
|
IN LPWSTR Buf,
|
||
|
IN DWORD VarType,
|
||
|
IN NJIN_DATA *VarData
|
||
|
)
|
||
|
{
|
||
|
switch(VarType) {
|
||
|
case Char:
|
||
|
if( Env->cCharFmtActual == Buf[0] ) {
|
||
|
*VarData->Char = (CHAR) Buf[1];
|
||
|
} else if( Env->cCharFmtNum == Buf[0] ) {
|
||
|
*VarData->Char = (CHAR) ConvertToIntegral(&Buf[1]);
|
||
|
} else return ERROR_INVALID_DATA;
|
||
|
return ERROR_SUCCESS;
|
||
|
case wChar:
|
||
|
if( Env->cCharFmtActual == Buf[0] ) {
|
||
|
*VarData->wChar = Buf[1];
|
||
|
} else if( Env->cCharFmtNum == Buf[0] ) {
|
||
|
*VarData->wChar = (WCHAR) ConvertToIntegral(&Buf[1]);
|
||
|
} else return ERROR_INVALID_DATA;
|
||
|
return ERROR_SUCCESS;
|
||
|
case Word:
|
||
|
*VarData->Word = (WORD) ConvertToIntegral(Buf);
|
||
|
return ERROR_SUCCESS;
|
||
|
case DWord:
|
||
|
*VarData->DWord = ConvertToIntegral(Buf);
|
||
|
return ERROR_SUCCESS;
|
||
|
case wString:
|
||
|
return CloneWString(Buf, VarData->wString);
|
||
|
case String:
|
||
|
return CloneString(Buf, VarData->String);
|
||
|
case IpAddress:
|
||
|
*VarData->IpAddress = ConvertToAddress(Buf);
|
||
|
return ERROR_SUCCESS;
|
||
|
case xBytes:
|
||
|
return ConvertToHexBytes(Buf, VarData->xBytesBuf, VarData->xBytesLen);
|
||
|
default:
|
||
|
verbose("unknown variable type\n");
|
||
|
return ERROR_INVALID_DATA;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//BeginExport(function)
|
||
|
DWORD
|
||
|
NjinExecuteLineA(
|
||
|
IN LPNJIN_ENV Env,
|
||
|
IN OUT LPNJIN_VAR Vars,
|
||
|
IN DWORD nVars,
|
||
|
IN LPWSTR Cmd
|
||
|
) //EndExport(function)
|
||
|
{
|
||
|
CHAR Ch, LastCh;
|
||
|
DWORD i, Result;
|
||
|
LPWSTR Var;
|
||
|
LPWSTR Value;
|
||
|
|
||
|
Var = NULL; Value = NULL;
|
||
|
for( i = 0; Cmd[i] != L'\0' ; i ++ ) {
|
||
|
if( Env->cEquals == Cmd[i] ) break;
|
||
|
}
|
||
|
|
||
|
if( Cmd[i] ) {
|
||
|
Cmd[i] = L'\0';
|
||
|
Var = Cmd;
|
||
|
Value = &Cmd[i+1];
|
||
|
} else {
|
||
|
verbose("No parameter passed\n");
|
||
|
return ERROR_INVALID_DATA;
|
||
|
}
|
||
|
|
||
|
for( i = 0; i < nVars; i ++ ) {
|
||
|
if( !Vars[i].ReadOnly && 0 == wcscmp(Vars[i].VarName, Var) )
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if( i >= nVars ) {
|
||
|
verbose("No such variable or operation\n");
|
||
|
return ERROR_FILE_NOT_FOUND;
|
||
|
}
|
||
|
|
||
|
Result = ConvertDataType(Env, Value, Vars[i].VarType, &Vars[i].VarData);
|
||
|
if( ERROR_SUCCESS != Result ) {
|
||
|
verbose("ConvertDataType: 0x%lx (%ld)\n", Result, Result );
|
||
|
return Result;
|
||
|
}
|
||
|
|
||
|
if( Vars[i].VarFunc ) Vars[i].VarFunc(Vars[i].VarName );
|
||
|
return ERROR_SUCCESS;
|
||
|
}
|
||
|
|
||
|
//BeginExport(function)
|
||
|
DWORD
|
||
|
NjinExecute(
|
||
|
IN LPNJIN_ENV Env,
|
||
|
IN OUT LPNJIN_VAR Vars,
|
||
|
IN DWORD nVars
|
||
|
) //EndExport(function)
|
||
|
{
|
||
|
char ch, lastch;
|
||
|
WCHAR buffer[1000];
|
||
|
unsigned int i;
|
||
|
DWORD Result;
|
||
|
|
||
|
verbose("NjinExecute called\n");
|
||
|
|
||
|
i = 0; lastch = (CHAR)Env->cEndOfLine;
|
||
|
while ((ch = getchar()) != EOF ) {
|
||
|
if( Env->cReturn == ch ) ch = (CHAR)Env->cEndOfLine;
|
||
|
if( Env->cEndOfLine == lastch && Env->cComment == ch ) {
|
||
|
while((ch = getchar()) != EOF && Env->cEndOfLine != ch )
|
||
|
;
|
||
|
lastch = ch;
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
if( Env->cEndOfLine == ch ) {
|
||
|
if( i ) {
|
||
|
buffer[i] = L'\0';
|
||
|
Result = NjinExecuteLineA(Env,Vars,nVars, buffer);
|
||
|
if( ERROR_SUCCESS != Result ) {
|
||
|
verbose("Error: %ld (0x%lx)\n", Result, Result);
|
||
|
return Result;
|
||
|
}
|
||
|
}
|
||
|
i = 0;
|
||
|
} else {
|
||
|
buffer[i++] = (WCHAR)ch;
|
||
|
}
|
||
|
lastch = ch;
|
||
|
}
|
||
|
|
||
|
return ERROR_SUCCESS;
|
||
|
}
|
||
|
|
||
|
//================================================================================
|
||
|
// DHCP SNAPIN DS WORK -- helper routines
|
||
|
//================================================================================
|
||
|
|
||
|
STORE_HANDLE hStore1, hStore2, hStore3, hStore4;
|
||
|
LPSTORE_HANDLE hRoot = NULL, hDhcpC = NULL, hObject = NULL, hDhcpRoot = NULL;
|
||
|
WCHAR gDsServer[100], gObject[100], gName[100], gComment[100];
|
||
|
WCHAR gClassName[100], gClassComment[100];
|
||
|
WCHAR Dummy[100];
|
||
|
WCHAR gOptName[100], gOptComment[100];
|
||
|
WCHAR gServerName[256];
|
||
|
|
||
|
DWORD gServerAddress, gServerState;
|
||
|
DWORD gOptId, gOptType, gOptLen, gIsVendor;
|
||
|
DWORD gDwordOptData;
|
||
|
BYTE gOptVal[255], gClassData[255];
|
||
|
DWORD gClassDataLen;
|
||
|
|
||
|
VOID
|
||
|
print_DHCP_OPTION_DATA(
|
||
|
IN DWORD nTabs,
|
||
|
IN LPDHCP_OPTION_DATA OptData
|
||
|
)
|
||
|
{
|
||
|
DWORD i;
|
||
|
|
||
|
i = nTabs;
|
||
|
while(i--) putchar('\t');
|
||
|
|
||
|
printf("NumElements=%ld, Type=%ld [0x%lx]\n",
|
||
|
OptData->NumElements, OptData->Elements[0].OptionType, OptData->Elements[0].Element.DWordOption
|
||
|
);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
print_DHCP_OPTION(
|
||
|
IN DWORD nTabs,
|
||
|
IN LPDHCP_OPTION Option
|
||
|
)
|
||
|
{
|
||
|
DWORD i;
|
||
|
|
||
|
i = nTabs;
|
||
|
while(i--) putchar('\t');
|
||
|
|
||
|
printf("Option [x%03x] %ws %ws Type= %ld\n",
|
||
|
Option->OptionID, Option->OptionName, Option->OptionComment?Option->OptionComment:L"", Option->OptionType
|
||
|
);
|
||
|
|
||
|
print_DHCP_OPTION_DATA(nTabs+1, &Option->DefaultValue);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
print_DHCP_OPTION_ARRAY(
|
||
|
IN DWORD nTabs,
|
||
|
IN LPDHCP_OPTION_ARRAY OptArray
|
||
|
)
|
||
|
{
|
||
|
DWORD i;
|
||
|
|
||
|
i = nTabs;
|
||
|
while(i--) putchar('\t');
|
||
|
printf("NumElements= %ld\n", OptArray->NumElements);
|
||
|
|
||
|
for( i = 0; i < OptArray->NumElements; i++ )
|
||
|
print_DHCP_OPTION(nTabs+1, &OptArray->Options[i]);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
print_DHCP_OPTION_VALUE(
|
||
|
IN DWORD nTabs,
|
||
|
IN LPDHCP_OPTION_VALUE OptVal
|
||
|
)
|
||
|
{
|
||
|
DWORD i;
|
||
|
|
||
|
i = nTabs;
|
||
|
while(i--) putchar('\t');
|
||
|
|
||
|
printf("OptionId=%ld\n", OptVal->OptionID);
|
||
|
print_DHCP_OPTION_DATA(nTabs+1, &OptVal->Value);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
print_DHCP_OPTION_VALUE_ARRAY(
|
||
|
IN DWORD nTabs,
|
||
|
IN LPDHCP_OPTION_VALUE_ARRAY OptValues
|
||
|
)
|
||
|
{
|
||
|
DWORD i;
|
||
|
|
||
|
i = nTabs;
|
||
|
while(i--) putchar('\t');
|
||
|
|
||
|
printf("NumElements=%ld\n", OptValues->NumElements);
|
||
|
for( i = 0; i < OptValues->NumElements ; i ++ )
|
||
|
print_DHCP_OPTION_VALUE(nTabs+1, &OptValues->Values[i]);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
print_DHCP_CLASS_INFO(
|
||
|
IN DWORD nTabs,
|
||
|
IN LPDHCP_CLASS_INFO ClassInfo
|
||
|
)
|
||
|
{
|
||
|
DWORD i;
|
||
|
|
||
|
i = nTabs;
|
||
|
while(i--) putchar('\t');
|
||
|
|
||
|
printf("ClassName= %ws ClassComment= %ws DataLength = %ld\n",
|
||
|
ClassInfo->ClassName, ClassInfo->ClassComment, ClassInfo->ClassDataLength
|
||
|
);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
print_DHCP_CLASS_INFO_ARRAY(
|
||
|
IN DWORD nTabs,
|
||
|
IN LPDHCP_CLASS_INFO_ARRAY ClassInfoArray
|
||
|
)
|
||
|
{
|
||
|
DWORD i;
|
||
|
|
||
|
i = nTabs;
|
||
|
while(i--) putchar('\t');
|
||
|
|
||
|
printf("NumElements=%ld\n", ClassInfoArray->NumElements);
|
||
|
for( i = 0; i < ClassInfoArray->NumElements ; i ++ )
|
||
|
print_DHCP_CLASS_INFO(nTabs+1, &ClassInfoArray->Classes[i]);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
print_DHCPDS_SERVER(
|
||
|
IN DWORD nTabs,
|
||
|
IN LPDHCPDS_SERVER Server
|
||
|
)
|
||
|
{
|
||
|
DWORD i;
|
||
|
|
||
|
i = nTabs;
|
||
|
while(i--) putchar('\t');
|
||
|
|
||
|
printf("Name=[%ws] State=%ld Address=%s Loc=[%ws] Type=%ld\n",
|
||
|
Server->ServerName, Server->Flags, inet_ntoa(*(struct in_addr *)&Server->IpAddress),
|
||
|
Server->DsLocation? Server->DsLocation: L"(NULL)",
|
||
|
Server->DsLocType
|
||
|
);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
print_DHCPDS_SERVERS(
|
||
|
IN DWORD nTabs,
|
||
|
IN LPDHCPDS_SERVERS Servers
|
||
|
)
|
||
|
{
|
||
|
DWORD i;
|
||
|
|
||
|
i = nTabs;
|
||
|
while(i--) putchar('\t');
|
||
|
|
||
|
printf("NumElements=%ld\n", Servers->NumElements);
|
||
|
for( i = 0; i < Servers->NumElements ; i ++ )
|
||
|
print_DHCPDS_SERVER(nTabs+1, &Servers->Servers[i]);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
SetDsServer(
|
||
|
IN LPWSTR VarNameUnused
|
||
|
)
|
||
|
{
|
||
|
DWORD Err;
|
||
|
|
||
|
if( NULL != hRoot ) {
|
||
|
StoreCleanupHandle(hRoot, 0, TRUE);
|
||
|
}
|
||
|
|
||
|
hRoot = &hStore1;
|
||
|
Err = StoreInitHandle(
|
||
|
hRoot,
|
||
|
0,
|
||
|
wcslen(gDsServer)?gDsServer:NULL,
|
||
|
NULL,
|
||
|
NULL,
|
||
|
NULL,
|
||
|
0
|
||
|
);
|
||
|
if( ERROR_SUCCESS != Err ) {
|
||
|
printf("StoreInitHandle():%ld 0x%lx\n", Err, Err);
|
||
|
hRoot = NULL;
|
||
|
return ;
|
||
|
}
|
||
|
|
||
|
if( hDhcpC ) StoreCleanupHandle(hDhcpC, 0, TRUE);
|
||
|
hDhcpC = &hStore2;
|
||
|
|
||
|
Err = StoreGetHandle(
|
||
|
hRoot,
|
||
|
0,
|
||
|
StoreGetChildType,
|
||
|
DHCP_ROOT_OBJECT_PARENT_LOC,
|
||
|
hDhcpC
|
||
|
);
|
||
|
if( ERROR_SUCCESS != Err ) {
|
||
|
printf("StoreInitHandle():%ld 0x%lx\n", Err, Err);
|
||
|
hRoot = NULL;
|
||
|
return ;
|
||
|
}
|
||
|
|
||
|
if( hDhcpRoot ) StoreCleanupHandle(hDhcpRoot, 0, TRUE);
|
||
|
hDhcpRoot = &hStore4;
|
||
|
Err = DhcpDsGetRoot(
|
||
|
DDS_FLAGS_CREATE,
|
||
|
hRoot,
|
||
|
hDhcpRoot
|
||
|
);
|
||
|
|
||
|
if( ERROR_SUCCESS != Err) {
|
||
|
printf("DhcpDsGetRoot(): %ld 0x%lx", Err, Err);
|
||
|
hDhcpRoot = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
SetObject(
|
||
|
IN LPWSTR VarNameUnused
|
||
|
)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
CreateOptDef(
|
||
|
IN LPWSTR VarNameUnused
|
||
|
)
|
||
|
{
|
||
|
DWORD Result;
|
||
|
|
||
|
Result = DhcpDsCreateOptionDef(
|
||
|
hDhcpC,
|
||
|
hObject,
|
||
|
0,
|
||
|
gOptName,
|
||
|
wcslen(gOptComment)?gOptComment:NULL,
|
||
|
wcslen(gClassName)?gClassName: NULL,
|
||
|
gOptId,
|
||
|
gOptType,
|
||
|
gOptVal,
|
||
|
gOptLen
|
||
|
);
|
||
|
|
||
|
printf("DhcpDsCreateOptionDef: %ld (0x%lx)\n", Result, Result);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
ModifyOptDef(
|
||
|
IN LPWSTR VarNameUnused
|
||
|
)
|
||
|
{
|
||
|
DWORD Result;
|
||
|
|
||
|
Result = DhcpDsModifyOptionDef(
|
||
|
hDhcpC,
|
||
|
hObject,
|
||
|
0,
|
||
|
gOptName,
|
||
|
wcslen(gOptComment)?gOptComment:NULL,
|
||
|
wcslen(gClassName)?gClassName: NULL,
|
||
|
gOptId,
|
||
|
gOptType,
|
||
|
gOptVal,
|
||
|
gOptLen
|
||
|
);
|
||
|
|
||
|
printf("DhcpDsModifyOptionDef: %ld (0x%lx)\n", Result, Result);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
DeleteOptDef(
|
||
|
IN LPWSTR VarNameUnused
|
||
|
)
|
||
|
{
|
||
|
DWORD Result;
|
||
|
|
||
|
Result = DhcpDsDeleteOptionDef(
|
||
|
hDhcpC,
|
||
|
hObject,
|
||
|
0,
|
||
|
wcslen(gClassName)?gClassName: NULL,
|
||
|
gOptId
|
||
|
);
|
||
|
|
||
|
printf("DhcpDsDeleteOptionDef: %ld (0x%lx)\n", Result, Result);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
EnumOptDefs(
|
||
|
IN LPWSTR VarNameUnused
|
||
|
)
|
||
|
{
|
||
|
DWORD Result;
|
||
|
LPDHCP_OPTION_ARRAY OptArray = NULL;
|
||
|
|
||
|
Result = DhcpDsEnumOptionDefs(
|
||
|
hDhcpC,
|
||
|
hObject,
|
||
|
0,
|
||
|
wcslen(gClassName)?gClassName: NULL,
|
||
|
gIsVendor,
|
||
|
&OptArray
|
||
|
);
|
||
|
|
||
|
printf("DhcpDsEnumOptionDefs: %ld (0x%lx)\n", Result, Result);
|
||
|
if( ERROR_SUCCESS == Result ) print_DHCP_OPTION_ARRAY(0, OptArray);
|
||
|
if( NULL != OptArray ) LocalFree(OptArray);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
SetOptValue(
|
||
|
IN LPWSTR VarNameUnused
|
||
|
)
|
||
|
{
|
||
|
DWORD Result;
|
||
|
DHCP_OPTION_DATA OptData;
|
||
|
DHCP_OPTION_DATA_ELEMENT OptDataElement;
|
||
|
|
||
|
OptData.NumElements = 1;
|
||
|
OptData.Elements = &OptDataElement;
|
||
|
OptDataElement.OptionType = DhcpDWordOption;
|
||
|
OptDataElement.Element.DWordOption = gDwordOptData;
|
||
|
|
||
|
Result = DhcpDsSetOptionValue(
|
||
|
hDhcpC,
|
||
|
hObject,
|
||
|
0,
|
||
|
wcslen(gClassName)?gClassName: NULL,
|
||
|
gOptId,
|
||
|
&OptData
|
||
|
);
|
||
|
|
||
|
printf("DhcpDsSetOptionValue: %ld (0x%lx)\n", Result, Result);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
RemoveOptValue(
|
||
|
IN LPWSTR VarNameUnused
|
||
|
)
|
||
|
{
|
||
|
DWORD Result;
|
||
|
|
||
|
Result = DhcpDsRemoveOptionValue(
|
||
|
hDhcpC,
|
||
|
hObject,
|
||
|
0,
|
||
|
wcslen(gClassName)? gClassName : NULL,
|
||
|
gOptId
|
||
|
);
|
||
|
|
||
|
printf("DhcpDsRemoveOptionValue: %ld (0x%lx)\n", Result, Result);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
GetOptValue(
|
||
|
IN LPWSTR VarNameUnused
|
||
|
)
|
||
|
{
|
||
|
DWORD Result;
|
||
|
LPDHCP_OPTION_VALUE OptVal = NULL;
|
||
|
|
||
|
Result = DhcpDsGetOptionValue(
|
||
|
hDhcpC,
|
||
|
hObject,
|
||
|
0,
|
||
|
wcslen(gClassName)? gClassName : NULL,
|
||
|
gOptId,
|
||
|
&OptVal
|
||
|
);
|
||
|
|
||
|
printf("DhcpDsGetOptionValue: %ld (0x%lx)\n", Result, Result);
|
||
|
if( ERROR_SUCCESS == Result ) print_DHCP_OPTION_VALUE(0, OptVal);
|
||
|
if( OptVal ) LocalFree(OptVal);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
EnumOptValues(
|
||
|
IN LPWSTR VarNameUnused
|
||
|
)
|
||
|
{
|
||
|
DWORD Result;
|
||
|
LPDHCP_OPTION_VALUE_ARRAY OptValues = NULL;
|
||
|
|
||
|
Result = DhcpDsEnumOptionValues(
|
||
|
hDhcpC,
|
||
|
hObject,
|
||
|
0,
|
||
|
wcslen(gClassName)? gClassName : NULL,
|
||
|
gIsVendor,
|
||
|
&OptValues
|
||
|
);
|
||
|
|
||
|
printf("DhcpDsEnumOptionValue: %ld (0x%lx)\n", Result, Result);
|
||
|
if( ERROR_SUCCESS == Result ) print_DHCP_OPTION_VALUE_ARRAY(0, OptValues);
|
||
|
if( OptValues ) LocalFree(OptValues);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
CreateClass(
|
||
|
IN LPWSTR VarNameUnused
|
||
|
)
|
||
|
{
|
||
|
DWORD Result;
|
||
|
|
||
|
Result = DhcpDsCreateClass(
|
||
|
hDhcpC,
|
||
|
hObject,
|
||
|
0,
|
||
|
wcslen(gClassName)? gClassName : NULL,
|
||
|
wcslen(gClassComment)? gClassComment : NULL,
|
||
|
gClassData,
|
||
|
gClassDataLen
|
||
|
);
|
||
|
printf("DhcpDsCreateClass: %ld (0x%lx)\n", Result, Result);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
DeleteClass(
|
||
|
IN LPWSTR VarNameUnused
|
||
|
)
|
||
|
{
|
||
|
DWORD Result;
|
||
|
|
||
|
Result = DhcpDsDeleteClass(
|
||
|
hDhcpC,
|
||
|
hObject,
|
||
|
0,
|
||
|
gClassName
|
||
|
);
|
||
|
printf("DhcpDsDeleteClass: %ld (0x%lx)\n", Result, Result);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
EnumClasses(
|
||
|
IN LPWSTR VarNameUnused
|
||
|
)
|
||
|
{
|
||
|
DWORD Result;
|
||
|
LPDHCP_CLASS_INFO_ARRAY Classes = NULL;
|
||
|
|
||
|
Result = DhcpDsEnumClasses(
|
||
|
hDhcpC,
|
||
|
hObject,
|
||
|
0,
|
||
|
&Classes
|
||
|
);
|
||
|
|
||
|
printf("DhcpDsEnumClasses: %ld (0x%lx)\n", Result, Result);
|
||
|
if( ERROR_SUCCESS == Result ) print_DHCP_CLASS_INFO_ARRAY(0, Classes);
|
||
|
if( Classes ) LocalFree(Classes);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
AddServer(
|
||
|
IN LPWSTR VarNameUnused
|
||
|
)
|
||
|
{
|
||
|
DWORD Result;
|
||
|
|
||
|
Result = DhcpDsAddServer(
|
||
|
hDhcpC,
|
||
|
hDhcpRoot,
|
||
|
0,
|
||
|
gServerName,
|
||
|
NULL,
|
||
|
gServerAddress,
|
||
|
gServerState
|
||
|
);
|
||
|
|
||
|
printf("DhcpDsAddServer: %ld (0x%lx)\n", Result, Result);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
DelServer(
|
||
|
IN LPWSTR VarNameUnused
|
||
|
)
|
||
|
{
|
||
|
DWORD Result;
|
||
|
|
||
|
Result = DhcpDsDelServer(
|
||
|
hDhcpC,
|
||
|
hDhcpRoot,
|
||
|
0,
|
||
|
gServerName,
|
||
|
NULL,
|
||
|
gServerAddress
|
||
|
);
|
||
|
|
||
|
printf("DhcpDsDelServer: %ld (0x%lx)\n", Result, Result);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
EnumServers(
|
||
|
IN LPWSTR VarNameUnused
|
||
|
)
|
||
|
{
|
||
|
DWORD Result;
|
||
|
LPDHCPDS_SERVERS Servers;
|
||
|
|
||
|
Servers = NULL;
|
||
|
Result = DhcpDsEnumServers(
|
||
|
hDhcpC,
|
||
|
hDhcpRoot,
|
||
|
0,
|
||
|
&Servers
|
||
|
);
|
||
|
|
||
|
printf("DhcpDsEnumServer: %ld (0x%lx)\n", Result, Result);
|
||
|
if( ERROR_SUCCESS == Result ) print_DHCPDS_SERVERS( 0, Servers);
|
||
|
if( Servers ) MemFree(Servers);
|
||
|
}
|
||
|
|
||
|
|
||
|
NJIN_VAR VarTable[] = {
|
||
|
L"DsServer", wString, { (LPVOID) &gDsServer }, SetDsServer, FALSE, //0
|
||
|
L"Object", wString, { (LPVOID) &gObject }, SetObject, FALSE, //1
|
||
|
L"OptName", wString, { (LPVOID) &gOptName }, NULL, FALSE, //2
|
||
|
L"OptComment", wString, { (LPVOID) &gOptComment }, NULL, FALSE, //3
|
||
|
L"ClassName", wString, { (LPVOID) &gClassName }, NULL, FALSE, //4
|
||
|
L"ClassComment",wString,{ (LPVOID) &gClassComment }, NULL, FALSE, //5
|
||
|
L"OptId", DWord, { (LPVOID) &gOptId }, NULL, FALSE, //6
|
||
|
L"OptType", DWord, { (LPVOID) &gOptType }, NULL, FALSE, //7
|
||
|
L"OptData", xBytes, { (LPVOID) NULL }, NULL, FALSE, //############ -> Need to fill pointer..
|
||
|
L"IsVendor", DWord, { (LPVOID) &gIsVendor }, NULL, FALSE, //9
|
||
|
L"DwordOptData", DWord, { (LPVOID) &gDwordOptData }, NULL, FALSE, //10
|
||
|
L"ClassData", xBytes, { (LPVOID) NULL }, NULL, FALSE, //############ -> need to fill pointer
|
||
|
L"ServerName", wString, { (LPVOID) &gServerName }, NULL, FALSE,
|
||
|
L"ServerAddress", IpAddress, { (LPVOID) &gServerAddress }, NULL, FALSE,
|
||
|
L"ServerState", DWord, { (LPVOID) &gServerState }, NULL, FALSE,
|
||
|
|
||
|
L"CreateOptionDef", wString, { (LPVOID) &Dummy }, CreateOptDef, FALSE, //12
|
||
|
L"ModifyOptionDef", wString, { (LPVOID) &Dummy }, ModifyOptDef, FALSE,
|
||
|
L"EnumOptionDefs", wString, { (LPVOID) &Dummy }, EnumOptDefs, FALSE,
|
||
|
L"SetOptionValue", wString, { (LPVOID) &Dummy }, SetOptValue, FALSE,
|
||
|
L"RemoveOptionValue", wString, { (LPVOID) &Dummy }, RemoveOptValue, FALSE,
|
||
|
L"GetOptionValue", wString, { (LPVOID) &Dummy }, GetOptValue, FALSE,
|
||
|
L"EnumOptionValues", wString, { (LPVOID) &Dummy }, EnumOptValues, FALSE,
|
||
|
L"CreateClass", wString, { (LPVOID) &Dummy }, CreateClass, FALSE,
|
||
|
L"DeleteClass", wString, { (LPVOID) &Dummy }, DeleteClass, FALSE,
|
||
|
L"EnumClasses", wString, { (LPVOID) &Dummy }, EnumClasses, FALSE,
|
||
|
L"AddServer", wString, { (LPVOID) &Dummy }, AddServer, FALSE,
|
||
|
L"DelServer", wString, { (LPVOID) &Dummy }, DelServer, FALSE,
|
||
|
L"EnumServers", wString, { (LPVOID) &Dummy }, EnumServers, FALSE,
|
||
|
};
|
||
|
|
||
|
NJIN_ENV Env[] = {
|
||
|
L'#',
|
||
|
L'=',
|
||
|
L'\r',
|
||
|
L'\n',
|
||
|
L' ',
|
||
|
L'#',
|
||
|
TRUE,
|
||
|
TRUE
|
||
|
};
|
||
|
|
||
|
#define VarTableSz (sizeof(VarTable)/sizeof(VarTable[0]))
|
||
|
|
||
|
void _cdecl main (void) {
|
||
|
DWORD Result;
|
||
|
DWORD i;
|
||
|
|
||
|
VarTable[8].VarData.xBytesLen = &gOptLen;
|
||
|
VarTable[8].VarData.xBytesBuf = gOptVal;
|
||
|
VarTable[11].VarData.xBytesLen = &gClassDataLen;
|
||
|
VarTable[11].VarData.xBytesBuf = gClassData;
|
||
|
|
||
|
Result = NjinExecute(
|
||
|
Env,
|
||
|
VarTable,
|
||
|
VarTableSz
|
||
|
);
|
||
|
|
||
|
if( ERROR_SUCCESS != Result ) {
|
||
|
printf("\nResult = %ld\n", Result);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//================================================================================
|
||
|
// end of file
|
||
|
//================================================================================
|