2 Stimmen

Seltsames Problem im Zusammenhang mit GetOwnerModuleFromTcpEntry bei der Ausrichtung auf x64

Da dies mein erster Beitrag ist, entschuldige ich mich, falls ich versehentlich wichtige Informationen ausgelassen haben sollte, aber hier kommt es.

Hintergrund: Ich führe Tests durch, um herauszufinden, was das nicht dokumentierte Array-Mitglied ‘OwningModuleInfo’ in MIB_TCPROW_OWNER_MODULE ist und wie es dieser Funktion hilft festzustellen, welcher Prozess den TCP-Endpunkt besitzt. Ich bin zu dem Schluss gekommen, dass der erste Eintrag im Array der Index des Dienstes in der Liste der laufenden Dienste ist, was uns zu dem seltsamen Problem führt. Ich verwende Visual Studio 2012 (Update 3) unter Windows 7. Die Test-App wird mit UAC = requireAdministrator ausgeführt (asInvoker produziert jedoch dasselbe Ergebnis).

Problem: Wenn ich auf x64 abziele, schlägt GetOwnerModuleFromTcpEntry für einige Einträge in der TCP-Tabelle fehl und gibt “126 - Das angegebene Modul wurde nicht gefunden.” zurück. Wenn ich auf Win32 abziele, verschwindet dieses Problem. Da ich weiß, dass dies nur passiert, wenn der Eintrag einem Dienst gehört, habe ich den folgenden Dummy-Aufruf kurz vor dem Aufruf meiner Testfunktion (jetzt auf x64 abzielend) versucht:

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

CloseServiceHandle(serviceManager);

MyTestFunction(); // Druckt die TCP-Tabelle zusammen mit den Eigentümerinformationen

Jetzt funktioniert es einwandfrei. Entfernen Sie den Aufruf an OpenSCManager erneut, und es schlägt fehl. Sagen Sie mir, dass das nicht wirklich durcheinander ist?

  • Ich habe alle Compiler- und Linker-Einstellungen, die ich finden konnte, überprüft.
  • Ich habe doppelt überprüft, dass ich auf die richtigen Bibliotheken verlinke.
  • Ich habe eine C++/CLI-Version mit identischem Code erstellt, die sowohl für Win32 als auch für x64 funktioniert.
    • Überprüfung auf Speicher/Ausrichtungs/Pointer-Probleme.

Beispiel-Ausgabe des Testlaufs ohne Dummy-Aufruf

Pid:   2896
Owner: Skype.exe

Pid:   848
Owner: Fehler 126 - Das angegebene Modul wurde nicht gefunden.

Pid:   2896
Owner: Skype.exe

Pid:   3756
Owner: Fehler 126 - Das angegebene Modul wurde nicht gefunden.

Mit Dummy-Aufruf

Pid:   2896
Owner: Skype.exe

Pid:   848
Owner: RpcSs

Pid:   2896
Owner: Skype.exe

Pid:   3756
Owner: WMPNetworkSvc

Abgesehen davon, dass dies ein Fehler seitens Microsoft ist, fehlt mir offensichtlich etwas und ich bin am Ende meiner Weisheit. Wenn also jemand mir einen Hinweis geben könnte, in welche Richtung ich suchen soll, wäre das sehr dankbar.

0voto

thomas_f Punkte 1762

Das Problem scheint zu sein, dass advapi32.dll nicht geladen ist. Diese Funktion geht offenbar davon aus, dass advapi32.dll geladen ist, wenn sie aufgerufen wird, was anscheinend nicht immer der Fall ist. Ich weiß immer noch nicht, warum advapi32.dll nicht automatisch geladen wird, aber ich denke, das ist eine andere Frage.

Siehe diesen Thread im MSDN-Forum.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X