2009-03-25 8 views
6

J'essaie d'appeler la fonction API interne Windows NT NtOpenProcess. Je sais que l'appel d'API internes peut être une mauvaise idée, mais pour cet outil particulier, j'ai besoin de l'accès de bas niveau fourni par cette API.Définition de pointeurs de fonction

Mon problème est que d'utiliser une telle API interne, je dois utiliser Runtime Dynamic Linking, comme spécifié dans this article

Pour ce faire, je dois définir un pointeur de fonction NtOpenProcess. Voici ma déclaration:

typedef NTSTATUS (NTAPI *_NtOpenProcess) (
OUT PHANDLE, 
IN ACCESS_MASK, 
IN POBJECT_ATTRIBUTES, 
IN PCLIENT_ID OPTIONAL); 

class procManager 
{ 
    HINSTANCE hNTDLL; 
public: 
    procManager() 
    { 
     hNTDLL = LoadLibrary(L"ntdll.dll"); 
     if (!hNTDLL) 
      throw std::runtime_error("NTDLL.DLL failure."); 
     _NtOpenProcess NtOpenProcess; 
     NtOpenProcess = reinterpret_cast <_NtOpenProcess> (GetProcAddress(hNTDLL, L"NtOpenProcess")); 
     if (!NtOpenProcess) 
      throw std::runtime_error("NtOpenProcess not found."); 
     //Use NTOpenProcess for stuff here 
    }; 
    ~procManager() 
    { 
     FreeLibrary(hNTDLL); 
    }; 
}; 

Le problème est, apparemment, il y a une erreur dans mon typedef ci-dessus. Le rendement du compilateur:

error C2059: syntax error : '__stdcall'

J'ai utilisé le dandy pratique fonction « Atteindre la définition » de mon IDE (Visual Studio 2008) et a constaté que NTAPI dans la déclaration est définie comme __stdcall.

Malheureusement, la suppression NTAPI de ma déclaration, ce qui en fait ceci:

typedef NTSTATUS (*_NtOpenProcess) (
OUT PHANDLE, 
IN ACCESS_MASK, 
IN POBJECT_ATTRIBUTES, 
IN PCLIENT_ID OPTIONAL); 

résultats dans une autre erreur:

error C2065: '_NtOpenProcess' : undeclared identifier

A ce stade, je veux dire « Bien sûr, il est non défini, c'est pourquoi c'est un typedef! "

Est-ce que quelqu'un voit mon erreur dans la déclaration?

+0

Récupère ntdll.lib à partir du DDK et lie-le statiquement. –

Répondre

4

Avez-vous inclus "ntdef.h" et "ntstatus.h"? Le compilateur ne comprend probablement pas NTSTATUS.

+0

Je pensais que je l'ai fait lol ... mais voici le problème -> #ifndef NTSTATUS #define LONG NTSTATUS #endif LONG et je suis passé NTSTATUS autour. Merci! –

Questions connexes