NtOpenKey schlägt mit 0xC0000034 fehl - wie behebt man das?

7

Ich erstelle eine Benutzermodus-CMD-Anwendung, die VS 2013 in C ++ verwendet, und ich versuche, die nativen Registrierungsbearbeitungsfunktionen darin zu verwenden. Ich versuche, einen bestimmten Schlüssel mit 'NtOpenKey' zu öffnen, aber es schlägt immer mit 'STATUS_OBJECT_NAME_NOT_FOUND' fehl und ich bin mir sicher, dass das 'Objekt' an seinem Platz ist, also muss der Grund woanders sein. Ich möchte die nativen Registrierungs-APIs verwenden, weil sie mit "Hidden Registry Keys" umgehen können - siehe hier für weitere Informationen. Hier ist ein Ausschnitt meines Codes:

%Vor%

Und Nt_Funcs_declr.h:

%Vor%

HINWEIS: Es ist für pädagogische Fragen, also fragt mich bitte nicht, warum ich WIN32 API nicht benutze.

    
AnArrayOfFunctions 11.09.2014, 15:31
quelle

1 Antwort

19

Hinweis: Wenn Sie die Kernel-API im Benutzermodus verwenden, wird nicht unterstützt . Ich empfehle dringend, dies zu tun, es sei denn, es gibt einen zwingenden Grund, warum es notwendig ist.

Hier ist das Problem:

%Vor%

Von der Dokumentation für UNICODE_STRING :

  

Wenn die Zeichenfolge nullterminiert ist, enthält Length nicht das abschließende Nullzeichen.

Sie sollten also etwas sagen wie

%Vor%

Wie beschrieben, hat Ihr Code versucht, einen Schlüssel namens L "Valve \ 0" anstelle des Schlüssels namens L "Valve" zu öffnen.

Nachtrag: Es wurde diskutiert, ob sogenannte "versteckte" Schlüssel (ein unglücklicher Name IMO; die Schlüssel sind für Win32-Code sichtbar, sie können einfach nicht manipuliert werden) sind eigentlich möglich, also hier ist der Arbeitscode, um einen zu erstellen:

%Vor%

Ab Windows 7 funktioniert das immer noch. (Sie benötigen eine Kopie von ntdll.lib, die von DDK / WDK verfügbar ist, um diesen Code zu erstellen.)

Bitte machen Sie nicht im Produktionscode oder auf den Maschinen anderer Leute.

    
Harry Johnston 11.09.2014, 22:33
quelle

Tags und Links