카테고리 없음

[네트웍/인터넷] 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.