Private Declare Function WinStationGetAllProcesses& Lib "winsta" (ByVal Server As Long, ByVal Unknown As Long, Count As Long, Info As Long)第一个参数是服务器句柄,0表示本地,第二个参数不知道干啥的,不过传0就行了,第三个参数返回正在运行的所有进程句柄,第四个参数返回指向一个进程信息结构的内存指针关键是第四个参数,指向的结构体应该是这样的:
Private Type WINSTA_PROCESS_INFO
Extended As Long'Extended As SYSTEM_PROCESS_INFORMATION
Length As Long
SID As LongExtended应该是SYSTEM_PROCESS_INFORMATION结构体的指针,这个结构体是ZwQuerySystemInformation使用的,但是不知道为什么,我按照标准的SYSTEM_PROCESS_INFORMATION结构体声明并且使用了ZwQuerySystemInformation取得进程列表的方式进行RtlMoveMemory后,就出现内存错误经过一番测试,我感觉原因就是SYSTEM_PROCESS_INFORMATION结构体跟其需要的结构体不同,SYSTEM_PROCESS_INFORMATION的结构体太乱了,网上有N种版本的SYSTEM_PROCESS_INFORMATION结构体,首先长度就不一样,这样也不难解释RtlMoveMemory出现洗白的原因了或者其指向的结构体根本就不是SYSTEM_PROCESS_INFORMATION所以现在这个函数唯一有点价值的就是第三个参数,快速取得进程总数了使用方法:
Dim Count As Long, Buffer As Long
WinStationGetAllProcesses 0, 0, Count, BufferCount中返回系统进程总数PS:这东东不能保证系统兼容性。。