使用typedef c ++编译器错误

时间:2016-10-23 00:27:25

标签: c++ winapi dll header

我正在努力将来自各种exploit-db文件的ntdll函数的一些声明网格化,以便创建一个键盘记录器(在教育上)。    我试着在这里搜索一下网络。我找不到任何类似的东西,我可以理解如何使用它来解决我的问题。如果有重复,我道歉,我找不到任何相关内容。

我把这些放在头文件中,当我尝试编译它们时,我得到了与标题中的typedef相关的各种错误,我收到提示decltype的错误消息,我承认我似乎无法理解它一点都没有。我从来没有真正搞过标题内容或使用decltype,我搜索过,但仍然无法真正理解它。出现错误:

typedef (NTSTATUS) (WINAPI *LPFUN_NtCreateThreadEx)
(
    OUT PHANDLE hThread,
    IN ACCESS_MASK DesiredAccess,
    IN LPVOID ObjectAttributes,
    IN HANDLE ProcessHandle,
    IN LPTHREAD_START_ROUTINE lpStartAddress,
    IN LPVOID lpParameter,
    IN BOOL CreateSuspended,
    IN DWORD StackZeroBits,
    IN DWORD SizeOfStackCommit,
    IN DWORD SizeOfStackReserve,
    OUT LPVOID lpBytesBuffer
);

typedef NTSTATUS(NTAPI *lNtAllocVirtMem)(
    IN  HANDLE  ProcessHandle,
    IN  PVOID   *BaseAddress,
    IN  PULONG  ZeroBits,
    IN  PSIZE_T RegionSize,
    IN  ULONG   AllocationType,
    IN  ULONG   Protect
);

main.cpp中的另一个错误是:(抱歉长线)

lNtAllocVirtMem pNtAllocateVirtualMemory=(lNtAllocVirtMem)GetProcAddress(LoadLibaryA("ntdll.dll"),"NtAllocateVirtualMemory");

我的错误是(我得到两者的两倍):

error: expected primary-expression before '__attribute__'
error: typedef 'NTSTATUS' is initialized (use decltype instead)

我想知道如何解决这些问题(因为我计划增加更多),更重要的是,我怎样才能确保我不会从这里得到这些?

1 个答案:

答案 0 :(得分:0)

类型NTSTATUS在Windows SDK头文件 winternl.h 中定义:

typedef _Return_type_success_(return >= 0) LONG NTSTATUS;

您需要包含该头文件,而不是尝试自己定义NTSTATUS。 SDK提供的定义有两种不同的方式:1它包含SAL注释,允许您运行静态代码分析。 2它提供了正确的别名,无论平台如何。它应该是x86和x64平台上的32位整数值。 long可能比此长。