Перечисляем хэндлы сокетов... в чем ошибка?

Тема в разделе "WASM.WIN32", создана пользователем slow, 20 фев 2007.

  1. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    В небезызвестной статье Holy_Father сказано, что

    Перечисляю хэндлы с пом. zwquerysysteminformation, таких не нахожу :dntknw:

    В то же время по netstat -a вижу что есть несколько сокетов в состоянии ESTABLISHED.

    Баг в статье? Или у меня в голове?
     
  2. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    "\Device\Tcp" и "\Device\Udp"
    Посмотреть открытые хендлы можно с помощью ProcessExplorer by Russinovich
     
  3. ldr

    ldr New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    5
    Потому что хендлы сокетов - \Device\Afd. Перезакрывай все \Device\Tcp и \Device\Ip в том же Process Explorer - ничего от этого не изменится.
     
  4. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Дело в том что среди хэндлов типа файл нет ни одного с именем похожим на что-нибудь из приведенного.
     
  5. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Плохо смотрел значит :) У System на моей машине их с полсотни, если не больше. А как ты тип File у хендла определяешь? Номера у типов различаются в разных системах
     
  6. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    не вдаваясь в сугубые подробности, заранее извиняюсь за delphi
    GetInfoTable - взята в каком-то сорце от Ms-Rem
    Код (Text):
    1.    HandlesInfo := GetInfoTable(SystemHandleInformation);
    2.  
    3.    GetMem(us, 1024);
    4.  
    5.    for i := 0 to HandlesInfo^.NumberOfHandles-1 do
    6.    begin
    7.      if HandlesInfo^.Information[i].ObjectTypeNumber = 28 then
    8.      begin
    9.        //--- determine object info
    10.        if zwqueryobject(HandlesInfo^.Information[i].Handle,
    11.                         ObjectNameInformation, us, 1024, addr(ret)) = STATUS_SUCCESS then
    12.        begin
    13.          s := WIdeCharToString(us.Buffer);
    14.          writeln(s);
    15.        end;
    16.      end;
    17.    end;
     
  7. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    У меня ХР. Там OB_TYPE_FILE = 28? В 2к и ниже вроде 23. Но с типом объекта 23 хэндлов нет вообще.
     
  8. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    slow
    Самый простой способ определить - перечислить все хендлы вместе с типом и посмотреть индекс. Более правильный - получить через ZwQueryObject с параметром ObjectTypeInformation имя типа. Полный пример был у Неббета в книжке
     
  9. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Кстати,
    - не канает! Это известный баг, он у ElicZ на его страничке описан, состоящий в том, что таким образом выводятся только те типы которые есть в NT (а их 23 всего).
     
  10. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Хех! А у меня работает!
    Код (Text):
    1. ZwQueryObject (hHandle, 2, &obT, sizeof (obT), 0);
     
  11. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Интересно, однако... по ZwQueryObject некоторые объекты с именем File имеют ObjectTypeNumber = 5 а остальные =28
     
  12. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    slow, лучше проверять не ObjectTypeNumber, а имя типа объекта, т.е. сравнивать строки - не запутаешься, и проще.
     
  13. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Спасибо, это я уже понял.
    Вопрос только в том, как определить среди хэндлов типа файл хэндлы сокетов.
     
  14. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Ну все нужные в нормальной жизни типы в этот список точно входят :)

    Никак не определить. Файл он и в африке файл, а его семантика уже драйвером определяется
     
  15. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Значит, в статье или в переводе ОПЕЧАТКА.

    Попробуем тогда NtQueryDirectoryObject поприменять.
     
  16. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Получаешь дескрипторы типа "File", узнаёшь их имя
    ZwQueryObject, hHandle, 1, ...
    сравниваешь с \Device\Tcp.
    Только все имена, начинающиеся с \Device - в юникоде.
     
  17. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Кароче почему-то большую часть хэндлов не копируется в процесс
    с пом ZwDuplicateObject :dntknw:(

    Код (Text):
    1.  if ZwDuplicateObject(GetCurrentProcess,HandlesInfo^.Information[i].Handle,
    2.                        hProcess, Addr(ObjHandle), DUPLICATE_SAME_ACCESS, 0, 0) = STATUS_SUCCESS then ....
    Может вызываю неправильно?
     
  18. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    все, нашел ошибку... всем спасибо
     
  19. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    у меня неправильны параметры у ZwDuplicateObject, надо так

    Код (Text):
    1. if ZwDuplicateObject(hProcess,HandlesInfo^.Information[i].Handle,
    2.                        INVALID_HANDLE_VALUE, Addr(ObjHandle), DUPLICATE_SAME_ACCESS, 0, 0) = STATUS_SUCCESS
    3.        then begin
    hProcess здесь это хэндл процесса - владельца хэндла HandlesInfo^.Information.Handle
     
  20. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Еще попутный вопрос.

    WSA функции не хотят работать с этим хэндлом :dntknw:( Возвращают ошибку 10038 - т.е. An operation was attempted on something that is not a socket.

    Как получить из этого хэндла хэндл сокета, чтобы работать с wsa функциями?