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);
    }

     

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

  • 相关阅读:
    6th Alpha阶段的postmortem报告
    两种open()函数
    文件操作权限第一位的0是什么意思
    vi的查找与替换
    浅析Linux下的/etc/profile、/etc/bashrc、~/.bash_profile、~/.bashrc文件
    Linux命令总结:file
    Linux下/boot目录
    英语单词简记
    Linux下grep命令
    Linux下find命令
  • 原文地址:https://www.cnblogs.com/sunny-li/p/5335256.html
Copyright © 2011-2022 走看看