2009-03-25 25 views
6

Próbuję wywołać wewnętrzną funkcję API systemu Windows NT NtOpenProcess. Wiem, że wywoływanie wewnętrznych interfejsów API może być złym pomysłem, ale dla tego konkretnego narzędzia potrzebuję dostępu niskiego poziomu, który zapewnia ten interfejs API.Definiowanie wskaźników funkcji

Moim problemem jest to, że użycie takiego wewnętrznego API, muszę korzystać Runtime dynamiczne łączenie, jak określono w this article

Aby to zrobić, należy zdefiniować wskaźnik funkcji do NtOpenProcess. Oto moja deklaracja:

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

Problem jest, najwyraźniej jest błąd w moim typedef powyżej. Powraca kompilatora:

error C2059: syntax error : '__stdcall'

użyłem poręczny dandysa „Go To definicja” cechę mojego IDE (Visual Studio 2008) i stwierdził, że NTAPI w deklaracji jest definiowane jako __stdcall.

Niestety, usuwając NTAPI z mojego oświadczenia, czyniąc ją w ten sposób:

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

skutkuje innego błędu:

error C2065: '_NtOpenProcess' : undeclared identifier

W tym momencie mówię: „Oczywiście jest to nieokreślone, dlatego to jest typedef! "

Czy ktoś widzi mój błąd w deklaracji?

+0

Pobierz ntdll.lib z DDK i łącze statycznie. –

Odpowiedz

4

Czy dodano "ntdef.h" i "ntstatus.h"? Kompilator prawdopodobnie nie może zrozumieć NTSTATUS.

+0

Myślałem zrobiłem lol ... ale tutaj jest problem -> #ifndef NTSTATUS #define LONG NTSTATUS #endif przeszedłem długą i NTSTATUS wokół. Dzięki! –

Powiązane problemy