You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 07:20:12