windows: Use WINAPI call convention for Windows API callbacks
authorMartin Willi <martin@revosec.ch>
Thu, 5 Jun 2014 11:10:43 +0000 (13:10 +0200)
committerMartin Willi <martin@revosec.ch>
Fri, 6 Jun 2014 14:28:28 +0000 (16:28 +0200)
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
src/libcharon/plugins/kernel_iph/kernel_iph_net.c
src/libcharon/plugins/kernel_wfp/kernel_wfp_ipsec.c
src/libcharon/plugins/socket_win/socket_win_socket.c
src/libstrongswan/tests/test_suite.c
src/libstrongswan/threading/windows/thread.c
src/libstrongswan/utils/utils.c
src/libstrongswan/utils/windows.h

index ff5d5de..03cbdb8 100644 (file)
@@ -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;
index 68b7537..871067b 100644 (file)
@@ -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)
index 5b44f85..62b3ea8 100644 (file)
@@ -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);
index 2cd951d..cf7a2ce 100644 (file)
@@ -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,
index c80c6ef..00ac318 100644 (file)
@@ -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;
index 2ea0f9a..2b27341 100644 (file)
@@ -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);
index 8ef9a1f..02a7209 100644 (file)
@@ -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)
        {
index b661386..fd43384 100644 (file)
@@ -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
 
 /**