/* ** Reads the tables for all net interfaces ** */ void MeasureNet::UpdateIFTable() { bool logging = false; if (c_GetIfTable2) { if (c_Table) { c_FreeMibTable(c_Table); c_Table = nullptr; } if (c_GetIfTable2((MIB_IF_TABLE2**)&c_Table) == NO_ERROR) { MIB_IF_TABLE2* ifTable = (MIB_IF_TABLE2*)c_Table; if (c_NumOfTables != ifTable->NumEntries) { c_NumOfTables = ifTable->NumEntries; logging = true; } if (GetRainmeter().GetDebug() && logging) { LogDebug(L"------------------------------"); LogDebugF(L"* NETWORK-INTERFACE: Count=%i", c_NumOfTables); for (size_t i = 0; i < c_NumOfTables; ++i) { const WCHAR* type = L"Other"; switch (ifTable->Table[i].Type) { case IF_TYPE_ETHERNET_CSMACD: type = L"Ethernet"; break; case IF_TYPE_PPP: type = L"PPP"; break; case IF_TYPE_SOFTWARE_LOOPBACK: type = L"Loopback"; break; case IF_TYPE_IEEE80211: type = L"IEEE802.11"; break; case IF_TYPE_TUNNEL: type = L"Tunnel"; break; case IF_TYPE_IEEE1394: type = L"IEEE1394"; break; } LogDebugF(L"%i: %s", (int)i + 1, ifTable->Table[i].Description); LogDebugF(L" Alias: %s", ifTable->Table[i].Alias); LogDebugF(L" Type=%s(%i), Hardware=%s, Filter=%s", type, ifTable->Table[i].Type, (ifTable->Table[i].InterfaceAndOperStatusFlags.HardwareInterface == 1) ? L"Yes" : L"No", (ifTable->Table[i].InterfaceAndOperStatusFlags.FilterInterface == 1) ? L"Yes" : L"No"); } LogDebug(L"------------------------------"); } } else { // Something's wrong. Unable to get the table. c_Table = nullptr; c_NumOfTables = 0; } } else { DWORD ret, size = 0; MIB_IFTABLE* ifTable = (MIB_IFTABLE*)c_Table; if ((ret = GetIfTable(ifTable, &size, FALSE)) == ERROR_INSUFFICIENT_BUFFER) { delete [] c_Table; c_Table = new BYTE[size]; ifTable = (MIB_IFTABLE*)c_Table; ret = GetIfTable(ifTable, &size, FALSE); } if (ret == NO_ERROR) { if (c_NumOfTables != ifTable->dwNumEntries) { c_NumOfTables = ifTable->dwNumEntries; logging = true; } if (GetRainmeter().GetDebug() && logging) { LogDebug(L"------------------------------"); LogDebugF(L"* NETWORK-INTERFACE: Count=%i", c_NumOfTables); for (size_t i = 0; i < c_NumOfTables; ++i) { const WCHAR* type = L""; switch (ifTable->table[i].dwType) { case IF_TYPE_ETHERNET_CSMACD: type = L"Ethernet"; break; case IF_TYPE_PPP: type = L"PPP"; break; case IF_TYPE_SOFTWARE_LOOPBACK: type = L"Loopback"; break; case IF_TYPE_IEEE80211: type = L"IEEE802.11"; break; case IF_TYPE_TUNNEL: type = L"Tunnel"; break; case IF_TYPE_IEEE1394: type = L"IEEE1394"; break; default: type = L"Other"; break; } LogDebugF(L"%i: %.*S", (int)i + 1, ifTable->table[i].dwDescrLen, (char*)ifTable->table[i].bDescr); LogDebugF(L" Type=%s(%i)", type, ifTable->table[i].dwType); } LogDebug(L"------------------------------"); } } else { // Something's wrong. Unable to get the table. delete [] c_Table; c_Table = nullptr; c_NumOfTables = 0; } } }
/* ** Reads the tables for all net interfaces ** */ void CMeasureNet::UpdateIFTable() { bool logging = false; if (c_GetIfTable2) { if (c_Table) { c_FreeMibTable(c_Table); c_Table = NULL; } if (c_GetIfTable2((MIB_IF_TABLE2**)&c_Table) == NO_ERROR) { MIB_IF_TABLE2* ifTable = (MIB_IF_TABLE2*)c_Table; if (c_NumOfTables != ifTable->NumEntries) { c_NumOfTables = ifTable->NumEntries; logging = true; } if (Rainmeter->GetDebug() && logging) { Log(LOG_DEBUG, L"------------------------------"); LogWithArgs(LOG_DEBUG, L"* NETWORK-INTERFACE: Count=%i", c_NumOfTables); for (size_t i = 0; i < c_NumOfTables; ++i) { std::wstring type; switch (ifTable->Table[i].Type) { case IF_TYPE_ETHERNET_CSMACD: type += L"Ethernet"; break; case IF_TYPE_PPP: type += L"PPP"; break; case IF_TYPE_SOFTWARE_LOOPBACK: type += L"Loopback"; break; case IF_TYPE_IEEE80211: type += L"IEEE802.11"; break; case IF_TYPE_TUNNEL: type += L"Tunnel"; break; case IF_TYPE_IEEE1394: type += L"IEEE1394"; break; default: type += L"Other"; break; } LogWithArgs(LOG_DEBUG, L"%i: %s", (int)i + 1, ifTable->Table[i].Description); LogWithArgs(LOG_DEBUG, L" Alias: %s", ifTable->Table[i].Alias); LogWithArgs(LOG_DEBUG, L" Type=%s(%i), Hardware=%s, Filter=%s", type.c_str(), ifTable->Table[i].Type, (ifTable->Table[i].InterfaceAndOperStatusFlags.HardwareInterface == 1) ? L"Yes" : L"No", (ifTable->Table[i].InterfaceAndOperStatusFlags.FilterInterface == 1) ? L"Yes" : L"No"); } Log(LOG_DEBUG, L"------------------------------"); } } else { // Something's wrong. Unable to get the table. c_Table = NULL; c_NumOfTables = 0; } } else { if (c_Table == NULL) { // Gotta reserve few bytes for the tables DWORD value = 0; if (GetNumberOfInterfaces(&value) == NO_ERROR) { if (c_NumOfTables != value) { c_NumOfTables = value; logging = true; } if (c_NumOfTables > 0) { DWORD size = sizeof(MIB_IFTABLE) + sizeof(MIB_IFROW) * c_NumOfTables; c_Table = new BYTE[size]; } } } if (c_Table) { DWORD ret, size = 0; MIB_IFTABLE* ifTable = (MIB_IFTABLE*)c_Table; if ((ret = GetIfTable(ifTable, &size, FALSE)) == ERROR_INSUFFICIENT_BUFFER) { delete [] c_Table; c_Table = new BYTE[size]; ifTable = (MIB_IFTABLE*)c_Table; ret = GetIfTable(ifTable, &size, FALSE); } if (ret == NO_ERROR) { if (c_NumOfTables != ifTable->dwNumEntries) { c_NumOfTables = ifTable->dwNumEntries; logging = true; } if (Rainmeter->GetDebug() && logging) { Log(LOG_DEBUG, L"------------------------------"); LogWithArgs(LOG_DEBUG, L"* NETWORK-INTERFACE: Count=%i", c_NumOfTables); for (size_t i = 0; i < c_NumOfTables; ++i) { std::string desc((char*)ifTable->table[i].bDescr, ifTable->table[i].dwDescrLen); std::wstring type; switch (ifTable->table[i].dwType) { case IF_TYPE_ETHERNET_CSMACD: type += L"Ethernet"; break; case IF_TYPE_PPP: type += L"PPP"; break; case IF_TYPE_SOFTWARE_LOOPBACK: type += L"Loopback"; break; case IF_TYPE_IEEE80211: type += L"IEEE802.11"; break; case IF_TYPE_TUNNEL: type += L"Tunnel"; break; case IF_TYPE_IEEE1394: type += L"IEEE1394"; break; default: type += L"Other"; break; } LogWithArgs(LOG_DEBUG, L"%i: %s", (int)i + 1, ConvertToWide(desc.c_str()).c_str()); LogWithArgs(LOG_DEBUG, L" Type=%s(%i)", type.c_str(), ifTable->table[i].dwType); } Log(LOG_DEBUG, L"------------------------------"); } } else { // Something's wrong. Unable to get the table. delete [] c_Table; c_Table = NULL; c_NumOfTables = 0; } } } }