TDI_SEND и правильная организация передаваемого буффера

Тема в разделе "WASM.NT.KERNEL", создана пользователем Nicky, 8 янв 2010.

  1. Nicky

    Nicky New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2009
    Сообщения:
    16
    Пытался реализовать отсылку/прием Tcp пакетов в режиме ядра. Данные отсылаютя/принимаются, но до некоторого момемнта, после которого следует BSOD. В StackCall вижу функции неправильной работы с Mdl (или исчерпаны все квоты, или nt!MiDeferredUnlockPages, nt!MmUnlockPages).
    В сети нашел несколко примеров, но все разные, в том смысле, что по разному работают с созданием/удалением MDL-списков для передаваемого буффера.
    Подскажите, почему ниже описанный сценарий неправильный? Отсылка производтся по TDI_SEND, прием - TDI_RECEIVE. Никаких событий я не устанавливал.. Передать/прнять нужно несколько байт, их количество известно. Но вот сервер может быть отключен.
    Вот как я это делал:
    1) в send создается список Mdl, который связывается с переданным в функцию буффером. Затем выполняется IoCallDriver к транспорту, ждем на событии WaitForSingleObject (которое передали в TdiBuildInternalDeviceControlIrp). По наступлению события, MmUnlockPages, IoFreeMdl

    Во многих найденных примерах send() отсутствуют MmUnlockPages, IoFreeMdl (почему, не считают нужным убирать за собой, или после IoCallDriver очистка/разлочивание страниц происходит автоматичеки)? В некоторых exmpls переданный буффер копируется в буффер, дополнительно выделенный из NonPagedPool внутри функции send() (зачем? боятся что переданный указатель станет недействительным в процессе отсылки?). Некоторые явно устанавливают CompletionRoutine, в качестве контекста которой передают PKEVENT pSendEvent (а в самой CompletionRoutine ждут события) - для чего дополнительно ожидать в CompletionRoutine, если можно после IoCallDriver вызвать WaitForSingleObject?
    Вобщем ничего не понятно :???:
    Не поможете как было бы правильно делать? Спасибо

    И еще такой вопрос - если databuffer изначально находится в памяти, зачем строить Mdl-списки? Ведь отсылка идет из контекста системного потока.. Тоже не понимаю причины

    На всякий случай приведу фрагмент кода, который у меня сейчас вызывает BSOD