srl*_*lle 2 delphi multithreading handle
我在Delphi应用程序中遇到问题,确定当前应用程序(当前线程)句柄.我知道我可以使用Windows API函数获取当前线程ID GetCurrentThreadID,但我需要当前的Thread句柄作为另一个Windows API函数SuspendThread的param.
实际上我想要做的是让我的旧dll之一用于挂钩kernel32.dll中的API函数,OpenProcess或者TerminateProcess也用于挂钩SuspendProcess.Hook位于dll文件中,使用SetWindowsHookEx注入正在运行的进程,然后查找目标函数的基址.挂钩函数如TerminateProcess我没有问题,因为它需要进程ID作为param,很容易在主应用程序中使用GetCurrentProcessID.要为SuspendThread函数创建类似的钩子,我需要将线程句柄作为参数传递.
只有我找到线程句柄的地方才是PROCESS_INFORMATION包含的结构
typedef struct _PROCESS_INFORMATION { // pi
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
} PROCESS_INFORMATION;
Run Code Online (Sandbox Code Playgroud)
但问题是这个结构只有在用CreateProcessAPI函数创建进程后才可用.主要目标是防止程序用户使用ProcessExplorer等在线提供的不同工具来终止进程.我实现了成功挂钩TerminateProcess API调用并阻止关闭我的应用程序,但这些过程探索工具中的挂起选项可以暂停我的进程.它是互联网信息亭应用程序,用户无法关闭该应用程序至关重要.应用程序当前在Windows XP中运行,并且必须在管理员帐户上运行,因为用户在登录我的应用程序后使用的其他应用程序需要管理员帐户才能运行,因此我不能简单地在受限用户下运行我的应用程序.
有什么办法可以在Delphi中获得我的主应用程序主线程句柄吗?
提前致谢
唯一安全的调用方法SuspendThread是使用当前线程的句柄.暂停任何其他线程是一个坏主意.要获取当前线程的句柄,只需调用即可GetCurrentThread.您可以在需要线程处理的任何地方使用它.但是不要将该句柄交给另一个线程 - 它是一个特殊的"伪句柄",它总是意味着"当前线程",无论哪个线程都有它.
你可以使用OpenThread或DuplicateHandle获得一个"真正的"线程句柄,但这可能不会让你到达你想去的地方.您将无法识别暂停线程或进程的尝试,因为另一个程序用来挂起线程的句柄不一定与您调用时的值相同OpenThread.句柄仅在打开它们的过程中有意义,并且可以获取同一事物的多个句柄,并且每次可能产生或不产生相同的值.
相反,调用GetThreadId以获取被挂起的线程的ID,然后查看它是否与您的任何程序的线程ID匹配.线程ID唯一标识线程; 手柄没有.同样适用于进程ID和句柄.
如果你有线程ID,你可以使用OpenThread获取它的句柄:
HANDLE WINAPI OpenThread(
__in DWORD dwDesiredAccess,
__in BOOL bInheritHandle,
__in DWORD dwThreadId
);
Run Code Online (Sandbox Code Playgroud)