![]() |
GetExtendedTcpTable
Hallöchen..
Ich möchte alle Verbindungen (zunächst erstmal nur TCP) und die dazugehörige PID ermitteln. Das habe ich bis jetzt
Delphi-Quellcode:
pTcpTable.dwNumEntries ist immer 0.
program Endpoints;
{$APPTYPE CONSOLE} uses SysUtils, Windows; const ANY_SIZE = 1; type MIB_TCPROW_OWNER_PID = packed record dwState: DWORD; dwLocalAddr: DWORD; dwLocalPort: DWORD; dwRemoteAddr: DWORD; dwRemotePort: DWORD; dwOwningPid: DWORD; end; PMIB_TCPROW_OWNER_PID = MIB_TCPROW_OWNER_PID; type MIB_TCPTABLE_OWNER_PID = packed record dwNumEntries: DWord; table: array [0..ANY_SIZE - 1] of MIB_TCPROW_OWNER_PID ; end; PMIB_TCPTABLE_OWNER_PID = MIB_TCPTABLE_OWNER_PID; const TCP_TABLE_OWNER_PID_ALL = 5; AF_INET = 0; type TCP_TABLE_CLASS = Integer; ULONG = Integer; function GetExtendedTcpTable(pTcpTable: Pointer; dwSize: PDWORD; bOrder: BOOL; lAf: ULONG; TableClass: TCP_TABLE_CLASS; Reserved: ULONG): DWord; stdcall; external 'iphlpapi.dll' name 'GetExtendedTcpTable'; // TCP Table + PID var pTcpTable: PMIB_TCPTABLE_OWNER_PID; dwSize: PDWord; Res: Dword; I: Integer; begin Res := GetExtendedTcpTable(@pTcpTable, dwSize, False, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0); // False = unsortiert for I := 0 to pTcpTable.dwNumEntries do writeln( IntToStr(pTcpTable.table[I].dwOwningPid) ); end. Ich vermute den Fehler in den Deklarationen kann das sein?? MSDN-Link: ![]() |
Re: GetExtendedTcpTable
siehe Kommentare
Delphi-Quellcode:
type
// hier fehlt das ^ vor dem MIB_TCPROW_OWNER_PID PMIB_TCPROW_OWNER_PID = ^MIB_TCPROW_OWNER_PID; PMIB_TCPTABLE_OWNER_PID = ^MIB_TCPTABLE_OWNER_PID; Const AF_INET = 2; // 2, nicht 0, wäre in WinSock definiert var pTcpTable: PMIB_TCPTABLE_OWNER_PID; dwSize: DWord; // DWORD reicht, kein Pointer, sonst müsste man ja noch selber Platz dafür allozieren Res: Dword; I: Integer; begin pTcpTable:=Nil; Try // hier ist ein @ zuviel, pTcpTable ist ja schon Pointer... dafür fehlt eines vor dwSize... // weiter erwartet das API, dass du bereits Speicher alloziert hast, bzw. üblicherweise macht man das so: dwSize:=0; Res := GetExtendedTcpTable(pTcpTable, @dwSize, False, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0); If (Res = ERROR_INSUFFICIENT_BUFFER) Then Begin GetMem(pTCPTable,dwSize); // das API hat die "gewünschte" Grösse gesetzt Res := GetExtendedTcpTable(pTcpTable, @dwSize, False, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0); end; If not (Res = NO_ERROR) Then raiseLastOSError(); // Error-Handling // dies ruft nach Access Violation 0..n sind n+1 Elemente, hat aber nur n => 1..n oder 0..n-1 for I := 1 to pTcpTable.dwNumEntries do writeln( IntToStr(pTcpTable.table[I - 1].dwOwningPid) ); Finally If (pTcpTable <> Nil) Then FreeMem(pTcpTable); end; end. |
Re: GetExtendedTcpTable
Zitat:
Der Fehler ist noch an einer anderen (mir unbekannten) Stelle. Bei mir kommt der Error 87 ("Falscher Paramter"). Hast du deinen Code mal ausprobiert Basilikum? |
Re: GetExtendedTcpTable
Zitat:
Zitat:
Zitat:
|
Re: GetExtendedTcpTable
Zitat:
Delphi-Quellcode:
Ich denke es liegt eher an den Werten. Leider finde ich weder im Plattform-SDK noch im Web etwas dazu.
const
ANY_SIZE = 1; type MIB_TCPROW_OWNER_PID = packed record dwState: DWORD; dwLocalAddr: DWORD; dwLocalPort: DWORD; dwRemoteAddr: DWORD; dwRemotePort: DWORD; dwOwningPid: DWORD; end; PMIB_TCPROW_OWNER_PID = ^MIB_TCPROW_OWNER_PID; type MIB_TCPTABLE_OWNER_PID = packed record dwNumEntries: DWord; table: array [0..ANY_SIZE - 1] of MIB_TCPROW_OWNER_PID ; end; PMIB_TCPTABLE_OWNER_PID = ^MIB_TCPTABLE_OWNER_PID; const TCP_TABLE_OWNER_PID_ALL = 5; AF_INET = 0; type TCP_TABLE_CLASS = Integer; ULONG = Longword; function GetExtendedTcpTable(pTcpTable: Pointer; dwSize: PDWORD; bOrder: BOOL; lAf: ULONG; TableClass: TCP_TABLE_CLASS; Reserved: ULONG): DWord; stdcall; external 'iphlpapi.dll' name 'GetExtendedTcpTable'; // TCP Table + PID var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var pTcpTable: PMIB_TCPTABLE_OWNER_PID; dwSize: PDWord; Res: Dword; I: Integer; begin New(pTcpTable); New(dwSize); dwSize^:=SizeOf(MIB_TCPTABLE_OWNER_PID); Res := GetExtendedTcpTable(pTcpTable, dwSize, False, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0); // False = unsortiert if Res<>NO_ERROR then raise Exception.Create(SysErrorMessage(Res)); for I := 0 to pTcpTable.dwNumEntries do writeln( IntToStr(pTcpTable.table[I].dwOwningPid) ); dispose(dwSize); dispose(pTcpTable); end; end. |
Re: GetExtendedTcpTable
@chaosben: siehe oben, jetzt auch wirklich komplett getestet... :-)
AF_INET müsste 2 sein, nicht 0 (WinSock) |
Re: GetExtendedTcpTable
Zitat:
Und damit müsste auch das Problem des Thread-Autors gelöst sein. |
Re: GetExtendedTcpTable
Das sieht schon mal sehr gut aus. Was soll ich noch sagen....!? Danke Jungs! :zwinker:
|
Re: GetExtendedTcpTable
Zitat:
Delphi-Quellcode:
"table" ist als Array deklariert, damit man alle Verbindungen ansprechen kann, allerdings stimmt die Größe nicht immer, sondern nur in dem Fall, dass es exakt eine TCP-Verbindung gibt.
MIB_TCPTABLE_OWNER_PID = packed record
dwNumEntries: DWord; table: array [0..ANY_SIZE - 1] of MIB_TCPROW_OWNER_PID ; end; Um den Zugriff dynamisch zu gestalten wird der Array an der Stelle dynamsich erzeugt, d.h. es können (theoretisch) 0 bis N Element vorhanden sein. Unter C ist das Ganze kein Problem, da es dort keine Informationen über Array-Größen gibt und man über "pTcpTable.dwNumEntries" weiss, wie viele Element der Array hat. Unter Delphi geht es nicht so einfach. Eine Möglichkeit ist es, sich einen typisierten Pointer ("PMIB_TCPROW_OWNER_PID") lokal anzulegen und durch den Speicher zu wandern, bis man alle Elemente erhalten hat.
Delphi-Quellcode:
Eine andere Möglichkeit wäre es, selbst einen danamischen Array anzulegen mit "pTcpTable.dwNumEntries" Elementen und den erhaltenen Array dort hinein zu kopieren.
var
pTable: PMIB_TCPROW_OWNER_PID; i: DWORD; begin ... pTable := @pTcpTable.Table; i := 0; // i dient als Index while (i <= pTcpTable.dwNumEntries) do begin ... Inc(i); Inc(pTable); // typisierte Pointer werden direkt um "sizeof(Type)" Byte weitergesetzt end; Array wieder freigeben! :) ("Finalize(MeinArray);") Dann kann der Zugriff wie gewohnt über eine For-Schleife erfolgen. :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz