调用NtQueryInformationProcess获取ProcessInstrumentationCallback返回STATUS_INVALID_INFO_CLASS问题
解决NtQueryInformationProcess返回STATUS_INVALID_INFO_CLASS的问题
问题分析
你遇到的STATUS_INVALID_INFO_CLASS错误,通常由以下几个核心原因导致:
1. 硬编码的信息类数值不匹配
PROCESS_INSTRUMENTATION_CALLBACK的数值并非固定为40,不同Windows版本可能存在差异。硬编码固定值会导致在非目标版本系统上调用直接失败。
2. 结构体定义错误
你的结构体存在拼写错误:verision应为Version,这会导致内存布局与系统预期的PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION完全不匹配,进而触发参数无效错误。
3. 自定义封装函数的潜在问题
manual_query_information_process是你自行封装的函数,如果内部没有正确传递参数(比如ProcessInformationLength、ReturnLength),或者没有正确加载ntdll.dll中的原生函数,也会导致调用失败。
解决步骤
步骤1:修正结构体定义
使用与系统内核一致的结构体定义,修正拼写错误:
typedef struct _PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION { ULONG Version; ULONG Reserved; PVOID Callback; } PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION, *PPROCESS_INSTRUMENTATION_CALLBACK_INFORMATION;
步骤2:确认信息类的正确数值
避免硬编码固定值,可通过以下方式确认当前系统的PROCESS_INSTRUMENTATION_CALLBACK值:
- 查阅对应Windows版本的内核头文件(如
ntpsapi.h) - 测试常见版本的数值:Windows 10 1903+通常为
0x28(十进制40),但需根据实际运行系统调整
步骤3:检查自定义函数实现
确保manual_query_information_process正确调用原生NtQueryInformationProcess,示例正确封装如下:
#include <windows.h> #include <winternl.h> typedef NTSTATUS(NTAPI* pNtQueryInformationProcess)( HANDLE ProcessHandle, PROCESS_INFORMATION_CLASS ProcessInformationClass, PVOID ProcessInformation, ULONG ProcessInformationLength, PULONG ReturnLength ); NTSTATUS manual_query_information_process( HANDLE ProcessHandle, PROCESS_INFORMATION_CLASS ProcessInformationClass, PVOID ProcessInformation, ULONG ProcessInformationLength, PULONG ReturnLength ) { pNtQueryInformationProcess NtQueryInformationProcess = (pNtQueryInformationProcess)GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtQueryInformationProcess"); if (!NtQueryInformationProcess) { return STATUS_PROCEDURE_NOT_FOUND; } return NtQueryInformationProcess(ProcessHandle, ProcessInformationClass, ProcessInformation, ProcessInformationLength, ReturnLength); }
步骤4:验证参数与版本号
- 必须为结构体设置正确的版本号:
nirvana.Version = 1(系统预期的版本值通常为1) - 确保
ProcessInformationLength传递的是结构体的实际大小:sizeof(PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION)
修正后的完整代码示例
#define PROCESS_INSTRUMENTATION_CALLBACK 0x28 // 根据实际系统调整数值 typedef struct _PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION { ULONG Version; ULONG Reserved; PVOID Callback; } PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION, *PPROCESS_INSTRUMENTATION_CALLBACK_INFORMATION; // 此处插入上述manual_query_information_process的实现 int main() { PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION nirvana = {0}; nirvana.Version = 1; NTSTATUS status = manual_query_information_process( GetCurrentProcess(), (PROCESS_INFORMATION_CLASS)PROCESS_INSTRUMENTATION_CALLBACK, &nirvana, sizeof(nirvana), NULL ); if (!NT_SUCCESS(status)) { printf("Unable to get callback: 0x%x\n", status); return 1; } printf("Got callback: 0x%p\n", nirvana.Callback); return 0; }
内容的提问来源于stack exchange,提问作者user24684540
相关产品推荐
相关产品推荐

