Странная проблема, связанная с GetOwnerModuleFromTcpEntry при таргетинге на x64

Так как я впервые публикуюсь, я прошу прощения, если я непреднамеренно пропустил какую-либо ключевую информацию, но здесь это идет.

Справочная информация: я провожу некоторое тестирование, чтобы выяснить, что такое недокументированный массив элементов OwningModuleInfo в MIB_TCPROW_OWNER_MODULE и как он помогает упомянутой функции в определении того, какому процессу принадлежит конечная точка TCP. Я пришел к выводу, что первым элементом в массиве является индекс службы в списке запущенных служб, что приводит нас к странной проблеме. Я использую Visual Studio 2012 (обновление 3) в Windows 7. Тестовое приложение работает под UAC = requireAdministrator (однако asInvoker выдает тот же результат).

Проблема: Когда я нацеливаюсь на x64, то для некоторых записей в таблице tcp происходит сбой GetOwnerModuleFromTcpEntry и возвращается "126 - указанный модуль не найден". Когда я нацеливаюсь на Win32, эта проблема исчезает. Поскольку я знаю, что это происходит только тогда, когда запись принадлежит службе, я попробовал следующий фиктивный вызов непосредственно перед вызовом моей тестовой функции (теперь нацеленной на x64):

SC_HANDLE serviceManager = OpenSCManager(
    NULL,
    NULL,
    SC_MANAGER_ENUMERATE_SERVICE);

CloseServiceHandle(serviceManager);

MyTestFunction(); // Prints the TCP table along with owner information

Теперь это работает просто отлично. Удалите вызов OpenSCManager снова, и он не сможет. Скажите, что это не совсем запутано?

  • Я рассмотрел все настройки компилятора и компоновщика, которые смог найти.
  • Я дважды проверил, поэтому я ссылаюсь на соответствующие библиотеки.
  • Я создал версию C++/CLI с идентичным кодом, который отлично работает как для Win32, так и для x64.
    • Проверено на наличие проблем с памятью / выравниванием / указателем.

Пример вывода из тестового прогона без фиктивного вызова

Pid:   2896
Owner: Skype.exe

Pid:   848
Owner: Error 126 - The specified module could not be found.

Pid:   2896
Owner: Skype.exe

Pid:   3756
Owner: Error 126 - The specified module could not be found.

С пустышкой

Pid:   2896
Owner: Skype.exe

Pid:   848
Owner: RpcSs

Pid:   2896
Owner: Skype.exe

Pid:   3756
Owner: WMPNetworkSvc

Если не считать того, что это ошибка со стороны Microsoft, я, очевидно, что-то упустил, и я в конце своей веревки. Поэтому, если бы кто-то мог подтолкнуть меня в правильном направлении относительно того, чего мне не хватает, это было бы очень ценно.

1 ответ

Решение

Кажется, проблема в том, что advapi32.dll не загружен. Кажется, что эта функция предполагает, что advapi32.dll загружается при ее вызове, что, очевидно, не всегда так. Я до сих пор не знаю, почему advapi32.dll не загружается автоматически, но я думаю, это другой вопрос.

Смотрите эту ветку на форуме MSDN.

Другие вопросы по тегам