diff --git a/EAPMethods/MSIBuild/Makefile b/EAPMethods/MSIBuild/Makefile
index 0b26b58..095c47f 100644
--- a/EAPMethods/MSIBuild/Makefile
+++ b/EAPMethods/MSIBuild/Makefile
@@ -35,6 +35,7 @@ Property Signature_
s$(MSIBUILD_LENGTH_ID) s$(MSIBUILD_LENGTH_ID)
AppSearch Property Signature_
OLD$(MSIBUILD_PRODUCT_NAME_UC)DIR clEAPTTLS.dll.$(PLAT)
+OLD$(MSIBUILD_PRODUCT_NAME_UC)DIR clEAPTTLSUI.dll.$(PLAT)
OLD$(MSIBUILD_PRODUCT_NAME_UC)DIR clEAPMethodEvents.dll.$(PLAT)
<.
+;
+
+EXPORTS
+ EapPeerFreeMemory
+ EapPeerFreeErrorMemory
+ EapPeerGetInfo
+; EapPeerConfigXml2Blob
+; EapPeerConfigBlob2Xml
+; EapPeerGetMethodProperties
+; EapPeerCredentialsXml2Blob
+; EapPeerQueryCredentialInputFields
+; EapPeerQueryUserBlobFromCredentialInputFields
+; EapPeerQueryInteractiveUIInputFields
+; EapPeerQueryUIBlobFromInteractiveUIInputFields
diff --git a/EAPMethods/build/EAPMethodUI.def b/EAPMethods/build/EAPMethodUI.def
new file mode 100644
index 0000000..470b9fd
--- /dev/null
+++ b/EAPMethods/build/EAPMethodUI.def
@@ -0,0 +1,26 @@
+;
+; Copyright 2015-2016 Amebis
+; Copyright 2016 GÉANT
+;
+; This file is part of GEANTLink.
+;
+; GEANTLink is free software: you can redistribute it and/or modify it
+; under the terms of the GNU General Public License as published by
+; the Free Software Foundation, either version 3 of the License, or
+; (at your option) any later version.
+;
+; GEANTLink is distributed in the hope that it will be useful, but
+; WITHOUT ANY WARRANTY; without even the implied warranty of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+; GNU General Public License for more details.
+;
+; You should have received a copy of the GNU General Public License
+; along with GEANTLink. If not, see .
+;
+
+EXPORTS
+ EapPeerFreeMemory
+ EapPeerFreeErrorMemory
+ EapPeerInvokeConfigUI
+ EapPeerInvokeIdentityUI
+ EapPeerInvokeInteractiveUI
diff --git a/EAPMethods/build/EAPTTLS.props b/EAPMethods/build/EAPTTLS.props
index 905e5a0..344008b 100644
--- a/EAPMethods/build/EAPTTLS.props
+++ b/EAPMethods/build/EAPTTLS.props
@@ -9,6 +9,9 @@
EAPMETHOD_TYPE=21;%(PreprocessorDefinitions)
+
+ EAPMethod.def
+
\ No newline at end of file
diff --git a/EAPMethods/build/EAPTTLS.vcxproj b/EAPMethods/build/EAPTTLS.vcxproj
index cde66e1..33d4d69 100644
--- a/EAPMethods/build/EAPTTLS.vcxproj
+++ b/EAPMethods/build/EAPTTLS.vcxproj
@@ -105,6 +105,9 @@
{d63f24bd-92a0-4d6b-8b69-ed947e4d2b1b}
+
+
+
diff --git a/EAPMethods/build/EAPTTLS.vcxproj.filters b/EAPMethods/build/EAPTTLS.vcxproj.filters
index be1489a..2281c44 100644
--- a/EAPMethods/build/EAPTTLS.vcxproj.filters
+++ b/EAPMethods/build/EAPTTLS.vcxproj.filters
@@ -44,4 +44,9 @@
Resource Files
+
+
+ Source Files
+
+
\ No newline at end of file
diff --git a/EAPMethods/build/EAPTTLSUI.props b/EAPMethods/build/EAPTTLSUI.props
new file mode 100644
index 0000000..c94e3c6
--- /dev/null
+++ b/EAPMethods/build/EAPTTLSUI.props
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+ EAPMETHOD_TYPE=21;%(PreprocessorDefinitions)
+
+
+ EAPMethodUI.def
+
+
+
+
\ No newline at end of file
diff --git a/EAPMethods/build/EAPTTLSUI.rc b/EAPMethods/build/EAPTTLSUI.rc
new file mode 100644
index 0000000..64b9712
Binary files /dev/null and b/EAPMethods/build/EAPTTLSUI.rc differ
diff --git a/EAPMethods/build/EAPTTLSUI.vcxproj b/EAPMethods/build/EAPTTLSUI.vcxproj
new file mode 100644
index 0000000..9a20174
--- /dev/null
+++ b/EAPMethods/build/EAPTTLSUI.vcxproj
@@ -0,0 +1,114 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ {DD7A97CA-F18E-43B7-95C4-D06E6A291624}
+ EAPTTLSUI
+
+
+
+ DynamicLibrary
+ true
+ Unicode
+
+
+ DynamicLibrary
+ true
+ Unicode
+
+
+ DynamicLibrary
+ false
+ true
+ Unicode
+
+
+ DynamicLibrary
+ false
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Create
+ Create
+ Create
+ Create
+
+
+
+
+
+
+
+ {47399d91-7eb9-41de-b521-514ba5db0c43}
+
+
+ {d63f24bd-92a0-4d6b-8b69-ed947e4d2b1b}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/EAPMethods/build/EAPTTLSUI.vcxproj.filters b/EAPMethods/build/EAPTTLSUI.vcxproj.filters
new file mode 100644
index 0000000..e8a7725
--- /dev/null
+++ b/EAPMethods/build/EAPTTLSUI.vcxproj.filters
@@ -0,0 +1,52 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hpp;hxx;hm;inl;inc;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+
+
+ Resource Files
+
+
+
+
+ Source Files
+
+
+
\ No newline at end of file
diff --git a/EAPMethods/include/EAPMethods.h b/EAPMethods/include/EAPMethods.h
index bf821d2..40f2b31 100644
--- a/EAPMethods/include/EAPMethods.h
+++ b/EAPMethods/include/EAPMethods.h
@@ -34,7 +34,9 @@ extern "C" {
namespace eap
{
class session_base;
+ class eap_module_base;
template class peer;
+ class peer_ui_base;
};
#pragma once
@@ -132,10 +134,9 @@ namespace eap
///
- /// EAP peer base class
+ /// EAP module base class
///
- template
- class peer
+ class eap_module_base
{
public:
inline DWORD create()
@@ -150,57 +151,12 @@ namespace eap
}
- virtual ~peer()
+ virtual ~eap_module_base()
{
m_ep.write(&EAPMETHOD_TRACE_EVT_MODULE_UNLOAD, winstd::event_data((BYTE)EAPMETHOD_TYPE), winstd::event_data::blank);
}
- ///
- /// Obtains a set of function pointers for an implementation of the EAP peer method currently loaded on the EAPHost service
- ///
- /// \sa [EapPeerGetInfo function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363608.aspx)
- ///
- inline void get_info(_Out_ EAP_PEER_METHOD_ROUTINES *pEapPeerMethodRoutines) const
- {
- ETW_FN_VOID;
-
- assert(pEapPeerMethodRoutines);
-
- pEapPeerMethodRoutines->dwVersion = PRODUCT_VERSION;
- pEapPeerMethodRoutines->pEapType = NULL;
-
- pEapPeerMethodRoutines->EapPeerInitialize = initialize;
- pEapPeerMethodRoutines->EapPeerShutdown = shutdown;
- pEapPeerMethodRoutines->EapPeerBeginSession = begin_session;
- pEapPeerMethodRoutines->EapPeerEndSession = end_session;
- pEapPeerMethodRoutines->EapPeerSetCredentials = NULL; // Always NULL unless we want to use generic credential UI
- pEapPeerMethodRoutines->EapPeerGetIdentity = get_identity;
- pEapPeerMethodRoutines->EapPeerProcessRequestPacket = process_request_packet;
- pEapPeerMethodRoutines->EapPeerGetResponsePacket = get_response_packet;
- pEapPeerMethodRoutines->EapPeerGetResult = get_result;
- pEapPeerMethodRoutines->EapPeerGetUIContext = get_ui_context;
- pEapPeerMethodRoutines->EapPeerSetUIContext = set_ui_context;
- pEapPeerMethodRoutines->EapPeerGetResponseAttributes = get_response_attributes;
- pEapPeerMethodRoutines->EapPeerSetResponseAttributes = set_response_attributes;
- }
-
-
- ///
- /// Free BLOB allocated with this peer
- ///
- inline void free_memory(_In_ void *ptr)
- {
- ETW_FN_VOID;
-
- if (ptr) {
- // Since we do security here and some of the BLOBs contain credentials, sanitize every memory block before freeing.
- SecureZeroMemory(ptr, HeapSize(m_heap, 0, ptr));
- HeapFree(m_heap, 0, ptr);
- }
- }
-
-
///
/// Allocate a EAP_ERROR and fill it according to dwErrorCode
///
@@ -257,6 +213,21 @@ namespace eap
}
+ ///
+ /// Free BLOB allocated with this peer
+ ///
+ inline void free_memory(_In_ void *ptr)
+ {
+ ETW_FN_VOID;
+
+ if (ptr) {
+ // Since we do security here and some of the BLOBs contain credentials, sanitize every memory block before freeing.
+ SecureZeroMemory(ptr, HeapSize(m_heap, 0, ptr));
+ HeapFree(m_heap, 0, ptr);
+ }
+ }
+
+
///
/// Free EAP_ERROR allocated with `make_error()` method
///
@@ -270,6 +241,49 @@ namespace eap
}
}
+
+ protected:
+ winstd::heap m_heap; ///< Heap
+ mutable winstd::event_provider m_ep; ///< Event Provider
+ };
+
+
+ ///
+ /// EAP peer base class
+ ///
+ template
+ class peer : public eap_module_base
+ {
+ public:
+ ///
+ /// Obtains a set of function pointers for an implementation of the EAP peer method currently loaded on the EAPHost service
+ ///
+ /// \sa [EapPeerGetInfo function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363608.aspx)
+ ///
+ inline void get_info(_Out_ EAP_PEER_METHOD_ROUTINES *pEapPeerMethodRoutines) const
+ {
+ ETW_FN_VOID;
+
+ assert(pEapPeerMethodRoutines);
+
+ pEapPeerMethodRoutines->dwVersion = PRODUCT_VERSION;
+ pEapPeerMethodRoutines->pEapType = NULL;
+
+ pEapPeerMethodRoutines->EapPeerInitialize = initialize;
+ pEapPeerMethodRoutines->EapPeerShutdown = shutdown;
+ pEapPeerMethodRoutines->EapPeerBeginSession = begin_session;
+ pEapPeerMethodRoutines->EapPeerEndSession = end_session;
+ pEapPeerMethodRoutines->EapPeerSetCredentials = NULL; // Always NULL unless we want to use generic credential UI
+ pEapPeerMethodRoutines->EapPeerGetIdentity = get_identity;
+ pEapPeerMethodRoutines->EapPeerProcessRequestPacket = process_request_packet;
+ pEapPeerMethodRoutines->EapPeerGetResponsePacket = get_response_packet;
+ pEapPeerMethodRoutines->EapPeerGetResult = get_result;
+ pEapPeerMethodRoutines->EapPeerGetUIContext = get_ui_context;
+ pEapPeerMethodRoutines->EapPeerSetUIContext = set_ui_context;
+ pEapPeerMethodRoutines->EapPeerGetResponseAttributes = get_response_attributes;
+ pEapPeerMethodRoutines->EapPeerSetResponseAttributes = set_response_attributes;
+ }
+
protected:
///
/// Initializes an EAP peer method for EAPHost.
@@ -446,9 +460,65 @@ namespace eap
assert(hSession);
return static_cast(hSession)->set_response_attributes(pAttribs, pEapOutput, ppEapError);
}
+ };
- protected:
- winstd::heap m_heap; ///< Heap
- mutable winstd::event_provider m_ep; ///< Event Provider
+
+ ///
+ /// EAP peer UI base class
+ ///
+ class peer_ui_base : public eap_module_base
+ {
+ public:
+ ///
+ /// Constructor
+ ///
+ peer_ui_base();
+
+ ///
+ /// Raises the EAP method's specific connection configuration user interface dialog on the client.
+ ///
+ /// \sa [EapPeerInvokeConfigUI function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363614.aspx)
+ ///
+ virtual DWORD invoke_config_ui(
+ _In_ const EAP_METHOD_TYPE *pEapType,
+ _In_ HWND hwndParent,
+ _In_ DWORD dwFlags,
+ _In_ DWORD dwSizeOfConnectionDataIn,
+ _In_count_(dwSizeOfConnectionDataIn) const BYTE *pConnectionDataIn,
+ _Out_ DWORD *pdwSizeOfConnectionDataOut,
+ _Out_ BYTE **ppConnectionDataOut,
+ _Out_ EAP_ERROR **ppEapError) = 0;
+
+ ///
+ /// Raises a custom interactive user interface dialog to obtain user identity information for the EAP method on the client.
+ ///
+ /// \sa [EapPeerInvokeIdentityUI function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363615.aspx)
+ ///
+ virtual DWORD invoke_identity_ui(
+ _In_ const EAP_METHOD_TYPE *pEapType,
+ _In_ DWORD dwFlags,
+ _In_ HWND hwndParent,
+ _In_ DWORD dwSizeOfConnectionData,
+ _In_count_(dwSizeOfConnectionData) const BYTE *pConnectionData,
+ _In_ DWORD dwSizeOfUserData,
+ _In_count_(dwSizeOfUserData) const BYTE *pUserData,
+ _Out_ DWORD *pdwSizeOfUserDataOut,
+ _Out_ BYTE **ppUserDataOut,
+ _Out_ LPWSTR *ppwszIdentity,
+ _Out_ EAP_ERROR **ppEapError) = 0;
+
+ ///
+ /// Raises a custom interactive user interface dialog for the EAP method on the client.
+ ///
+ /// \sa [EapPeerInvokeInteractiveUI function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363616.aspx)
+ ///
+ virtual DWORD invoke_interactive_ui(
+ _In_ const EAP_METHOD_TYPE *pEapType,
+ _In_ HWND hwndParent,
+ _In_ DWORD dwSizeofUIContextData,
+ _In_count_(dwSizeofUIContextData) const BYTE *pUIContextData,
+ _Out_ DWORD *pdwSizeOfDataFromInteractiveUI,
+ _Out_ BYTE **ppDataFromInteractiveUI,
+ _Out_ EAP_ERROR **ppEapError) = 0;
};
};
diff --git a/EAPMethods/include/EAPTTLS.h b/EAPMethods/include/EAPTTLS.h
index 7bce9b7..2d85b23 100644
--- a/EAPMethods/include/EAPTTLS.h
+++ b/EAPMethods/include/EAPTTLS.h
@@ -24,6 +24,7 @@ namespace eap
{
class session_ttls;
class peer_ttls;
+ class peer_ttls_ui;
}
#pragma once
@@ -44,4 +45,61 @@ namespace eap
class peer_ttls : public peer
{
};
+
+
+ class peer_ttls_ui : public peer_ui_base
+ {
+ public:
+ ///
+ /// Constructor
+ ///
+ peer_ttls_ui();
+
+ ///
+ /// Raises the EAP method's specific connection configuration user interface dialog on the client.
+ ///
+ /// \sa [EapPeerInvokeConfigUI function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363614.aspx)
+ ///
+ virtual DWORD invoke_config_ui(
+ _In_ const EAP_METHOD_TYPE *pEapType,
+ _In_ HWND hwndParent,
+ _In_ DWORD dwFlags,
+ _In_ DWORD dwSizeOfConnectionDataIn,
+ _In_count_(dwSizeOfConnectionDataIn) const BYTE *pConnectionDataIn,
+ _Out_ DWORD *pdwSizeOfConnectionDataOut,
+ _Out_ BYTE **ppConnectionDataOut,
+ _Out_ EAP_ERROR **ppEapError);
+
+ ///
+ /// Raises a custom interactive user interface dialog to obtain user identity information for the EAP method on the client.
+ ///
+ /// \sa [EapPeerInvokeIdentityUI function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363615.aspx)
+ ///
+ virtual DWORD invoke_identity_ui(
+ _In_ const EAP_METHOD_TYPE *pEapType,
+ _In_ DWORD dwFlags,
+ _In_ HWND hwndParent,
+ _In_ DWORD dwSizeOfConnectionData,
+ _In_count_(dwSizeOfConnectionData) const BYTE *pConnectionData,
+ _In_ DWORD dwSizeOfUserData,
+ _In_count_(dwSizeOfUserData) const BYTE *pUserData,
+ _Out_ DWORD *pdwSizeOfUserDataOut,
+ _Out_ BYTE **ppUserDataOut,
+ _Out_ LPWSTR *ppwszIdentity,
+ _Out_ EAP_ERROR **ppEapError);
+
+ ///
+ /// Raises a custom interactive user interface dialog for the EAP method on the client.
+ ///
+ /// \sa [EapPeerInvokeInteractiveUI function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363616.aspx)
+ ///
+ virtual DWORD invoke_interactive_ui(
+ _In_ const EAP_METHOD_TYPE *pEapType,
+ _In_ HWND hwndParent,
+ _In_ DWORD dwSizeofUIContextData,
+ _In_count_(dwSizeofUIContextData) const BYTE *pUIContextData,
+ _Out_ DWORD *pdwSizeOfDataFromInteractiveUI,
+ _Out_ BYTE **ppDataFromInteractiveUI,
+ _Out_ EAP_ERROR **ppEapError);
+ };
}
diff --git a/EAPMethods/include/StdAfx.h b/EAPMethods/include/StdAfx.h
index 30139ff..793ca00 100644
--- a/EAPMethods/include/StdAfx.h
+++ b/EAPMethods/include/StdAfx.h
@@ -28,9 +28,7 @@
#include
#include
-extern "C" {
#include
-}
#include
#include
diff --git a/EAPMethods/src/EAPMethods.cpp b/EAPMethods/src/EAPMethods.cpp
index 3c46fc6..91a824d 100644
--- a/EAPMethods/src/EAPMethods.cpp
+++ b/EAPMethods/src/EAPMethods.cpp
@@ -130,3 +130,12 @@ DWORD eap::session_base::set_response_attributes(_In_ EapAttributes *pAttribs, _
return ERROR_SUCCESS;
}
+
+
+//////////////////////////////////////////////////////////////////////
+// eap::peer_ui_base
+//////////////////////////////////////////////////////////////////////
+
+eap::peer_ui_base::peer_ui_base() : eap_module_base()
+{
+}
diff --git a/EAPMethods/src/EAPTTLS.cpp b/EAPMethods/src/EAPTTLS.cpp
index 711444d..c880f79 100644
--- a/EAPMethods/src/EAPTTLS.cpp
+++ b/EAPMethods/src/EAPTTLS.cpp
@@ -20,6 +20,8 @@
#include
+#pragma comment(lib, "Comctl32.lib")
+
//////////////////////////////////////////////////////////////////////
// eap::session_ttls
@@ -28,3 +30,91 @@
eap::session_ttls::session_ttls() : session_base()
{
}
+
+
+//////////////////////////////////////////////////////////////////////
+// eap::peer_ui_base
+//////////////////////////////////////////////////////////////////////
+
+eap::peer_ttls_ui::peer_ttls_ui() : peer_ui_base()
+{
+}
+
+
+DWORD eap::peer_ttls_ui::invoke_config_ui(
+ _In_ const EAP_METHOD_TYPE *pEapType,
+ _In_ HWND hwndParent,
+ _In_ DWORD dwFlags,
+ _In_ DWORD dwSizeOfConnectionDataIn,
+ _In_count_(dwSizeOfConnectionDataIn) const BYTE *pConnectionDataIn,
+ _Out_ DWORD *pdwSizeOfConnectionDataOut,
+ _Out_ BYTE **ppConnectionDataOut,
+ _Out_ EAP_ERROR **ppEapError)
+{
+ UNREFERENCED_PARAMETER(pEapType);
+ UNREFERENCED_PARAMETER(dwFlags);
+ UNREFERENCED_PARAMETER(dwSizeOfConnectionDataIn);
+ UNREFERENCED_PARAMETER(pConnectionDataIn);
+ UNREFERENCED_PARAMETER(pdwSizeOfConnectionDataOut);
+ UNREFERENCED_PARAMETER(ppConnectionDataOut);
+ UNREFERENCED_PARAMETER(ppEapError);
+
+ InitCommonControls();
+ MessageBox(hwndParent, _T(PRODUCT_NAME_STR) _T(" configuration goes here!"), _T(PRODUCT_NAME_STR) _T(" Settings"), MB_OK);
+
+ return ERROR_SUCCESS;
+}
+
+
+DWORD eap::peer_ttls_ui::invoke_identity_ui(
+ _In_ const EAP_METHOD_TYPE *pEapType,
+ _In_ DWORD dwFlags,
+ _In_ HWND hwndParent,
+ _In_ DWORD dwSizeOfConnectionData,
+ _In_count_(dwSizeOfConnectionData) const BYTE *pConnectionData,
+ _In_ DWORD dwSizeOfUserData,
+ _In_count_(dwSizeOfUserData) const BYTE *pUserData,
+ _Out_ DWORD *pdwSizeOfUserDataOut,
+ _Out_ BYTE **ppUserDataOut,
+ _Out_ LPWSTR *ppwszIdentity,
+ _Out_ EAP_ERROR **ppEapError)
+{
+ UNREFERENCED_PARAMETER(pEapType);
+ UNREFERENCED_PARAMETER(dwFlags);
+ UNREFERENCED_PARAMETER(dwSizeOfConnectionData);
+ UNREFERENCED_PARAMETER(pConnectionData);
+ UNREFERENCED_PARAMETER(dwSizeOfUserData);
+ UNREFERENCED_PARAMETER(pUserData);
+ UNREFERENCED_PARAMETER(pdwSizeOfUserDataOut);
+ UNREFERENCED_PARAMETER(ppUserDataOut);
+ UNREFERENCED_PARAMETER(ppwszIdentity);
+ UNREFERENCED_PARAMETER(ppEapError);
+
+ InitCommonControls();
+ MessageBox(hwndParent, _T(PRODUCT_NAME_STR) _T(" credential prompt goes here!"), _T(PRODUCT_NAME_STR) _T(" Credentials"), MB_OK);
+
+ return ERROR_SUCCESS;
+}
+
+
+DWORD eap::peer_ttls_ui::invoke_interactive_ui(
+ _In_ const EAP_METHOD_TYPE *pEapType,
+ _In_ HWND hwndParent,
+ _In_ DWORD dwSizeofUIContextData,
+ _In_count_(dwSizeofUIContextData) const BYTE *pUIContextData,
+ _Out_ DWORD *pdwSizeOfDataFromInteractiveUI,
+ _Out_ BYTE **ppDataFromInteractiveUI,
+ _Out_ EAP_ERROR **ppEapError)
+{
+ UNREFERENCED_PARAMETER(pEapType);
+ UNREFERENCED_PARAMETER(dwSizeofUIContextData);
+ UNREFERENCED_PARAMETER(pUIContextData);
+ UNREFERENCED_PARAMETER(pdwSizeOfDataFromInteractiveUI);
+ UNREFERENCED_PARAMETER(ppDataFromInteractiveUI);
+ UNREFERENCED_PARAMETER(ppEapError);
+
+ InitCommonControls();
+ MessageBox(hwndParent, _T(PRODUCT_NAME_STR) _T(" interactive UI goes here!"), _T(PRODUCT_NAME_STR) _T(" Prompt"), MB_OK);
+
+ return ERROR_SUCCESS;
+}
diff --git a/EAPMethods/src/Main.cpp b/EAPMethods/src/Main.cpp
index 6031a2e..e0e5e82 100644
--- a/EAPMethods/src/Main.cpp
+++ b/EAPMethods/src/Main.cpp
@@ -20,8 +20,6 @@
#include
-#pragma comment(lib, "Comctl32.lib")
-#pragma comment(lib, "Shlwapi.lib")
#if EAPMETHOD_TYPE==21
#define _EAPMETHOD_PEER eap::peer_ttls
@@ -43,19 +41,13 @@ BOOL WINAPI DllMain(_In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason, _In_ LPVOID l
UNREFERENCED_PARAMETER(lpvReserved);
if (fdwReason == DLL_PROCESS_ATTACH) {
- //// Load EAPMethodEvents.dll
- //tstring path;
- //GetModuleFileName(hinstDLL, path);
- //LPTSTR pszFilename = PathFindFileName(path.c_str());
- //path.resize(pszFilename ? (size_t)(pszFilename - (LPCTSTR)path.c_str()) : 0);
- //path += _T("EAPMethodEvents.dll");
- //g_EAPMethodEvents.load(path.c_str(), NULL, LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_IMAGE_RESOURCE);
-
- if (!g_peer.create())
+#ifdef _DEBUG
+ //Sleep(10000);
+#endif
+ if (g_peer.create() != ERROR_SUCCESS)
return FALSE;
- } else if (fdwReason == DLL_PROCESS_DETACH) {
+ } else if (fdwReason == DLL_PROCESS_DETACH)
assert(!_CrtDumpMemoryLeaks());
- }
return TRUE;
}
@@ -71,8 +63,6 @@ VOID WINAPI EapPeerFreeMemory(_In_ void *pUIContextData)
g_peer.free_memory(pUIContextData);
}
-#pragma comment(linker, "/EXPORT:EapPeerFreeMemory")
-
///
/// Releases error-specific memory allocated by the EAP peer method.
@@ -84,8 +74,6 @@ VOID WINAPI EapPeerFreeErrorMemory(_In_ EAP_ERROR *ppEapError)
g_peer.free_error_memory(ppEapError);
}
-#pragma comment(linker, "/EXPORT:EapPeerFreeErrorMemory")
-
///
/// Obtains a set of function pointers for an implementation of the EAP peer method currently loaded on the EAPHost service.
@@ -100,144 +88,16 @@ DWORD WINAPI EapPeerGetInfo(_In_ EAP_TYPE* pEapType, _Out_ EAP_PEER_METHOD_ROUTI
#endif
// Parameter check
- if (!ppEapError) {
+ if (!ppEapError)
dwResult = ERROR_INVALID_PARAMETER;
- } else if (!pEapType) {
+ else if (!pEapType)
*ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pEapType is NULL."), NULL);
- } else if (pEapType->type != EAPMETHOD_TYPE) {
+ else if (pEapType->type != EAPMETHOD_TYPE)
*ppEapError = g_peer.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, winstd::wstring_printf(_T(__FUNCTION__) _T(" Input EAP type (%d) does not match the supported EAP type (%d)."), (int)pEapType->type, (int)EAPMETHOD_TYPE).c_str(), NULL);
- } else if (!pEapPeerMethodRoutines) {
+ else if (!pEapPeerMethodRoutines)
*ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pEapPeerMethodRoutines is NULL."), NULL);
- } else
+ else
g_peer.get_info(pEapPeerMethodRoutines);
return dwResult;
}
-
-#pragma comment(linker, "/EXPORT:EapPeerGetInfo")
-
-
-///
-/// Raises the EAP method's specific connection configuration user interface dialog on the client.
-///
-/// \sa [EapPeerInvokeConfigUI function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363614.aspx)
-///
-DWORD WINAPI EapPeerInvokeConfigUI(_In_ EAP_METHOD_TYPE *pEapType, _In_ HWND hwndParent, _In_ DWORD dwFlags, _In_ DWORD dwSizeOfConnectionDataIn, _In_ BYTE *pConnectionDataIn, _Out_ DWORD *pdwSizeOfConnectionDataOut, _Out_ BYTE **ppConnectionDataOut, _Out_ EAP_ERROR **ppEapError)
-{
- DWORD dwResult = NO_ERROR;
-
-#ifdef _DEBUG
- //MessageBox(NULL, _T("Attach debugger!"), _T(__FUNCTION__), MB_OK);
-#endif
-
- // Parameter check
- if (!ppEapError) {
- dwResult = ERROR_INVALID_PARAMETER;
- } else if (!pEapType) {
- *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pEapType is NULL."), NULL);
- } else if (pEapType->eapType.type != EAPMETHOD_TYPE) {
- *ppEapError = g_peer.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, winstd::wstring_printf(_T(__FUNCTION__) _T(" Input EAP type (%d) does not match the supported EAP type (%d)."), (int)pEapType->eapType.type, (int)EAPMETHOD_TYPE).c_str(), NULL);
- } else if (pEapType->dwAuthorId != 67532) {
- *ppEapError = g_peer.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, winstd::wstring_printf(_T(__FUNCTION__) _T(" EAP author (%d) does not match the supported author (%d)."), (int)pEapType->dwAuthorId, (int)67532).c_str(), NULL);
- } else if (!pdwSizeOfConnectionDataOut) {
- *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pdwSizeOfConnectionDataOut is NULL."), NULL);
- } else if (!ppConnectionDataOut) {
- *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" ppConnectionDataOut is NULL."), NULL);
- } else {
- UNREFERENCED_PARAMETER(dwFlags);
- UNREFERENCED_PARAMETER(dwSizeOfConnectionDataIn);
- UNREFERENCED_PARAMETER(pConnectionDataIn);
-
- InitCommonControls();
- MessageBox(hwndParent, _T(PRODUCT_NAME_STR) _T(" configuration goes here!"), _T(PRODUCT_NAME_STR) _T(" Settings"), MB_OK);
- }
-
- return dwResult;
-}
-
-#pragma comment(linker, "/EXPORT:EapPeerInvokeConfigUI")
-
-
-///
-/// Raises a custom interactive user interface dialog to obtain user identity information for the EAP method on the client.
-///
-/// \sa [EapPeerInvokeIdentityUI function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363615.aspx)
-///
-DWORD WINAPI EapPeerInvokeIdentityUI(_In_ EAP_METHOD_TYPE *pEapType, _In_ DWORD dwFlags, _In_ HWND hwndParent, _In_ DWORD dwSizeOfConnectionData, _In_ const BYTE *pConnectionData, _Out_ DWORD dwSizeOfUserData, _In_ const BYTE *pUserData, _Out_ DWORD *pdwSizeOfUserDataOut, _Out_ BYTE **ppUserDataOut, _Out_ LPWSTR *ppwszIdentity, _Out_ EAP_ERROR **ppEapError)
-{
- DWORD dwResult = NO_ERROR;
-
-#ifdef _DEBUG
- //MessageBox(NULL, _T("Attach debugger!"), _T(__FUNCTION__), MB_OK);
-#endif
-
- // Parameter check
- if (!ppEapError) {
- dwResult = ERROR_INVALID_PARAMETER;
- } else if (!pEapType) {
- *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pEapType is NULL."), NULL);
- } else if (pEapType->eapType.type != EAPMETHOD_TYPE) {
- *ppEapError = g_peer.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, winstd::wstring_printf(_T(__FUNCTION__) _T(" Input EAP type (%d) does not match the supported EAP type (%d)."), (int)pEapType->eapType.type, (int)EAPMETHOD_TYPE).c_str(), NULL);
- } else if (pEapType->dwAuthorId != 67532) {
- *ppEapError = g_peer.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, winstd::wstring_printf(_T(__FUNCTION__) _T(" EAP author (%d) does not match the supported author (%d)."), (int)pEapType->dwAuthorId, (int)67532).c_str(), NULL);
- } else if (!pdwSizeOfUserDataOut) {
- *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pdwSizeOfUserDataOut is NULL."), NULL);
- } else if (!ppUserDataOut) {
- *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" ppUserDataOut is NULL."), NULL);
- } else if (!ppwszIdentity) {
- *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" ppwszIdentity is NULL."), NULL);
- } else {
- UNREFERENCED_PARAMETER(dwFlags);
- UNREFERENCED_PARAMETER(pUserData);
- UNREFERENCED_PARAMETER(dwSizeOfUserData);
- UNREFERENCED_PARAMETER(pConnectionData);
- UNREFERENCED_PARAMETER(dwSizeOfConnectionData);
-
- InitCommonControls();
- MessageBox(hwndParent, _T(PRODUCT_NAME_STR) _T(" credential prompt goes here!"), _T(PRODUCT_NAME_STR) _T(" Credentials"), MB_OK);
- }
-
- return dwResult;
-}
-
-#pragma comment(linker, "/EXPORT:EapPeerInvokeIdentityUI")
-
-
-///
-/// Raises a custom interactive user interface dialog for the EAP method on the client.
-///
-/// \sa [EapPeerInvokeInteractiveUI function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363616.aspx)
-///
-DWORD WINAPI EapPeerInvokeInteractiveUI(_In_ EAP_METHOD_TYPE *pEapType, _In_ HWND hwndParent, _In_ DWORD dwSizeofUIContextData, _In_ BYTE *pUIContextData, _Out_ DWORD *pdwSizeOfDataFromInteractiveUI, _Out_ BYTE **ppDataFromInteractiveUI, _Out_ EAP_ERROR **ppEapError)
-{
- DWORD dwResult = NO_ERROR;
-
-#ifdef _DEBUG
- //MessageBox(NULL, _T("Attach debugger!"), _T(__FUNCTION__), MB_OK);
-#endif
-
- // Parameter check
- if (!ppEapError) {
- dwResult = ERROR_INVALID_PARAMETER;
- } else if (!pEapType) {
- *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pEapType is NULL."), NULL);
- } else if (pEapType->eapType.type != EAPMETHOD_TYPE) {
- *ppEapError = g_peer.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, winstd::wstring_printf(_T(__FUNCTION__) _T(" Input EAP type (%d) does not match the supported EAP type (%d)."), (int)pEapType->eapType.type, (int)EAPMETHOD_TYPE).c_str(), NULL);
- } else if (pEapType->dwAuthorId != 67532) {
- *ppEapError = g_peer.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, winstd::wstring_printf(_T(__FUNCTION__) _T(" EAP author (%d) does not match the supported author (%d)."), (int)pEapType->dwAuthorId, (int)67532).c_str(), NULL);
- } else if (!pdwSizeOfDataFromInteractiveUI) {
- *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pdwSizeOfDataFromInteractiveUI is NULL."), NULL);
- } else if (!ppDataFromInteractiveUI) {
- *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" ppDataFromInteractiveUI is NULL."), NULL);
- } else {
- UNREFERENCED_PARAMETER(dwSizeofUIContextData);
- UNREFERENCED_PARAMETER(pUIContextData);
-
- InitCommonControls();
- MessageBox(hwndParent, _T(PRODUCT_NAME_STR) _T(" interactive UI goes here!"), _T(PRODUCT_NAME_STR) _T(" Prompt"), MB_OK);
- }
-
- return dwResult;
-}
-
-#pragma comment(linker, "/EXPORT:EapPeerInvokeInteractiveUI")
diff --git a/EAPMethods/src/MainUI.cpp b/EAPMethods/src/MainUI.cpp
new file mode 100644
index 0000000..abf9494
--- /dev/null
+++ b/EAPMethods/src/MainUI.cpp
@@ -0,0 +1,225 @@
+/*
+ Copyright 2015-2016 Amebis
+ Copyright 2016 GÉANT
+
+ This file is part of GEANTLink.
+
+ GEANTLink is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ GEANTLink is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GEANTLink. If not, see .
+*/
+
+#include
+
+
+#if EAPMETHOD_TYPE==21
+#define _EAPMETHOD_PEER_UI eap::peer_ttls_ui
+#else
+#error Unknown EAP Method type.
+#endif
+
+_EAPMETHOD_PEER_UI g_peer;
+
+
+///
+/// DLL main entry point
+///
+/// \sa [DllMain entry point](https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583.aspx)
+///
+BOOL WINAPI DllMain(_In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason, _In_ LPVOID lpvReserved)
+{
+ UNREFERENCED_PARAMETER(hinstDLL);
+ UNREFERENCED_PARAMETER(lpvReserved);
+
+ if (fdwReason == DLL_PROCESS_ATTACH) {
+#ifdef _DEBUG
+ //MessageBox(NULL, _T("Attach debugger!"), _T(__FUNCTION__), MB_OK);
+#endif
+ if (g_peer.create() != ERROR_SUCCESS)
+ return FALSE;
+ } else if (fdwReason == DLL_PROCESS_DETACH)
+ assert(!_CrtDumpMemoryLeaks());
+
+ return TRUE;
+}
+
+
+///
+/// Releases all memory associated with an opaque user interface context data buffer.
+///
+/// \sa [EapPeerFreeMemory function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363606.aspx)
+///
+VOID WINAPI EapPeerFreeMemory(_In_ void *pUIContextData)
+{
+ g_peer.free_memory(pUIContextData);
+}
+
+
+///
+/// Releases error-specific memory allocated by the EAP peer method.
+///
+/// \sa [EapPeerFreeErrorMemory function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363605.aspx)
+///
+VOID WINAPI EapPeerFreeErrorMemory(_In_ EAP_ERROR *ppEapError)
+{
+ g_peer.free_error_memory(ppEapError);
+}
+
+
+///
+/// Raises the EAP method's specific connection configuration user interface dialog on the client.
+///
+/// \sa [EapPeerInvokeConfigUI function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363614.aspx)
+///
+DWORD WINAPI EapPeerInvokeConfigUI(
+ _In_ /*const*/ EAP_METHOD_TYPE *pEapType,
+ _In_ HWND hwndParent,
+ _In_ DWORD dwFlags,
+ _In_ DWORD dwSizeOfConnectionDataIn,
+ _In_count_(dwSizeOfConnectionDataIn) /*const*/ BYTE *pConnectionDataIn,
+ _Out_ DWORD *pdwSizeOfConnectionDataOut,
+ _Out_ BYTE **ppConnectionDataOut,
+ _Out_ EAP_ERROR **ppEapError)
+{
+ DWORD dwResult = NO_ERROR;
+#ifdef _DEBUG
+ //MessageBox(NULL, _T("Attach debugger!"), _T(__FUNCTION__), MB_OK);
+#endif
+
+ // Parameter check
+ if (!ppEapError)
+ dwResult = ERROR_INVALID_PARAMETER;
+ else if (!pEapType)
+ *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pEapType is NULL."), NULL);
+ else if (pEapType->eapType.type != EAPMETHOD_TYPE)
+ *ppEapError = g_peer.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, winstd::wstring_printf(_T(__FUNCTION__) _T(" Input EAP type (%d) does not match the supported EAP type (%d)."), (int)pEapType->eapType.type, (int)EAPMETHOD_TYPE).c_str(), NULL);
+ else if (pEapType->dwAuthorId != 67532)
+ *ppEapError = g_peer.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, winstd::wstring_printf(_T(__FUNCTION__) _T(" EAP author (%d) does not match the supported author (%d)."), (int)pEapType->dwAuthorId, (int)67532).c_str(), NULL);
+ else if (!pdwSizeOfConnectionDataOut)
+ *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pdwSizeOfConnectionDataOut is NULL."), NULL);
+ else if (!ppConnectionDataOut)
+ *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" ppConnectionDataOut is NULL."), NULL);
+ else
+ dwResult = g_peer.invoke_config_ui(
+ pEapType,
+ hwndParent,
+ dwFlags,
+ dwSizeOfConnectionDataIn,
+ pConnectionDataIn,
+ pdwSizeOfConnectionDataOut,
+ ppConnectionDataOut,
+ ppEapError);
+
+ return dwResult;
+}
+
+
+///
+/// Raises a custom interactive user interface dialog to obtain user identity information for the EAP method on the client.
+///
+/// \sa [EapPeerInvokeIdentityUI function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363615.aspx)
+///
+DWORD WINAPI EapPeerInvokeIdentityUI(
+ _In_ /*const*/ EAP_METHOD_TYPE *pEapType,
+ _In_ DWORD dwFlags,
+ _In_ HWND hwndParent,
+ _In_ DWORD dwSizeOfConnectionData,
+ _In_count_(dwSizeOfConnectionData) const BYTE *pConnectionData,
+ _In_ DWORD dwSizeOfUserData,
+ _In_count_(dwSizeOfUserData) const BYTE *pUserData,
+ _Out_ DWORD *pdwSizeOfUserDataOut,
+ _Out_ BYTE **ppUserDataOut,
+ _Out_ LPWSTR *ppwszIdentity,
+ _Out_ EAP_ERROR **ppEapError)
+{
+ DWORD dwResult = NO_ERROR;
+#ifdef _DEBUG
+ //MessageBox(NULL, _T("Attach debugger!"), _T(__FUNCTION__), MB_OK);
+#endif
+
+ // Parameter check
+ if (!ppEapError)
+ dwResult = ERROR_INVALID_PARAMETER;
+ else if (!pEapType)
+ *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pEapType is NULL."), NULL);
+ else if (pEapType->eapType.type != EAPMETHOD_TYPE)
+ *ppEapError = g_peer.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, winstd::wstring_printf(_T(__FUNCTION__) _T(" Input EAP type (%d) does not match the supported EAP type (%d)."), (int)pEapType->eapType.type, (int)EAPMETHOD_TYPE).c_str(), NULL);
+ else if (pEapType->dwAuthorId != 67532)
+ *ppEapError = g_peer.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, winstd::wstring_printf(_T(__FUNCTION__) _T(" EAP author (%d) does not match the supported author (%d)."), (int)pEapType->dwAuthorId, (int)67532).c_str(), NULL);
+ else if (!pdwSizeOfUserDataOut)
+ *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pdwSizeOfUserDataOut is NULL."), NULL);
+ else if (!ppUserDataOut)
+ *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" ppUserDataOut is NULL."), NULL);
+ else if (!ppwszIdentity)
+ *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" ppwszIdentity is NULL."), NULL);
+ else
+ dwResult = g_peer.invoke_identity_ui(
+ pEapType,
+ dwFlags,
+ hwndParent,
+ dwSizeOfConnectionData,
+ pConnectionData,
+ dwSizeOfUserData,
+ pUserData,
+ pdwSizeOfUserDataOut,
+ ppUserDataOut,
+ ppwszIdentity,
+ ppEapError);
+
+ return dwResult;
+}
+
+
+///
+/// Raises a custom interactive user interface dialog for the EAP method on the client.
+///
+/// \sa [EapPeerInvokeInteractiveUI function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363616.aspx)
+///
+DWORD WINAPI EapPeerInvokeInteractiveUI(
+ _In_ /*const*/ EAP_METHOD_TYPE *pEapType,
+ _In_ HWND hwndParent,
+ _In_ DWORD dwSizeofUIContextData,
+ _In_count_(dwSizeofUIContextData) /*const*/ BYTE *pUIContextData,
+ _Out_ DWORD *pdwSizeOfDataFromInteractiveUI,
+ _Out_ BYTE **ppDataFromInteractiveUI,
+ _Out_ EAP_ERROR **ppEapError)
+{
+ DWORD dwResult = NO_ERROR;
+#ifdef _DEBUG
+ //MessageBox(NULL, _T("Attach debugger!"), _T(__FUNCTION__), MB_OK);
+#endif
+
+ // Parameter check
+ if (!ppEapError)
+ dwResult = ERROR_INVALID_PARAMETER;
+ else if (!pEapType)
+ *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pEapType is NULL."), NULL);
+ else if (pEapType->eapType.type != EAPMETHOD_TYPE)
+ *ppEapError = g_peer.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, winstd::wstring_printf(_T(__FUNCTION__) _T(" Input EAP type (%d) does not match the supported EAP type (%d)."), (int)pEapType->eapType.type, (int)EAPMETHOD_TYPE).c_str(), NULL);
+ else if (pEapType->dwAuthorId != 67532)
+ *ppEapError = g_peer.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, winstd::wstring_printf(_T(__FUNCTION__) _T(" EAP author (%d) does not match the supported author (%d)."), (int)pEapType->dwAuthorId, (int)67532).c_str(), NULL);
+ else if (!pdwSizeOfDataFromInteractiveUI)
+ *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pdwSizeOfDataFromInteractiveUI is NULL."), NULL);
+ else if (!ppDataFromInteractiveUI)
+ *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" ppDataFromInteractiveUI is NULL."), NULL);
+ else
+ dwResult = g_peer.invoke_interactive_ui(
+ pEapType,
+ hwndParent,
+ dwSizeofUIContextData,
+ pUIContextData,
+ pdwSizeOfDataFromInteractiveUI,
+ ppDataFromInteractiveUI,
+ ppEapError);
+
+ return dwResult;
+}
diff --git a/Makefile b/Makefile
index 5fdbde6..d4b6e9e 100644
--- a/Makefile
+++ b/Makefile
@@ -188,6 +188,9 @@ RegisterDLLs :: \
"$(OUTPUT_DIR)\$(PLAT).Debug\EAPTTLS.dll"
reg.exe add "HKLM\SYSTEM\CurrentControlSet\services\EapHost\Methods\67532" /ve /t REG_SZ /d "$(PRODUCT_NAME)" /f > NUL
reg.exe add "HKLM\SYSTEM\CurrentControlSet\services\EapHost\Methods\67532\21" /v "PeerDllPath" /t REG_SZ /d "$(MAKEDIR)\$(OUTPUT_DIR)\$(PLAT).Debug\EAPTTLS.dll" /f > NUL
+ reg.exe add "HKLM\SYSTEM\CurrentControlSet\services\EapHost\Methods\67532\21" /v "PeerConfigUIPath" /t REG_SZ /d "$(MAKEDIR)\$(OUTPUT_DIR)\$(PLAT).Debug\EAPTTLSUI.dll" /f > NUL
+ reg.exe add "HKLM\SYSTEM\CurrentControlSet\services\EapHost\Methods\67532\21" /v "PeerIdentityPath" /t REG_SZ /d "$(MAKEDIR)\$(OUTPUT_DIR)\$(PLAT).Debug\EAPTTLSUI.dll" /f > NUL
+ reg.exe add "HKLM\SYSTEM\CurrentControlSet\services\EapHost\Methods\67532\21" /v "PeerInteractiveUIPath" /t REG_SZ /d "$(MAKEDIR)\$(OUTPUT_DIR)\$(PLAT).Debug\EAPTTLSUI.dll" /f > NUL
reg.exe add "HKLM\SYSTEM\CurrentControlSet\services\EapHost\Methods\67532\21" /v "PeerFriendlyName" /t REG_SZ /d "@$(MAKEDIR)\$(OUTPUT_DIR)\$(PLAT).Debug\EAPTTLS.dll,-1" /f > NUL
reg.exe add "HKLM\SYSTEM\CurrentControlSet\services\EapHost\Methods\67532\21" /v "PeerInvokePasswordDialog" /t REG_DWORD /d 0 /f > NUL
reg.exe add "HKLM\SYSTEM\CurrentControlSet\services\EapHost\Methods\67532\21" /v "PeerInvokeUsernameDialog" /t REG_DWORD /d 0 /f > NUL
diff --git a/VS10Solution.sln b/VS10Solution.sln
index 7efe58f..29e8efe 100644
--- a/VS10Solution.sln
+++ b/VS10Solution.sln
@@ -20,6 +20,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CredWrite", "CredWrite\Cred
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EAPMethodEvents", "EAPMethods\build\EAPMethodEvents.vcxproj", "{D63F24BD-92A0-4D6B-8B69-ED947E4D2B1B}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EAPTTLSUI", "EAPMethods\build\EAPTTLSUI.vcxproj", "{DD7A97CA-F18E-43B7-95C4-D06E6A291624}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
@@ -60,6 +62,14 @@ Global
{D63F24BD-92A0-4D6B-8B69-ED947E4D2B1B}.Release|Win32.Build.0 = Release|Win32
{D63F24BD-92A0-4D6B-8B69-ED947E4D2B1B}.Release|x64.ActiveCfg = Release|x64
{D63F24BD-92A0-4D6B-8B69-ED947E4D2B1B}.Release|x64.Build.0 = Release|x64
+ {DD7A97CA-F18E-43B7-95C4-D06E6A291624}.Debug|Win32.ActiveCfg = Debug|Win32
+ {DD7A97CA-F18E-43B7-95C4-D06E6A291624}.Debug|Win32.Build.0 = Debug|Win32
+ {DD7A97CA-F18E-43B7-95C4-D06E6A291624}.Debug|x64.ActiveCfg = Debug|x64
+ {DD7A97CA-F18E-43B7-95C4-D06E6A291624}.Debug|x64.Build.0 = Debug|x64
+ {DD7A97CA-F18E-43B7-95C4-D06E6A291624}.Release|Win32.ActiveCfg = Release|Win32
+ {DD7A97CA-F18E-43B7-95C4-D06E6A291624}.Release|Win32.Build.0 = Release|Win32
+ {DD7A97CA-F18E-43B7-95C4-D06E6A291624}.Release|x64.ActiveCfg = Release|x64
+ {DD7A97CA-F18E-43B7-95C4-D06E6A291624}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -67,6 +77,7 @@ Global
GlobalSection(NestedProjects) = preSolution
{331B6077-E3E2-4867-B93E-9D3F57280DE7} = {60BAAC3D-DC98-4C19-BC40-1A86963DE86C}
{D63F24BD-92A0-4D6B-8B69-ED947E4D2B1B} = {60BAAC3D-DC98-4C19-BC40-1A86963DE86C}
+ {DD7A97CA-F18E-43B7-95C4-D06E6A291624} = {60BAAC3D-DC98-4C19-BC40-1A86963DE86C}
{47399D91-7EB9-41DE-B521-514BA5DB0C43} = {E66A3FE1-4EE4-401F-8EAD-BE518B230393}
{2D3CE079-7EB1-4F47-B79E-F0310671ECCB} = {7B5EC9B7-208C-426A-941D-DAF9271BD4A4}
EndGlobalSection