From ce64885a66bede5896ee2d7be12efd7ab69bd51a Mon Sep 17 00:00:00 2001 From: Toad King Date: Thu, 15 May 2014 20:33:21 -0400 Subject: [PATCH 1/3] make IOCTL_SO_GETHOSTID more accurate on Windows --- .../Core/IPC_HLE/WII_IPC_HLE_Device_net.cpp | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/Source/Core/Core/IPC_HLE/WII_IPC_HLE_Device_net.cpp b/Source/Core/Core/IPC_HLE/WII_IPC_HLE_Device_net.cpp index 6204248546ed..e3d6d31811df 100644 --- a/Source/Core/Core/IPC_HLE/WII_IPC_HLE_Device_net.cpp +++ b/Source/Core/Core/IPC_HLE/WII_IPC_HLE_Device_net.cpp @@ -854,7 +854,55 @@ bool CWII_IPC_HLE_Device_net_ip_top::IOCtl(u32 _CommandAddress) INFO_LOG(WII_IPC_NET, "IOCTL_SO_GETHOSTID " "(BufferIn: (%08x, %i), BufferOut: (%08x, %i)", BufferIn, BufferInSize, BufferOut, BufferOutSize); + // default placeholder, in case of failure ReturnValue = 192 << 24 | 168 << 16 | 1 << 8 | 150; + +#ifdef _WIN32 + DWORD forwardTableSize, ipTableSize; + PMIB_IPFORWARDTABLE forwardTable = (PMIB_IPFORWARDTABLE)malloc(sizeof(MIB_IPFORWARDTABLE)); + PMIB_IPADDRTABLE ipTable = (PMIB_IPADDRTABLE)malloc(sizeof(MIB_IPADDRTABLE)); + + forwardTableSize = sizeof(MIB_IPFORWARDTABLE); + if (GetIpForwardTable(forwardTable, &forwardTableSize, 0) == ERROR_INSUFFICIENT_BUFFER) + { + free(forwardTable); + forwardTable = (PMIB_IPFORWARDTABLE)malloc(forwardTableSize); + } + + ipTableSize = sizeof(MIB_IPADDRTABLE); + if (GetIpAddrTable(ipTable, &ipTableSize, 0) == ERROR_INSUFFICIENT_BUFFER) + { + free(ipTable); + ipTable = (PMIB_IPADDRTABLE)malloc(ipTableSize); + } + + // find the interface IP used for the default route and use that + if (!GetIpForwardTable(forwardTable, &forwardTableSize, 0) && !GetIpAddrTable(ipTable, &ipTableSize, 0)) + { + for (DWORD i = 0; i < forwardTable->dwNumEntries; i++) + { + MIB_IPFORWARDROW forwardRow = forwardTable->table[i]; + if (forwardRow.dwForwardDest == 0) + { + for (DWORD j = 0; j < ipTable->dwNumEntries; j++) + { + MIB_IPADDRROW ipRow = ipTable->table[j]; + if (ipRow.dwIndex == forwardRow.dwForwardIfIndex) + { + ReturnValue = Common::swap32(ipRow.dwAddr); + break; + } + } + + break; + } + } + } + + free(forwardTable); + free(ipTable); +#endif + break; } From e7e60214147a587a6735ae3c73581a511b0b4c13 Mon Sep 17 00:00:00 2001 From: Toad King Date: Fri, 16 May 2014 19:13:52 -0400 Subject: [PATCH 2/3] changed IOCTL_SO_GETHOSTID to remove malloc()/free() calls account for GetIpForwardTable() returning ERROR_MORE_DATA --- .../Core/IPC_HLE/WII_IPC_HLE_Device_net.cpp | 61 ++++++++++--------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/Source/Core/Core/IPC_HLE/WII_IPC_HLE_Device_net.cpp b/Source/Core/Core/IPC_HLE/WII_IPC_HLE_Device_net.cpp index e3d6d31811df..20d7b00a3cf3 100644 --- a/Source/Core/Core/IPC_HLE/WII_IPC_HLE_Device_net.cpp +++ b/Source/Core/Core/IPC_HLE/WII_IPC_HLE_Device_net.cpp @@ -854,55 +854,60 @@ bool CWII_IPC_HLE_Device_net_ip_top::IOCtl(u32 _CommandAddress) INFO_LOG(WII_IPC_NET, "IOCTL_SO_GETHOSTID " "(BufferIn: (%08x, %i), BufferOut: (%08x, %i)", BufferIn, BufferInSize, BufferOut, BufferOutSize); - // default placeholder, in case of failure - ReturnValue = 192 << 24 | 168 << 16 | 1 << 8 | 150; #ifdef _WIN32 - DWORD forwardTableSize, ipTableSize; - PMIB_IPFORWARDTABLE forwardTable = (PMIB_IPFORWARDTABLE)malloc(sizeof(MIB_IPFORWARDTABLE)); - PMIB_IPADDRTABLE ipTable = (PMIB_IPADDRTABLE)malloc(sizeof(MIB_IPADDRTABLE)); + DWORD forwardTableSize, ipTableSize, result; + DWORD ifIndex = -1; + std::unique_ptr forwardTable; + std::unique_ptr ipTable; - forwardTableSize = sizeof(MIB_IPFORWARDTABLE); - if (GetIpForwardTable(forwardTable, &forwardTableSize, 0) == ERROR_INSUFFICIENT_BUFFER) + forwardTableSize = 0; + if (GetIpForwardTable(nullptr, &forwardTableSize, FALSE) == ERROR_INSUFFICIENT_BUFFER) { - free(forwardTable); - forwardTable = (PMIB_IPFORWARDTABLE)malloc(forwardTableSize); + forwardTable = std::unique_ptr((PMIB_IPFORWARDTABLE)operator new(forwardTableSize)); } - ipTableSize = sizeof(MIB_IPADDRTABLE); - if (GetIpAddrTable(ipTable, &ipTableSize, 0) == ERROR_INSUFFICIENT_BUFFER) + ipTableSize = 0; + if (GetIpAddrTable(nullptr, &ipTableSize, FALSE) == ERROR_INSUFFICIENT_BUFFER) { - free(ipTable); - ipTable = (PMIB_IPADDRTABLE)malloc(ipTableSize); + ipTable = std::unique_ptr((PMIB_IPADDRTABLE)operator new(ipTableSize)); } // find the interface IP used for the default route and use that - if (!GetIpForwardTable(forwardTable, &forwardTableSize, 0) && !GetIpAddrTable(ipTable, &ipTableSize, 0)) + result = GetIpForwardTable(forwardTable.get(), &forwardTableSize, FALSE); + while (result == NO_ERROR || result == ERROR_MORE_DATA) // can return ERROR_MORE_DATA on XP even after the first call { for (DWORD i = 0; i < forwardTable->dwNumEntries; i++) { - MIB_IPFORWARDROW forwardRow = forwardTable->table[i]; - if (forwardRow.dwForwardDest == 0) + if (forwardTable->table[i].dwForwardDest == 0) { - for (DWORD j = 0; j < ipTable->dwNumEntries; j++) - { - MIB_IPADDRROW ipRow = ipTable->table[j]; - if (ipRow.dwIndex == forwardRow.dwForwardIfIndex) - { - ReturnValue = Common::swap32(ipRow.dwAddr); - break; - } - } - + ifIndex = forwardTable->table[i].dwForwardIfIndex; break; } } + + if (result == NO_ERROR || ifIndex != -1) + break; + + result = GetIpForwardTable(forwardTable.get(), &forwardTableSize, FALSE); } - free(forwardTable); - free(ipTable); + if (ifIndex != -1 && GetIpAddrTable(ipTable.get(), &ipTableSize, FALSE) == NO_ERROR) + { + for (DWORD i = 0; i < ipTable->dwNumEntries; i++) + { + if (ipTable->table[i].dwIndex == ifIndex) + { + ReturnValue = Common::swap32(ipTable->table[i].dwAddr); + break; + } + } + } #endif + // default placeholder, in case of failure + if (ReturnValue == 0) + ReturnValue = 192 << 24 | 168 << 16 | 1 << 8 | 150; break; } From 1ba5ffeea367f7191c3e0c1b734e17b7efbe1b88 Mon Sep 17 00:00:00 2001 From: Toad King Date: Fri, 16 May 2014 20:10:30 -0400 Subject: [PATCH 3/3] remove trailing whitespace --- Source/Core/Core/IPC_HLE/WII_IPC_HLE_Device_net.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/Core/IPC_HLE/WII_IPC_HLE_Device_net.cpp b/Source/Core/Core/IPC_HLE/WII_IPC_HLE_Device_net.cpp index 20d7b00a3cf3..660d4d37d6ba 100644 --- a/Source/Core/Core/IPC_HLE/WII_IPC_HLE_Device_net.cpp +++ b/Source/Core/Core/IPC_HLE/WII_IPC_HLE_Device_net.cpp @@ -860,7 +860,7 @@ bool CWII_IPC_HLE_Device_net_ip_top::IOCtl(u32 _CommandAddress) DWORD ifIndex = -1; std::unique_ptr forwardTable; std::unique_ptr ipTable; - + forwardTableSize = 0; if (GetIpForwardTable(nullptr, &forwardTableSize, FALSE) == ERROR_INSUFFICIENT_BUFFER) {