将有效的x64解决方案转换为x86(VS2017)

时间:2019-06-22 19:08:12

标签: c++

我有一个VS2017解决方案(非托管API挂钩),当针对x64(调试或发行版)构建时,它运行完美。我正在x86下尝试相同。我没有编译或链接错误,但我的应用程序因ntdll.dll异常而崩溃。

我用Deviare的SpyStudio监视我的应用崩溃之前正在打开的文件。我的x86应用程序(当被钩住时)试图访问“ System32”目录(我认为),该目录应该进入“ SysWOW64”或“ winsxs”目录。

这是x86应用程序正在运行的Deviare SpyStudio屏幕截图,没有激活钩子,它可以正常工作;

https://imagizer.imageshack.com/img924/7403/k49M3x.png

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

https://imagizer.imageshack.com/img923/9698/lYLtLJ.png

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


#pragma comment (lib, "ntdll") 

<....>
HMODULE hDll_ntdll = LoadLibrary(TEXT("ntdll.dll"));
<....>

我确实注意到,当我注释掉上面的#pragma comment (lib, "ntdll")行时,出现“无法解决的外部”错误。

我做错了什么或者我忘记做什么?

1 个答案:

答案 0 :(得分:1)

我知道了! :)对于遇到此问题的其他人,正是x86调用约定导致了我的错误。只需在我的所有函数定义中添加“ __stdcall”就可以了。示例:对于x64和x86,我更改了此函数调用,仅在x64中有效;

  

NTSTATUS NtCreateFile_Hook(OUT PHANDLE FileHandle,在ACCESS_MASK DesiredAccess中,在POBJECT_ATTRIBUTES ObjectAttributes中,在PIOGESTATUS_BLOCK IoStatusBlock中,在PLARGE_INTEGER AllocationSize OPTIONAL中,在ULONG FileAttributes中,在ULONG CreateAccess中,在ULONG CreateAccess中,在ULONG OPOPTIONAL中,在ULONG EaLength)

为此,它适用于x64和x86;

  

NTSTATUS __ stdcall NtCreateFile_Hook(OUT PHANDLE FileHandle,在ACCESS_MASK DesiredAccess中,在POBJECT_ATTRIBUTES ObjectAttributes中,在OUT PIO_STATUS_BLOCK IoStatusBlock中,在PLARGE_INTEGER AllocationSize中,在ULONG中。 ,在PVOID EaBuffer可选,在ULONG EaLength中)

这很好用!希望在x64平台上添加“ __stdcall”没有任何缺点。到目前为止,它可以正常工作。