Всем привет.
Есть некий user mode функционал перечисления параметров сетевых адаптеров через TDI (сделано так для совместимости с NT4, ну и вроде как работало раньше везде).
На висте, понятное дело, проблемы.
В общем, смысл примерно такой.
1. Получаем список TDI Entity. Это работает.
2. Далее пробуем получать тип:
theObjectID.toi_entity = pEntityIDs[i];
theObjectID.toi_class = INFO_CLASS_GENERIC; // 0x100
theObjectID.toi_type = INFO_TYPE_PROVIDER; // 0x100
theObjectID.toi_id = ENTITY_TYPE_ID; // 0x001
memset(&tcpRequest, 0, sizeof(tcpRequest));
tcpRequest.ID = theObjectID;
Это уже не работает с ошибкой "invalid function".
Пробовалось и для \device\tcp и для \device\tcp6 — монопенесуально. Ковырять вистовый inetmib1, понятное дело, не хочется.
Собственно, вопрос в следующем — можно ли как-нибудь попроще вывернуться (не используя ip helper, дабы не дублировать функциональность для NT4 отдельно) или таки придется использовать ip helper и плодить легаси код?
Спасибо!
В принципе, можно попробовать сразу затребовать нужный код, вы ведь знаете, что вам нужно. Например, для получения таблицы локальных адресов можно сляпать такой запрос:
tcp_req.ID.toi_entity.tei_entity = CL_NL_ENTITY;
tcp_req.ID.toi_entity.tei_instance = 0;
tcp_req.ID.toi_class = INFO_CLASS_PROTOCOL;
tcp_req.ID.toi_type = INFO_TYPE_PROVIDER;
tcp_req.ID.toi_id = IP_MIB_ADDRTABLE_ENTRY_ID;
и это работает под Vista в том числе. Правда, надо заметить, что аналогичный запрос для таблицы маршрутизации ( IP_MIB_RTTABLE_ENTRY_ID ) под вистой не работает и возвращает пресловутый "invalid function". И очень возможно, что в Windows 7.0 IOCTL_TCP_QUERY_INFORMATION_EX вообще уберут. В этом свете использование ip helper ( или другого API ) IMHO более предпочтительно — лучше думать о поддержке Vista и последующих систем, а не NT 4.
TC>В принципе, можно попробовать сразу затребовать нужный код, вы ведь знаете, что вам нужно. Например, для получения таблицы локальных адресов можно сляпать такой запрос:
TC>TC> tcp_req.ID.toi_entity.tei_entity = CL_NL_ENTITY;
TC> tcp_req.ID.toi_entity.tei_instance = 0;
TC> tcp_req.ID.toi_class = INFO_CLASS_PROTOCOL;
TC> tcp_req.ID.toi_type = INFO_TYPE_PROVIDER;
TC> tcp_req.ID.toi_id = IP_MIB_ADDRTABLE_ENTRY_ID;
TC>
TC>и это работает под Vista в том числе. Правда, надо заметить, что аналогичный запрос для таблицы маршрутизации ( IP_MIB_RTTABLE_ENTRY_ID ) под вистой не работает и возвращает пресловутый "invalid function". И очень возможно, что в Windows 7.0 IOCTL_TCP_QUERY_INFORMATION_EX вообще уберут. В этом свете использование ip helper ( или другого API ) IMHO более предпочтительно — лучше думать о поддержке Vista и последующих систем, а не NT 4.
Ну вот есть мнение, что такой подход и будет в большинстве наших кейсов давать invalid function — там все несколько сложнее, фактически свой adapter helper + protocol helper. В общем, придется, видимо, бранч на ip helper делать, млин. Ну нафига так все было уродовать, непонятно
Спасибо за ответ
Можно дизассемблировать tcpip.sys вистовский, и посмотреть в обработчике IOCTL, что именно делает вызов invalid function.
Я IP Help не использую, я
сам из ядра делаю IOCTL запросы девайсам ip и tcp.
Дело в том что висту я пока не ставил, да и не ковырял вообще её, поэтому ничего сказать не могу.
CF>Можно дизассемблировать tcpip.sys вистовский, и посмотреть в обработчике IOCTL, что именно делает вызов invalid function.
CF>Я IP Help не использую, я сам из ядра делаю IOCTL запросы девайсам ip и tcp.
CF>Дело в том что висту я пока не ставил, да и не ковырял вообще её, поэтому ничего сказать не могу.
Насколько я понимаю, там во всей этой кухне уже далеко не только tcpip.sys участвует. В общем, проще ip helper заюзать, там есть хоть какие-то шансы, что все останется работоспособным и далее...
AS>Насколько я понимаю, там во всей этой кухне уже далеко не только tcpip.sys участвует. В общем, проще ip helper заюзать, там есть хоть какие-то шансы, что все останется работоспособным и далее...
В висте tcpip.sys в этом бардаке вообще не участвует
. У него более нет интерфейса, доступного из UM ( из KM он тоже "не доступен"
), соответственно он не занимается обработкой запросов IOCTL_TCP_QUERY_INFORMATION_EX.