【问题标题】:C and 64 bit pointer calculationC和64位指针计算
【发布时间】:2012-06-15 01:18:43
【问题描述】:

我正在做一个内核模式驱动程序,在 64 位上运行代码时遇到了一些错误。

代码在 32 位上运行良好,但是当我在 amd64 中构建/运行时,我得到了奇怪的结果。我阅读了一些关于 64 位指针和寻址与 32 位与 16 位(在 win32 中)的内容,我确信我遗漏了一些关于 64 位架构中指针基础知识的内容。

这是在 32 位中运行良好的 C 代码。 ncImageLoadEventSettings.buffchar*ncILHead->count 只是一个 int。

// Calculate offset
    pnt = (void*)(ncImageLoadEventSettings.buff + sizeof(struct NC_IL_HEAD) + (ncILHead->count * sizeof(struct NC_IL_INFO)));

此代码计算将结构对象写入缓冲区的地址(从.buff 开始),这在 32 位模式下运行良好。

需要注意的是,读取这个缓冲区的程序是32位的。我想我在某处读到 64 位模式下的结构与 32 位模式下的结构大小不同。

32 位阅读器程序可以很好地读取缓冲区的一些内容,而大多数条目都是垃圾。

这是计算地址的正确方法,还是读取该缓冲区的 64 位和 32 位读取器应用程序可能存在问题?

【问题讨论】:

  • 与 MSVC 没有对齐差异,默认打包 8。这些结构是否包含任何指针?

标签: c winapi pointers 64-bit driver


【解决方案1】:

http://en.wikipedia.org/wiki/Data_structure_alignment#Typical_alignment_of_C_structs_on_x86

一般来说,指针更大(64 位),并且大多数 64 位大小的字段(包括指针)将对齐(添加填充)。

【讨论】:

  • 啊,谢谢。可能想引用文章中的某个部分,其中说“与 32 位系统相比,64 位系统在对齐方面的唯一显着差异是”。
猜你喜欢
  • 1970-01-01
  • 2011-01-31
  • 2016-08-01
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
  • 2012-07-16
相关资源
最近更新 更多