Dev9ghzdrk: Get host mac correctly on Windows. (#2619)

Follow up from #2586 which ensures that MAC address is unique on Xlink Kai when using Windows.
Previous build was returning last two bytes as 00:00 rather than last two bytes of host adapter's MAC.
This commit is contained in:
Daniel Nowak 2018-10-09 14:37:41 -04:00 committed by lightningterror
parent eac7527b93
commit a84a315473
6 changed files with 70 additions and 139 deletions

View File

@ -143,11 +143,6 @@ DEV9configure() {
}
void __attribute__((constructor)) DllMain() {
//gtk_builder_add_from_file(builder, "dev9ghzdrk.ui", NULL);
//builder = gtk_build_new_from_resource( "/net/pcsx2/dev9ghzdrk/dev9ghzdrk.ui" );
}
NetAdapter* GetNetAdapter()
{
NetAdapter* na;

View File

@ -69,6 +69,7 @@
</child>
<child>
<object class="GtkComboBoxText" id="IDC_BAYTYPE">
<property name="sensitive">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="has_entry">True</property>
@ -129,7 +130,7 @@
<object class="GtkComboBoxText" id="IDC_ETHDEV">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="has_entry">True</property>
<property name="has_entry">False</property>
<property name="entry_text_column">0</property>
</object>
<packing>
@ -172,6 +173,7 @@
<child>
<object class="GtkCheckButton" id="IDC_HDDENABLED">
<property name="label" translatable="yes">ENABLED</property>
<property name="sensitive">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
@ -201,6 +203,7 @@
</child>
<child>
<object class="GtkEntry" id="IDC_HDDFILE">
<property name="sensitive">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
@ -223,7 +226,7 @@
<object class="GtkLabel" id="label2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Hard Disk Drive (not yet properly implemented</property>
<property name="label" translatable="yes">Hard Disk Drive (not yet properly implemented)</property>
</object>
</child>
</object>

View File

@ -19,19 +19,6 @@
#include <winsock2.h>
#include "..\DEV9.h"
#define GetKeyV(name, var, s, t) \
size = s; type = t; \
RegQueryValueEx(myKey, name, 0, &type, (LPBYTE) var, &size);
#define GetKeyVdw(name, var) \
GetKeyV(name, var, 4, REG_DWORD);
//#define SetKeyV(name, var, s, t) \
// RegSetValueEx(myKey, name, 0, t, (LPBYTE) var, s);
//#define SetKeyVdw(name, var) \
// SetKeyV(name, var, 4, REG_DWORD);
BOOL WritePrivateProfileInt(LPCSTR lpAppName, LPCSTR lpKeyName, int intvar, LPCSTR lpFileName)
{
return WritePrivateProfileString(lpAppName, lpKeyName, std::to_string(intvar).c_str(), lpFileName);
@ -44,7 +31,7 @@ bool FileExists(std::string szPath)
}
void SaveConf() {
const std::string file(s_strIniPath + "/dev9ghz.ini");
const std::string file(s_strIniPath + "dev9ghz.ini");
DeleteFile(file.c_str());
WritePrivateProfileString("DEV9", "Eth", config.Eth, file.c_str());
@ -54,84 +41,14 @@ void SaveConf() {
WritePrivateProfileInt("DEV9", "hddEnable", config.hddEnable, file.c_str());
}
void DeleteRegConf() {
HKEY myKey;
//DWORD type, size;
void LoadConf() {
const std::string file(s_strIniPath + "dev9ghz.ini");
if (FileExists(file.c_str()) == false)
return;
if (RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\PS2Eplugin\\DEV9\\DEV9linuz", 0, KEY_ALL_ACCESS, &myKey) != ERROR_SUCCESS) {
return;
}
RegDeleteKey(myKey, "Eth");
RegDeleteKey(myKey, "Hdd");
RegDeleteKey(myKey, "HddSize");
RegDeleteKey(myKey, "ethEnable");
RegDeleteKey(myKey, "hddEnable");
RegCloseKey(myKey);
//Delete Key Software\PS2Eplugin\DEV9\DEV9linuz
if (RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\PS2Eplugin\\DEV9", 0, KEY_ALL_ACCESS, &myKey) != ERROR_SUCCESS) {
emu_printf("Error Opening Key DEV9\n");
return;
}
if (RegDeleteKey(myKey, "DEV9linuz") != ERROR_SUCCESS) {
emu_printf("Error Removing Key DEV9linuz\n");
RegCloseKey(myKey);
return;
}
RegCloseKey(myKey);
//Delete Key Software\PS2Eplugin\DEV9
if (RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\PS2Eplugin", 0, KEY_ALL_ACCESS, &myKey) != ERROR_SUCCESS) {
emu_printf("Error Opening Key PS2Eplugin\n");
return;
}
if (RegDeleteKey(myKey, "DEV9") != ERROR_SUCCESS) {
emu_printf("Error Removing Key DEV9\n");
RegCloseKey(myKey);
return;
}
RegCloseKey(myKey);
}
void LoadIniConf() {
//memset(&config, 0, sizeof(config));
//strcpy(config.Hdd, HDD_DEF);
//config.HddSize = 8 * 1024;
//strcpy(config.Eth, ETH_DEF);
const std::string file(s_strIniPath + "/dev9ghz.ini");
if (FileExists(file.c_str()) == false) {
SaveConf();
return;
}
GetPrivateProfileString("DEV9", "Eth", ETH_DEF, config.Eth, sizeof(config.Eth), file.c_str());
GetPrivateProfileString("DEV9", "Hdd", HDD_DEF, config.Hdd, sizeof(config.Hdd), file.c_str());
config.HddSize = GetPrivateProfileInt("DEV9", "HddSize", config.HddSize, file.c_str());
config.ethEnable = GetPrivateProfileInt("DEV9", "ethEnable", config.ethEnable, file.c_str());
config.hddEnable = GetPrivateProfileInt("DEV9", "hddEnable", config.hddEnable, file.c_str());
}
void LoadConf() {
HKEY myKey;
DWORD type, size;
memset(&config, 0, sizeof(config));
strcpy(config.Hdd, HDD_DEF);
config.HddSize = 8 * 1024;
strcpy(config.Eth, ETH_DEF);
if (RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\PS2Eplugin\\DEV9\\DEV9linuz", 0, KEY_ALL_ACCESS, &myKey)!=ERROR_SUCCESS) {
LoadIniConf();
return;
}
printf("Importing Settings\n");
//Import old settings if user has upgraded this plugin
GetKeyV("Eth", config.Eth, sizeof(config.Eth), REG_SZ);
GetKeyV("Hdd", config.Hdd, sizeof(config.Hdd), REG_SZ);
GetKeyVdw("HddSize", &config.HddSize);
GetKeyVdw("ethEnable", &config.ethEnable);
GetKeyVdw("hddEnable", &config.hddEnable);
RegCloseKey(myKey);
SaveConf();
DeleteRegConf();
}
}

View File

@ -51,16 +51,15 @@ void OnInitDialog(HWND hW) {
for (int i=0; i<pcap_io_get_dev_num(); i++) {
dev = pcap_io_get_dev_desc(i);
int itm=ComboBox_AddString(GetDlgItem(hW, IDC_ETHDEV), dev);
ComboBox_SetItemData(GetDlgItem(hW, IDC_ETHDEV),itm,strdup(pcap_io_get_dev_name(i)));
ComboBox_SetItemData(GetDlgItem(hW, IDC_ETHDEV),itm,_strdup(pcap_io_get_dev_name(i)));
if (strcmp(pcap_io_get_dev_name(i), config.Eth) == 0) {
ComboBox_SetCurSel(GetDlgItem(hW, IDC_ETHDEV), itm);
}
}
vector<tap_adapter> * al=GetTapAdapters();
for (size_t i=0; i<al->size(); i++) {
int itm=ComboBox_AddString(GetDlgItem(hW, IDC_ETHDEV), al[0][i].name.c_str());
ComboBox_SetItemData(GetDlgItem(hW, IDC_ETHDEV),itm,strdup( al[0][i].guid.c_str()));
ComboBox_SetItemData(GetDlgItem(hW, IDC_ETHDEV),itm,_strdup( al[0][i].guid.c_str()));
if (strcmp(al[0][i].guid.c_str(), config.Eth) == 0) {
ComboBox_SetCurSel(GetDlgItem(hW, IDC_ETHDEV), itm);
}
@ -77,27 +76,27 @@ void OnOk(HWND hW) {
if (i == -1)
{
//adapter not selected
if (Button_GetCheck(GetDlgItem(hW, IDC_ETHENABLED)))
if ( Button_GetCheck(GetDlgItem(hW, IDC_ETHENABLED)))
{
//Trying to use an ethernet without
//selected adapter, we can't have that
SysMessage("Please select an ethernet adapter");
return;
}
else
else
{
//user not planning on using
//ethernet anyway
strcpy(config.Eth, ETH_DEF);
}
}
else
else
{
//adapter is selected
char* ptr = (char*)ComboBox_GetItemData(GetDlgItem(hW, IDC_ETHDEV), i);
strcpy(config.Eth, ptr);
}
Edit_GetText(GetDlgItem(hW, IDC_HDDFILE), config.Hdd, 256);
config.ethEnable = Button_GetCheck(GetDlgItem(hW, IDC_ETHENABLED));
@ -109,7 +108,7 @@ void OnOk(HWND hW) {
}
BOOL CALLBACK ConfigureDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch(uMsg) {
case WM_INITDIALOG:
OnInitDialog(hW);
@ -147,8 +146,8 @@ EXPORT_C_(void)
DEV9configure() {
DialogBox(hInst,
MAKEINTRESOURCE(IDD_CONFIG),
GetActiveWindow(),
(DLGPROC)ConfigureDlgProc);
GetActiveWindow(),
(DLGPROC)ConfigureDlgProc);
//SysMessage("Nothing to Configure");
}
@ -156,12 +155,12 @@ EXPORT_C_(void)
DEV9about() {
DialogBox(hInst,
MAKEINTRESOURCE(IDD_ABOUT),
GetActiveWindow(),
GetActiveWindow(),
(DLGPROC)AboutDlgProc);
}
BOOL APIENTRY DllMain(HANDLE hModule, // DLL INIT
DWORD dwReason,
DWORD dwReason,
LPVOID lpReserved) {
hInst = (HINSTANCE)hModule;
return TRUE; // very quick :)
@ -184,7 +183,7 @@ NetAdapter* GetNetAdapter()
}
return na;
}
s32 _DEV9open()
s32 _DEV9open()
{
//handleDEV9Thread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) DEV9ThreadProc, &dwThrdParam, CREATE_SUSPENDED, &dwThreadId);
//SetThreadPriority(handleDEV9Thread,THREAD_PRIORITY_HIGHEST);

View File

@ -51,29 +51,46 @@ int GetMACAddress(char *adapter, mac_address* addr)
{
int retval = 0;
#ifdef _WIN32
static IP_ADAPTER_INFO AdapterInfo[128]; // Allocate information
// for up to 128 NICs
static PIP_ADAPTER_INFO pAdapterInfo;
ULONG dwBufLen = sizeof(AdapterInfo); // Save memory size of buffer
static IP_ADAPTER_ADDRESSES AdapterInfo[128];
DWORD dwStatus = GetAdaptersInfo( // Call GetAdapterInfo
AdapterInfo, // [out] buffer to receive data
&dwBufLen); // [in] size of receive data buffer
if(dwStatus != ERROR_SUCCESS) // Verify return value is
return 0; // valid, no buffer overflow
static PIP_ADAPTER_ADDRESSES pAdapterInfo;
ULONG dwBufLen = sizeof(AdapterInfo);
pAdapterInfo = AdapterInfo; // Contains pointer to
// current adapter info
do {
if(strcmp(pAdapterInfo->AdapterName,adapter)==0)
DWORD dwStatus = GetAdaptersAddresses(
AF_UNSPEC,
GAA_FLAG_INCLUDE_PREFIX,
NULL,
AdapterInfo,
&dwBufLen
);
if(dwStatus != ERROR_SUCCESS)
return 0;
pAdapterInfo = AdapterInfo;
char adapter_desc[128] = "";
// Must get friendly description from the cryptic adapter name
for (int ii = 0; ii < pcap_io_get_dev_num(); ii++)
if (0 == strcmp(pcap_io_get_dev_name(ii), adapter))
{
memcpy(addr,pAdapterInfo->Address,6);
strcpy(adapter_desc, pcap_io_get_dev_desc(ii));
break;
}
wchar_t wadapter[128];
std::mbstowcs(wadapter, adapter_desc, 128);
do {
if ( 0 == wcscmp(pAdapterInfo->Description, wadapter ) )
{
memcpy(addr,pAdapterInfo->PhysicalAddress,6);
return 1;
}
pAdapterInfo = pAdapterInfo->Next; // Progress through
pAdapterInfo = pAdapterInfo->Next;
}
while(pAdapterInfo); // Terminate if last adapter
while(pAdapterInfo);
#elif defined(__linux__)
struct ifreq ifr;
int fd = socket(AF_INET, SOCK_DGRAM, 0);
@ -304,7 +321,7 @@ char* pcap_io_get_dev_desc(int num)
PCAPAdapter::PCAPAdapter()
{
//if (config.ethEnable == 0) return; //whut? nada!
if (config.ethEnable == 0) return;
if (pcap_io_init(config.Eth) == -1) {
SysMessage("Can't open Device '%s'\n", config.Eth);
}

View File

@ -344,14 +344,14 @@ smap_read8(u32 addr)
EXPORT_C_(u16)
smap_read16(u32 addr)
{
if (addr >= SMAP_BD_TX_BASE && addr < (SMAP_BD_TX_BASE + SMAP_BD_SIZE))
int rv = dev9Ru16(addr);
if (addr >= SMAP_BD_TX_BASE && addr < (SMAP_BD_TX_BASE + SMAP_BD_SIZE))
{
int rv = dev9Ru16(addr);
if(dev9.bd_swap)
return (rv<<8)|(rv>>8);
if (dev9.bd_swap)
return (rv << 8) | (rv >> 8);
return rv;
/*
switch (addr & 0x7)
switch (addr & 0x7)
{
case 0: // ctrl_stat
hard = dev9Ru16(addr);
@ -380,14 +380,13 @@ smap_read16(u32 addr)
}
*/
}
else if (addr >= SMAP_BD_RX_BASE && addr < (SMAP_BD_RX_BASE + SMAP_BD_SIZE))
else if (addr >= SMAP_BD_RX_BASE && addr < (SMAP_BD_RX_BASE + SMAP_BD_SIZE))
{
int rv = dev9Ru16(addr);
if(dev9.bd_swap)
return (rv<<8)|(rv>>8);
if (dev9.bd_swap)
return (rv << 8) | (rv >> 8);
return rv;
/*
switch (addr & 0x7)
switch (addr & 0x7)
{
case 0: // ctrl_stat
hard = dev9Ru16(addr);
@ -416,10 +415,9 @@ smap_read16(u32 addr)
}
*/
}
#ifdef DEV9_LOG_ENABLE
switch(addr)
{
#ifdef DEV9_LOG_ENABLE
case SMAP_R_TXFIFO_FRAME_CNT:
printf("SMAP_R_TXFIFO_FRAME_CNT read 16\n");
return dev9Ru16(addr);
@ -489,12 +487,14 @@ smap_read16(u32 addr)
case SMAP_R_EMAC3_STA_CTRL_H:
DEV9_LOG("SMAP_R_EMAC3_STA_CTRL_H 16bit read %x\n", dev9Ru16(addr));
return dev9Ru16(addr);
#endif
default:
DEV9_LOG("SMAP : Unknown 16 bit read @ %X,v=%X\n",addr,dev9Ru16(addr));
return dev9Ru16(addr);
}
#endif
return rv;
}
EXPORT_C_(u32)
smap_read32(u32 addr)
{