سؤال

وأنا أحاول أن استدعاء ويندوز NT وظيفة API NtOpenProcess الداخلية. وأنا أعلم الدعوة واجهات برمجة التطبيقات الداخلية يمكن أن تكون فكرة سيئة، ولكن لهذا أداة معينة أنا في حاجة إلى الحصول على مستوى منخفض يوفر هذا API.

ومشكلتي هي أن استخدام مثل هذا API الداخلي، ولست بحاجة لاستخدام وقت التشغيل ارتباط ديناميكي، على النحو المحدد في <لأ href = "http://msdn.microsoft.com/en-us/library/ms686944(VS. 85) .aspx اتصال "يختلط =" noreferrer "> هذه المقالة

لفعل ذلك، ولست بحاجة لتحديد مؤشر دالة إلى NtOpenProcess. وفيما يلي بيان بلدي:

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

والمشكلة هي، على ما يبدو هناك خطأ في typedef وبلدي أعلاه. يعود المترجم:

<اقتباس فقرة>   

والخطأ C2059: خطأ في بناء الجملة:   '__stdcall'

ولقد استخدمت مدهش ميزة مفيدة "الانتقال إلى تعريف" من بلدي IDE (البصرية ستوديو 2008)، ووجدت أن يعرف NTAPI في الإعلان كما __stdcall.

ومما يؤسف له، وإزالة NTAPI من إعلان بلدي، مما يجعل من هذا:

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

والنتائج في خطأ آخر:

<اقتباس فقرة>   

والخطأ C2065: '_NtOpenProcess':   المعرف غير معروفة

وعند هذه النقطة أنا أقول "بالطبع انها غير معرفة، وهذا هو السبب في انها typedef و!"

لا أحد يرى لي خطأ في الإعلان؟

هل كانت مفيدة؟

المحلول

هل تشمل "ntdef.h" و "ntstatus.h"؟ المترجم ربما غير قادر على فهم NTSTATUS.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top