VS2015指针不断改变,对齐?

时间:2017-04-14 00:54:33

标签: c windows visual-studio-2015 kernel alignment

在Visual Studio 2015中,在内核驱动程序项目上工作。我注意到这种事情正在发生;

dprintf("os %p; os_lock %p\n", os, &os->os_lock);
mutex_init(&os->os_lock);
mutex_enter(&os->os_lock);

void mutex_init(kmutex_t *mp) {
  dprintf("%s is %p\n", __func__, mp);
  ...

void mutex_enter(kmutex_t *mp) {
  dprintf("%s is %p\n", __func__, mp);
  ...

os 0xffffa08b29041ac0; os_lock 0xffffa08b29041df8
mutex_init is 0xffffa08b29041df8
mutex_enter is 0xffffa08b29041df0  <---
那么那里发生了什么?当然,它是VS2015由于某种原因正在做的一个对齐的东西,但是由于第一次调用是正确的,它会让人感到特别困惑,然后它决定在第二次调用时搞乱它。这似乎是一件非常糟糕的事情。结构是在考虑到对齐的情况下制作的,os_lock是+ 0x338 in。

我可以在该结构周围抛出#pragma pack(8)来阻止它,但它似乎发生在其他很多地方,并且它需要停止:)我无法想象VS2015会是这个随机的,所以它必须是我设法做的事情。

1 个答案:

答案 0 :(得分:0)

哈,世界又恢复了理智。原来其中一个头文件有#pragma pack(4)以使用户域结构传入内核是相同的,但头文件以#pragma push()结束 - 不知道大脑在那里做了什么,但是git commit是凌晨1点。

因此,根据包含所述标题的文件,以及哪些文件没有,包装是4或8.当然让事情变得有趣。让我们把它归结为PEBCAK的人,对不起噪音。