2009-03-25 72 views
6

Tôi đang cố gắng gọi hàm Windows NT API bên trong NtOpenProcess. Tôi biết gọi API nội bộ có thể là một ý tưởng tồi, nhưng đối với công cụ cụ thể này, tôi cần truy cập cấp thấp API này cung cấp.Xác định các con trỏ chức năng

Vấn đề của tôi là sử dụng một API nội bộ như vậy, tôi cần phải sử dụng Runtime Liên kết động, theo quy định tại this article

Để làm điều đó, tôi cần phải xác định một con trỏ hàm để NtOpenProcess. Đây là tuyên bố của tôi:

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

Vấn đề là, dường như có lỗi trong typedef của tôi ở trên. Lợi nhuận biên dịch:

error C2059: syntax error : '__stdcall'

tôi đã sử dụng tiện dụng dandy "Go To Definition" tính năng của IDE của tôi (Visual Studio 2008) và thấy rằng NTAPI trong tờ khai được định nghĩa là __stdcall.

Thật không may, loại bỏ NTAPI từ khai của tôi, làm cho nó này:

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

kết quả do lỗi khác:

error C2065: '_NtOpenProcess' : undeclared identifier

Tại thời điểm này tôi đang nói "Dĩ nhiên đó là không xác định, đó là lý do tại sao đó là một typedef! "

Có ai thấy lỗi của tôi trong tuyên bố không?

+0

Nhận ntdll.lib từ DDK và liên kết tĩnh. –

Trả lời

4

Bạn có bao gồm "ntdef.h" và "ntstatus.h" không? Trình biên dịch có thể không hiểu NTSTATUS.

+0

Tôi nghĩ tôi đã làm lol ... nhưng đây là vấn đề -> #ifndef NTSTATUS #define LONG NTSTATUS #endif Tôi chuyển LONG và NTSTATUS xung quanh. Cảm ơn! –

Các vấn đề liên quan