J'essaie d'appeler l'API native (NtOpenKey) en mode utilisateur. Je vois un problème d'éditeur de liens. Je suis vraiment confus, ce qui manque ici. Comment puis-je réaliser cela? Je joins mon code ici. ntdll.lib est ajouté au projet (lien)Appel de l'API native (Nt) en mode utilisateur
Erreur 58 erreur LNK2001: symbole externe non résolu "__declspec (dllimport) à long __cdecl NtOpenKey (void * *, unsigned long, struct _OBJECT_ATTRIBUTES *)" (__imp_ NtOpenKey @@ YAJPEAPEAXKPEAU_OBJECT_ATTRIBUTES @@@ Z) C: \ Users \ santhi.ragipati \ documents \ Visual studio 2013 \ Projects \ NtRegistry \ NtRegistry \ NtRegistry.obj NtRegistry
Merci Santhi `// NtRegistry.cpp: Définit le point d'entrée pour l'application console. //
#include <tchar.h>
#include <Windows.h>
#include <Winternl.h>
#include <ntstatus.h>
NTSYSAPI NTSTATUS NTAPI NtOpenKey(
_Out_ PHANDLE KeyHandle,
_In_ ACCESS_MASK DesiredAccess,
_In_ POBJECT_ATTRIBUTES ObjectAttributes
);
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE handleRegKey = NULL;
for (int n = 0; n < 1; n++)
{
NTSTATUS status = NULL;
UNICODE_STRING RegistryKeyName;
OBJECT_ATTRIBUTES ObjectAttributes;
RtlInitUnicodeString(&RegistryKeyName, L"\\Registry\\Machine\\Software\\MyCompany\\MyApp");
InitializeObjectAttributes(&ObjectAttributes,
&RegistryKeyName,
OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
NULL, // handle
NULL);
status = NtOpenKey(&handleRegKey, (ACCESS_MASK)KEY_READ, &ObjectAttributes);
if (NT_SUCCESS(status) == FALSE)
{
break;
}
} // Get the Frame location from the registry key.
// All done with the registry.
if (NULL != handleRegKey)
{
NtClose(handleRegKey);
}
return 0;
}
`
Copie possible de [Qu'est-ce qu'une erreur de symbole externe de référence/non résolue non définie et comment la réparer?] (Http://stackoverflow.com/questions/12573816/what-is-an-defined-reference-unresolved- external-symbol-error-et-how-do-i-fix) –
J'ai défini le NtOpenKey exactement comme dans le document MSDN, j'ai aussi essayé avec ZwOpenKey. Je n'ai pas eu de chance avec les deux fonctions. J'ai suivi comme mentionné ici http://www.osronline.com/article.cfm?article=91 – sreeR
On dirait que la fonction est déclarée avec une liaison C++ au lieu d'une liaison C. Vous devez probablement ajouter 'extern 'c" 'à la déclaration. Cela devrait aussi être "__stdcall" plutôt que "__cdecl" mais je suppose que c'est une version 64 bits donc il n'y a pas de différence. –