windows-nt/Source/XPSP1/NT/net/layer2svc/wlstore/policy-r.c
2020-09-26 16:20:57 +08:00

279 lines
8.3 KiB
C

//----------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2000.
//
// File: policy-r.c
//
// Contents: Policy management for registry.
//
//
// History: KrishnaG.
// AbhisheV.
//
//----------------------------------------------------------------------------
#include "precomp.h"
DWORD
MarshallWirelessPSBuffer(
PWIRELESS_PS_DATA pWirelessPSData,
LPBYTE pBuffer,
DWORD * pdwBufferLen
)
{
DWORD dwSize = 0;
DWORD dwError = 0;
LPBYTE pCurrentPos = NULL;
DWORD dwPSSize = 0;
LPWSTR SSID = NULL;
DWORD dwWepEnabled = 0;
DWORD dwId = 0;
DWORD dwNetworkAuthentication = 0;
DWORD dwAutomaticKeyProvision = 0;
DWORD dwNetworkType = 0;
DWORD dwEnable8021x = 0;
DWORD dw8021xMode = 0;
DWORD dwEAPType = 0;
DWORD dwCertificateType = 0;
DWORD dwValidateServerCertificate = 0;
DWORD dwMachineAuthentication = 0;
DWORD dwMachineAuthenticationType = 0;
DWORD dwGuestAuthentication = 0;
DWORD dwIEEE8021xMaxStart = 0;
DWORD dwIEEE8021xStartPeriod = 0;
DWORD dwIEEE8021xAuthPeriod = 0;
DWORD dwIEEE8021xHeldPeriod = 0;
DWORD dwDescriptionLen = 0;
DWORD dwEAPDataLen = 0;
DWORD dwSSIDLen = 0;
pCurrentPos = pBuffer;
dwPSSize = pWirelessPSData->dwPSLen;
memcpy(pCurrentPos, &dwPSSize, sizeof(DWORD));
pCurrentPos += sizeof(DWORD);
SSID = pWirelessPSData->pszWirelessSSID;
memcpy(pCurrentPos, SSID, 32*2);
pCurrentPos += 32*2;
dwSSIDLen = pWirelessPSData->dwWirelessSSIDLen;
memcpy(pCurrentPos, &dwSSIDLen, sizeof(DWORD));
pCurrentPos += sizeof(DWORD);
dwWepEnabled = pWirelessPSData->dwWepEnabled;
memcpy(pCurrentPos, &dwWepEnabled, sizeof(DWORD));
pCurrentPos += sizeof(DWORD);
dwId = pWirelessPSData->dwId;
memcpy(pCurrentPos, &dwId, sizeof(DWORD));
pCurrentPos += sizeof(DWORD);
dwNetworkAuthentication = pWirelessPSData->dwNetworkAuthentication;
memcpy(pCurrentPos, &dwNetworkAuthentication, sizeof(DWORD));
pCurrentPos += sizeof(DWORD);
dwAutomaticKeyProvision = pWirelessPSData->dwAutomaticKeyProvision;
memcpy(pCurrentPos, &dwAutomaticKeyProvision, sizeof(DWORD));
pCurrentPos += sizeof(DWORD);
dwNetworkType = pWirelessPSData->dwNetworkType;
memcpy(pCurrentPos, &dwNetworkType, sizeof(DWORD));
pCurrentPos += sizeof(DWORD);
dwEnable8021x = pWirelessPSData->dwEnable8021x;
memcpy(pCurrentPos, &dwEnable8021x, sizeof(DWORD));
pCurrentPos += sizeof(DWORD);
dw8021xMode = pWirelessPSData->dw8021xMode;
memcpy(pCurrentPos, &dw8021xMode, sizeof(DWORD));
pCurrentPos += sizeof(DWORD);
dwEAPType = pWirelessPSData->dwEapType;
memcpy(pCurrentPos, &dwEAPType, sizeof(DWORD));
pCurrentPos += sizeof(DWORD);
dwEAPDataLen = pWirelessPSData->dwEAPDataLen;
memcpy(pCurrentPos, &dwEAPDataLen, sizeof(DWORD));
pCurrentPos += sizeof(DWORD);
memcpy(pCurrentPos,
pWirelessPSData->pbEAPData,
dwEAPDataLen);
pCurrentPos += dwEAPDataLen;
dwMachineAuthentication = pWirelessPSData->dwMachineAuthentication;
memcpy(pCurrentPos, &dwMachineAuthentication, sizeof(DWORD));
pCurrentPos += sizeof(DWORD);
dwMachineAuthenticationType = pWirelessPSData->dwMachineAuthenticationType;
memcpy(pCurrentPos, &dwMachineAuthenticationType, sizeof(DWORD));
pCurrentPos += sizeof(DWORD);
dwGuestAuthentication = pWirelessPSData->dwGuestAuthentication;
memcpy(pCurrentPos, &dwGuestAuthentication, sizeof(DWORD));
pCurrentPos += sizeof(DWORD);
dwIEEE8021xMaxStart = pWirelessPSData->dwIEEE8021xMaxStart;
memcpy(pCurrentPos, &dwIEEE8021xMaxStart, sizeof(DWORD));
pCurrentPos += sizeof(DWORD);
dwIEEE8021xStartPeriod = pWirelessPSData->dwIEEE8021xStartPeriod;
memcpy(pCurrentPos, &dwIEEE8021xStartPeriod, sizeof(DWORD));
pCurrentPos += sizeof(DWORD);
dwIEEE8021xAuthPeriod = pWirelessPSData->dwIEEE8021xAuthPeriod;
memcpy(pCurrentPos, &dwIEEE8021xAuthPeriod, sizeof(DWORD));
pCurrentPos += sizeof(DWORD);
dwIEEE8021xHeldPeriod = pWirelessPSData->dwIEEE8021xHeldPeriod;
memcpy(pCurrentPos, &dwIEEE8021xHeldPeriod, sizeof(DWORD));
pCurrentPos += sizeof(DWORD);
dwDescriptionLen = pWirelessPSData->dwDescriptionLen;
memcpy(pCurrentPos, &dwDescriptionLen, sizeof(DWORD));
pCurrentPos += sizeof(DWORD);
memcpy(pCurrentPos,
pWirelessPSData->pszDescription,
dwDescriptionLen*2);
*pdwBufferLen = dwPSSize;
return(dwError);
}
DWORD
MarshallWirelessPolicyBuffer(
PWIRELESS_POLICY_DATA pWirelessPolicyData,
LPBYTE * ppBuffer,
DWORD * pdwBufferLen
)
{
LPBYTE pBuffer = NULL;
DWORD dwSize = 0;
DWORD dwError = 0;
DWORD dwPollingInterval = 0;
LPBYTE pCurrentPos = NULL;
DWORD dwEffectiveSize = 0;
PWIRELESS_PS_DATA *ppWirelessPSData = NULL;
DWORD dwNumPreferredSettings = 0;
DWORD dwPSSize = 0;
DWORD i = 0;
DWORD dwDisableZeroConf = 0;
DWORD dwNetworkToAccess = 0;
DWORD dwConnectToNonPreferredNtwks = 0;
DWORD dwWlBlobLen = 0;
WORD wMajorVersion = 0;
WORD wMinorVersion = 0;
wMajorVersion = WL_BLOB_MAJOR_VERSION;
wMinorVersion = WL_BLOB_MINOR_VERSION;
// first estimate the total size
dwSize += sizeof(WORD); // Major Version
dwSize += sizeof(WORD); // Minor Version
dwSize += sizeof(DWORD); // Length of the Wl_Blob
dwWlBlobLen += sizeof(DWORD); // dwPollingInterval
dwWlBlobLen += sizeof(DWORD); // dwDisableZeroConf
dwWlBlobLen += sizeof(DWORD); // dwNetworkToAccess
dwWlBlobLen += sizeof(DWORD); // dwConnectToNonPreferredNetworks
dwWlBlobLen += sizeof(DWORD); // dwNumPreferredSettings
ppWirelessPSData = pWirelessPolicyData->ppWirelessPSData;
dwNumPreferredSettings =
pWirelessPolicyData->dwNumPreferredSettings;
for (i=0; i<dwNumPreferredSettings;++i) {
dwWlBlobLen += (*ppWirelessPSData)->dwPSLen;
ppWirelessPSData++;
}
//dwSize++; //Taroon Dont know why this for.
dwSize += dwWlBlobLen;
pBuffer = AllocPolMem(dwSize);
if (!pBuffer) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
pCurrentPos = pBuffer;
memcpy(pCurrentPos, &wMajorVersion, sizeof(WORD));
pCurrentPos += sizeof(WORD);
memcpy(pCurrentPos, &wMinorVersion, sizeof(WORD));
pCurrentPos += sizeof(WORD);
memcpy(pCurrentPos, &dwWlBlobLen, sizeof(DWORD));
pCurrentPos += sizeof(DWORD);
dwPollingInterval = pWirelessPolicyData->dwPollingInterval;
memcpy(pCurrentPos, &dwPollingInterval, sizeof(DWORD));
pCurrentPos += sizeof(DWORD);
dwDisableZeroConf = pWirelessPolicyData->dwDisableZeroConf;
memcpy(pCurrentPos, &dwDisableZeroConf, sizeof(DWORD));
pCurrentPos += sizeof(DWORD);
dwNetworkToAccess = pWirelessPolicyData->dwNetworkToAccess;
memcpy(pCurrentPos, &dwNetworkToAccess, sizeof(DWORD));
pCurrentPos += sizeof(DWORD);
dwConnectToNonPreferredNtwks = pWirelessPolicyData->dwConnectToNonPreferredNtwks;
memcpy(pCurrentPos, &dwConnectToNonPreferredNtwks, sizeof(DWORD));
pCurrentPos += sizeof(DWORD);
dwNumPreferredSettings = pWirelessPolicyData->dwNumPreferredSettings;
memcpy(pCurrentPos, &dwNumPreferredSettings, sizeof(DWORD));
pCurrentPos += sizeof(DWORD);
// Write each Preferred Setting data here
ppWirelessPSData = pWirelessPolicyData->ppWirelessPSData;
for(i=0; i<dwNumPreferredSettings;++i) {
dwError = MarshallWirelessPSBuffer(
*(ppWirelessPSData+i),
pCurrentPos,
&dwPSSize);
BAIL_ON_WIN32_ERROR(dwError);
pCurrentPos += dwPSSize;
}
*ppBuffer = pBuffer;
*pdwBufferLen = dwSize;
return(dwError);
error:
if (pBuffer) {
FreePolMem(pBuffer);
}
*ppBuffer = NULL;
*pdwBufferLen = 0;
return(dwError);
}