2009-03-25 35 views
6

Estoy intentando llamar a la función interna NtOpenProcess de la API de Windows NT. Sé que llamar a las API internas puede ser una mala idea, pero para esta herramienta en particular necesito el acceso de bajo nivel que proporciona esta API.Definición de punteros de función

Mi problema es que para usar una API interna, necesito utilizar en tiempo de ejecución Enlazado dinámico, como se especifica en this article

Para hacer eso, necesito definir un puntero de función a NtOpenProcess. Aquí está mi declaración:

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

El problema es que aparentemente hay un error en mi typedef anterior. Los rendimientos del compilador:

error C2059: syntax error : '__stdcall'

que utilizan la práctica función de Dandy "Ir a definición" de mi IDE (Visual Studio 2008) y encontraron que NTAPI en la declaración se define como __stdcall.

Por desgracia, la eliminación de NTAPI de mi declaración, por lo que es esto:

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

resultados en otro error:

error C2065: '_NtOpenProcess' : undeclared identifier

Llegados a este punto que estoy diciendo "Por supuesto que es indefinido, por eso es un tipo dedef! "

¿Alguien ve mi error en la declaración?

+0

Obtenga ntdll.lib del DDK y enlace estáticamente. –

Respuesta

4

¿Incluyó "ntdef.h" y "ntstatus.h"? El compilador probablemente no puede entender NTSTATUS.

+0

creo que lo hice lol ... pero aquí está el problema -> #ifndef NTSTATUS #define LARGO NTSTATUS #endif Cambié de largo y alrededor de NTSTATUS. Gracias! –