Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   GetIfTable2 - MIB_IF_ROW2 (https://www.delphipraxis.net/165808-getiftable2-mib_if_row2.html)

andreas.mund 17. Jan 2012 15:22

GetIfTable2 - MIB_IF_ROW2
 
Hallo, ich möchte die API GetIfTable2 in Delphi verwenden. Hat hier evtl. bereits jemand die Struktur MIB_IF_ROW2 auf Delphi umgesetzt?

Sir Rufo 17. Jan 2012 18:18

AW: GetIfTable2 - MIB_IF_ROW2
 
Etwa sowas hier?
Delphi-Quellcode:
NDIS_MEDIUM = (
NdisMedium802_3,
NdisMedium802_5,
NdisMediumFddi,
NdisMediumWan,
NdisMediumLocalTalk,
NdisMediumDix, // defined for convenience, not a real medium
NdisMediumArcnetRaw,
NdisMediumArcnet878_2,
NdisMediumAtm,
NdisMediumWirelessWan,
NdisMediumIrda,
NdisMediumBpc,
NdisMediumCoWan,
NdisMedium1394,
NdisMediumInfiniBand,
NdisMediumMax // Not a real medium, defined as an upper-bound
);

NDIS_PHYSICAL_MEDIUM = (
NdisPhysicalMediumUnspecified,
NdisPhysicalMediumWirelessLan,
NdisPhysicalMediumCableModem,
NdisPhysicalMediumPhoneLine,
NdisPhysicalMediumPowerLine,
NdisPhysicalMediumDSL, // includes ADSL and UADSL (G.Lite)
NdisPhysicalMediumFibreChannel,
NdisPhysicalMedium1394,
NdisPhysicalMediumWirelessWan,
NdisPhysicalMediumNative802_11,
NdisPhysicalMediumBluetooth,
NdisPhysicalMediumInfiniband,
NdisPhysicalMediumWiMax,
NdisPhysicalMediumUWB,
NdisPhysicalMedium802_3,
NdisPhysicalMedium802_5,
NdisPhysicalMediumIrda,
NdisPhysicalMediumWiredWAN,
NdisPhysicalMediumWiredCoWan,
NdisPhysicalMediumOther,
NdisPhysicalMediumMax // Not a real physical type, defined as an upper-bound
);

NET_IF_ACCESS_TYPE =
( NET_IF_ACCESS_LOOPBACK = 1,
NET_IF_ACCESS_BROADCAST = 2,
NET_IF_ACCESS_POINT_TO_POINT = 3,
NET_IF_ACCESS_POINT_TO_MULTI_POINT = 4,
NET_IF_ACCESS_MAXIMUM = 5);

TUNNEL_TYPE = (
TUNNEL_TYPE_NONE = 0,
TUNNEL_TYPE_OTHER = 1,
TUNNEL_TYPE_DIRECT = 2,
TUNNEL_TYPE_6TO4 = 11,
TUNNEL_TYPE_ISATAP = 13,
TUNNEL_TYPE_TEREDO = 14);

NET_IF_DIRECTION_TYPE = (

NET_IF_DIRECTION_SENDRECEIVE,
NET_IF_DIRECTION_SENDONLY,
NET_IF_DIRECTION_RECEIVEONLY,
NET_IF_DIRECTION_MAXIMUM
);

TInterfaceAndOperStatusFlags = (
HardwareInterface = 1,
FilterInterface = 1,
ConnectorPresent = 1,
NotAuthenticated = 1,
NotMediaConnected = 1,
Paused = 1,
LowPower = 1,
EndPointInterface = 1);

NET_IF_ADMIN_STATUS = ( // ifAdminStatus

NET_IF_ADMIN_STATUS_UP = 1,
NET_IF_ADMIN_STATUS_DOWN = 2,
NET_IF_ADMIN_STATUS_TESTING = 3
);

IF_OPER_STATUS = (
IfOperStatusUp,
IfOperStatusDown,
IfOperStatusTesting,
IfOperStatusUnknown,
IfOperStatusDormant,
IfOperStatusNotPresent,
IfOperStatusLowerLayerDown);
{$EXTERNALSYM IF_OPER_STATUS}
TIfOperStatus = IF_OPER_STATUS;

NET_IF_MEDIA_CONNECT_STATE = (
MediaConnectStateUnknown,
MediaConnectStateConnected,
MediaConnectStateDisconnected);

NET_IF_CONNECTION_TYPE = (
NET_IF_CONNECTION_DEDICATED = 1,
NET_IF_CONNECTION_PASSIVE = 2,
NET_IF_CONNECTION_DEMAND = 3,
NET_IF_CONNECTION_MAXIMUM = 4);

TMibIfRow2 = packed record
InterfaceLuid: record
case integer of
0: (
Value: Dword);
1: (
Reserved: Dword;
NetLuidIndex: Dword;
IfType: Dword);
end;
InterfaceIndex:ULONG ;
InterfaceGuid: TGUID;
Alias:array[0..256] of WCHAR;
Description:array[0..256] of WCHAR;
PhysicalAddressLength:ULONG;
PhysicalAddress:array[0..31] of UCHAR;
PermanentPhysicalAddress:array[0..31] of UCHAR;
Mtu:ULONG;
Typet:ULONG;
TunnelType:TUNNEL_TYPE;
MediaType:NDIS_MEDIUM;
PhysicalMediumType:NDIS_PHYSICAL_MEDIUM;
AccessType:NET_IF_ACCESS_TYPE;
DirectionType:NET_IF_DIRECTION_TYPE;
InterfaceAndOperStatusFlags: TInterfaceAndOperStatusFlags ;
OperStatus:IF_OPER_STATUS;
AdminStatus:NET_IF_ADMIN_STATUS;
MediaConnectState:NET_IF_MEDIA_CONNECT_STATE;
NetworkGuid:TGUID;
ConnectionType:NET_IF_CONNECTION_TYPE;
TransmitLinkSpeed:DWORD;
ReceiveLinkSpeed:DWORD;
InOctets:DWORD;
InUcastPkts:DWORD;
InNUcastPkts:DWORD;
InDiscards:DWORD;
InErrors:DWORD;
InUnknownProtos:DWORD;
InUcastOctets:DWORD;
InMulticastOctets:DWORD;
InBroadcastOctets:DWORD;
OutOctets:DWORD;
OutUcastPkts:DWORD;
OutNUcastPkts:DWORD;
OutDiscards:DWORD;
OutErrors:DWORD;
OutUcastOctets:DWORD;
OutMulticastOctets:DWORD;
OutBroadcastOctets:DWORD;
OutQLen:DWORD;

end;
TMibIfArray2 = array [0..512] of TMibIfRow2;
TMibIfTable2 = packed record
dwNumEntries: ULONG ;
Table : TMibIfArray2;
end;
Und damit das kein ehter Guttenberg wird hier noch die Quellenangabe
Gefunden über den 2. Link bei Bei Google suchenDelphi MIB_IF_ROW2

andreas.mund 27. Jan 2012 09:13

AW: GetIfTable2 - MIB_IF_ROW2
 
Vielen dank für deine Antwort.

Ich habe diese und auch weitere in Russischen Foren gefundenen Versionen von MIB_IF_ROW2 getestet. Leider scheint aber noch irgendetwas falsch zu sein.

Wenn ich den hier beschriebene Record verwende so ist die Ausgabe von "Alias" und "Description" korrekt. Die folgenden Einträge aus MIB_IF_ROW2 sind verschoben. Der Record scheint 110 Bytes zu kurz zu sein. Füge ich am ende der Struktur 110 Bytes an (OFFSET : Array[1..110] of Byte; ) werden alle Einträge von "Alias" und Description korrekt ausgelesen.

Ich habe die ganze Struktur noch einmal mit der MSDN Hilfe verglichen...

hierbei fällt mir vor allen dingen auf das "ULONG64" im Beispiel jeweils mit DWORD übersetzt wurde. Ein DWORD hat jedoch nur 32 Bit und einen 64 Bit unsigned integer 64 Bit gibt es soweit mir bekannt ist in Delphi nicht. Wenn ich anstatt DWORD jeweils INT64 verwenden würde (was zumindest von der Anzahl an Bytes passt) erklärt das aber auch nicht das komplette Offset von 110 Bytes. (Wie kann ULONG 64 korrekt nach Delphi übersetzt werden!?)

Hat jemand eine idee wo der Fehler sein könnte?


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz