一:ToolHelp API
MSDN:https://msdn.microsoft.com/en-us/library/ms686832(VS.85).aspx
关于Toolhelp API,MSDN是这样解释的:
The functions provided by the tool help library make it easier for you to obtain information about currently executing applications. These functions are designed to streamline the creation of tools.
提供的工具帮助库的功能方便您可以获取有关当前正在执行的应用程序的信息。这些功能旨在简化创建工具。
其实,ToolHelp API就是用于枚举进程,枚举模块,获取进程和模块信息的工具API。
1。CreateToolhelp32Snapshot
HANDLE WINAPI CreateToolhelp32Snapshot(
_In_ DWORD dwFlags,
_In_ DWORD th32ProcessID
);
创建进程快照
dwFlags:
TH32CS_INHERIT:指示是可继承的快照句柄。
TH32CS_SNAPALL:包括所有进程和线程,再加上堆的 th32ProcessID 中指定的进程和模块。等效于指定 TH32CS_SNAPHEAPLIST,TH32CS_SNAPMODULE,TH32CS_SNAPPROCESS 和 TH32CS_SNAPTHREAD 的值组合使用或运算 (|)。
TH32CS_SNAPHEAPLIST:包括所有堆的快照中的 th32ProcessID 中指定的进程。若要枚举的堆,请参阅 Heap32ListFirst。
TH32CS_SNAPMODULE:包括所有模块的快照中的 th32ProcessID 中指定的进程。若要枚举模块,请参阅 Module32First。如果函数失败与 ERROR_BAD_LENGTH,重试功能,直到成功为止。
64 位 Windows: 在 32 位进程中使用此标志,而在 64 位进程中使用 64 位的进程。若要包括 64 位进程从 th32ProcessID 中指定的进程的 32 位模块,请使用 TH32CS_SNAPMODULE32 标志。
TH32CS_SNAPMODULE32:包括所有的 32 位模块的 th32ProcessID 在快照时从 64 位进程调用中指定的进程。此标志可以结合 TH32CS_SNAPMODULE 或 TH32CS_SNAPALL。如果函数失败与 ERROR_BAD_LENGTH,重试功能,直到成功为止。
TH32CS_SNAPPROCESS:包含在快照中系统中的所有进程。若要枚举的进程,请参阅 Process32First。
TH32CS_SNAPTHREAD:包含在快照中系统中的所有线程。若要枚举的线程,请参阅 Thread32First。若要标识属于特定进程的线程,线程进行枚举时比较 THREADENTRY32 结构的 th32OwnerProcessID 成员及其进程标识符。
th32ProcessID:
要包含在快照中的进程的进程标识符。这个参数可以是零,以表明当前进程。当指定的 TH32CS_SNAPHEAPLIST、 TH32CS_SNAPMODULE、 TH32CS_SNAPMODULE32 或 TH32CS_SNAPALL 的值,将使用此参数。否则为它将被忽略,所有流程都包含在快照中。
如果指定的进程是空闲进程或 CSRSS 之一处理,此函数将失败和最后的错误代码是 ERROR_ACCESS_DENIED,因为它们的访问限制阻止用户级代码打开它们。
如果指定的进程是一个 64 位的过程和调用方是 32 位的进程,此函数将失败和最后的错误代码是 ERROR_PARTIAL_COPY (299)。
返回值:如果此函数成功,它返回一个打开句柄到指定快照。如果函数失败,则返回 INVALID_HANDLE_VALUE
简单解释:如果你想枚举进程,dwFlags用TH32CS_SNAPPROCESS,此时th32ProcessID会被忽略,要枚举模块,用TH32CS_SNAPMODULE(64位程序枚举32位进程的模块时用TH32CS_SNAPMODULE32),枚举模块时th32ProcessID表示进程ID
2。Process32First
BOOL WINAPI Process32First(
_In_ HANDLE hSnapshot,
_Inout_ LPPROCESSENTRY32 lppe
);
获取进程快照中的第一个进程信息
hSnapshot:调用 CreateToolhelp32