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.
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.