CreateToolhelp32Snapshot函数

CreateToolhelp32Snapshot函数

  • CreateToolhelp32Snapshot可以通过获取进程信息为指定的进程、进程使用的堆[HEAP]、模块[MODULE]、线程建立一个快照。说到底,可以获取系统中正在运行的进程信息,线程信息,等。

原型:

HANDLE WINAPI CreateToolhelp32Snapshot(
  _In_ DWORD dwFlags,       //用来指定“快照”中需要返回的对象,可以是TH32CS_SNAPPROCESS等
  _In_ DWORD th32ProcessID  //一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取 当前进程快照时可以设为0
);

0x01.参数

dwFlags [in]

要包括在快照中的系统部分。此参数可以是以下一个或多个值。

含义
TH32CS_INHERIT 0x80000000表示快照句柄是可继承的。
TH32CS_SNAPALL包括系统中的所有进程和线程,以及th32ProcessID中指定的进程的堆和模块。等效于使用OR运算指定组合的TH32CS_SNAPHEAPLIST,TH32CS_SNAPMODULE,TH32CS_SNAPPROCESS和TH32CS_SNAPTHREAD值。
TH32CS_SNAPHEAPLIST 0x00000001包括快照中th32ProcessID中指定的进程的所有堆。要枚举堆,请参阅Heap32ListFirst。
TH32CS_SNAPMODULE 0x00000008包括快照中th32ProcessID中指定的进程的所有模块。要枚举模块,请参阅Module32First。如果函数失败并返回ERROR_BAD_LENGTH,请重试该函数直到成功。64位Windows:在32位进程中使用此标志包括th32ProcessID中指定的进程的32位模块,而在64位进程中使用该进程包括64位模块。要包括来自64位进程的th32ProcessID中指定的进程的32位模块,请使用TH32CS_SNAPMODULE32标志。
TH32CS_SNAPMODULE32 0x00000010包括从64位进程调用时快照中的th32ProcessID中指定的进程的所有32位模块。该标志可以与TH32CS_SNAPMODULE或TH32CS_SNAPALL组合使用。如果函数失败并返回ERROR_BAD_LENGTH,请重试该函数直到成功。
TH32CS_SNAPPROCESS 0x00000002包括快照中系统中的所有进程。要枚举进程,请参阅Process32First。
TH32CS_SNAPTHREAD 0x00000004包括快照中系统中的所有线程。要枚举线程,请参阅Thread32First。要标识属于特定进程的线程,在枚举线程时将其进程标识符与THREADENTRY32结构的th32OwnerProcessID成员进行比较。

参数2

th32ProcessID [in]

要包括在快照中的进程的进程标识符。此参数可以为零以指示当前进程。当指定TH32CS_SNAPHEAPLIST,TH32CS_SNAPMODULE,TH32CS_SNAPMODULE32或TH32CS_SNAPALL值时,使用此参数。否则,它将被忽略,并且所有进程都包括在快照中。
如果指定的进程是空闲进程或其中一个CSRSS进程,则此函数将失败,并且最后一个错误代码为ERROR_ACCESS_DENIED,因为它们的访问限制会阻止用户级代码打开它们。
如果指定的进程是64位进程,并且调用程序是32位进程,则此函数失败,最后一个错误代码为ERROR_PARTIAL_COPY(299)

返回值

如果函数成功,它将返回一个打开的句柄到指定的快照。
如果函数失败,则返回INVALID_HANDLE_VALUE。要获取扩展错误信息,请调用GetLastError。可能的错误代码包括ERROR_BAD_LENGTH

0x02.备注

  1. 此功能拍摄的快照由其他工具帮助功能检查,以提供其结果。对快照的访问是只读的。快照句柄充当对象句柄,并且遵守与其在其中有效的进程和线程相同的规则。
  2. 要枚举所有进程的堆或模块状态,请指定TH32CS_SNAPALL并将th32ProcessID设置为零。然后,对于快照中的每个附加进程,再次调用CreateToolhelp32Snapshot,指定其进程标识符和TH32CS_SNAPHEAPLISTTH32_SNAPMODULE值。
  3. 当为包含当前进程以外的进程的堆和模块创建快照时,由于各种原因,CreateToolhelp32Snapshot函数可能会失败或返回不正确的信息。例如,如果目标进程中的加载器数据表已损坏或未初始化,或者在作为DLL被加载或卸载的结果的函数调用期间模块列表发生更改,则函数可能会失败,并显示ERROR_BAD_LENGTH或其他错误代码。确保目标进程未在暂挂状态下启动,并尝试再次调用该函数。如果在使用TH32CS_SNAPMODULETH32CS_SNAPMODULE32调用时,函数失败,ERROR_BAD_LENGTH,则再次调用该函数,直到成功。
  4. TH32CS_SNAPMODULETH32CS_SNAPMODULE32标志不会检索使用LOAD_LIBRARY_AS_DATAFILE或类似标志加载的模块的句柄。有关详细信息,请参阅LoadLibraryEx
    要销毁快照,请使用CloseHandle函数。
    请注意,您可以使用QueryFullProcessImageName函数从32位进程检索32位和64位进程的可执行映像的全名。

