Мне непонятно, зачем вообще нужно копировать NB (NET_BUFFER). Если вы планируете поставить NB в очередь для обработки в другом потоке, вы можете сделать это с исходным NB, и вам не нужно ничего копировать.
Единственная причина, по которой вам нужно скопировать полезную нагрузку, — это если вы планируете некоторое время зависать в буфере (скажем, более 1000 мс). На высоком уровне полезная нагрузка, связанная с NB, принадлежит приложению. NDIS позволяет вам поставить NB в очередь, выполнить некоторую обработку, удалить его, изменить и т. д. Но (в зависимости от параметров сокета) приложение может зависнуть до тех пор, пока его буфер не будет возвращен обратно к нему. Таким образом, вы не можете цепляться за исходный NB или его полезную нагрузку бесконечно. Если вы собираетесь делать что-то, что занимает много времени, вам следует выделить глубокую копию всех необходимых вам структур данных (NBL, NB, MDL и буфер полезной нагрузки) и вернуть оригиналы обратно в приложение.
Если вы загружаете полезную нагрузку пакета в IRP, чтобы процесс пользовательского режима мог обдумать полезную нагрузку, вам действительно нужна 1 копия. Причина в том, что ядро не может доверять какому-либо процессу пользовательского режима выполнение каких-либо действий в рамках определенного бюджета времени. Представьте, например, что система переходит в спящий режим. Ядро должным образом приостанавливает все процессы пользовательского режима, а затем ждет, пока каждое устройство перейдет в состояние пониженного энергопотребления. Но сетевая карта не может перейти в режим пониженного энергопотребления, потому что путь данных не будет приостановлен, потому что какой-то пакет застрял в вашем драйвере фильтра, ожидая ответа (теперь приостановленного) процесса пользовательского режима. Таким образом, вы защищаете себя, отвязывая IO в usermode с IO по сетевому устройству: сделайте копию.
Но если все, что вы делаете, это отправляете пакет на другое устройство ядра, которое выполняет (скажем) шифрование, тогда вы можете предположить, что устройство шифрования обеспечивает разумный бюджет времени, поэтому может быть безопасно передать ему исходную полезную нагрузку пакета. .
person
Jeffrey Tippet
schedule
30.06.2017