Zitat von
marabu:
Die Speicherzuordnung sollte zweistufig erfolgen. Beim einem ersten Aufruf wird BufferSize mit SizeOf(PF_INTERFACE_STATS) initialisiert. Das Ergebnis des Aufrufs ist eine korrekte Initialisierung von Buffersize für den zweiten Aufruf.
Ok, dass hatte ich auch so verstanden. Trotzdem danke
Delphi-Quellcode:
procedure FltStats;
Type
TFilter = Array[0..15] of PF_FILTER_STATS;
PFilter = ^TFilter;
var bufSize : DWord;
dwResult : DWord;
ppfStats : PPF_INTERFACE_STATS;
i : Integer;
Filter : PFilter;
begin
bufSize := SizeOf(PF_INTERFACE_STATS);
GetMem(ppfStats, bufSize);
try
dwResult := PfGetInterfaceStatistics(hIf, ppfStats, @bufSize, false);
case dwResult of
ERROR_INSUFFICIENT_BUFFER :
begin
FreeMem(ppfStats);
GetMem(ppfStats, bufSize);
dwResult := PfGetInterfaceStatistics(hIf, ppfStats, @bufSize, false);
if dwResult <> NO_ERROR then
Exit;
end;
ERROR_INVALID_HANDLE : Exit;
end;
Filter := @ppfStats^.filterinfo;
for i:= 0 to Length(Filter^)-1 do
ShowMessage( 'Filter (' + IntToStr(Succ(i)) + ')'#13#10 +
' SourcePort: ' + IntToStr(Filter[i].info.wSrcPort) + #13#10+
' DestinationPort: ' + IntToStr(Filter[i].info.wDstPort));
finally
FreeMem(ppfStats);
end;
end;
Hier hab ich eigentlich nichts anderes gemacht, als wie im 1. Posting von mir. Die MessageBox
gibt mir jedenfalls für die Filter die auch existieren, die Korrekten Infos. Mein Problem ist
anscheinend genau das:
Zitat von
marabu:
Der Zugriff auf die einzelnen Filter erfolgt dann einfach über Zeiger-Arithmetik.
Hat jemand dafür eventuell ein Beispiel? Es reicht eine Zeile, z.B. wie komme ich an die Infos für den 2. Filter?
(Das muss doch auch irgendwie dynamisch gehen, also OHNE das ich vorher ein array mit fester länge definiere?!)