VirtualBox

Changeset 46593 in vbox for trunk/src/VBox/Devices


Ignore:
Timestamp:
Jun 17, 2013 2:32:51 PM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
86471
Message:

updates

Location:
trunk/src/VBox/Devices/Network/slirp
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Network/slirp/ip_icmp.c

    r44528 r46593  
    5757#include "ip_icmp.h"
    5858#ifdef RT_OS_WINDOWS
    59 #include <Icmpapi.h>
    60 #include <Iphlpapi.h>
     59# include <Icmpapi.h>
     60# include <Iphlpapi.h>
     61# include <iprt/ldr.h>
    6162#endif
    6263
     
    116117    fd_nonblock(pData->icmp_socket.s);
    117118    NSOCK_INC();
     119
    118120#else /* RT_OS_WINDOWS */
    119     pData->hmIcmpLibrary = LoadLibrary("Iphlpapi.dll");
    120     if (pData->hmIcmpLibrary != NULL)
    121     {
    122         pData->pfIcmpParseReplies = (long (WINAPI *)(void *, long))
    123                                     GetProcAddress(pData->hmIcmpLibrary, "IcmpParseReplies");
    124         pData->pfIcmpCloseHandle = (BOOL (WINAPI *)(HANDLE))
    125                                     GetProcAddress(pData->hmIcmpLibrary, "IcmpCloseHandle");
    126         pData->pfGetAdaptersAddresses = (ULONG (WINAPI *)(ULONG, ULONG, PVOID, PIP_ADAPTER_ADDRESSES, PULONG))
    127                                     GetProcAddress(pData->hmIcmpLibrary, "GetAdaptersAddresses");
    128         if (pData->pfGetAdaptersAddresses == NULL)
     121    /* Resolve symbols we need. */
     122    {
     123        RTLDRMOD hLdrMod;
     124        int rc = RTLdrLoadSystem("Iphlpapi.dll", true /*fNoUnload*/, &hLdrMod);
     125        if (RT_SUCCESS(rc))
    129126        {
    130             LogRel(("NAT: Can't find GetAdapterAddresses in Iphlpapi.dll\n"));
     127            pData->pfIcmpParseReplies = (long (WINAPI *)(void *, long))RTLdrGetFunction(hLdrMod, "IcmpParseReplies");
     128            pData->pfIcmpCloseHandle = (BOOL (WINAPI *)(HANDLE))RTLdrGetFunction(hLdrMod, "IcmpCloseHandle");
     129            rc = RTLdrGetSymbol(hLdrMod, "GetAdaptersAddresses", (void **)&pData->pfGetAdaptersAddresses);
     130            if (RT_FAILURE(rc))
     131                LogRel(("NAT: Can't find GetAdapterAddresses in Iphlpapi.dll\n"));
     132            RTLdrClose(hLdrMod);
    131133        }
    132     }
    133 
     134
     135        if (pData->pfIcmpParseReplies == NULL)
     136        {
     137            int rc = RTLdrLoadSystem("Icmp.dll", true /*fNoUnload*/, &hLdrMod);
     138            if (RT_FAILURE(rc))
     139            {
     140                LogRel(("NAT: Icmp.dll could not be loaded: %Rrc\n", rc));
     141                return 1;
     142            }
     143            pData->pfIcmpParseReplies = (long (WINAPI *)(void *, long))RTLdrGetFunction(hLdrMod, "IcmpParseReplies");
     144            pData->pfIcmpCloseHandle = (BOOL (WINAPI *)(HANDLE))RTLdrGetFunction(hLdrMod, "IcmpCloseHandle");
     145            RTLdrClose(hLdrMod);
     146        }
     147    }
    134148    if (pData->pfIcmpParseReplies == NULL)
    135149    {
    136         if(pData->pfGetAdaptersAddresses == NULL)
    137             FreeLibrary(pData->hmIcmpLibrary);
    138         pData->hmIcmpLibrary = LoadLibrary("Icmp.dll");
    139         if (pData->hmIcmpLibrary == NULL)
    140         {
    141             LogRel(("NAT: Icmp.dll could not be loaded\n"));
    142             return 1;
    143         }
    144         pData->pfIcmpParseReplies = (long (WINAPI *)(void *, long))
    145                                     GetProcAddress(pData->hmIcmpLibrary, "IcmpParseReplies");
    146         pData->pfIcmpCloseHandle = (BOOL (WINAPI *)(HANDLE))
    147                                     GetProcAddress(pData->hmIcmpLibrary, "IcmpCloseHandle");
    148     }
    149     if (pData->pfIcmpParseReplies == NULL)
    150     {
    151150        LogRel(("NAT: Can't find IcmpParseReplies symbol\n"));
    152         FreeLibrary(pData->hmIcmpLibrary);
    153151        return 1;
    154152    }
     
    156154    {
    157155        LogRel(("NAT: Can't find IcmpCloseHandle symbol\n"));
    158         FreeLibrary(pData->hmIcmpLibrary);
    159156        return 1;
    160157    }
     158
    161159    pData->icmp_socket.sh = IcmpCreateFile();
    162160    pData->phEvents[VBOX_ICMP_EVENT_INDEX] = CreateEvent(NULL, FALSE, FALSE, NULL);
    163     pData->szIcmpBuffer = sizeof(ICMP_ECHO_REPLY) * 10;
    164     pData->pvIcmpBuffer = RTMemAlloc(pData->szIcmpBuffer);
     161    pData->cbIcmpBuffer = sizeof(ICMP_ECHO_REPLY) * 10;
     162    pData->pvIcmpBuffer = RTMemAlloc(pData->cbIcmpBuffer);
    165163#endif /* RT_OS_WINDOWS */
     164
    166165    LIST_INIT(&pData->icmp_msg_head);
    167166    return 0;
     
    177176#ifdef RT_OS_WINDOWS
    178177    pData->pfIcmpCloseHandle(pData->icmp_socket.sh);
    179     FreeLibrary(pData->hmIcmpLibrary);
    180178    RTMemFree(pData->pvIcmpBuffer);
    181179#else
     
    529527                                       &ipopt /*=RequestOptions*/,
    530528                                       pData->pvIcmpBuffer /*=ReplyBuffer*/,
    531                                        pData->szIcmpBuffer /*=ReplySize*/,
     529                                       pData->cbIcmpBuffer /*=ReplySize*/,
    532530                                       1 /*=Timeout in ms*/);
    533531                error = GetLastError();
     
    710708    {
    711709        /* DEBUG : append message to ICMP packet */
    712         int message_len;
     710        size_t message_len;
    713711        message_len = strlen(message);
    714712        if (message_len > ICMP_MAXDATALEN)
    715713            message_len = ICMP_MAXDATALEN;
    716         m_append(pData, m, message_len, message);
     714        m_append(pData, m, (int)message_len, message);
    717715    }
    718716#else
  • trunk/src/VBox/Devices/Network/slirp/slirp_state.h

    r41987 r46593  
    202202# ifdef RT_OS_WINDOWS
    203203    void *pvIcmpBuffer;
    204     size_t szIcmpBuffer;
    205     /* Accordin MSDN specification IcmpParseReplies
    206      * function should be detected in runtime
     204    uint32_t cbIcmpBuffer;
     205    /* According MSDN specification IcmpParseReplies
     206     * function should be detected at runtime.
    207207     */
    208208    long (WINAPI * pfIcmpParseReplies)(void *, long);
    209209    BOOL (WINAPI * pfIcmpCloseHandle)(HANDLE);
    210     HMODULE hmIcmpLibrary;
    211210# endif
    212211#if defined(RT_OS_WINDOWS)
  • trunk/src/VBox/Devices/Network/slirp/socket.c

    r45261 r46593  
    14791479    int size;
    14801480
    1481     len = pData->pfIcmpParseReplies(pData->pvIcmpBuffer, pData->szIcmpBuffer);
     1481    len = pData->pfIcmpParseReplies(pData->pvIcmpBuffer, pData->cbIcmpBuffer);
    14821482    if (len < 0)
    14831483    {
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette