Si el servicio no está corriendo, solo puedes obtener sus dependencias; lo que dificilmente te dirá qué puertos utiliza con exactitud. Si está corriendo entonces podrás obtener la informacion de los puertos que hace uso; ésto lo obtendrás por PID, por lo cual he creado la función
GetUsedPortsByPID con lo cual podrás cumplir tu misión.
La principal diferencia entre un puerto TCP y uno UDP será la dirección remota, por ello si
Info[Index].Addr = 0 entonces es un puerto UDP.
Nota; aconsejo revisar unidad
TlHelp32;
Código Delphi
[-]type
TGetTable = function(lpTable: Pointer; lpSize: PCardinal; bOrder: LongBool; sin_family, TableClass, Reserved: Cardinal): Cardinal; stdcall;
TInfo = array [0..255] of packed record
Addr, Port: Cardinal;
end;
procedure _Add(var Info: TInfo; var Result: Cardinal; _GetTable: TGetTable; _class, pid, _pid, _port, _addr, _size: Cardinal; _tcp: Boolean);
var
Table, Actually: PCardinal;
Size, Count, Port: Cardinal;
begin
Size := 0;
if _GetTable(nil, @Size, True, 2, _class, 0) = ERROR_INSUFFICIENT_BUFFER then
begin
Table := VirtualAlloc(nil, Size, MEM_COMMIT, PAGE_READWRITE);
_GetTable(Table, @Size, True, 2, _class, 0);
Count := Table^;
Actually := PCardinal(Cardinal(Table) + 4);
while LongBool(Count) do
begin
if PCardinal(Cardinal(Actually) + _pid)^ = pid then
begin
Port := PCardinal(Cardinal(Actually) + _port)^;
if not _tcp then
Info[Result].Addr := 0
else
Info[Result].Addr := PCardinal(Cardinal(Actually) + 12)^;
Info[Result].Port := (Port div 256) + (Port mod 256) * 256;
Inc(Result);
end;
Inc(Actually, _size);
Dec(Count);
end;
VirtualFree(Table, 0, MEM_RELEASE);
end;
end;
function GetUsedPortsByPID(dwProcessID: Cardinal; var Info: TInfo): Cardinal;
var hModule: Cardinal;
begin
Result := 0;
hModule := LoadLibrary('iphlpapi');
_Add(Info, Result, GetProcAddress(hModule, 'GetExtendedTcpTable'), 5, dwProcessID, 20, 8, 4, 6, True);
_Add(Info, Result, GetProcAddress(hModule, 'GetExtendedUdpTable'), 1, dwProcessID, 8, 4, 0, 3, False);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Info: TInfo;
Index: Cardinal;
begin
for Index := 1 to GetUsedPortsByPID(1256, Info) do
ShowMessage(IntToStr(Info[Index - 1].Port));
end;
Saludos