Hallo,
ich "spiele" etwas mit Packetfiltern (IPHLPAPI.DLL) herum und habe jetzt ein evtl. kleineres Problem.
Erstmal die Vorgeschichte:
Es gibt in der
IPHLPAPI.DLL die function "
PfGetInterfaceStatistics"
Delphi-Quellcode:
function PfGetInterfaceStatistics(
pInterface: INTERFACE_HANDLE;
ppfStats: PPF_INTERFACE_STATS;
pdwBufferSize: PDWORD;
fResetCounters: BOOL): DWORD;
stdcall; external IPHLPAPI name '_PfGetInterfaceStatistics@16';
die mir einen Zeiger auf ein Struktur "
PF_INTERFACE_STATS" liefert. Laut
MSDN ist diese so deklariert:
Delphi-Quellcode:
...
typedef struct _PF_INTERFACE_STATS {
PVOID pvDriverContext;
DWORD dwFlags;
DWORD dwInDrops;
DWORD dwOutDrops;
PFFORWARD_ACTION eaInAction;
PFFORWARD_ACTION eaOutAction;
DWORD dwNumInFilters;
DWORD dwNumOutFilters;
DWORD dwFrag;
DWORD dwSpoof;
DWORD dwReserved1;
DWORD dwReserved2;
LARGE_INTEGER liSYN;
LARGE_INTEGER liTotalLogged;
DWORD dwLostLogEntries;
PF_FILTER_STATS FilterInfo[1];
} PF_INTERFACE_STATS,
*PPF_INTERFACE_STATS;
...
Das ganze sollte in Delphi wohl so aussehen:
Delphi-Quellcode:
...
type
_PF_FILTER_DESCRIPTOR = packed record
dwFilterFlags: DWORD;
dwRule: DWORD;
pfatType: PFADDRESSTYPE;
SrcAddr: PByteArray;
SrcMask: PByteArray;
DstAddr: PByteArray;
DstMask: PByteArray;
dwProtocol: DWORD;
fLateBound: DWORD;
wSrcPort: Word;
wDstPort: Word;
wSrcPortHighRange: Word;
wDstPortHighRange: Word;
end;
PF_FILTER_DESCRIPTOR = _PF_FILTER_DESCRIPTOR;
PPF_FILTER_DESCRIPTOR = ^PF_FILTER_DESCRIPTOR;
type
_PF_FILTER_STATS = packed record
dwNumPacketsFiltered:DWORD;
info: PF_FILTER_DESCRIPTOR;
end;
PF_FILTER_STATS = _PF_FILTER_STATS;
PPF_FILTER_STATS = ^PF_FILTER_STATS;
type
_PF_INTERFACE_STATS = packed record
pvDriverContext: Pointer;
dwFlags: DWORD;
dwInDrops: DWORD;
dwOutDrops: DWORD;
eaInAction: PFFORWARD_ACTION;
eaOutAction: PFFORWARD_ACTION;
dwNumInFilters: DWORD;
dwNumOutFilters: DWORD;
dwFrag: DWORD;
dwSpoof: DWORD;
dwReserved1: DWORD;
dwReserved2: DWORD;
liSyn: LARGE_INTEGER;
liTotalLogged: LARGE_INTEGER;
dwLostLogEntries: DWORD;
// hier liegt mein Problem...
FilterInfo: Array[0..0] of PF_FILTER_STATS;
end;
PF_INTERFACE_STATS = _PF_INTERFACE_STATS;
PPF_INTERFACE_STATS = ^PF_INTERFACE_STATS;
...
Die Funktion (
PfGetInterfaceStatistics) ansicht tut auch das was sie soll, wenn ich z.B. die Anzahl der Output Filter
für ein Interface haben will, bekomme ich sie über:
Delphi-Quellcode:
...
var PStats : PPF_INTERFACE_STATS;
...
begin
...
// Output Filter
ShowMessage('dwNumOutFilter: ' + IntToStr(Stats^.dwNumOutFilters));
// Hier liegt mein Problem
ShowMessage('SrcPort: ' + IntToStr(Stats^.FilterInfo[0].info.wSrcPort));
end;
Der Code oben funktioniert, nur bekomme ich in FilterInfo nur die Infos über den ersten Filter, es sind aber mehrere
vorhanden!
Laut
MSDN gibt es in
Stats^.FilterInfo für jeden Filter ein Element. Wenn ich aber z.B.
Stats^.FilterInfo[1].info.wSrcPort
abfrage, bekomme ich nur Müll. Ich vermute mal, dass es an der Deklaration des Typs liegt, denn wenn ich einfach
Delphi-Quellcode:
...
dwLostLogEntries: DWORD;
// hier liegt mein Problem...
// FilterInfo: Array[0..0] of PF_FILTER_STATS;
FilterInfo: Array[0..15] of PF_FILTER_STATS;
end;
PF_INTERFACE_STATS = _PF_INTERFACE_STATS;
...
definiere, stehen in
Stats^.FilterInfo[1].*** die Informationen zum 2. Filter, in
.FilterInfo[2] zum 3. usw.
Jetzt meine Frage:
Wie muss ich nun den Type deklarieren, um zur Laufzeit die Infos zu
n Filter abzufragen?
Ein
FilterInfo: Array[0..15] of PF_FILTER_STATS; würde mir ja auch nur die Infos der
ersten 16 Filter bringen, der User könnte aber mehr Filter anlegen.
Also schonmal vielen Dank für Eure Antwort(en) ...