2009-03-25 21 views
6

NtOpenProcess iç Windows NT API işlevini çağırmaya çalışıyorum. Dahili API'leri aramanın kötü bir fikir olabileceğini biliyorum, ancak bu özel araç için bu API'nin sağladığı düşük seviyeli erişime ihtiyacım var.İşlev İşaretleyicilerini Tanımlama

Benim sorunum Bunu yapmak için this article

belirtildiği gibi, ben Süre Dinamik Bağlama kullanmak gerekir böyle bir iç API kullanmaktır, ben NtOpenProcess için bir işlev işaretçisi tanımlamak gerekir. İşte benim ilanıdır:

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

Sorun, görünüşe yukarıda benim typedef bir hata var. derleyici döner:

error C2059: syntax error : '__stdcall'

benim IDE (Visual Studio 2008) kullanışlı züppe "Go Definition'ı" özelliği kullanılan ve bildiriminde NTAPI __stdcall olarak tanımlandığını gördük.

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

başka bir hatayla sonuçlanır: Ben tanımlanmamış olması Tabii" diyorum Bu noktada

error C2065: '_NtOpenProcess' : undeclared identifier

, işte bu yüzden bu yapma benim beyanı gelen NTAPI çıkarmadan Maalesef

, Bu bir yazım hatası! "

Hata bildirimde hatamı gören var mı?

+0

DDN'den ntdll.lib dosyasını alın ve statik olarak bağlantı oluşturun. I lol sanıyordum –

cevap

4

"ntdef.h" ve "ntstatus.h" ifadesini eklediniz mi? Derleyici muhtemelen NTSTATUS'u anlayamıyor.

+0

... ama burada sorun -> Etrafa LONG ve NTSTATUS anahtarlamalı #endif NTSTATUS #define UZUN NTSTATUS #ifndef. Teşekkürler! –

İlgili konular