zoukankan      html  css  js  c++  java
  • pvoid64 pvoid

    如果需要某一个结构体,既在kernel space用,又在user space用,如

    typedef struct

    {

    PVOID data;

    int size;

    }binary,pbinary;

    上面这个binary的结构体,假设需要在Kenel space和user space同时用到,如通过ksmethod来进行传递,就需要把PVOID改成PVOID64.

    typedef struct

    {

    PVOID64 data;

    int size;

    }binary_64,pbinary_64;

    以上是结论,下面来讲讲原因。

    先说一说为什么需要改。

    如果不改的话,假设一种情况,app是32bit的,系统是64bit的,这样,user space的binary就是4byte+4byte,在KS,大小是8byte+4byte。如果这个时候call kemethod,OS就会返回not sufficient buffer了。

    如果改成pvoid64之后呢?

    不管什么情况,都是8byte+4byte。至少大小应该是没有问题了。

    补充一点,如果说我们拿到的binary,还需要赋值给user space的某一个变量m_pbinary,而且它里面的data是pvoid类型的,那么可不能直接强制类型转换,需要每一项每一项的赋值。

    for example:

    ===============================

    pbinary m_pbinary = (pbinary_64)pbinary; (error)

    ===============================

    pbinary m_pbinary = new binary;

    m_pbinary->data = pbinary->data;

    m_pbinary->size = pbinary->size;(correct)

    ===============================

    不然,size就成了0了。

    补记一点:

    在上面的强制转换的过程中,从64位pvoid64转换成pvoid,有的时候编译器可能会 有warning,

    我们可以用宏进行转换

    m_pbinary->data =(Ptr64ToPtr) pbinary->data;

    这个是微软定义的一个API

    __inline
    void *
    Ptr64ToPtr(
    const void * POINTER_64 p
    )
    {
    return((void *) (ULONG_PTR) (unsigned __int64) p);
    }

     

    就可以了,不会报错。:)

  • 相关阅读:
    Android:Butter Knife 8.0.1配置
    webAPI获得链接客户端IP地址
    解决WebClient或HttpWebRequest首次连接缓慢问题
    Android Studio中有用的快捷键栏
    SQL十进制和十六进制相互转换
    SQL分组查询每组前几条数据
    POJ 1011 Sticks
    POJ 1144 Network(割点)
    求无向图中的割边(桥)
    POJ 2553 The Bottom of a Graph
  • 原文地址:https://www.cnblogs.com/sunny-li/p/5335256.html
Copyright © 2011-2022 走看看