C++ 将工作x64解决方案转换为x86(VS2017)

C++ 将工作x64解决方案转换为x86(VS2017),c++,C++,我有一个VS2017解决方案(非托管API钩子),它在为x64(调试或发布)构建时可以完美工作。我正试图在x86下实现同样的功能。我没有编译或链接错误,但我的应用程序因ntdll.dll异常而崩溃 在我的应用程序崩溃之前,我使用Deviceare的SpyStudio监控哪些文件正在被打开。我的x86应用程序(挂接时)正在尝试访问“System32”目录,其中(我认为)应该是“SysWOW64”或“winsxs”目录 这是运行x86应用程序的Deviare SpyStudio屏幕截图,在没有激活挂

我有一个VS2017解决方案(非托管API钩子),它在为x64(调试或发布)构建时可以完美工作。我正试图在x86下实现同样的功能。我没有编译或链接错误,但我的应用程序因ntdll.dll异常而崩溃

在我的应用程序崩溃之前,我使用Deviceare的SpyStudio监控哪些文件正在被打开。我的x86应用程序(挂接时)正在尝试访问“System32”目录,其中(我认为)应该是“SysWOW64”或“winsxs”目录

这是运行x86应用程序的Deviare SpyStudio屏幕截图,在没有激活挂钩的情况下,它工作正常

这是激活挂钩的SpyStudio屏幕截图

VS2017似乎没有正确选择我的“ntdll.dll”库,我认为这是自动完成的,因为在我的代码中我使用了它


#pragma注释(lib,“ntdll”)
HMODULE hDll_ntdll=LoadLibrary(文本(“ntdll.dll”);
我确实注意到,当我注释掉上面的
#pragma注释(lib,“ntdll”)
行时,会出现“未解决的外部”错误

我做错了什么,还是忘了做什么?

我明白了!:)对于遇到此问题的任何其他人来说,是x86调用约定导致了我的错误。只需将“\uu stdcall”添加到我所有的函数定义中就可以了。例如:对于x64和x86,我更改了这个函数调用,它只在x64中起作用

NTSTATUS NtCreateFile_Hook(OUT PHANDLE FileHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,OUT PIO_STATUS_BLOCK IoStatusBlock,IN PLARGE_INTEGER AllocationSize OPTIONAL,IN ULONG FileAttributes,IN ULONG sharedaccess,IN ULONG CreateDisposition,IN ULONG CreateOptions,IN PVOID EaBuffer OPTIONAL,IN ULONG EaLength)

对此,它适用于x64和x86

NTSTATUS\u stdcallNtCreateFile\u钩子(OUT PHANDLE FileHandle、IN ACCESS_MASK DesiredAccess、IN POBJECT_ATTRIBUTES ObjectAttributes、OUT PIO_STATUS块IoStatusBlock、IN PLARGE_INTEGER AllocationSize可选、IN ULONG FileAttributes、IN ULONG sharedaccess、IN ULONG CreateDisposition、IN ULONG CreateOptions、IN PVOID EaBuffer可选、IN ULONG EaLength)


这非常有效!希望在x64平台上添加“\u stdcall”不会有任何缺点。到目前为止,它工作正常。

请回答这个问题。我使用LoadLibrary和GetProcAddress,所有功能都适用于x64(正如我提到的,所有构建都不会出错)。我认为这与定义ntdll.dll函数时x64/x86命名约定的差异有关。我现在正在深入研究其中的更多内容。我正在使用Windows 10 SDK,我想知道它是否添加了一些其他命名约定差异?我得到的错误是->“错误LNK2019:未解析的外部符号_NtCreateFile@44在函数“long\uu cdecl NtCreateFile\u Hook(void**,unsigned long,struct…”中引用了一步…WOW64 ntdll.dll中没有定义“NtCreateFile”。我改为使用“ZwCreateFile”的typedef,因此现在我不再有未解析的外部。我在“ZwOpenFile”请求访问此文件时,这里是对象缓冲区内容->“0x0015fa88{Length=28 MaximumLength=30 buffer=0x758741b4 L”\\Device\\KsecDD”}“有什么想法吗?这看起来像是一个安全文件,我尝试以管理员身份运行,同样的问题。如有任何帮助,将不胜感激。”