基本概念的说明
在Linux中task_struct结构体内存储着进程的信息;在Nano Code或WinDBG中可以通过[dt task_struct]命令查看task_struct结构体中存储的信息,当然也可以通过[dt task_struct 地址]查看进程对应的task_struct结构体内存储的信息。
list_head结构体是Linux中提供的双向循环链表;list_head结构体的定义在下方能看到。
struct list_head {
struct list_head *next, *prev;
};
进程的task_struct结构体都是由sched.h文件中的定义task_struct结构体虚拟出来的。
如何通过一个进程的task_struct结构体找到另一个进程的task_struct结构体?这显然需要借助task_strcut结构体中的相关字段,在task_strcut结构体内的tasks字段完成了不同进程task_struct结构体间的相互链接。
tasks字段通过list_head结构体所实现的双向循环链表使得进程task_struct结构体的地址一个接着一个的串联起来,最头上的是无疑是init进程的task_struct结构体init_task,在之后每新创建一个进程就会先虚拟出该进程的task_struct结构体,然后再把该task_struct结构体对应的地址插入链表当中,只要我们进行正向/反向遍历即可找出所有进程的task_struct结构体的地址,并根据这个地址获取相关信息。
杂项问题
在给Nano Code编写插件,并且当我们需要从被调试系统中获取信息的话,需要使用到wdbgExts.h中定义的API,这些API的定义及说明可以在微软的官方文档中看到;关于符号相关的API的定义及说明,可以通过下方链接直达微软的官方文档页面。
https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/wdbgexts-symbols
以Linux系统为例,如果我们需要获取task_struct结构体中的信息,那么是要向在Linux下编程一样导入相关的头文件吗,显然不能,如果我们这么样去导入的话,IDE会告诉你,你缺少一个又一个的头文件。这个过程会相当的繁琐且复杂(毕竟你还有找到它们),最重要的是,你还不一定能成功…………;因此我们应该去调用合适的API去解决问题。