首页
社区
课程
招聘
[求助]NtQuerySystemInformation的疑惑
发表于: 2015-9-8 15:20 4274

[求助]NtQuerySystemInformation的疑惑

2015-9-8 15:20
4274
一个函数内的不同分支的近似功能,为什么实现的风格却不同?

这样实现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平台测试的结果一样。 按理说微软的代码不会那么随意吧, 这么写就有这么写的理由, 想请前辈指教一下。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//