从 'BYTE *' 到 'ULONG' 的指针截断

Pointer truncation from 'BYTE *' to 'ULONG'

我试图为 windows 编写一个简单的过滤器驱动程序,当我想要构建项目时,Visual Studio 给了我以下警告:

警告 C4311 'type cast':从 'BYTE *' 到 'ULONG'

的指针截断

和错误: C2220 警告被视为错误 - 未生成 'object' 文件

这是我的代码:

BOOLEAN GetAllBufferFromChunkedFormat(STREAM_EDIT_PARAMETERS* params, BYTE** 
dataBuffer)
{
if (!CheckPointer(params) || !CheckPointer(dataBuffer))
{
    return FALSE;
}
BYTE* iterator = params->dataStart + params->contentStart;
params->currentContentLength = 0;
UINT currentChunkLength = 0;
BOOLEAN isAllData = FALSE;
while ((ULONG)iterator - (ULONG)params->dataStart < params->streamEditor->dataLength) //calculate total length
{
    currentChunkLength = strtol(iterator, &iterator, 16);
    iterator += s_chunksSeparatorLength + currentChunkLength + s_chunksSeparatorLength;
    ..
    ..
    ..
}

警告显示在行:

while ((ULONG)iterator - (ULONG)params->dataStart < params->streamEditor->dataLength)

问题是什么?为什么?

一个LONG类型是4字节宽,而指针类型如BYTE*有架构的宽度,即在 x86 平台上为 32 位或 4 字节,在 x64 架构上为 64 位(8 字节)。因此这在 x86 平台上编译良好,但在 64 位平台上给出警告(被视为错误)。

对于 x64 体系结构,正确的转换应该是数字类型“LONG LONG”或 UINT64 和类似类型,或者如果你真的不在乎你可以static_cast(x)这个值。