/***********************************************************************/ /* MACUTIL: Author Olivier Bertrand -- 2008-2012 */ /* From the article and sample code by Khalid Shaikh. */ /***********************************************************************/ #ifdefined(_WIN32) #include"my_global.h" #else// !_WIN32 #errorThis is WINDOWS only DLL #endif// !_WIN32 #include"global.h" #include"plgdbsem.h" #include"macutil.h"
#if0// This is placed here just to know what are the actual values #define MAX_ADAPTER_DESCRIPTION_LENGTH 128 #define MAX_ADAPTER_NAME_LENGTH 256 #define MAX_ADAPTER_ADDRESS_LENGTH 8 #define DEFAULT_MINIMUM_ENTITIES 32 #define MAX_HOSTNAME_LEN 128 #define MAX_DOMAIN_NAME_LEN 128 #define MAX_SCOPE_ID_LEN 256
/***********************************************************************/ /* Implementation of the MACINFO class. */ /***********************************************************************/
MACINFO::MACINFO(bool adap, bool fix)
{
Fip = NULL;
Piaf = NULL;
Curp = NULL;
Buflen = 0;
Fix = fix;
Adap = adap;
N = -1;
} // end of MACINFO constructor
/***********************************************************************/ /* MACINFO: Return an error message. */ /***********************************************************************/ void MACINFO::MakeErrorMsg(PGLOBAL g, DWORD drc)
{ if (drc == ERROR_BUFFER_OVERFLOW)
snprintf(g->Message, sizeof(g->Message), "GetAdaptersInfo: Buffer Overflow buflen=%d nbofadap=%d",
Buflen, N); elseif (drc == ERROR_INVALID_PARAMETER)
snprintf(g->Message, sizeof(g->Message), "GetAdaptersInfo: Invalid parameters"); elseif (drc == ERROR_NO_DATA)
snprintf(g->Message, sizeof(g->Message), "No adapter information exists for the local computer"); elseif (drc == ERROR_NOT_SUPPORTED)
snprintf(g->Message, sizeof(g->Message), "GetAdaptersInfo is not supported"); else
FormatMessage(FORMAT_MESSAGE_FLAGS, NULL, GetLastError(), 0, g->Message, sizeof(g->Message), NULL);
} // end of MakeErrorMsg
/***********************************************************************/ /* MAC: Get the number of found adapters. */ /***********************************************************************/ int MACINFO::GetNadap(PGLOBAL g)
{ if (N < 0) { // Best method if (Adap) {
DWORD drc = GetAdaptersInfo(NULL, &Buflen);
if (drc == ERROR_SUCCESS)
N = (Fix) ? 1 : 0; elseif (drc == ERROR_BUFFER_OVERFLOW)
N = Buflen / sizeof(IP_ADAPTER_INFO); else
MakeErrorMsg(g, drc);
} else
N = (Fix) ? 1 : 0;
#if0 // This method returns too many adapters
DWORD dw, drc = GetNumberOfInterfaces((PDWORD)&dw);
if (drc == NO_ERROR) {
N = (int)dw;
Buflen = N * sizeof(IP_ADAPTER_INFO);
} else
MakeErrorMsg(g, 0); #endif
} // endif MaxSize
return N;
} // end of GetNadap
/***********************************************************************/ /* GetMacInfo: Get info for all found adapters. */ /***********************************************************************/ bool MACINFO::GetMacInfo(PGLOBAL g)
{
DWORD drc;
if (GetNadap(g) < 0) returntrue; elseif (N == 0) returnfalse;
if (drc == ERROR_SUCCESS) {
Curp = Piaf; // Curp is the first one returnfalse; // Success
} // endif drc
MakeErrorMsg(g, drc); returntrue;
} // end of GetMacInfo
/***********************************************************************/ /* GetMacInfo: Get info for all found adapters. */ /***********************************************************************/ bool MACINFO::GetFixedInfo(PGLOBAL g)
{
ULONG len = (uint)sizeof(FIXED_INFO);
DWORD drc;
/***********************************************************************/ /* Get next MAC info. */ /***********************************************************************/ bool MACINFO::NextMac(void)
{ if (Curp)
Curp = Curp->Next;
return Curp != NULL;
} // end of NextMac
/***********************************************************************/ /* Get the next MAC address elements. */ /***********************************************************************/ bool MACINFO::GetOneInfo(PGLOBAL g, int flag, void *v, int lv)
{ char *p = NULL, buf[260] = ""; unsignedint i; int n = 0;
if (!Curp && flag >= 10) { // Fix info row, no adapter info available switch (flag) { case13: case14: case19: case22: case23: break; default:
p = PlugDup(g, "");
} // endswitch flag
} elseswitch (flag) { // FIXED INFO case1: // Host Name
p = Fip->HostName; break; case2: // Domain Name
p = Fip->DomainName; break; case3: // DNS IPaddress
p = (Fip->CurrentDnsServer)
? (char*)&Fip->CurrentDnsServer->IpAddress
: (char*)&Fip->DnsServerList.IpAddress; break; case4: // Node Type
n = (int)Fip->NodeType; break; case5: // Scope ID ???
p = Fip->ScopeId; break; case6: // Routing enabled
n = (int)Fip->EnableRouting; break; case7: // Proxy enabled
n = (int)Fip->EnableProxy; break; case8: // DNS enabled
n = (int)Fip->EnableDns; break; // ADAPTERS INFO case10: // Name
p = Curp->AdapterName; break; case11: // Description if ((p = strstr(Curp->Description, " - Packet Scheduler Miniport"))) {
strncpy(buf, Curp->Description, p - Curp->Description);
i = (int)(p - Curp->Description);
strncpy(buf, Curp->Description, i);
buf[i] = 0;
p = buf;
} elseif ((p = strstr(Curp->Description, " - Miniport d'ordonnancement de paquets"))) {
i = (int)(p - Curp->Description);
strncpy(buf, Curp->Description, i);
buf[i] = 0;
p = buf;
} else
p = Curp->Description;
break; case12: // MAC Address for (p = buf, i = 0; i < Curp->AddressLength; i++) { if (i)
strcat(p++, "-");
p += snprintf(p, sizeof(buf) - (p - buf), "%.2X", Curp->Address[i]);
} // endfor i
p = buf; break; case13: // Type #if0// This is not found in the SDK switch (Curp->Type) { case IF_ETHERNET_ADAPTERTYPE: p = "Ethernet Adapter"; break; case IF_TOKEN_RING_ADAPTERTYPE: p = "Token Ring Adapter"; break; case IF_FDDI_ADAPTERTYPE: p = "FDDI Adapter"; break; case IF_PPP_ADAPTERTYPE: p = "PPP Adapter"; break; case IF_LOOPBACK_ADAPTERTYPE: p = "Loop Back Adapter"; break; // case IF_SLIP_ADAPTERTYPE: p = "Generic Slip Adapter"; break; default:
snprintf(buf, sizeof(buf), "Other Adapter, type=%d", Curp->Type);
p = buf;
} // endswitch Type #endif// 0
n = (int)Curp->Type; break; case14: // DHCP enabled
n = (int)Curp->DhcpEnabled; break; case15: // IP Address
p = (Curp->CurrentIpAddress)
? (char*)&Curp->CurrentIpAddress->IpAddress
: (char*)&Curp->IpAddressList.IpAddress; break; case16: // Subnet Mask
p = (Curp->CurrentIpAddress)
? (char*)&Curp->CurrentIpAddress->IpMask
: (char*)&Curp->IpAddressList.IpMask; break; case17: // Gateway
p = (char*)&Curp->GatewayList.IpAddress; break; case18: // DHCP Server
p = (char*)&Curp->DhcpServer.IpAddress; break; case19: // Have WINS
n = (Curp->HaveWins) ? 1 : 0; break; case20: // Primary WINS
p = (char*)&Curp->PrimaryWinsServer.IpAddress; break; case21: // Secondary WINS
p = (char*)&Curp->SecondaryWinsServer.IpAddress; break; case22: // Lease obtained
n = (int)Curp->LeaseObtained; break; case23: // Lease expires
n = (int)Curp->LeaseExpires; break; default:
snprintf(g->Message, sizeof(g->Message), "Invalid flag value %d", flag); returntrue;
} // endswitch flag
if (p)
strncpy((char*)v, p, lv); else
*((int*)v) = n;
returnfalse;
} // end of GetOneInfo
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-10-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.