先声明~我是小菜,初学windows驱动,欢迎各位大牛拍砖~~
先放代码~

/*
从ActiveProcessLink上遍历进程
*/
VOID GetProcess()
{
  //获取EPROCESS结构
  ULONG epadr = (ULONG)PsGetCurrentProcess();
  if((epadr == 0) || (epadr == 0xffffffff)){
    KdPrint(("Can't get the process!\n"));
    return;
  }

  //获取ActiveProcessLink链表,EPROCESS+0X88是ActiveProcessLink节点
  LIST_ENTRY* pActPro = (LIST_ENTRY*)(epadr + 0x88);
  LIST_ENTRY* bC = pActPro;
  //获取保存文件名的ImageFileName数组,EPROCESS+0X174是ImageFileName数组
  UCHAR* ImageFileName = (UCHAR*)(epadr + 0x174);
  do{
    KdPrint(("%s.\n",ImageFileName));
    //遍历链表
    pActPro = (LIST_ENTRY*)pActPro->Flink;
    //获得ImageFileName
    _asm{
      mov eax,pActPro
      add eax,236
      mov ImageFileName,eax
    }
  }while(pActPro->Flink != bC);
}

#pragma LOCKEDCODE
extern "C" NTSTATUS DriverEntry (
      IN PDRIVER_OBJECT pDriverObject,
      IN PUNICODE_STRING pRegistryPath  ) 
{
#ifdef  DBG
  _asm int 3
#endif
  KdPrint(("进入驱动入口\n"));
  
  GetProcess();

  KdPrint(("DriverEntry end\n"));

  return STATUS_SUCCESS;
}

在EPROCESS中,ActiveProcessLinks域是一个双链表节点,在windows中,所有活动进程都连接在一起,构成一个双链表,表头是全局变量PsActiveProcessHead。当一个进程创建时,其ActiveProcessLinks域将作为节点加入到此链表中;当进程删除是,则从链表中移除。
但是为什么System Idle Process不能在链表中遍历出来呢?想不通。。。