我试图在64位Win7(AMD64)上运行一些编码32位Vista(X86)的驱动程序,但没有运行。经过大量调试和击中,我使它在后者上工作,但我不知道为什么它起作用的原因。这就是我所做的:

在许多地方,缓冲指针指向一系列结构(在不同的地方不同),并且在某些地方使用这种陈述:

ptr = (PVOID)((PCHAR)ptr + offset);

在某些地方:

ptr = (PVOID)((ULONG)ptr + offset);

第二个正在返回垃圾,所以我将它们全部更改为第一。但是我发现第二个网上的网上有许多样本驱动器。我的问题:

  1. 这些宏定义在哪里(Google无济于事)?
  2. 我了解所有的P_宏都是指针,为什么要把指针铸成乌隆?这如何在32位上起作用?
  3. PCHAR显然会根据环境改变宽度。您知道为此找到文档的任何地方吗?
有帮助吗?

解决方案

  1. 它们应该在winnt.h中定义(它们在SDK中;没有DDK)
  2. 乌隆(Ulong)未签名长;在32位系统上,这是指针的大小。因此,指针可以来回转换为Ulong而不会损失 - 但在64位系统上并非如此(在其中施放值将截断它)。人们投入到乌隆(Ulong
  3. 指针算术总是以基础类型的单位工作,即Phar的字符。这等于字节算术
  4. 任何C书籍都应详细说明指针算术的精确语义。

其他提示

该代码在64位失败的原因是,它将指针投向了Ulong。 Ulong是32位值,而64位的指针为64位值。因此,每当您使用Ulong Cast时,您都会截断指针。

假设PCHAR被定义为PCHAR铸件 char * 很好,只要目的是通过明确数的字节来递增指针。

两个宏都有相同的意图,但只有一个宏在指针大于32位的情况下是有效的。

指针算术是这样的。如果你有:

T *p;

你也是:

p + n;

(n是一个数字),那么p的值将通过 n * sizeof(T).

举一个具体示例,如果您有指向DWORD的指针:

DWORD *pdw = &some_dword_in_memory;

然后您添加一个:

pdw = pdw + 1;

然后,您将指向下一个dword。地址PDW点将增加 sizeof(DWORD), ,即4个字节。

您提到的宏正在使用铸件来导致它们适用的地址偏移量乘以不同的数量。通常,这仅在低级代码中完成,该代码已通过了一个字节(或char或void)缓冲区,但知道其中的数据确实是其他类型。

ULONG 在Windows SDK中以Windef.h定义,始终为32位,因此,当您将64位指针投入到 ULONG 您将指针截断为32位。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top