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

193 lines
5.2 KiB
C

/*++
Copyright (c) 2001, Microsoft Corporation
Module Name:
eapolpol.c
Abstract:
The module deals with functions related to communication group policy
settings to EAPOL module
Revision History:
November 19 2001, Created
--*/
#include "precomp.h"
DWORD
ConvertWirelessPSDataToEAPOLData (
IN WIRELESS_PS_DATA *pWirelessData,
IN OUT EAPOL_POLICY_DATA *pEAPOLData
)
{
DWORD dwRetCode = NO_ERROR;
DWORD dwSSIDSize = 0;
WCHAR pszTempSSID[33];
BYTE pszOutSSID[33];
do
{
if (pWirelessData->dwWirelessSSIDLen != 0)
{
wcsncpy(pszTempSSID, pWirelessData->pszWirelessSSID, 32);
pszTempSSID[32] = L'\0';
dwSSIDSize = WideCharToMultiByte (
CP_ACP,
0,
pszTempSSID, //pWirelessData->pszWirelessSSID,
-1, // pWirelessData->dwWirelessSSIDLen+1,
pszOutSSID,
MAX_SSID_LEN +1 ,
NULL,
NULL);
if (dwSSIDSize == 0)
{
dwRetCode = GetLastError();
break;
}
memcpy(pEAPOLData->pbWirelessSSID, pszOutSSID, 32);
}
pEAPOLData->dwWirelessSSIDLen = dwSSIDSize-1;
pEAPOLData->dwEnable8021x = pWirelessData->dwEnable8021x;
pEAPOLData->dw8021xMode = pWirelessData->dw8021xMode;
pEAPOLData->dwEAPType = pWirelessData->dwEapType;
if (pWirelessData->dwEAPDataLen != 0)
{
pEAPOLData->pbEAPData = AllocSPDMem(pWirelessData->dwEAPDataLen);
if (!pEAPOLData->pbEAPData) {
dwRetCode = GetLastError();
break;
}
}
memcpy (pEAPOLData->pbEAPData, pWirelessData->pbEAPData, pWirelessData->dwEAPDataLen);
pEAPOLData->dwEAPDataLen = pWirelessData->dwEAPDataLen;
pEAPOLData->dwMachineAuthentication = pWirelessData->dwMachineAuthentication;
pEAPOLData->dwMachineAuthenticationType = pWirelessData->dwMachineAuthenticationType;
pEAPOLData->dwGuestAuthentication = pWirelessData->dwGuestAuthentication;
pEAPOLData->dwIEEE8021xMaxStart = pWirelessData->dwIEEE8021xMaxStart;
pEAPOLData->dwIEEE8021xStartPeriod = pWirelessData->dwIEEE8021xStartPeriod;
pEAPOLData->dwIEEE8021xAuthPeriod = pWirelessData->dwIEEE8021xAuthPeriod;
pEAPOLData->dwIEEE8021xHeldPeriod = pWirelessData->dwIEEE8021xHeldPeriod;
}
while (FALSE);
return dwRetCode;
}
//
// If Policy Engine is calling into EAPOL, pEAPOLList will be LocalFree by
// PolicyEngine, after it returns from calling into EAPOL.
// If Policy Engine is called by EAPOL, pEAPOLList will be LocalFree by
// EAPOL
//
DWORD
ConvertWirelessPolicyDataToEAPOLList (
IN WIRELESS_POLICY_DATA *pWirelessData,
OUT PEAPOL_POLICY_LIST *ppEAPOLList
)
{
DWORD dwIndex = 0;
EAPOL_POLICY_DATA *pEAPOLData = NULL;
EAPOL_POLICY_LIST *pEAPOLList = NULL;
DWORD dwRetCode = NO_ERROR;
do
{
if (!pWirelessData) {
pEAPOLList = AllocSPDMem(sizeof(EAPOL_POLICY_LIST));
if (!pEAPOLList) {
dwRetCode = GetLastError();
break;
}
break;
}
pEAPOLList = AllocSPDMem(sizeof(EAPOL_POLICY_LIST)+
pWirelessData->dwNumPreferredSettings*sizeof(EAPOL_POLICY_DATA));
if (!pEAPOLList) {
dwRetCode = GetLastError();
break;
}
pEAPOLList->dwNumberOfItems = pWirelessData->dwNumPreferredSettings;
for (dwIndex=0; dwIndex< pWirelessData->dwNumPreferredSettings; dwIndex++)
{
pEAPOLData = &(pEAPOLList->EAPOLPolicy[dwIndex]);
dwRetCode = ConvertWirelessPSDataToEAPOLData (
pWirelessData->ppWirelessPSData[dwIndex],
pEAPOLData
);
if (dwRetCode != NO_ERROR)
{
break;
}
}
}
while (FALSE);
if (dwRetCode) {
if (pEAPOLList) {
for (dwIndex = 0; dwIndex < pWirelessData->dwNumPreferredSettings; dwIndex++)
{
pEAPOLData = &(pEAPOLList->EAPOLPolicy[dwIndex]);
if (pEAPOLData->pbEAPData)
{
FreeSPDMem(pEAPOLData->pbEAPData);
}
}
FreeSPDMem(pEAPOLList);
pEAPOLList = NULL;
}
}
*ppEAPOLList = pEAPOLList;
return dwRetCode;
}
VOID
FreeEAPOLList (
IN PEAPOL_POLICY_LIST pEAPOLList
)
{
DWORD dwIndex = 0;
PEAPOL_POLICY_DATA pEAPOLData = NULL;
if (pEAPOLList) {
for (dwIndex = 0; dwIndex < pEAPOLList->dwNumberOfItems; dwIndex++)
{
pEAPOLData = &(pEAPOLList->EAPOLPolicy[dwIndex]);
if (pEAPOLData->pbEAPData)
{
FreeSPDMem(pEAPOLData->pbEAPData);
}
}
FreeSPDMem(pEAPOLList);
}
return;
}