193 lines
5.2 KiB
C
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;
|
|
}
|
|
|