From cab59c73fc616c23bf510dd875363da08ce1850c Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Thu, 5 Jun 2014 13:10:43 +0200 Subject: [PATCH] windows: Use WINAPI call convention for Windows API callbacks For x86_64 it does not actually matter, but for i686 builds the call convention is different with WINAPI. --- src/charon-svc/charon-svc.c | 12 ++++++------ src/libcharon/plugins/kernel_iph/kernel_iph_net.c | 9 ++++++--- src/libcharon/plugins/kernel_wfp/kernel_wfp_ipsec.c | 6 +++--- src/libcharon/plugins/socket_win/socket_win_socket.c | 8 ++++---- src/libstrongswan/tests/test_suite.c | 4 ++-- src/libstrongswan/threading/windows/thread.c | 6 ++++-- src/libstrongswan/utils/utils.c | 2 +- src/libstrongswan/utils/windows.h | 4 ++-- 8 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/charon-svc/charon-svc.c b/src/charon-svc/charon-svc.c index ff5d5de49..03cbdb871 100644 --- a/src/charon-svc/charon-svc.c +++ b/src/charon-svc/charon-svc.c @@ -48,8 +48,8 @@ extern void (*dbg) (debug_t group, level_t level, char *fmt, ...); /** * Forward declaration */ -static DWORD service_handler(DWORD dwControl, DWORD dwEventType, - LPVOID lpEventData, LPVOID lpContext); +static DWORD WINAPI service_handler(DWORD dwControl, DWORD dwEventType, + LPVOID lpEventData, LPVOID lpContext); /** * Logging hook for library logs, using stderr output @@ -111,7 +111,7 @@ static void update_status(DWORD state) /** * Control handler for console */ -static BOOL console_handler(DWORD dwCtrlType) +static BOOL WINAPI console_handler(DWORD dwCtrlType) { switch (dwCtrlType) { @@ -135,8 +135,8 @@ static BOOL console_handler(DWORD dwCtrlType) /** * Service handler function */ -static DWORD service_handler(DWORD dwControl, DWORD dwEventType, - LPVOID lpEventData, LPVOID lpContext) +static DWORD WINAPI service_handler(DWORD dwControl, DWORD dwEventType, + LPVOID lpEventData, LPVOID lpContext) { switch (dwControl) { @@ -285,7 +285,7 @@ static bool switch_workingdir() /** * Service main routine when running as service */ -static void service_main(DWORD dwArgc, LPTSTR *lpszArgv) +static void WINAPI service_main(DWORD dwArgc, LPTSTR *lpszArgv) { memset(&status, 0, sizeof(status)); status.dwServiceType = SERVICE_WIN32_OWN_PROCESS; diff --git a/src/libcharon/plugins/kernel_iph/kernel_iph_net.c b/src/libcharon/plugins/kernel_iph/kernel_iph_net.c index 68b753792..871067b1a 100644 --- a/src/libcharon/plugins/kernel_iph/kernel_iph_net.c +++ b/src/libcharon/plugins/kernel_iph/kernel_iph_net.c @@ -355,9 +355,11 @@ typedef struct { /** * NotifyIpInterfaceChange() callback */ -static void change_interface(private_kernel_iph_net_t *this, - MIB_IPINTERFACE_ROW_FIXUP *row, MIB_NOTIFICATION_TYPE type) +static void WINAPI change_interface(void *user, PMIB_IPINTERFACE_ROW row_badal, + MIB_NOTIFICATION_TYPE type) { + private_kernel_iph_net_t *this = user; + MIB_IPINTERFACE_ROW_FIXUP* row = (MIB_IPINTERFACE_ROW_FIXUP*)row_badal; IP_ADAPTER_ADDRESSES addrs[64], *current; ULONG res, size = sizeof(addrs); @@ -757,7 +759,8 @@ kernel_iph_net_t *kernel_iph_net_create() .mutex = mutex_create(MUTEX_TYPE_DEFAULT), .ifaces = linked_list_create(), ); - + /* PIPINTERFACE_CHANGE_CALLBACK is not using WINAPI in MinGW, which seems + * to be wrong. Force a cast to our WINAPI call */ res = NotifyIpInterfaceChange(AF_UNSPEC, (void*)change_interface, this, TRUE, &this->changes); if (res != NO_ERROR) diff --git a/src/libcharon/plugins/kernel_wfp/kernel_wfp_ipsec.c b/src/libcharon/plugins/kernel_wfp/kernel_wfp_ipsec.c index 5b44f85b5..62b3ea8dd 100644 --- a/src/libcharon/plugins/kernel_wfp/kernel_wfp_ipsec.c +++ b/src/libcharon/plugins/kernel_wfp/kernel_wfp_ipsec.c @@ -1545,9 +1545,9 @@ static traffic_selector_t *addr2ts(FWP_IP_VERSION version, void *data, /** * FwpmNetEventSubscribe0() callback */ -static void event_callback(private_kernel_wfp_ipsec_t *this, - const FWPM_NET_EVENT1 *event) +static void WINAPI event_callback(void *user, const FWPM_NET_EVENT1 *event) { + private_kernel_wfp_ipsec_t *this = user; traffic_selector_t *local = NULL, *remote = NULL; u_int8_t protocol = 0; u_int16_t from_local = 0, to_local = 65535; @@ -1610,7 +1610,7 @@ static bool register_events(private_kernel_wfp_ipsec_t *this) DWORD res; res = FwpmNetEventSubscribe0(this->handle, &subscription, - (void*)event_callback, this, &this->event); + event_callback, this, &this->event); if (res != ERROR_SUCCESS) { DBG1(DBG_KNL, "registering for WFP events failed: 0x%08x", res); diff --git a/src/libcharon/plugins/socket_win/socket_win_socket.c b/src/libcharon/plugins/socket_win/socket_win_socket.c index 2cd951d8f..cf7a2ce5a 100644 --- a/src/libcharon/plugins/socket_win/socket_win_socket.c +++ b/src/libcharon/plugins/socket_win/socket_win_socket.c @@ -75,14 +75,14 @@ struct private_socket_win_socket_t { /** * WSASendMsg function */ - int (*WSASendMsg)(SOCKET, LPWSAMSG, DWORD, LPDWORD, - LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); + int WINAPI (*WSASendMsg)(SOCKET, LPWSAMSG, DWORD, LPDWORD, + LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); /** * WSARecvMsg function */ - int (*WSARecvMsg)(SOCKET, LPWSAMSG, LPDWORD, - LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); + int WINAPI (*WSARecvMsg)(SOCKET, LPWSAMSG, LPDWORD, + LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); }; METHOD(socket_t, receiver, status_t, diff --git a/src/libstrongswan/tests/test_suite.c b/src/libstrongswan/tests/test_suite.c index c80c6efd6..00ac31830 100644 --- a/src/libstrongswan/tests/test_suite.c +++ b/src/libstrongswan/tests/test_suite.c @@ -138,7 +138,7 @@ static DWORD main_thread; /** * APC routine invoked by main thread on worker failure */ -static void set_worker_failure(ULONG_PTR dwParam) +static void WINAPI set_worker_failure(ULONG_PTR dwParam) { worker_failed = TRUE; } @@ -180,7 +180,7 @@ void test_fail_if_worker_failed() /** * Vectored exception handler */ -static long eh_handler(PEXCEPTION_POINTERS ei) +static long WINAPI eh_handler(PEXCEPTION_POINTERS ei) { char *ename; bool old = FALSE; diff --git a/src/libstrongswan/threading/windows/thread.c b/src/libstrongswan/threading/windows/thread.c index 2ea0f9a7e..2b273413c 100644 --- a/src/libstrongswan/threading/windows/thread.c +++ b/src/libstrongswan/threading/windows/thread.c @@ -378,8 +378,10 @@ void thread_set_active_condvar(CONDITION_VARIABLE *condvar) /** * APC to cancel a thread */ -static void docancel(private_thread_t *this) +static void WINAPI docancel(ULONG_PTR dwParam) { + private_thread_t *this = (private_thread_t*)dwParam; + /* make sure cancel() does not access this anymore */ threads_lock->lock(threads_lock); threads_lock->unlock(threads_lock); @@ -398,7 +400,7 @@ METHOD(thread_t, cancel, void, if (!this->cancel_pending) { this->cancel_pending = TRUE; - QueueUserAPC((void*)docancel, this->handle, (uintptr_t)this); + QueueUserAPC(docancel, this->handle, (uintptr_t)this); if (this->condvar) { WakeAllConditionVariable(this->condvar); diff --git a/src/libstrongswan/utils/utils.c b/src/libstrongswan/utils/utils.c index 8ef9a1f33..02a720945 100644 --- a/src/libstrongswan/utils/utils.c +++ b/src/libstrongswan/utils/utils.c @@ -247,7 +247,7 @@ static mutex_t *sigint_mutex; /** * Control handler to catch ^C */ -static BOOL handler(DWORD dwCtrlType) +static BOOL WINAPI handler(DWORD dwCtrlType) { switch (dwCtrlType) { diff --git a/src/libstrongswan/utils/windows.h b/src/libstrongswan/utils/windows.h index b66138644..fd4338455 100644 --- a/src/libstrongswan/utils/windows.h +++ b/src/libstrongswan/utils/windows.h @@ -116,14 +116,14 @@ char* strndup(const char *s, size_t n); * Provided via ws2_32 */ #ifndef InetNtop -const char *inet_ntop(int af, const void *src, char *dst, socklen_t size); +const char WINAPI *inet_ntop(int af, const void *src, char *dst, socklen_t size); #endif /** * Provided via ws2_32 */ #ifndef InetPton -int inet_pton(int af, const char *src, void *dst); +int WINAPI inet_pton(int af, const char *src, void *dst); #endif /**