【问题标题】:Get variables datatypes in kernel mode drivers windows在内核模式驱动程序窗口中获取变量数据类型
【发布时间】:2020-06-04 08:15:25
【问题描述】:

我想知道内核模式驱动程序中是否有任何方法可以提供变量的数据类型。就像我声明:

INT i = 0;

并询问“i”的数据类型,它将返回 INT。对于结构,我也想要同样的东西。

【问题讨论】:

  • 数据类型在编译时是已知的。为什么要在运行时执行此操作?
  • 我将 API 中的所有参数作为指针,并想决定调用内核中参数类型库的位置。
  • 所以有问题的函数接受void *类型的参数?然后你需要以某种方式传递关于类型的附加信息。
  • 是的,我也需要它。
  • 一种方法是传入一个表示类型的枚举值,然后在函数中使用switch 来处理基于该类型的类型。

标签: c++ c kernel driver windows-kernel


【解决方案1】:

那是不可能的。内核是有效的汇编。如果你得到一个PVOID,那是一个 32 位或 64 位地址,你甚至不知道它指向的对象的大小。

【讨论】:

    【解决方案2】:

    你可以这样声明你的函数:

    void myapi(void *param, enum type param_type);
    

    以及相关的枚举:

    enum type {
        TYPE_INT,
        TYPE_CHAR,
        // more types
     };
    

    这样的身体:

    void myapi(void *param, enum type param_type)
    {
        if (param_type == TYPE_INT) {
            int *intptr = param;
            // do something with intptr
        } else if (param_type == TYPE_CHAR) {
            char *charptr = param;
            // do something with charptr
        // cases for other types
        }
    }
    

    你会这样称呼它:

    int myint = 0;
    myapi(&myint, TYPE_INT);
    char mychar = 'x';
    myapi(&mychar, TYPE_CHAR);
    

    【讨论】:

    • 是的,这个策略可能适用,我感谢你的努力。但问题是 API 来自另一个驱动程序,在它们中应用钩子后,我将它们放入我的驱动程序,这就是为什么我不知道数据类型,所以我需要相应地输入它们..
    • @abdullahtoqeer 如果调用函数没有为您提供有关数据类型的任何信息,那么就无法知道它可能是什么。你只有一个指向某个未知内存块的指针。
    • 不!调用 API 只是传递参数,不提供其他信息,我们需要对它们进行相应的类型转换。
    • @abdullahtoqeer 如果您不知道正确的类型是什么,您打算如何转换为正确的类型?在给定的内存块中没有任何内容表明它是intchardoublestruct 的实例。也许一个更具体的例子会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 2016-06-10
    相关资源
    最近更新 更多