Странная проблема, связанная с 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 не загружается автоматически, но я думаю, это другой вопрос.