AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Type-Deklaration PF_INTERFACE_STATS (MSDN-PlattformSDK: RAS)
Thema durchsuchen
Ansicht
Themen-Optionen

Type-Deklaration PF_INTERFACE_STATS (MSDN-PlattformSDK: RAS)

Ein Thema von x000x · begonnen am 19. Jun 2005 · letzter Beitrag vom 19. Jun 2005
 
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, 14: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz