这两天一直看Windows进程结构和进程切换,对进程结构有了一点了解,进程上下文指的就是进程的页目录物理地址,进程切换后之所以在同样的进程地址空间对应的物理地址也不相同就是因为进程的页目录基地址不同。页目录的物理地址由CR3寄存器存放。根据前面的分析可知进程切换时CR3的内容会发生改变,也就是说进程结构中有页目录物理,经过实验证实了我的想法。在KPROCESS偏移0x18处DirectoryTableBase存放着页目录的物理地址。我猜想进程切换的时候CR3的值应该就是在这里取得的吧。。。

所以写了个程序遍历EPROCESS中进程名(EPROCESS中偏移0x174h)和进程的Context

#include <ntifs.h>

VOID 
Unload( 
    IN PDRIVER_OBJECT  DriverObject 
    ); 

VOID GetAllProcess(ULONG Address);

NTSTATUS 
DriverEntry( IN PDRIVER_OBJECT DriverObject,
       IN PUNICODE_STRING RegistryPath )
{
  NTSTATUS status = STATUS_SUCCESS;
  ULONG Address;
  ULONG oldAddress;

  //得到当前进程的地址
  Address = (ULONG)PsGetCurrentProcess();
  //得到EPROCESS中链表的偏移
  Address += 0x88;
  //用oldAddress保存当前进程链表的地址
  oldAddress = Address;

  //遍历进程链表
  do
  {
    GetAllProcess(Address);
    //让Address指向当前链表的下一个进程链表的地址(注意是Flink)
    Address = *(ULONG*)Address;

  }while( oldAddress!=Address );//当得到的链表地址与保存的地址相等说明遍历完整个线程链表,返回
  
  DriverObject->DriverUnload = Unload;

  return status;
}


VOID 
Unload( 
    IN PDRIVER_OBJECT  DriverObject 
    )
{

}

VOID GetAllProcess(ULONG Address)
{
  //得到对应的EPROCESS结构
  Address -= 0x88;
  //EPROCESS偏移0x174为ImageFileName(进程名)
  DbgPrint("ProcessName %s \n",(char*)Address+0x174);
  //EPROCESS偏移0x18为页目录物理地址
  DbgPrint("Process Context %d \n",*(ULONG*)(Address+0x18)); 

}

  水平有限,写出来只为分享和自己记忆。。。