unit
uMain;
interface
uses
Windows, SysUtils, Classes, Controls, Forms, ComCtrls, Messages, Variants, Graphics,
Dialogs, StdCtrls, Buttons, ExtCtrls, ImgList;
const
MAX_ADAPTER_NAME_LENGTH =
256
;
MAX_ADAPTER_DESCRIPTION_LENGTH =
128
;
MAX_ADAPTER_ADDRESS_LENGTH =
8
;
IPHelper =
'iphlpapi.dll'
;
MIB_IF_TYPE_OTHER =
1
;
MIB_IF_TYPE_ETHERNET =
6
;
MIB_IF_TYPE_TOKENRING =
9
;
MIB_IF_TYPE_FDDI =
15
;
MIB_IF_TYPE_PPP =
23
;
MIB_IF_TYPE_LOOPBACK =
24
;
MIB_IF_TYPE_SLIP =
28
;
type
time_t =
Longint
;
IP_ADDRESS_STRING =
record
S:
array
[
0..15
]
of
Char
;
end
;
IP_MASK_STRING = IP_ADDRESS_STRING;
PIP_MASK_STRING = ^IP_MASK_STRING;
PIP_ADDR_STRING = ^IP_ADDR_STRING;
IP_ADDR_STRING =
record
Next: PIP_ADDR_STRING;
IpAddress: IP_ADDRESS_STRING;
IpMask: IP_MASK_STRING;
Context: DWORD;
end
;
PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO;
IP_ADAPTER_INFO =
record
Next: PIP_ADAPTER_INFO;
ComboIndex: DWORD;
AdapterName:
array
[
0..
MAX_ADAPTER_NAME_LENGTH +
3
]
of
Char
;
Description:
array
[
0..
MAX_ADAPTER_DESCRIPTION_LENGTH +
3
]
of
Char
;
AddressLength: UINT;
Address:
array
[
0..
MAX_ADAPTER_ADDRESS_LENGTH -
1
]
of
BYTE
;
Index: DWORD;
Type_: UINT;
DhcpEnabled: UINT;
CurrentIpAddress: PIP_ADDR_STRING;
IpAddressList: IP_ADDR_STRING;
GatewayList: IP_ADDR_STRING;
DhcpServer: IP_ADDR_STRING;
HaveWins: BOOL;
PrimaryWinsServer: IP_ADDR_STRING;
SecondaryWinsServer: IP_ADDR_STRING;
LeaseObtained: time_t;
LeaseExpires: time_t;
end
;
TfrmEnumNetInterfaces =
class
(TForm)
tvInterfaces: TTreeView;
procedure
FormCreate(Sender: TObject);
private
procedure
ReadLanInterfaces;
end
;
function
GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO;
var
pOutBufLen: ULONG): DWORD; stdcall; external IPHelper;
var
frmEnumNetInterfaces: TfrmEnumNetInterfaces;
implementation
{$R *.dfm}
procedure
TfrmEnumNetInterfaces
.
ReadLanInterfaces;
function
MACToStr(
Addr
:
array
of
Byte
; Len:
Integer
):
String
;
var
I:
Integer
;
begin
if
Len =
0
then
Result :=
'00-00-00-00-00-00'
else
begin
Result :=
''
;
for
I :=
0
to
Len -
2
do
Result := Result + IntToHex(
Addr
[i],
2
) +
'-'
;
Result := Result + IntToHex(
Addr
[Len -
1
],
2
);
end
;
end
;
var
InterfaceInfo,
TmpPointer: PIP_ADAPTER_INFO;
Len: ULONG;
AdapterTree, IPAddrTree, DHCPTree, WinsTree: TTreeNode;
begin
if
GetAdaptersInfo(
nil
, Len) = ERROR_BUFFER_OVERFLOW
then
begin
GetMem(InterfaceInfo, Len);
try
if
GetAdaptersInfo(InterfaceInfo, Len) = ERROR_SUCCESS
then
begin
TmpPointer := InterfaceInfo;
repeat
AdapterTree := tvInterfaces
.
Items
.
Add(
nil
,
'Адаптер: '
+ TmpPointer^.Description);
tvInterfaces
.
Items
.
AddChild(AdapterTree,
'МАС: '
+
MACToStr(TmpPointer^.Address, TmpPointer^.AddressLength));
if
Boolean
(TmpPointer^.DhcpEnabled)
then
begin
DHCPTree := tvInterfaces
.
Items
.
AddChild(AdapterTree,
'DHCP: Вкл.'
);
end
else
tvInterfaces
.
Items
.
AddChild(AdapterTree,
'DHCP: Выкл.'
);
if
TmpPointer^.HaveWins
then
begin
WinsTree := tvInterfaces
.
Items
.
AddChild(AdapterTree,
'WINS: Вкл.'
);
end
else
tvInterfaces
.
Items
.
AddChild(AdapterTree,
'WINS: Выкл.'
);
TmpPointer := TmpPointer
.
Next;
until
TmpPointer =
nil
;
end
;
finally
FreeMem(InterfaceInfo);
end
;
end
;
end
;
procedure
TfrmEnumNetInterfaces
.
FormCreate(Sender: TObject);
begin
ReadLanInterfaces;
end
;
end
.