Как я могу проверить, доступен ли порт TCP из драйвера фильтра TDI?

Мой драйвер фильтра TDI перехватывает запросы IRP_MJ_CREATE и назначает исходный порт для каждого открытого соединения TCP/UDP в соответствии с моими потребностями. Драйвер внутренне поддерживает таблицу с соединениями (включая открытие/закрытие сокета и льготный период TCP), но я все еще вижу редкие случаи, когда драйвер не получает уведомления о конкретных событиях, что приводит к неправильному предположению, что конкретный исходный порт TCP бесплатно, пока он используется.

Я искал возможность отправки запроса TDI_QUERY_INFORMATION перед назначением этого порта, но я не вижу возможности запрашивать любой адрес - я могу запрашивать только объект открытого адреса, но не общий адрес.

Есть ли какой-либо (эффективный) вариант для запроса определенного исходного порта и проверки его использования?


person user3428991    schedule 17.03.2014    source источник


Ответы (1)


Должна быть причина, по которой уведомления не доставляются или не обрабатываются. Я бы сосредоточился там в первую очередь. Однако, не имея источника, это трудно определить.

В противном случае, в отношении TDI_QUERY_INFORMATION:

Используйте макрос TdiBuildQueryInformation, передавая в QType TDI_QUERY_ADDRESS_INFO. TDI_ADDRESS_INFO определяет формат, в котором транспорт возвращает запрошенную информацию.

TDI_ADDRESS_INFO содержит TRANSPORT_ADDRESS, который содержит 1 или более структур TA_ADDRESS.

Каждая из структур TA_ADDRESS определяет транспортный адрес конкретного TDI_ADDRESS_TYPE_XXX. Передайте структуру TA_IP_ADDRESS и укажите тип TDI_ADDRESS_TYPE_IP.

// From Tdi.h or TdiKrnl.h
#define TDI_ADDRESS_TYPE_IP        ((USHORT)2)  // internetwork: UDP, TCP, etc.

Внутри структуры TA_IP_ADDRESS есть TDI_ADDRESS_IP, который содержит порт.

typedef struct _TA_ADDRESS_IP {
  LONG           TAAddressCount;
  struct _AddrIp {
    USHORT         AddressLength;
    USHORT         AddressType;
    TDI_ADDRESS_IP Address[1];
  } Address[1];
} TA_IP_ADDRESS, *PTA_IP_ADDRESS;

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

typedef struct _TDI_ADDRESS_IP {
  USHORT sin_port;
  ULONG  in_addr;
  UCHAR  sin_zero[8];
} TDI_ADDRESS_IP, *PTDI_ADDRESS_IP;

Похоже, что большинство функций TDI устарели и будут удалены в будущих версиях Windows. В результате они указывают либо на Winsock Kernel (WSK), либо на Windows Filtering Platform (WFP).

Ядро Винсока

http://msdn.microsoft.com/en-us/library/windows/hardware/ff571083%28v=vs.85%29.aspx

Платформа фильтрации Windows

http://msdn.microsoft.com/en-us/library/windows/hardware/ff571068%28v=vs.85%29.aspx

Надеюсь это поможет.

person Jeff    schedule 23.04.2014
comment
Спасибо. К сожалению, на данном этапе я не могу перейти на WFP или WSK... что касается TDI_QUERY_ADDRESS_INFO, я могу использовать его для запроса информации о существующем адресном объекте, чего у меня нет под рукой. К сожалению, я не вижу, как я могу использовать его для проверки доступности. - person user3428991; 24.04.2014