Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2010, 16:04   #1
Мрак
 
Регистрация: 01.05.2007
Сообщений: 3
По умолчанию Проблема: GetExtendedTcpTable + TCP_TABLE_OWNER_MODULE_ALL

Всем огромный привет.

Второй день уже мучаюсь, не могу решить проблему.
Суть в том что мне нужно получить список открытых портов, источник, получатель, процесс и т.д.

Всё это отлично делает функция GetExtendedTcpTable.
Но вот тут проблема, что GetExtendedTcpTable с table_class TCP_TABLE_OWNER_PID_ALL работает как надо, НО GetExtendedTcpTable с table_class TCP_TABLE_OWNER_MODULE_ALL вообще не работает. Уже много раз гугл перелистал, нету примера реализации на Delphi.

Кратко что да как.
Структура:
Код:
PMIB_TCPROW_OWNER_MODULE = ^MIB_TCPROW_OWNER_MODULE;
MIB_TCPROW_OWNER_MODULE = packed record
  dwState: DWORD;
  dwLocalAddr: DWORD;
  dwLocalPort: DWORD;
  dwRemoteAddr: DWORD;
  dwRemotePort: DWORD;
  dwOwningPid: DWORD;
  liCreateTimestamp: LARGE_INTEGER;
  OwningModuleInfo : array[0..0] of UInt64;
end;
PMIB_TCPTABLE_OWNER_MODULE = ^MIB_TCPTABLE_OWNER_MODULE;
MIB_TCPTABLE_OWNER_MODULE = packed record
  dwNumEntries:  DWORD;
  table: array [0..0] of MIB_TCPROW_OWNER_MODULE;
end;
Вызов:
Код:
var
pTcpTable: PMIB_TCPTABLE_OWNER_MODULE;
dwSize: DWORD;
Res: Dword;

Res := GetExtendedTcpTable(pTcpTable, @dwSize, False, AF_INET, TCP_TABLE_OWNER_MODULE_ALL, 0);
    If (Res = ERROR_INSUFFICIENT_BUFFER) Then Begin
    pTcpTable := GetMemory(dwSize);
    //ZeroMemory(pTcpTable, dwSize);
      Res := GetExtendedTcpTable(pTcpTable, @dwSize, False, AF_INET, TCP_TABLE_OWNER_MODULE_ALL, 0);
    end;
Но данные возвращает вообще не верные, тот же первый параметр State он весь не правилен, должен быть от 1 до 12, но при TCP_TABLE_OWNER_MODULE_ALL выше код, работает отлично.
Мрак вне форума Ответить с цитированием
Старый 15.08.2011, 09:13   #2
Некий_ИТшник
Новичок
Джуниор
 
Регистрация: 11.07.2011
Сообщений: 1
По умолчанию ну у меня работает так

Код:
type
PMIB_TCPROW_OWNER_PID = ^_MIB_TCPROW_OWNER_PID;
_MIB_TCPROW_OWNER_PID =  record
  dwState: DWORD;
  dwLocalAddr: DWORD;
  dwLocalPort: DWORD;
  dwRemoteAddr: DWORD;
  dwRemotePort: DWORD;
  dwOwningPid: DWORD;

end;
PMIB_TCPTABLE_OWNER_PID = ^_MIB_TCPTABLE_OWNER_PID;
_MIB_TCPTABLE_OWNER_PID = record
  dwNumEntries:  DWORD;
  table: array [0..0] of _MIB_TCPROW_OWNER_PID;
end;
 PTCP_TABLE_CLASS = ^TCP_TABLE_CLASS;

  TCP_TABLE_CLASS =
    (TCP_TABLE_BASIC_LISTENER,
    TCP_TABLE_BASIC_CONNECTIONS,
    TCP_TABLE_BASIC_ALL,
    TCP_TABLE_OWNER_PID_LISTENER,
    TCP_TABLE_OWNER_PID_CONNECTIONS,
    TCP_TABLE_OWNER_PID_ALL,
    TCP_TABLE_OWNER_MODULE_LISTENER,
    TCP_TABLE_OWNER_MODULE_CONNECTIONS,
    TCP_TABLE_OWNER_MODULE_ALL);
