Changeset 46593 in vbox for trunk/src/VBox/Devices
- Timestamp:
- Jun 17, 2013 2:32:51 PM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 86471
- 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 57 57 #include "ip_icmp.h" 58 58 #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> 61 62 #endif 62 63 … … 116 117 fd_nonblock(pData->icmp_socket.s); 117 118 NSOCK_INC(); 119 118 120 #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)) 129 126 { 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); 131 133 } 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 } 134 148 if (pData->pfIcmpParseReplies == NULL) 135 149 { 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 {151 150 LogRel(("NAT: Can't find IcmpParseReplies symbol\n")); 152 FreeLibrary(pData->hmIcmpLibrary);153 151 return 1; 154 152 } … … 156 154 { 157 155 LogRel(("NAT: Can't find IcmpCloseHandle symbol\n")); 158 FreeLibrary(pData->hmIcmpLibrary);159 156 return 1; 160 157 } 158 161 159 pData->icmp_socket.sh = IcmpCreateFile(); 162 160 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); 165 163 #endif /* RT_OS_WINDOWS */ 164 166 165 LIST_INIT(&pData->icmp_msg_head); 167 166 return 0; … … 177 176 #ifdef RT_OS_WINDOWS 178 177 pData->pfIcmpCloseHandle(pData->icmp_socket.sh); 179 FreeLibrary(pData->hmIcmpLibrary);180 178 RTMemFree(pData->pvIcmpBuffer); 181 179 #else … … 529 527 &ipopt /*=RequestOptions*/, 530 528 pData->pvIcmpBuffer /*=ReplyBuffer*/, 531 pData-> szIcmpBuffer /*=ReplySize*/,529 pData->cbIcmpBuffer /*=ReplySize*/, 532 530 1 /*=Timeout in ms*/); 533 531 error = GetLastError(); … … 710 708 { 711 709 /* DEBUG : append message to ICMP packet */ 712 int message_len;710 size_t message_len; 713 711 message_len = strlen(message); 714 712 if (message_len > ICMP_MAXDATALEN) 715 713 message_len = ICMP_MAXDATALEN; 716 m_append(pData, m, message_len, message);714 m_append(pData, m, (int)message_len, message); 717 715 } 718 716 #else -
trunk/src/VBox/Devices/Network/slirp/slirp_state.h
r41987 r46593 202 202 # ifdef RT_OS_WINDOWS 203 203 void *pvIcmpBuffer; 204 size_t szIcmpBuffer;205 /* Accordin MSDN specification IcmpParseReplies206 * function should be detected in runtime204 uint32_t cbIcmpBuffer; 205 /* According MSDN specification IcmpParseReplies 206 * function should be detected at runtime. 207 207 */ 208 208 long (WINAPI * pfIcmpParseReplies)(void *, long); 209 209 BOOL (WINAPI * pfIcmpCloseHandle)(HANDLE); 210 HMODULE hmIcmpLibrary;211 210 # endif 212 211 #if defined(RT_OS_WINDOWS) -
trunk/src/VBox/Devices/Network/slirp/socket.c
r45261 r46593 1479 1479 int size; 1480 1480 1481 len = pData->pfIcmpParseReplies(pData->pvIcmpBuffer, pData-> szIcmpBuffer);1481 len = pData->pfIcmpParseReplies(pData->pvIcmpBuffer, pData->cbIcmpBuffer); 1482 1482 if (len < 0) 1483 1483 {
Note:
See TracChangeset
for help on using the changeset viewer.