
30.11.2008, 03:44
|
|
Участник форума
Регистрация: 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..
|
|
|