首页
社区
课程
招聘
[求助]《Undocumented Windows 2000 Secrets》中一段代码的疑惑
发表于: 2009-2-23 01:42 4384

[求助]《Undocumented Windows 2000 Secrets》中一段代码的疑惑

2009-2-23 01:42
4384
在《Undocumented Windows 2000 Secrets》一文中有这样一段枚举进程ID的代码:
BOOL WINAPI EnumProcesses( PDWORD lpidProcess, DWORD cb,PDWORD lpcbNeeded)
{	
	PSYSTEM_PROCESS_INFORMATION pspi, pSpiNext;	
	DWORD dSize, i;	
	NTSTATUS ns;	
	BOOL fOk = FALSE;
	
	for (dSize=0x8000; ((pspi = LocalAlloc(LMEM_FIXED,dSize)) != NULL); dSize += 0x8000)		
	{		
		ns = NtQuerySystemInformation( SystemProcessInformation,pspi, dSize, NULL);		
		if ( STATUS_SUCCESS == ns )			
		{			
			pSpiNext = pspi;
			for ( i=0; i < cb/sizeof(DWORD); i++ )				
			{				
				lpidProcess[i] = pspiNext->dUniqueProcessId;				
				pSpiNext = (PSYSTEM_PROCESS_INFORMATION)((BYTE)pSpiNext + pSpiNext->dNext);				
			}			
			*lpcbNeeded = i * sizeof(DWORD);			
			fOk = TRUE;			
		}		
		LocalFree(pspi);		
		if ( fOk || (ns != STATUS_INFO_LENGTH_MISMATCH) )			
		{			
			if ( !fOk) SetLastError(RtlNtStatusToDosError(ns));			
			break;			
		}		
		return fOk;		
	}
}


代码中定义了“pspi, pSpiNext”,在后面取进程ID值的时候,
为何要用“pSpiNext”而不直接用“pspi”???
如果只定义“pspi”,用此变量取ID值,为何会导致蓝屏???

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
pspi始终指向缓冲区开头且不变,因为最后释放内存的时候仍然用到这个指针。pspinext则是变化的,在循环过程中依次指向下一个结构。两者的作用是不一样的。如果只用一个pspi,那你释放内存时怎么办?
2009-2-23 07:59
0
雪    币: 26
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
哦,pspinext是变化的,所以如果用pspi,释放时内存池的指针发生了变化,就导致蓝屏,是吧?
2009-2-23 10:50
0
雪    币: 191
活跃值: (95)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
PVOID pspi;
PSYSTEM_PROCESS_INFORMATION pSpiNext;

把代码看成这样就OK了
2009-2-23 11:38
0
雪    币: 26
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
把代码变一下,在XP、2003下dwNeededSize都能返回一个大于0的值,但在2000下,却始终是0,奇怪。
DWORD dwNeededSize = 0;
rc = NtQuerySystemInformation(SystemProcessesAndThreadsInformation, NULL, 0, &dwNeededSize);
2009-2-23 12:08
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
6
win2000下不会返回dwNeedSize的

你需要使用1楼的那个累加的方法
2009-2-23 12:15
0
雪    币: 26
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢大家!
再请教一下MJ大,
为何win2000下不会返回dwNeedSize的值呢?
MSDN上也没提到。
在win2000下,除了一楼代码中的累加方法,应该还可以初始赋个较大的值,是吧。
2009-2-23 13:09
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
8
答案是WIN2000就是这么写的:

        case SystemProcessInformation:
            if (SystemInformationLength < sizeof( SYSTEM_PROCESS_INFORMATION)) {
                return STATUS_INFO_LENGTH_MISMATCH;
                }

            Status = ExpGetProcessInformation (SystemInformation,
                                               SystemInformationLength,
                                               &Length,
                                               NULL);

            if (NT_SUCCESS(Status) && ARGUMENT_PRESENT( ReturnLength )) {
                *ReturnLength = Length;
            }

只有成功获取了ProcessInfomation才会告诉你返回了多少数据
2009-2-23 13:16
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
9
2000和nt4的源码哪个更有参考价值啊?
2009-2-23 14:20
0
雪    币: 26
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
非常感谢!!!
2009-2-23 15:40
0
游客
登录 | 注册 方可回帖
返回
//