首页
社区
课程
招聘
[求助]驱动程序 结构体定义的一个问题。~ ~~~
发表于: 2012-5-11 18:13 8284

[求助]驱动程序 结构体定义的一个问题。~ ~~~

2012-5-11 18:13
8284


这个是 Win 7 x64 _MMPTE_HARDWARE 结构。

可是当自己定义的时候。



编译器 提示: 'PageFrameNumber' : type of bit field too small for number of bits。
意思 大概就是太大了。

如果我把 PageFrameNumber 类型改成 ULONG64 之类的64位类型。 编译是通过了。但是并不符合要求。



What Should I Do.?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 378
活跃值: (702)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
2
Specifies packing alignment for structure, union, and class members.
#pragma pack( [ show ] | [ push | pop ] [, identifier ] , n  )
2012-5-11 18:25
0
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
3
unsigned默认类型是int型,默认32位
2012-5-11 19:24
0
雪    币: 99
活跃值: (110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
能举个例子么。
2012-5-11 19:31
0
雪    币: 99
活跃值: (110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
64位的是神马。? 3Q
2012-5-11 19:31
0
雪    币: 99
活跃值: (110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=EvilKnight;1071627]Specifies packing alignment for structure, union, and class members.
#pragma pack( [ show ] | [ push | pop ] [, identifier ] , n  )[/QUOTE]

能举个例子么。3Q
2012-5-11 19:32
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不是 long  就是 long long  w我猜的
2012-5-11 19:50
0
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
8
64位下int也是32位,48位用ULONGLONG64
2012-5-11 20:27
0
雪    币: 99
活跃值: (110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
如果我把 PageFrameNumber 类型改成 ULONG64 之类的64位类型。 编译是通过了。但是并不符合要求。
看最后一张图。
2012-5-11 20:29
0
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
10
#pragma pack(push,1)
....
....
#pragma pack(pop)
2012-5-11 20:34
0
雪    币: 99
活跃值: (110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
#pragma pack(push,1)
typedef struct _NEWMMPTE_HARDWARE {

unsigned Valid :                                        1;
unsigned Dirty1 :                                        1;
unsigned Owner :                                        1;
unsigned WriteThrough :                                1;
unsigned CacheDisable :                                1;
unsigned Accessed :                                1;
unsigned Dirty :                                        1;
unsigned LargePage :                                1;
unsigned Global :                                        1;
unsigned CopyOnWrite :                                1;
unsigned Unused :                                        1;  
unsigned Write :                                        1;
ULONG_PTR PageFrameNumber :                        36;
unsigned reserved1 :                                4;
unsigned SoftwareWsIndex :                        11;
unsigned NoExecute :                                1;

} NEWMMPTE_HARDWARE, *NEWPMMPTE_HARDWARE;
#pragma pack(pop)

这样编译后。

0: kd> dt Anti!_NEWMMPTE_HARDWARE
   +0x000 Valid            : Pos 0, 1 Bit
   +0x000 Dirty1           : Pos 1, 1 Bit
   +0x000 Owner            : Pos 2, 1 Bit
   +0x000 WriteThrough     : Pos 3, 1 Bit
   +0x000 CacheDisable     : Pos 4, 1 Bit
   +0x000 Accessed         : Pos 5, 1 Bit
   +0x000 Dirty            : Pos 6, 1 Bit
   +0x000 LargePage        : Pos 7, 1 Bit
   +0x000 Global           : Pos 8, 1 Bit
   +0x000 CopyOnWrite      : Pos 9, 1 Bit
   +0x000 Unused           : Pos 10, 1 Bit
   +0x000 Write            : Pos 11, 1 Bit
   +0x004 PageFrameNumber  : Pos 0, 36 Bits
   +0x00c reserved1        : Pos 0, 4 Bits
   +0x00c SoftwareWsIndex  : Pos 4, 11 Bits
   +0x00c NoExecute        : Pos 15, 1 Bit

还是有问题。
2012-5-11 20:43
0
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
12
因为你没定义类型
默认int是32位,4字节对齐的,都必须用ULONG64
2012-5-11 21:06
0
雪    币: 99
活跃值: (110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
3Q .解决了。
2012-5-11 21:19
0
游客
登录 | 注册 方可回帖
返回
//