gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:46:29 25 4
gpt4 key购买 nike

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

我使用 Deviare 的 SpyStudio 来监控在我的应用程序崩溃之前打开了哪些文件。我的 x86 应用程序( Hook 时)正在尝试访问“System32”目录(我认为)它应该进入“SysWOW64”或“winsxs”目录。

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

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

这是激活 Hook 后的 SpyStudio 屏幕截图;

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

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


#pragma comment (lib, "ntdll")

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

我确实注意到,当我注释掉上面的 #pragma comment (lib, "ntdll") 行时,我得到了“ Unresolved external ”错误。

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

最佳答案

我想通了! :) 对于遇到此问题的任何其他人,是 x86 调用约定导致了我的错误。只需将“__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 ShareAccess, IN ULONG CreateDisposition, IN ULONG CreateOptions, IN PVOID EaBuffer OPTIONAL, IN ULONG EaLength)

为此,它适用于 x64 和 x86;

NTSTATUS __stdcall 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 ShareAccess, IN ULONG CreateDisposition, IN ULONG CreateOptions, IN PVOID EaBuffer OPTIONAL, IN ULONG EaLength)

这非常有效!希望将“__stdcall”添加到 x64 平台没有任何缺点。到目前为止,它工作正常。

关于c++ - 将工作的 x64 解决方案转换为 x86 (VS2017),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56718345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com