c++ - OpenGL 调用锁定/卡住

标签 c++ c opengl assembly

我正在使用一些戴尔工作站(运行 WinXP Pro SP 2 和 DeepFreeze)进行开发,但是最近加载到这些机器上的东西阻止了任何 opengl 调用(调用锁)完成(而且我知道代码像我一样工作已经在“干净”的机器上对其进行了测试,我还使用 dev-cpp 生成的简单 opengl 应用程序进行了测试,它也将锁定在戴尔机器上。

我已经尝试调试我自己的应用程序以查看 gl 调用卡住的确切位置,但是 ZwQueryInformationProcess 上有一些全局系统 Hook 会扰乱对 ZwQueryInformationThread(由 ExitThread 使用)的调用,从而阻止我进行调试(它导致调试器 OllyDBG 进入访问冲突报告循环或如果传递异常则程序崩溃)。 钩子(Hook):

ntdll.ZwQueryInformationProcess 7C90D7E0       B8 9A000000          MOV EAX,9A
7C90D7E5                                       BA 0003FE7F          MOV EDX,7FFE0300
7C90D7EA                                       FF12                 CALL DWORD PTR DS:[EDX]
7C90D7EC                                     - E9 0F28448D          JMP 09D50000
7C90D7F1                                       9B                   WAIT
7C90D7F2                                       0000                 ADD BYTE PTR DS:[EAX],AL
7C90D7F4                                       00BA 0003FE7F        ADD BYTE PTR DS:[EDX+7FFE0300],BH
7C90D7FA                                       FF12                 CALL DWORD PTR DS:[EDX]
7C90D7FC                                       C2 1400              RETN 14
7C90D7FF                                       90                   NOP
ntdll.ZwQueryInformationToken 7C90D800         B8 9C000000          MOV EAX,9C

困惑的函数 + 调用:

ntdll.ZwQueryInformationThread 7C90D7F0        8D9B 000000BA        LEA EBX,DWORD PTR DS:[EBX+BA000000]
7C90D7F6                                       0003                 ADD BYTE PTR DS:[EBX],AL
7C90D7F8                                       FE                   ???                                                          ; Unknown command
7C90D7F9                                       7F FF                JG SHORT ntdll.7C90D7FA
7C90D7FB                                       12C2                 ADC AL,DL
7C90D7FD                                       14 00                ADC AL,0
7C90D7FF                                       90                   NOP
ntdll.ZwQueryInformationToken 7C90D800         B8 9C000000          MOV EAX,9C

所以首先,任何人都知道如果有任何事情会导致 OpenGL 调用导致无限锁定,是否有任何解决方法?什么会在内核内存中创建这样一个钩子(Hook)?

更新:经过一番摸索,我发现了更多的kernal hooks,其中很多是用来使系统信息调用返回的数据无效(比如远程调试端口),我也设法找出了what曾经这样做是使用 madchook.dll(由 madshi)来做到这一点,这个 dll 也被注入(inject)到每个正在运行的进程中(这些似乎是一些反调试代码)。此外,在 OpenGL 方面,似乎 Direct X 很好/不受影响(我运行了一个 DX 9 演示没有问题),那么这些内核 Hook 之一是否会以某种方式影响 OpenGL?

最佳答案

经过一些研究,似乎有一些东西在主动阻止用户-> 内核模式对 OGL 的调用,这可能是 DeepFreeze 的一个选项。不过 DirectX 工作完美,所以我已经切换到它。

关于c++ - OpenGL 调用锁定/卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2273934/

相关文章:

c++ - 当父类共享指针为返回类型时返回新的基类

c - 将 32 位长分成 4 个字节

c++ - GLSL 语法错误 : "in" parse error

c++ - 二叉树只添加到根

c++ - 将 C int 数组重置为零 : the fastest way?

C++ 如何从 main() 外部访问在 main() 中初始化的对象?

c - 不清楚汉诺塔的递归调用

c - 队列弹出一些垃圾值

python - 如何在 PyOpenGL 中旋转某个对象(Quad)?

android - 使用 OpenGL(和 OpenGL ES)渲染 SVG