// 首先用PsGetCurrentProcess()或IoGetCurrentProcess(), 可以获取当前进程EPROCESS
PEPROCESS eproc = PsGetCurrentProcess(); //PEPROCESS
// 保存起始位置PID,防止循环遍历进程双向链表
HANDLE current_PID = *((PHANDLE)((ULONG)eproc+PIDOFFSET));
HANDLE start_PID = current_PID;
PUCHAR lpImageFileName = (PUCHAR)((ULONG)eproc+IMAGENAMEOFFSET);
// 遍历进程双向链表,枚举所有进程
int count=0;
DbgPrint("SN PID EPROCESS ImageFileName\n");
do
{
// PID为负值必为Idle进程 if(0>=(LONG)current_PID) {current_PID=0; lpImageFileName="Idle";}
// Show process id and name form scan EPROCESS
DbgPrint("%02d %04d %08X %s\n",count++,current_PID,eproc,lpImageFileName);
//get the next EPROCESS from the flink of the next list entry
eproc = (PEPROCESS)((ULONG)(((PLIST_ENTRY)((ULONG)eproc+FLINKOFFSET))->Flink) - FLINKOFFSET);
current_PID = *((PHANDLE)((ULONG)eproc+PIDOFFSET)); // THE NEXT PID
lpImageFileName = (PUCHAR)((ULONG)eproc+IMAGENAMEOFFSET); //THE NEXT ImageFileName
}while(start_PID != current_PID);