Einzelnen Beitrag anzeigen

Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#1

Type-Deklaration PF_INTERFACE_STATS (MSDN-PlattformSDK: RAS)

  Alt 19. Jun 2005, 15:02
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) ...
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat