2017-01-14 6 views
0

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; 
} 

` 
+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) –

+0

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

+1

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

Répondre

1

Ce fut le cadeau:

[email protected]@[email protected]@@Z 

C'est typique du nom C++ mutiler; Puisque les fonctions peuvent être surchargées, mais que le nom de la fonction utilisé lors de l'exportation et de l'importation doit être unique, le nom est modifié pour inclure une description de la liste des arguments. L'ajout de extern "c" à la déclaration résoudra le problème.


Soit dit en passant, vous ne voulez probablement pas de mettre le drapeau OBJ_KERNEL_HANDLE, car il demande une poignée que vous ne serez pas en mesure d'utiliser. Je suppose que Windows va l'ignorer, et vous donner une poignée en mode utilisateur de toute façon, mais mieux vaut prévenir que guérir.