카테고리 없음
[네트웍/인터넷] IP Helper API 를 이용한 네트워크 카드 Enable/Disable 시키기
쇼핑스크래퍼3
2023. 8. 28. 08:31
// 이 프로그램을 실행해도 윈도우즈의 네트워크 연결 등록정보에는 계속 연결된것으로 보이지만
// 실제 traffic 발생 여부를 관찰하면 Enable/Disable 되는것이 보임
// IPHLPAPI.DLL 의 Delphi 헤더파일은 JEDI 에서 받을 수 있습니다
// ftp://delphi-jedi.org/api/IPHlpAPI.zip
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,
IpHlpApi,
IpIfConst,
IpRtrMib;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure ChangeIfStatus(Row: TMibIfRow; Status: DWORD);
begin
Row.dwAdminStatus:=Status;
SetIfEntry(Row);
end;
// Disable
procedure TForm1.Button1Click(Sender: TObject);
var
MibRow: TMibIfRow;
IntfTable: PMibIfTable;
Size: DWORD;
I: Integer;
begin
Size := 0;
if GetIfTable(nil, Size, True) <> ERROR_INSUFFICIENT_BUFFER then Exit;
IntfTable := AllocMem(Size);
try
if GetIfTable(IntfTable, Size, True) = NO_ERROR then
begin
for I := 0 to IntfTable^.dwNumEntries - 1 do
begin
{$R-}MibRow := IntfTable.Table[I];{$R+}
if (MibRow.dwType <> MIB_IF_TYPE_ETHERNET) or // 이더넷이 아니면 제외
(MibRow.dwOperStatus < MIB_IF_OPER_STATUS_CONNECTED) then // 현재 동작중이 아니면 제외
Continue;
ChangeIfStatus(MibRow, MIB_IF_ADMIN_STATUS_DOWN); // 다운시킨다
end;
end;
finally
FreeMem(IntfTable);
end;
end;
// Enable
procedure TForm1.Button2Click(Sender: TObject);
var
MibRow: TMibIfRow;
IntfTable: PMibIfTable;
Size: DWORD;
I: Integer;
begin
Size := 0;
if GetIfTable(nil, Size, True) <> ERROR_INSUFFICIENT_BUFFER then Exit;
IntfTable := AllocMem(Size);
try
if GetIfTable(IntfTable, Size, True) = NO_ERROR then
begin
for I := 0 to IntfTable^.dwNumEntries - 1 do
begin
{$R-}MibRow := IntfTable.Table[I];{$R+}
if (MibRow.dwType <> MIB_IF_TYPE_ETHERNET) or // 이더넷이 아니면 제외
(MibRow.dwOperStatus >= MIB_IF_OPER_STATUS_CONNECTED) then // 현재 동작중이면 제외
Continue;
ChangeIfStatus(MibRow, MIB_IF_ADMIN_STATUS_UP); // 업시킨다
end;
end;
finally
FreeMem(IntfTable);
end;
end;
end.