windows-nt/Source/XPSP1/NT/net/dhcp/client/nt/tdhcpcapi.c
2020-09-26 16:20:57 +08:00

490 lines
14 KiB
C

//================================================================================
// Copyright (C) 1997 Microsoft Corporation
// Author: RameshV
// Description: Tests the dhcp api as exported in dhcpsdk.h
//================================================================================
#include "precomp.h"
#include <dhcpcsdk.h>
#include <wchar.h>
HANDLE tGlobalHandle = INVALID_HANDLE_VALUE;
#define fatal(str, err) do{ printf("%s: %ld (0x%lx)\n", (#str), (err), (err)); exit(1); }while(0)
#define error(str, err) do{ printf("%s: %ld (0x%lx)\n", (#str), (err), (err)); }while(0)
ULONG
MakeDword(
IN LPWSTR Arg
)
{
LPWSTR ArgEnd;
ULONG Ret;
Ret = wcstoul(Arg, &ArgEnd, 0);
if( *ArgEnd ) {
printf("[%ws] is not a valid number, assumed 0 instead\n", Arg);
return 0;
}
return Ret;
}
LPWSTR
MakeLpwstr(
IN LPWSTR Arg
)
{
if( 0 == _wcsicmp(Arg, L"NULL") ) {
return NULL;
}
return Arg;
}
VOID
MakeHexBytes(
IN OUT LPBYTE *HexBytes,
IN OUT DWORD *nHexBytes,
IN OUT LPWSTR HexStr
)
{
CHAR Low, High;
LPBYTE HexByteString;
if( wcslen(HexStr) % 2 ) {
fatal(MakeHexBytes expects a even number of hex bytes!!!, ERROR_INVALID_DATA);
}
*nHexBytes = 0;
*HexBytes = HexByteString = (LPBYTE)HexStr;
while(*HexStr) {
Low = (CHAR)*HexStr++;
High = (CHAR)*HexStr++;
if( Low >= '0' && Low <= '9' ) Low -= '0';
else if( Low >= 'A' && Low <= 'F' ) Low = Low - 'A' + 10;
else if( Low >= 'a' && Low <= 'f' ) Low = Low - 'a' + 10;
else fatal(MakeHexBytes expects number in range 0 to 9 and A to F only, 0);
if( High >= '0' && High <= '9' ) High -= '0';
else if( High >= 'A' && Low <= 'F' ) High = High - 'A' + 10;
else if( High >= 'a' && Low <= 'f' ) High = High - 'a' + 10;
else fatal(MakeHexBytes expects number in range 0 to 9 and A to F only, 0);
*HexByteString ++ = (BYTE)((Low<<4)|High);
(*nHexBytes) ++;
}
if( 0 == *nHexBytes ) *HexBytes = NULL;
}
VOID
MakeParams(
IN OUT PDHCPCAPI_PARAMS_ARRAY Params,
IN LPWSTR Str
)
{
ULONG i, Count, Mod;
LPWSTR Start, First, Second,Third;
if( L'\0' == *Str ) {
Params->nParams = 0;
Params->Params = NULL;
return ;
}
Count = 1; Mod = 0;
Start = Str;
while(*Str) {
if(L',' == *Str) {
Mod ++;
if( Mod == 3 ) {
Mod = 0;
Count ++;
}
*Str = L'\0';
}
Str ++;
}
if( 2 != Mod ) {
printf("Invalid DHCPCAPI_PARAMS_ARRAY data! Ignored\n");
Params->nParams = 0;
Params->Params = NULL;
return ;
}
Params->nParams = Count;
Params->Params = LocalAlloc(LMEM_FIXED, sizeof(DHCPCAPI_PARAMS)*Count);
if( NULL == Params->Params ) {
fatal(MakeParams-not enough memory, ERROR_NOT_ENOUGH_MEMORY);
}
Str = Start;
for( i = 0; i < Count ; i ++ ) {
First = Str;
Second = wcslen(Str)+Str+1; Str = Second;
Third = wcslen(Str)+Str+1; Str = Third + wcslen(Third) + 1;
Params->Params[i].Flags = MakeDword(First);
if( 'v' == *Second || 'V' == *Second ) {
Params->Params[i].IsVendor = TRUE;
Second ++;
} else {
Params->Params[i].IsVendor = FALSE;
}
Params->Params[i].OptionId = MakeDword(Second);
MakeHexBytes(&Params->Params[i].Data, &Params->Params[i].nBytesData, Third);
}
}
VOID
UnMakeParams(
IN PDHCPCAPI_PARAMS_ARRAY Params
)
{
if( NULL != Params->Params ) {
LocalFree(Params->Params);
}
}
VOID
PrintHex(
IN ULONG Count,
IN LPBYTE Data
)
{
BYTE cData;
while(Count --) {
cData = *Data++;
if( (cData>>4) < 10 ) printf("%c", '0' + (cData>>4));
else printf("%c", 'A' + (cData>>4) - 10 );
if( (cData& 0xF) < 10 ) printf("%c", '0' + (cData&0xF));
else printf("%c", 'A' + (cData&0xF) - 10 );
}
}
VOID
PrintParams(
IN PDHCPCAPI_PARAMS_ARRAY Params
)
{
ULONG Count;
printf("\t{%ld,", Params->nParams);
if( Params->nParams ) {
printf("{");
for( Count = 0; Count < Params->nParams ; Count ++ ) {
printf("[0x%lx,%ld,", Params->Params[Count].Flags, Params->Params[Count].OptionId);
PrintHex(Params->Params[Count].nBytesData, Params->Params[Count].Data);
printf("] ");
}
printf("}");
}
printf("}\n");
}
ULONG
TestRequestParams(
IN LPWSTR *Args,
IN ULONG nArgs
)
{
DWORD Error;
DWORD Flags;
LPVOID Reserved;
LPWSTR AdapterName, AppName;
LPDHCPCAPI_CLASSID ClassId;
DHCPCAPI_PARAMS_ARRAY SendParams;
DHCPCAPI_PARAMS_ARRAY RecdParams;
BYTE Buffer[5000];
DWORD Size;
if( 8 != nArgs ) {
printf("Usage: DhcpRequestParams Flags Reserved AdapterName ClassId SendParams RecdParams Size lpAppName\n");
return ERROR_INVALID_PARAMETER;
}
Flags = MakeDword(Args[0]);
Reserved = ULongToPtr(MakeDword(Args[1]));
AdapterName = MakeLpwstr(Args[2]);
ClassId = ULongToPtr(MakeDword(Args[3]));
MakeParams(&SendParams, Args[4]);
MakeParams(&RecdParams, Args[5]);
Size = MakeDword(Args[6]);
AppName = MakeLpwstr(Args[7]);
printf("DhcpRequestParams(\n\t0x%lx,\n\t0x%p,\n\t%ws,\n\t0x%p,\n",
Flags, Reserved, AdapterName, ClassId
);
PrintParams(&SendParams);
PrintParams(&RecdParams);
printf("\t0x%p,\n\t[Size = %ld],\n\t%ws\n\t);\n", (Size?Buffer:0), Size, AppName);
Error = DhcpRequestParams(
Flags,
Reserved,
AdapterName,
ClassId,
SendParams,
RecdParams,
Size?Buffer:0,
&Size,
AppName
);
printf("DhcpRequestParams: %ld (0x%lx) [Size = %ld]\n", Error, Error, Size);
printf("Send, Recd Params are:\n");
PrintParams(&SendParams);
PrintParams(&RecdParams);
UnMakeParams(&SendParams);
UnMakeParams(&RecdParams);
return 0;
}
ULONG
TestUndoRequestParams(
IN LPWSTR *Args,
IN ULONG nArgs
)
{
ULONG Flags;
LPVOID Reserved;
LPWSTR AdapterName, AppName;
ULONG Error;
if( nArgs != 4 ) {
printf("usage: DhcpUndoRequestParams dwFlags dwReserved lpwAdapterName lpwAppName\n");
return 0;
}
Flags = MakeDword(Args[0]);
Reserved = ULongToPtr(MakeDword(Args[1]));
AdapterName = MakeLpwstr(Args[2]);
AppName = MakeLpwstr(Args[3]);
printf("DhcpUndoRequestParams(\n\t0x%lx,\n\t%p,\n\t%ws,\n\t%ws\n\t);\n", Flags, Reserved, AdapterName, AppName);
Error = DhcpUndoRequestParams(
Flags,
Reserved,
AdapterName,
AppName
);
printf("DhcpUndoRequestParams: %ld (0x%lx)\n", Error, Error);
return 0;
}
ULONG
TestRegisterParamChange(
IN LPWSTR *Args,
IN ULONG nArgs
)
{
DWORD Error;
DWORD Flags;
LPVOID Reserved;
LPWSTR AdapterName;
LPDHCPCAPI_CLASSID ClassId;
DHCPCAPI_PARAMS_ARRAY Params;
HANDLE Handle;
if( nArgs != 6 ) {
printf("usage: DhcpRegisterParamChange dwFlags dwReserved lpwAdapterName dwClassId Params Handle\n");
return 0;
}
printf("Handle of 0 causes NULL to be used, any other Handle will use default ptr\n");
Flags = MakeDword(Args[0]);
Reserved = ULongToPtr(MakeDword(Args[1]));
AdapterName = MakeLpwstr(Args[2]);
ClassId = ULongToPtr(MakeDword(Args[3]));
MakeParams(&Params, Args[4]);
Handle = ULongToPtr(MakeDword(Args[5]));
printf("DhcpRegisterParamChange(\n\t0x%lx,\n\t%p,\n\t%ws,\n\t0x%p,\n", Flags, Reserved, AdapterName, ClassId);
PrintParams(&Params);
printf("0x%px\n\t);", Handle?&Handle: NULL);
Error = DhcpRegisterParamChange(
Flags,
Reserved,
AdapterName,
ClassId,
Params,
(LPVOID)(Handle?&Handle:NULL)
);
printf("DhcpRegisterParamChange: %ld (0x%lx)\n", Error, Error);
if( ERROR_SUCCESS == Error ) {
tGlobalHandle = Handle;
}
printf("Handle: 0x%p\n", Handle);
UnMakeParams(&Params);
return 0;
}
ULONG
TestDeRegisterParamChange(
IN LPWSTR *Args,
IN ULONG nArgs
)
{
DWORD Error;
DWORD Flags;
LPVOID Reserved;
HANDLE Handle;
if( nArgs != 3 ) {
printf("usage: DhcpRegisterParamChange dwFlags dwReserved Handle\n");
return 0;
}
Flags = MakeDword(Args[0]);
Reserved = ULongToPtr(MakeDword(Args[1]));
Handle = ULongToPtr(MakeDword(Args[2]));
printf("DhcpRegisterParamChange(\n\t0x%lx,\n\t%p,\n\t0x%p,\n\t);", Flags, Reserved, Handle);
Error = DhcpDeRegisterParamChange(
Flags,
Reserved,
Handle
);
printf("DhcpDeRegisterParamChange: %ld (0x%lx)\n", Error, Error);
return 0;
}
ULONG
TestStaticRefreshParams(
IN LPWSTR *Args,
IN ULONG nArgs
)
{
DWORD Error;
ULONG DhcpStaticRefreshParams( LPWSTR AdapterName );
if( nArgs != 1 ) {
printf("usage: DhcpStaticRefresh lpwAdapterName\n");
return 0;
}
Error = DhcpStaticRefreshParams( MakeLpwstr(*Args) );
printf("DhcpStaticRefreshParams( %ws ) : %ld\n", *Args, Error );
return Error;
}
ULONG
DhcpApiTestLine(
IN LPWSTR Buf
)
{
ULONG Error;
LPWSTR Words[100];
ULONG nWords;
BOOL LastCharWasSpace = TRUE;
nWords = 0;
while( *Buf ) { // process each character till end
if( *Buf == L'\t' || *Buf == L' ' || *Buf == L'\n' ) {
if( FALSE == LastCharWasSpace ) { // this char is space but last wasnt
*Buf = L'\0' ; // terminate the run
LastCharWasSpace = TRUE; // change state
}
} else if( TRUE == LastCharWasSpace ) { // this char is not space but last was
Words[nWords++] = Buf; // mark this as beginning of new string
LastCharWasSpace = FALSE; // change state
}
Buf ++; // next character
}
if( 0 == nWords ) {
error(Incorrect command. Please type help, 0);
return 0;
}
if( 0 == _wcsicmp(Words[0], L"DhcpRequestParams") ) {
return TestRequestParams(&Words[1], nWords-1);
}
if( 0 == _wcsicmp(Words[0], L"DhcpUndoRequestParams") ) {
return TestUndoRequestParams(&Words[1], nWords-1);
}
if( 0 == _wcsicmp(Words[0], L"DhcpRegisterParamChange") ) {
return TestRegisterParamChange(&Words[1], nWords-1);
}
if( 0 == _wcsicmp(Words[0], L"DhcpDeRegisterParamChange") ) {
return TestDeRegisterParamChange(&Words[1], nWords-1);
}
if( 0 == _wcsicmp(Words[0], L"DhcpStaticRefresh") ) {
return TestStaticRefreshParams(&Words[1], nWords-1);
}
printf("Unknown command!");
while(nWords--) {
printf("First word: %ws\n", Words[0]);
}
return 0;
}
ULONG
DhcpApiTestLoop(
VOID
)
{
ULONG Error;
WCHAR Buffer[1000];
printf("Usage:\n");
printf(" For AdapterName use NULL to indicate NULL adaptername.\n");
printf(" For Params, use a dash (-) to indcate no params.\n");
printf(" For Params, syntax: flags,optid,[sequence of hex bytes or empty] {,flags,optid,[sequence of hex bytes]}*\n");
printf(" For Params, prepend OptId with the character 'v' to make it vendor option.\n");
printf(" Flags values -- DHCPCAPI_REQUEST_PERSISTENT - %ld\n", DHCPCAPI_REQUEST_PERSISTENT);
printf(" Flags values -- DHCPCAPI_REQUEST_SYNCHRONOUS - %ld\n", DHCPCAPI_REQUEST_SYNCHRONOUS);
printf(" Flags values -- DHCPCAPI_REGISTER_HANDLE_EVENT - %ld\n", DHCPCAPI_REGISTER_HANDLE_EVENT);
printf("\n\n");
printf("1) DhcpRequestParams dwFlags dwReserved lpwAdapterName dwClassId SendParams RecdParams dwSize lpwAppName\n");
printf("2) DhcpUndoRequestParams dwFlags dwReserved lpwAdapterName lpwAppName\n");
printf("3) DhcpRegisterParamChange dwFlags dwReserved lpwAdapterName pClassId Params pHandle\n");
printf("4) DhcpDeRegisterParamChange dwFlags dwReserved dwEvent\n");
printf("5) DhcpStaticRefresh lpwAdapterName\n");
do {
printf("DHCP> ");
if( NULL == _getws(Buffer) ) break;
Error = DhcpApiTestLine(Buffer);
if( ERROR_SUCCESS != Error ) {
error(DhcpApiTestLine, Error);
}
} while(1);
return 0;
}
void _cdecl main(void) {
DWORD Error;
Error = DhcpCApiInitialize(NULL);
if( ERROR_SUCCESS != Error ) {
fatal(DhcpApiInitialize, Error);
}
Error = DhcpApiTestLoop();
if( ERROR_SUCCESS != Error ) {
error(DhcpApiTestLoop, Error);
}
DhcpCApiCleanup();
exit(0);
}
//================================================================================
// end of file
//================================================================================