2017-04-14 84 views
1

在Visual Studio 2015中使用内核驱动程序项目。我注意到这种事情正在发生。VS2015指针不断变化,对齐?

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英寸。

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

回答

0

哈,世界再次健全。发现其中一个头文件有#pragma pack(4)使得传递到内核的userland结构相同,但头文件以#pragma push()结尾 - 不确定大脑在那里做什么,但是git commit在凌晨1点。

因此,取决于哪些文件包含所述标头,哪些不包含,包是4或8。让我们把这个放在PEBCAK的人身上,对于噪音感到抱歉。