_____________________________________________________________

const
  MIB_TCP_STATE_CLOSED = 1; 
  MIB_TCP_STATE_LISTEN = 2; 
  MIB_TCP_STATE_SYN_SENT = 3; 
  MIB_TCP_STATE_SYN_RCVD = 4; 
  MIB_TCP_STATE_ESTAB = 5;
  MIB_TCP_STATE_FIN_WAIT1 = 6; 
  MIB_TCP_STATE_FIN_WAIT2 = 7; 
  MIB_TCP_STATE_CLOSE_WAIT = 8; 
  MIB_TCP_STATE_CLOSING = 9; 
  MIB_TCP_STATE_LAST_ACK = 10; 
  MIB_TCP_STATE_TIME_WAIT = 11; 
  MIB_TCP_STATE_DELETE_TCB = 12;
  type
  PVOID = Pointer;
var
  Form1: TForm1;
  function GetExtendedTcpTable(pTcpTable: PVOID; pdwSize: PDWORD;
  bOrder: BOOL; ulAf: ULONG; TableClass: TCP_TABLE_CLASS;
  Reserved: ULONG): DWORD; stdcall; external 'Iphlpapi.dll';
   function StateToStateStr(State: DWORD): string;


---------------------------------------------------------------------
procedure TForm1.GetExConnections;
var
pTcpTable: PMIB_TCPTABLE_OWNER_PID;
  MIB_TCPROW:_MIB_TCPROW_OWNER_PID;
  dwSize: DWORD;
  Res: DWORD;
  i: Integer;
  hl:Cardinal;
  M1: hmodule; //äåñêðèïòîð ìîäóëÿ
NameProc1: array[0..max_path] of char;
begin
pTcpTable := nil;
  dwSize := 0;
  Res := GetExtendedTcpTable(pTcpTable, @dwSize, False, AF_INET,
    TCP_TABLE_OWNER_PID_all, 0);
  if Res = ERROR_INVALID_PARAMETER then
    raise Exception.Create('ERROR_INVALID_PARAMETER');
  if Res = ERROR_INSUFFICIENT_BUFFER then
  begin
   pTcpTable := GetMemory(dwSize);
 Zeromemory(pTcpTable, dwSize);
     try
      if GetExtendedTcpTable(pTcpTable, @dwSize, False, AF_INET,
        TCP_TABLE_OWNER_PID_all, 0) = NO_ERROR then
      begin
        for i := 0 to pTcpTable^.dwNumEntries - 1 do
        begin
          MIB_TCPROW := pTcpTable^.Table[i];
                      hl:=windows.OpenProcess(windows.PROCESS_QUERY_INFORMATION or windows.PROCESS_VM_READ or PROCESS_DUP_HANDLE,false, mib_tcprow.dwOwningPid);
         if hl>0 then  begin
        EnumProcessModules(hl, @M1, 4, cM);
        GetModuleFileNameEx(hl, M1, NameProc1, sizeof(NameProc1));

         windows.
    listbox4.Items.Add(ExtractFileName(string(NameProc1)));
                        end
    else listbox4.Items.Add('Íåèçâåñòíûé ñèñòåìíûé ïðîöåññ');
    closehandle(hl);
        listbox5.Items.Add(inttostr(ntohs(MIB_TCPROW.dwLocalPort))+' - TCP');
    listbox7.Items.Add(inttostr(mib_tcprow.dwState) + statetostatestr(mib_tcprow.dwState));
     listbox7.Perform( LB_SETHORIZONTALEXTENT, 300, 0 );
    listbox6.Items.Add('Àäðåññ:'+inet_ntoa(in_addr(mib_tcprow.dwRemoteAddr))+'Ïîðò:'+inttostr(ntohs(MIB_TCPROW.dwRemotePort)));
      listbox6.Perform( LB_SETHORIZONTALEXTENT, 200, 0 );
        end;
        end;
    finally
      FreeMemory(pTcpTable);
    end
  end;
end;
У нас принято оформлять код специальным тегом. Кнопка #. Модератор

Последний раз редактировалось dr.Chas; 18.08.2011 в 22:16.
Некий_ИТшник вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37