Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Salat im UDPTable (https://www.delphipraxis.net/83532-salat-im-udptable.html)

Harry M. 4. Jan 2007 08:36


Salat im UDPTable
 
Morgen's :)

Ich versuche den UDP Table zu holen. Die Anzahl der Verbindungen ist richtig (stimmt mit TCPView von Sysinternals überein) Aber der Rest ist Salat :gruebel:

Delphi-Quellcode:
program UDP;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Windows,
  WinSock;

type
  TTableOwnerPID = record
    PID: Cardinal;
    Protocol: string[3];
    localIP: DWORD;
    localPort: DWORD;
    remoteIP: DWORD;
    remotePort: DWORD;
    Status: DWORD;
    end;

type
  ATableOwnerPID = Array of TTableOwnerPID;

type
  UDP_TABLE_CLASS = Integer;
  ULONG = Integer;

const
  ANY_SIZE = 1;
  IpHlpApiLib = 'iphlpapi.dll';
  UDP_TABLE_OWNER_PID_ALL = 2;

type
  MIB_UDPROW_OWNER_PID = packed record
    dwState: DWORD;
    dwLocalAddr: DWORD;
    dwLocalPort: DWORD;
    dwRemoteAddr: DWORD;
    dwRemotePort: DWORD;
    dwOwningPid: DWORD;
    end;
  PMIB_UDPROW_OWNER_PID = ^MIB_UDPROW_OWNER_PID;

type
  MIB_UDPTABLE_OWNER_PID = packed record
    dwNumEntries: DWord;
    table: array [0..ANY_SIZE - 1] of MIB_UDPROW_OWNER_PID ;
    end;
  PMIB_UDPTABLE_OWNER_PID = ^MIB_UDPTABLE_OWNER_PID;

type
  TGetExtendedUdpTable = function (pUpdTable: Pointer; dwSize: PDWORD; bOrder: BOOL;
    lAf: ULONG; TableClass: UDP_TABLE_CLASS; Reserved: ULONG): DWord; stdcall;

var
  pGetExtendedUdpTable: TGetExtendedUdpTable;
  hLib: Cardinal;

function LoadAPI: Boolean;
begin
  Result := False;
  hLib := LoadLibrary(IpHlpApiLib);

  if hLib <> 0 then begin
    @pGetExtendedUdpTable := GetProcAddress(hLib, 'GetExtendedUdpTable');
    end;

  Result := (Assigned(pGetExtendedUdpTable));
end;

procedure UnLoadAPI;
begin
  if Assigned(pGetExtendedUdpTable) then
    pGetExtendedUdpTable := nil;

  if hLib <> 0 then
    FreeLibrary(hLib);
end;

function GetUPDTable: ATableOwnerPID;
var
  pUdpTable: PMIB_UDPTABLE_OWNER_PID;
  dwSize: DWord;
  Res: Dword;
  I: Integer;
begin
  SetLength(Result, 0);
  pUdpTable:=Nil;
  Try
    dwSize:=0;
    Res := pGetExtendedUdpTable(pUdpTable, @dwSize, True, AF_INET, UDP_TABLE_OWNER_PID_ALL, 0);
    If (Res = ERROR_INSUFFICIENT_BUFFER) Then Begin
      GetMem(pUdpTable,dwSize);
      Res := pGetExtendedUdpTable(pUdpTable, @dwSize, True, AF_INET, UDP_TABLE_OWNER_PID_ALL, 0);
    end;

    if Res = NO_ERROR then begin
      SetLength(Result, pUdpTable.dwNumEntries); // die anzahl der ermittelten einträge stimmt
      for I := 0 to pUdpTable.dwNumEntries-1 do begin
        Result[I].Protocol := 'UDP';
        Result[I].PID := pUdpTable.table[I].dwOwningPid; // aber ab hier steht salat
        Result[I].localIP := pUdpTable.table[I].dwLocalAddr;
        Result[I].localPort := pUdpTable.table[I].dwLocalPort;
        Result[I].remoteIP := 0; // pUdpTable.table[I].dwRemoteAddr;
        Result[I].remotePort := 0; // pUdpTable.table[I].dwRemotePort;
        Result[I].Status := 99; // pUdpTable.table[I].dwState;
        end; // end of for
      end; // end of Res = NO_ERROR
  finally
    If (pUdpTable <> Nil) Then FreeMem(pUdpTable);
  end;
end;

function GetAddress(AIpAdress, APort: DWord): String;
var
  IP: in_addr;
begin
  IP.S_addr := AIpAdress;
  Result := inet_ntoa(IP) + ':' + IntToStr(htons(APort));
end;

var
  UDPArray: ATableOwnerPID;
  I: Integer;
  ResLn: String;
begin
  if LoadApi then begin

    UDPArray := GetUPDTable;
    for I := Low(UDPArray) to High(UDPArray) do begin
      ResLn := IntToStr(UDPArray[I].PID);
      ResLn := ResLn + StringOfchar(' ',5) + UDPArray[I].Protocol;
      ResLn := ResLn + StringOfchar(' ',5) + GetAddress(UDPArray[I].localIP, UDPArray[I].localPort);
      ResLn := ResLn + StringOfchar(' ',5) + GetAddress(UDPArray[I].remoteIP, UDPArray[I].remotePort);

      writeln( ResLn );
      end;

    UnloadApi;
    end else begin
      writeln('Kein API Support.');
      end;
end.

Klaus01 4. Jan 2007 13:29

Re: Salat im UDPTable
 
Delphi-Quellcode:
PMIB_UDPROW_OWNER_PID = ^MIB_UDPROW_OWNER_PID;

pUdpTable: PMIB_UDPTABLE_OWNER_PID;
Könnte es damit zusammenhängen, das pUpdTable ein Pointer auf MIB_...
ist und pUpdTable nie instantiiert wurde. (pUdpTable:=Nil;)

Grüße
Klaus

Harry M. 4. Jan 2007 13:46

Re: Salat im UDPTable
 
Hallo Klaus,

meiner Auffassung wird pUdpTable durch die Funktion GetExtendedUdpTable inizalisiert.
Die Anzahl der Einträge ist ja auch korrekt.

Klaus01 4. Jan 2007 13:57

Re: Salat im UDPTable
 
Da kannst Du recht haben.
Sag einmal, welche DLL brauch ich noch neben der iphlpapi.dll um das Programm ausführen zu können.
Ich bekomme immer eine Fehlermeldung das irgendwas mit ipv6 in der ntdll.dll nicht gefunden wird.

Grüße
Klaus

Daniel G 4. Jan 2007 14:01

Re: Salat im UDPTable
 
Liste der Anhänge anzeigen (Anzahl: 1)
Du brauchst auf jeden Fall Windows XP... :wink:

@Harry: Ich habe vor längerer Zeit auch mal mit den Extended - Geschichten herumgespielt... Irgendwo müsste der Code noch herumflattern.....

//edit:

So, da isses. Hoffentlich hilft's... :wink:

Harry M. 4. Jan 2007 14:56

Re: Salat im UDPTable
 
@Daniel G:
Das sieht schonmal sehr sehr gut aus.:thumb:
Ich check das mal durch und meld mich dann wieder!

@Klaus01;
Der Code rennt erst erst ab XP Sp 2 oder höher (2003/Vista).
Welches Os/Sp hast Du denn drauf und wie bitte, ist genau nochmal die Fehlermeldung.

Klaus01 4. Jan 2007 15:05

Re: Salat im UDPTable
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier w2k und zuhause XP mit allen Patchen.
Werde es heute abend einmal zuhause testen.

Fehlermeldung habe ich angehängt.

Grüße
Klaus

Harry M. 4. Jan 2007 15:29

Re: Salat im UDPTable
 
@Klaus: Danke. Kann ich dann künftig berücksitigen.

@Daniel G: Die Unit ist Klasse! Das bekomm ich jetzte zum laufen! Danke vielmals.
PS: Dein Net-Mon hab ich auch gleich "gesavt" :mrgreen:

Daniel G 4. Jan 2007 16:43

Re: Salat im UDPTable
 
Zitat:

Zitat von Harry M.
@Daniel G: Die Unit ist Klasse! Das bekomm ich jetzte zum laufen! Danke vielmals.
PS: Dein Net-Mon hab ich auch gleich "gesavt" :mrgreen:

Gern geschehen. :wink:

Klaus01 4. Jan 2007 20:50

Re: Salat im UDPTable
 
Guten Abend,


Code:
typedef struct {
  DWORD dwLocalAddr;
  DWORD dwLocalPort;
  DWORD dwOwningPid;
} MIB_UDPROW_OWNER_PID,
 *PMIB_UDPROW_OWNER_PID;
Quelle: -> http://msdn2.microsoft.com/en-us/library/aa366928.aspx

Deine Auslegung:
Delphi-Quellcode:
  MIB_UDPROW_OWNER_PID = packed record
    dwState: DWORD;
    dwLocalAddr: DWORD;
    dwLocalPort: DWORD;
    dwRemoteAddr: DWORD;
    dwRemotePort: DWORD;
    dwOwningPid: DWORD;
    end;
Aber sollte es nicht eher so ausschauen?
Delphi-Quellcode:
  MIB_UDPROW_OWNER_PID = packed record
  //  dwState: DWORD;
    dwLocalAddr: DWORD;
    dwLocalPort: DWORD;
   // dwRemoteAddr: DWORD;
   // dwRemotePort: DWORD;
    dwOwningPid: DWORD;
    end;
This table entry is specifically returned by a call to GetExtendedUdpTable
with the TableClass parameter set to UDP_TABLE_OWNER_PID and the ulAf parameter set to AF_INET.

Und so rufst Du GetExtendedUdpTable auf:

Delphi-Quellcode:
Res := pGetExtendedUdpTable(pUdpTable, @dwSize, True, AF_INET, UDP_TABLE_OWNER_PID_ALL, 0)
Ich hoffe nun, daß ich nicht allzuviel Mumpitz geschrieben habe.

Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:47 Uhr.
Seite 1 von 2  1 2      

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