-
-
[求助]NtQuerySystemInformation的疑惑
-
发表于: 2015-9-8 15:20 4274
-
一个函数内的不同分支的近似功能,为什么实现的风格却不同?
这样实现SystemExtendedProcessInformation分支。
可以这样调用。
而却是这样实现SystemExtendedHandleInformation分支。
导致调用时,想获得总量,需要先传递SYSTEM_HANDLE_INFORMATION_EX的指针和SIZE,否则调用会失败。
传入的指针和size对后续代码并没有任何意义,那么为什么就不能传入null和0呢,和前面的风格一样。
我看了一下源码,没找到原因,在xp和win10平台测试的结果一样。 按理说微软的代码不会那么随意吧, 这么写就有这么写的理由, 想请前辈指教一下。
这样实现SystemExtendedProcessInformation分支。
case SystemExtendedProcessInformation: { BOOLEAN ExtendedInformation; if (SystemInformationClass == SystemProcessInformation ) { ExtendedInformation = FALSE; } else { ExtendedInformation = TRUE; } Status = ExpGetProcessInformation (SystemInformation, SystemInformationLength, ReturnLength, NULL, ExtendedInformation); } break;
可以这样调用。
DWORD returned; QuerySystemInformation(SystemExtendedProcessInformation, NULL, 0, &returned); PVOID buffer = new BYTE[returned]; QuerySystemInformation(SystemExtendedProcessInformation, buffer, returned,NULL);
而却是这样实现SystemExtendedHandleInformation分支。
case SystemExtendedHandleInformation: if (SystemInformationLength < sizeof( SYSTEM_HANDLE_INFORMATION_EX )) { return STATUS_INFO_LENGTH_MISMATCH; } if (!POINTER_IS_ALIGNED (SystemInformation, TYPE_ALIGNMENT (SYSTEM_HANDLE_INFORMATION_EX))) { return STATUS_DATATYPE_MISALIGNMENT; } Status = ExpGetHandleInformationEx( SystemInformation, SystemInformationLength, &Length ); if (ARGUMENT_PRESENT( ReturnLength )) { *ReturnLength = Length; } break;
导致调用时,想获得总量,需要先传递SYSTEM_HANDLE_INFORMATION_EX的指针和SIZE,否则调用会失败。
DWORD returned; SYSTEM_HANDLE_INFORMATION_EX shiex; QuerySystemInformation(SystemExtendedHandleInformation, &shiex, sizeof(SYSTEM_HANDLE_INFORMATION_EX), &returned); PVOID buffer = new BYTE[returned]; QuerySystemInformation(SystemExtendedHandleInformation, buffer, returned, NULL);
传入的指针和size对后续代码并没有任何意义,那么为什么就不能传入null和0呢,和前面的风格一样。
我看了一下源码,没找到原因,在xp和win10平台测试的结果一样。 按理说微软的代码不会那么随意吧, 这么写就有这么写的理由, 想请前辈指教一下。
赞赏
看原图
赞赏
雪币:
留言: