Сокет из ядра

Тема в разделе "WASM.NT.KERNEL", создана пользователем katrus, 29 янв 2009.

  1. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Сложно ли открыть сокет из драйвера (tcp или udp)? Есть ли более менее готовые библиотеки? Как понимаю, нужно подключится к драйверу сети.
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Windows < Vista

    Для Windows до Vista задача сводиться к написанию TDI-клиента. Порядок действий примерно такой:

    1. ZwOpenFile ( \Device\Tcp или \Device\Udp ) - локальный адрес
    2. ZwOpenFile ( \Device\Tcp или \Device\Udp ) - удалённый узел
    3. ObReferenceObjectByHandle - на удалённый узел

    4. TdiBuildAssociateAddress, IoCallDriver
    5. TdiBuildSetEventHandler ( TDI_EVENT_RECEIVE ), IoCallDriver
    6. TdiBuildConnect, IoCallDriver
    7. TdiBuildSend, IoCallDriver

    8. Ждём данные. Будет вызвана наша функция, зарегистрированная на шаге 5.

    9. TdiBuildDisconnect, IoCallDriver
    10. TdiBuildDisassociateAddress, IoCallDriver
    11. TdiBuildSetEventHandler ( TDI_EVENT_RECEIVE == NULL ), IoCallDriver

    12. ObDereferenceObject - на удалённый узел
    13. ZwClose - удалённый узел
    14. ZwClose - локальный адрес

    Что касается готовых реализаций, да хотя бы вот сюда посмотри:

    Kernel mode sockets library for the masses
    Kernel Mode Sockets Library

    Среди платных разработок есть вот такая, например:

    Kernel Mode Sockets (KSOCKS)

    Ну и в поиск, конечно же, например, так.

    Windows >= Vista

    В Windows Vista появился компонент под названием Winsock Kernel (в MSDN есть описание), внешне похож на сокеты, но только внешне. В любом случае, стоит подумать о его использовании, вместо TDI-клиента, даже несмотря на то, что TDI-клиенты по-прежнему поддерживаются в Windows Vista и Windows 7, при чём код, написанный для Windows XP, будет работать почти без изменений.