windows-nt/Source/XPSP1/NT/net/layer2svc/zeroconf/cmdtool/cmds.c

211 lines
6.3 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
#include <precomp.h>
#include "ErrCtrl.h"
#include "wzcutil.h"
// "wzctool s"; args = "{guid} param value"
// sets the value for any of the params
void cmdS(int argc, char *argv[])
{
DWORD rpcStatus = RPC_S_OK;
INTF_ENTRY Intf;
DWORD dwFlags = 0;
if (argc < 2 || (argc < 3 && _stricmp(argv[1], "sc")))
{
printf("usage: wzctool s guid {im|am|ws|ssid|bssid|cm|awk|rwk} value");
return;
}
ZeroMemory(&Intf, sizeof(INTF_ENTRY));
Intf.wszGuid = RpcCAlloc(sizeof(WCHAR)*strlen(argv[0])+1);
wsprintf(Intf.wszGuid, L"%S", argv[0]);
Intf.wszDescr = NULL;
if (!_stricmp(argv[1],"im"))
{
Intf.nInfraMode = atoi(argv[2]);
dwFlags |= INTF_INFRAMODE;
printf("setting INFRASTRUCTURE_MODE %d.\n",
Intf.nInfraMode);
}
else if (!_stricmp(argv[1],"am"))
{
Intf.nAuthMode = atoi(argv[2]);
dwFlags |= INTF_AUTHMODE;
printf("setting AUTHENTICATION_MODE %d.\n",
Intf.nAuthMode);
}
else if (!_stricmp(argv[1], "ws"))
{
Intf.nWepStatus = atoi(argv[2]);
dwFlags |= INTF_WEPSTATUS;
printf("setting WEPSTATUS %d.\n",
Intf.nWepStatus);
}
else if (!_stricmp(argv[1], "ssid"))
{
Intf.rdSSID.dwDataLen = strlen(argv[2]);
Intf.rdSSID.pData = (LPBYTE)RpcCAlloc(Intf.rdSSID.dwDataLen);
CopyMemory(Intf.rdSSID.pData, argv[2], Intf.rdSSID.dwDataLen);
dwFlags |= INTF_SSID;
}
else if (!_stricmp(argv[1], "bssid"))
{
LPSTR pHdwByte, pHdwTerm;
INT i = 0;
Intf.rdBSSID.dwDataLen = 6;
Intf.rdBSSID.pData = (LPBYTE)RpcCAlloc(Intf.rdBSSID.dwDataLen);
pHdwByte = argv[2];
do
{
pHdwTerm = strchr(pHdwByte, ':');
if (pHdwTerm)
*pHdwTerm = '\0';
Intf.rdBSSID.pData[i++] = (BYTE)atoi(pHdwByte);
if (pHdwTerm)
*pHdwTerm = ':';
pHdwByte = pHdwTerm+1;
} while(i < 6 && pHdwTerm != NULL);
dwFlags |= INTF_BSSID;
}
else if (!_stricmp(argv[1], "cm"))
{
Intf.dwCtlFlags = atoi(argv[2]);
dwFlags |= INTF_ALL_FLAGS;
printf("setting CONFIGURATION_MODE 0x%08x.\n",
Intf.dwCtlFlags);
}
else if (!_stricmp(argv[1], "awk"))
{
BOOL bOk = TRUE;
LPSTR pszTransmit = NULL, pszIndex, pszMaterial;
DWORD dwKeyIndex = 0;
pszMaterial = strrchr(argv[2], ':');
if (pszMaterial != NULL)
{
*pszMaterial = '\0';
pszMaterial++;
pszIndex = strrchr(argv[2], ':');
if (pszIndex != NULL)
{
*pszIndex = '\0';
pszIndex++;
pszTransmit = argv[2];
}
else
{
pszIndex = argv[2];
}
}
else
{
pszMaterial = argv[2];
}
if (pszTransmit != NULL)
dwKeyIndex = (_stricmp(pszTransmit,"t") == 0) ? 0x80000000 : 0;
if (pszIndex != NULL)
dwKeyIndex += atoi(pszIndex);
if (*pszMaterial != '\0')
{
// we assume the key material is represented as hex digits, hence we need to allocate
// as many bytes as half of its length. Also, keep in mind NDIS_802_11_WEP provides
// one byte for the key material;
Intf.rdCtrlData.dwDataLen = sizeof(NDIS_802_11_WEP) + (strlen(pszMaterial)+1)/2 - 1;
Intf.rdCtrlData.pData = (LPBYTE)RpcCAlloc(Intf.rdCtrlData.dwDataLen);
if (Intf.rdCtrlData.pData != NULL)
{
BYTE btKeyByte = 0;
PNDIS_802_11_WEP pndWepKey = (PNDIS_802_11_WEP)Intf.rdCtrlData.pData;
UINT i = 0;
pndWepKey->Length = Intf.rdCtrlData.dwDataLen;
pndWepKey->KeyLength = (strlen(pszMaterial)+1)/2;
pndWepKey->KeyIndex = dwKeyIndex;
while (isxdigit(*pszMaterial))
{
pndWepKey->KeyMaterial[i] = HEX(*pszMaterial) << 4;
pszMaterial++;
if (!isxdigit(*pszMaterial))
break;
pndWepKey->KeyMaterial[i++] |= HEX(*pszMaterial);
pszMaterial++;
}
if (*pszMaterial == '\0')
{
printf("Adding WEP key Index:0x%08x Length:%d Material:",
pndWepKey->KeyIndex,
pndWepKey->KeyLength);
for (i = 0; i < pndWepKey->KeyLength; i++)
{
printf("%02x", pndWepKey->KeyMaterial[i]);
}
printf("\n");
dwFlags |= INTF_ADDWEPKEY;
}
else
{
printf("Incorrect key material. Use sequence of hexadecimal digits\n");
}
}
else
{
printf("Out of memory!");
}
}
else
{
printf("Missing key material. Use \"[[t:]key_index:]key_material\" syntax.\n");
}
}
else if (!_stricmp(argv[1], "rwk"))
{
Intf.rdCtrlData.dwDataLen = sizeof(NDIS_802_11_WEP);
Intf.rdCtrlData.pData = (LPBYTE)RpcCAlloc(Intf.rdCtrlData.dwDataLen);
if (Intf.rdCtrlData.pData != NULL)
{
PNDIS_802_11_WEP pndWepKey = (PNDIS_802_11_WEP)Intf.rdCtrlData.pData;
pndWepKey->Length = Intf.rdCtrlData.dwDataLen;
pndWepKey->KeyIndex = atoi(argv[2]);
printf("Removing WEP key %d.\n", pndWepKey->KeyIndex);
dwFlags |= INTF_REMWEPKEY;
}
else
{
printf("Out of memory!");
}
}
else
{
printf("Invalid interface setting \"%s\".\n", argv[1]);
return;
}
rpcStatus = WZCSetInterface(
NULL,
dwFlags,
&Intf,
&dwFlags);
printf("dwOutFlags = 0x%x\n", dwFlags);
if (rpcStatus != RPC_S_OK)
{
printf("call failed with rpcStatus=%d\n", rpcStatus);
}
else
{
printf("call succeeded.\n");
}
WZCDeleteIntfObj(&Intf);
}