Ваш основной подход верен. Чтобы выполнить фильтрацию на уровне NETWORK
на основе идентификатора процесса, необходимо открыть два дескриптора WinDivert:
- Один дескриптор на уровне
SOCKET
, чтобы построить отображение из сетевых 5-кортежей на ProcessID
s. - Еще один дескриптор на уровне
NETWORK
для выполнения фактической фильтрации. Для этого сетевой набор из 5 пакетов сопоставляется с ProcessID
с использованием сопоставления SOCKET
, и пакет может быть отфильтрован соответствующим образом.
Итак, да, вам действительно нужноto handles.
Другая проблема, о которой вы упомянули, заключается в том, что для нового соединения не гарантируется, что событие SOCKET
-layer будет первым. Это тоже правда. Чтобы обойти эту проблему, пользовательское приложение должно ставить в очередь событие NETWORK
-layer до тех пор, пока не прибудет соответствующее событие SOCKET
-layer, и обрабатывать пакет только по прибытии обоих событий. Это немного сложно, но это решает проблему. Это также подход, используемый Tallow .