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 a9e4fd6..4c59414 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 @@ -3,6 +3,7 @@ // Refer to the license.txt file included. #include +#include #include #include "Common/CommonPaths.h" @@ -48,7 +49,6 @@ typedef struct pollfd pollfd_t; #endif extern std::queue > g_ReplyQueueLater; -const u8 default_address[] = { 0x00, 0x17, 0xAB, 0x99, 0x99, 0x99 }; // ********************************************************************************** // Handle /dev/net/kd/request requests @@ -304,6 +304,49 @@ s32 CWII_IPC_HLE_Device_net_kd_request::NWC24MakeUserID(u64* nwc24_id, u32 holly return WC24_OK; } +void GetMacAddress(u8 address[6]) +{ + std::string wireless_mac = SConfig::GetInstance().m_WirelessMac; + if (!wireless_mac.empty()) + { + int x = 0; + for (size_t i = 0; i < wireless_mac.length() && x < 6; i++) + { + if (wireless_mac[i] == ':' || wireless_mac[i] == '-') + continue; + + std::stringstream ss; + ss << std::hex << wireless_mac[i]; + if (wireless_mac[i+1] != ':' && wireless_mac[i+1] != '-') + { + ss << std::hex << wireless_mac[i+1]; + i++; + } + ss >> address[x]; + x++; + } + } + else + { + address[0] = 0x00; + address[1] = 0x17; + address[2] = 0xAB; + address[3] = rand() & 0xFF; + address[4] = rand() & 0xFF; + address[5] = rand() & 0xFF; + + SConfig::GetInstance().m_WirelessMac = + StringFromFormat("%02X:%02X:%02X:%02X:%02X:%02X", + address[0], + address[1], + address[2], + address[3], + address[4], + address[5]); + SConfig::GetInstance().SaveSettings(); + } +} + // ********************************************************************************** // Handle /dev/net/ncd/manage requests CWII_IPC_HLE_Device_net_ncd_manage::CWII_IPC_HLE_Device_net_ncd_manage(u32 _DeviceID, const std::string& _rDeviceName) @@ -381,35 +424,12 @@ bool CWII_IPC_HLE_Device_net_ncd_manage::IOCtlV(u32 _CommandAddress) case IOCTLV_NCD_GETWIRELESSMACADDRESS: INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: IOCTLV_NCD_GETWIRELESSMACADDRESS"); - - if (!SConfig::GetInstance().m_WirelessMac.empty()) - { - int x = 0; - int tmpaddress[6]; - for (unsigned int i = 0; i < SConfig::GetInstance().m_WirelessMac.length() && x < 6; i++) - { - if (SConfig::GetInstance().m_WirelessMac[i] == ':' || SConfig::GetInstance().m_WirelessMac[i] == '-') - continue; - - std::stringstream ss; - ss << std::hex << SConfig::GetInstance().m_WirelessMac[i]; - if (SConfig::GetInstance().m_WirelessMac[i+1] != ':' && SConfig::GetInstance().m_WirelessMac[i+1] != '-') - { - ss << std::hex << SConfig::GetInstance().m_WirelessMac[i+1]; - i++; - } - ss >> tmpaddress[x]; - x++; - } - u8 address[6]; - for (int i = 0; i < 6;i++) - address[i] = tmpaddress[i]; - Memory::WriteBigEData(address, CommandBuffer.PayloadBuffer.at(1).m_Address, 4); - break; - } - - Memory::WriteBigEData(default_address, - CommandBuffer.PayloadBuffer.at(1).m_Address, sizeof(default_address)); + + u8 address[6]; + GetMacAddress(address); + Memory::WriteBigEData(address, + CommandBuffer.PayloadBuffer.at(1).m_Address, + sizeof(address)); break; default: @@ -501,7 +521,10 @@ bool CWII_IPC_HLE_Device_net_wd_command::IOCtlV(u32 CommandAddress) // Probably used to disallow certain channels? memcpy(info->country, "US", 2); info->ntr_allowed_channels = Common::swap16(0xfffe); - memcpy(info->mac, default_address, 6); + + u8 address[6]; + GetMacAddress(address); + memcpy(info->mac, address, sizeof(info->mac)); } break; @@ -1206,7 +1229,9 @@ bool CWII_IPC_HLE_Device_net_ip_top::IOCtlV(u32 CommandAddress) Memory::Write_U32(0, _BufferOut); break; case 0x1004: // mac address - Memory::WriteBigEData(default_address, _BufferOut, 6); + u8 address[6]; + GetMacAddress(address); + Memory::WriteBigEData(address, _BufferOut, sizeof(address)); break; case 0x1005: // link state Memory::Write_U32(1, _BufferOut);