Показать сообщение отдельно

  #28  
Старый 30.11.2008, 03:44
t04
Участник форума
Регистрация: 10.01.2007
Сообщений: 140
С нами: 10175096

Репутация: 105
По умолчанию

опыта особого не имею в программировании классов. перевел приблизительно (урезал не нужное) и очень сомневаюсь в верности функции
Код:
function TRawEthernet.EnumAdapters:TAdapters;
TAdapters в особый класс не хочу переводить, достаточно record;
надо все по минимуму, заранее спасибо за помощь

Код:
unit Unit1;

interface

uses Windows;

type
  NDISPROT_QUERY_BINDING = record
    BindingIndex      : DWORD;  // 0-based binding number
    DeviceNameOffset  : DWORD;  // from start of this struct
    DeviceNameLength  : DWORD;  // in bytes
    DeviceDescrOffset : DWORD;  // from start of this struct
    DeviceDescrLength : DWORD;  // in bytes
  end;

  TAdaptor  = record
    Index : Byte;
    ID    : String;
    Name  : String;
  end;
  TAdapters = record
    Adapter : array [0..10] of TAdaptor;
    Count   : Byte;
  end;

  TRawEthernet = class
    private
      FHandle       : DWORD;
      FDriverOpen   : Boolean;
      FAdapterBound : Boolean;
    public
      property Handle:DWORD read FHandle;
      property IsDriverOpen   : Boolean read FDriverOpen;
      property IsAdapterBound : Boolean read FAdapterBound;
      procedure DriverInit(const adapterID:String);
      function SendData(const Data:PChar):Boolean;
      function CloseDriver:Boolean;
      function EnumAdapters:TAdapters;
  end;

implementation

procedure TRawEthernet.DriverInit(const adapterID:String);
const
  IOCTL_NDISPROT_OPEN_DEVICE    = $12C800;
var
  lpBytesReturned : DWORD;
begin
  FHandle := CreateFile('\\.\\NdisProt',
                        GENERIC_WRITE or GENERIC_READ,
                        0,
                        nil,
                        OPEN_EXISTING,
                        FILE_ATTRIBUTE_NORMAL,
                        0);
  if  (FHandle=INVALID_HANDLE_VALUE)or(FHandle=0) then
    FDriverOpen := false
  else
    FDriverOpen := true;
  FAdapterBound := DeviceIoControl( FHandle,
                                    IOCTL_NDISPROT_OPEN_DEVICE,
                                    @adapterID,
                                    Length(adapterID),
                                    nil,
                                    0,
                                    lpBytesReturned,
                                    nil);
end;

function TRawEthernet.SendData(const Data:PChar):Boolean;
var
  Buf                   : PChar;
  lpNumberOfBytesWritten: DWORD;
begin
  lstrcpy(Buf,Data);
  Result := WriteFile(FHandle,
                      Buf,
                      lstrlen(Buf),
                      lpNumberOfBytesWritten,
                      nil);
end;

function TRawEthernet.CloseDriver:Boolean;
begin
  Result := CloseHandle(FHandle);
end;

function TRawEthernet.EnumAdapters:TAdapters;
const
  IOCTL_NDISPROT_QUERY_BINDING  = $12C80C;
var
  validAdapter: Boolean;
  tmpPos      : Word;
  iBytesRead  : DWORD;
  adapterIndex: Integer;
  ndisprot    : NDISPROT_QUERY_BINDING;
  Buf         : PChar;
  tmpInfo     : String;
begin
  adapterIndex := 0;
  validAdapter := true;
  repeat
    iBytesRead := 0;
    ndisprot.BindingIndex := adapterIndex;
    try
      validAdapter := DeviceIoControl(FHandle,
                                      IOCTL_NDISPROT_QUERY_BINDING,
                                      @ndisprot,
                                      SizeOf(bufsize),//что тут надо поставить?
                                      @Buf,
                                      1024,
                                      iBytesRead,
                                      nil);
    except; end;//после этого вообще бред какой то на мой взгляд
    if ( not validAdapter) then break;
    move(Buf,tmpinfo,iBytesRead);
    Result.Adapter[adapterIndex].Index := adapterIndex;    
    tmpPos := Pos('}',tmpInfo)+1;
    Result.Adapter[adapterIndex].Name := copy(tmpinfo,1,tmpPos);
    delete(tmpinfo,1,tmpPos);
    Result.Adapter[adapterIndex].Name := tmpinfo;
    Inc(adapterIndex);
  until (not validAdapter) or (adapterIndex = 10);
end;

end.

Последний раз редактировалось t04; 30.11.2008 в 03:52..
 
Ответить с цитированием