windows-nt/Source/XPSP1/NT/net/layer2svc/eapol/service/elnotify.cpp
2020-09-26 16:20:57 +08:00

239 lines
5.2 KiB
C++

/*++
Copyright (c) 2000, Microsoft Corporation
Module Name:
elnotify.cpp
Abstract:
Module to handle the notification from 802.1X state machine to netshell
Revision History:
sachins, Jan 04, 2001, Created
--*/
#include "pcheapol.h"
#pragma hdrstop
#include <netconp.h>
#include <dbt.h>
#include "elnotify.h"
HRESULT QueueEvent(EAPOLMAN_EVENT * pEvent)
{
HRESULT hr = S_OK;
INetConnectionEAPOLEventNotify *pEAPOLNotify = NULL;
TRACE0 (NOTIFY, "QueueEvent: Entered");
hr = CoInitializeEx (NULL, COINIT_MULTITHREADED);
if (SUCCEEDED (hr))
{
hr = CoCreateInstance (
CLSID_EAPOLManager,
NULL,
CLSCTX_ALL,
IID_INetConnectionEAPOLEventNotify,
(LPVOID *)&pEAPOLNotify);
if (SUCCEEDED (hr))
{
TRACE0 (NOTIFY, "QueueEvent: CoCreateInstance succeeded");
pEAPOLNotify->UpdateEAPOLInfo (pEvent);
pEAPOLNotify->Release ();
}
else
{
TRACE0 (NOTIFY, "QueueEvent: CoCreateInstance failed");
}
CoUninitialize ();
}
else
{
TRACE0 (NOTIFY, "QueueEvent: CoInitializeEx failed");
}
TRACE0 (NOTIFY, "QueueEvent completed");
CoTaskMemFree (pEvent);
return hr;
}
//+---------------------------------------------------------------------------
//
// EAPOLMANAuthenticationStarted
//
// Purpose: Called by EAPOL module to indicate to netshell that
// authentication has started
//
// Arguments:
// Interface GUID
//
// Returns: nothing
//
//
HRESULT EAPOLMANAuthenticationStarted(GUID * InterfaceId)
{
EAPOLMAN_EVENT * pEvent = NULL;
HRESULT hr = S_OK;
TRACE0 (NOTIFY, "EAPOLMANAuthenticationStarted entered");
pEvent = (EAPOLMAN_EVENT *) CoTaskMemAlloc (sizeof (EAPOLMAN_EVENT));
if(!pEvent)
{
TRACE0 (NOTIFY, "EAPOLMANAuthenticationStarted: Out of memory for pEvent");
return E_OUTOFMEMORY;
}
ZeroMemory(pEvent, sizeof(EAPOLMAN_EVENT));
pEvent->Type = EAPOLMAN_STARTED;
memcpy ((BYTE *)&pEvent->InterfaceId, (BYTE *)InterfaceId, sizeof (GUID));
hr = QueueEvent(pEvent);
TRACE0 (NOTIFY, "EAPOLMANAuthenticationStarted completed");
return hr;
}
//
//
// EAPOLMANAuthenticationSucceeded
//
// Purpose: Called by EAPOL module to indicate to netshell that
// authentication succeeded
//
// Arguments:
// Interface GUID
//
// Returns: nothing
//
HRESULT EAPOLMANAuthenticationSucceeded(GUID * InterfaceId)
{
EAPOLMAN_EVENT * pEvent = NULL;
HRESULT hr = S_OK;
TRACE0 (NOTIFY, "EAPOLMANAuthenticationSucceeded entered");
pEvent = (EAPOLMAN_EVENT *) CoTaskMemAlloc (sizeof (EAPOLMAN_EVENT));
if(!pEvent)
{
TRACE0 (NOTIFY, "EAPOLMANAuthenticationSucceeded: Out of memory for pEvent");
return E_OUTOFMEMORY;
}
ZeroMemory(pEvent, sizeof(EAPOLMAN_EVENT));
pEvent->Type = EAPOLMAN_SUCCEEDED;
memcpy ((BYTE *)&pEvent->InterfaceId, (BYTE *)InterfaceId, sizeof (GUID));
hr = QueueEvent(pEvent);
TRACE0 (NOTIFY, "EAPOLMANAuthenticationSucceeded completed");
return hr;
}
//
//
// EAPOLMANAuthenticationFailed
//
// Purpose: Called by EAPOL module to indicate to netshell that
// authentication failed
//
// Arguments:
// InterfaceId - Interface GUID
// dwType - Type of error
//
// Returns: nothing
//
HRESULT EAPOLMANAuthenticationFailed(
GUID * InterfaceId,
DWORD dwType)
{
EAPOLMAN_EVENT * pEvent = NULL;
HRESULT hr = S_OK;
TRACE0 (NOTIFY, "EAPOLMANAuthenticationFailed entered");
pEvent = (EAPOLMAN_EVENT *) CoTaskMemAlloc (sizeof (EAPOLMAN_EVENT));
if(!pEvent)
{
return E_OUTOFMEMORY;
}
ZeroMemory(pEvent, sizeof(EAPOLMAN_EVENT));
pEvent->Type = EAPOLMAN_FAILED;
memcpy ((BYTE *)&pEvent->InterfaceId, (BYTE *)InterfaceId, sizeof (GUID));
pEvent->dwType = dwType;
hr = QueueEvent(pEvent);
TRACE0 (NOTIFY, "EAPOLMANAuthenticationFailed completed");
return hr;
}
//
//
// EAPOLMANNotification
//
// Purpose: Called by EAPOL module to indicate to netshell that
// notification message needs to be displayed
//
// Arguments:
// InterfaceId - Interface GUID
// pszwNotificationMessage - Pointer to notification string to be displayed
// dwType - Type of error
//
// Returns: nothing
//
HRESULT EAPOLMANNotification(
GUID * InterfaceId,
LPWSTR pszwNotificationMessage,
DWORD dwType)
{
EAPOLMAN_EVENT * pEvent = NULL;
HRESULT hr = S_OK;
TRACE0 (NOTIFY, "EAPOLMANNotification entered");
pEvent = (EAPOLMAN_EVENT *) CoTaskMemAlloc (sizeof (EAPOLMAN_EVENT));
if(!pEvent)
{
return E_OUTOFMEMORY;
}
ZeroMemory(pEvent, sizeof(EAPOLMAN_EVENT));
pEvent->Type = EAPOLMAN_NOTIFICATION;
memcpy ((BYTE *)&pEvent->InterfaceId, (BYTE *)InterfaceId, sizeof (GUID));
pEvent->dwType = dwType;
wcscpy (pEvent->szwMessage, pszwNotificationMessage);
TRACE2 (NOTIFY, "EAPOLMANNotification: Got string = %ws :: Event string = %ws", pszwNotificationMessage, pEvent->szwMessage);
hr = QueueEvent(pEvent);
TRACE0 (NOTIFY, "EAPOLMANNotification completed");
return hr;
}