0x03.包含库

Minimum supported clientWindows XP [desktop apps only]
Minimum supported serverWindows Server 2003 [desktop apps only]
HeaderTlHelp32.h
LibraryKernel32.lib
DLLKernel32.dll

0x04.Example

#include "StdAfx.h"
#include "windows.h"
#include "tlhelp32.h"
#include "stdio.h"
int main(int argc, char* argv[])
{
  PROCESSENTRY32 pe32;
  //在使用这个结构前,先设置它的大小
  pe32.dwSize = sizeof(pe32);
  //给系统内所有的进程拍个快照
  HANDLE hProcessSnap =    ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  if (hProcessSnap == INVALID_HANDLE_VALUE)
  {
  printf("CreateToolhelp32Snapshot 调用失败.\n");
  return -1;
  }
  //遍历进程快照,轮流显示每个进程的信息
  BOOL bMore = ::Process32First(hProcessSnap,&pe32);
  while (bMore)
  {
  printf("进程名称:%s\n",pe32.szExeFile);
  printf("进程ID:%u\n\n",pe32.th32ProcessID);
  bMore = ::Process32Next(hProcessSnap,&pe32);
  }
  //不要忘记清除掉snapshot对象
  ::CloseHandle(hProcessSnap);
  return 0;
}
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: createtoolhelp32snapshot是Windows API中的一个函数,用于创建一个系统进程和模块的快照。它的具体用法是通过调用该函数并传递一个指向PROCESSENTRY32结构的指针来创建快照。这个结构体包含有关进程的信息,例如进程ID,父进程ID,进程名称,线程计数等。这个函数可以帮助开发人员获取有关正在运行的进程的信息,从而进行进程管理和监控。 ### 回答2: CreateToolhelp32Snapshot函数是Windows操作系统提供的一个API函数,位于“kernel32.dll”库中。它被用于获取系统中的进程和线程的快照信息。 这个函数的第一个参数dwFlags用于指定快照的类型,可以是TH32CS_SNAPPROCESS或TH32CS_SNAPTHREAD,分别表示获取进程或者线程的快照。 第二个参数th32ProcessID是要获取快照的目标进程的进程ID,如果传入0,则表示获取系统中所有进程的快照。 使用CreateToolhelp32Snapshot函数可以创建一个系统进程和线程的快照,这个快照包含了这些进程和线程的详细信息,如进程ID、父进程ID、线程ID、模块计数等等。 返回的是一个句柄HANDLE,该句柄可以被Process32First和Process32Next等函数使用,以在快照中遍历获取进程或线程的信息。 使用该API可以方便地获取系统当前运行的进程和线程的信息,进而进行一些系统监视、性能分析或者程序调试的工作。 需要注意的是,通过CreateToolhelp32Snapshot获取的快照信息只是一个静态的快照,也就是说获取到的信息在快照创建时的状态,并不会反映后续的实时变化。如果需要获取实时的进程和线程信息,需要结合其他API函数来实现。 ### 回答3: CreateToolhelp32Snapshot 是一个用于获取系统中进程和模块信息的函数。它是 Windows API 中的一个函数,可用于遍历系统中的进程列表以及每个进程中加载的模块列表。 这个函数的调用需要传入一个表示要获取的信息类型的参数,可以是 TH32CS_SNAPPROCESS 或 TH32CS_SNAPMODULE。当传入 TH32CS_SNAPPROCESS 时,函数将返回一个快照句柄,该句柄可以用于获取系统中所有正在运行的进程的详细信息。当传入 TH32CS_SNAPMODULE 时,函数将返回一个快照句柄,该句柄可以用于获取某个指定进程中加载的所有模块的详细信息。 使用 CreateToolhelp32Snapshot 函数时,我们可以通过调用 Process32First 和 Process32Next 函数来遍历进程列表,获取每个进程的信息。同样,我们可以通过调用 Module32First 和 Module32Next 函数来遍历某个指定进程的模块列表,获取每个模块的详细信息。 需要注意的是,在调用 CreateToolhelp32Snapshot 函数返回快照句柄后,我们可以通过调用 CloseHandle 函数来关闭句柄,释放系统资源。同时,在遍历进程或模块列表时,我们需要逐个使用 CloseHandle 函数关闭每个句柄。 使用 CreateToolhelp32Snapshot 函数可以方便地获取系统中正在运行的进程和每个进程加载的模块的信息,这对于了解系统状态、进行进程监控和调试等操作非常有用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值