GetComputerNameW导致Windows 10中的缓冲区溢出

时间:2015-10-28 08:43:36

标签: c++ mfc windows-10

我一直在互联网上搜索这个问题,这对我来说似乎很奇怪。 在我的程序中,我通过以下代码获取计算机的名称:

TCHAR ComputerName[MAX_COMPUTERNAME_LENGTH + 1];

memset( ComputerName, 0, sizeof( ComputerName ) );

DWORD dwNameLenght = MAX_COMPUTERNAME_LENGTH;

GetComputerNameW(ComputerName, &dwNameLenght);

我已经使用包含unicode字符的计算机名称(ÆÆØ)对其进行了测试,但它工作正常(尽管GetLastError()返回的代码为203)。 如果名称为DESKTOP-IVHSIQD,则不会获得计算机名称,GetLastError()将返回111,这称为缓冲区溢出。 操作系统是Windows 10 x64。

1 个答案:

答案 0 :(得分:4)

我认为你的缓冲区确实太小了...... GetComputerNameW上的文档指出:

  

lpnSize [in,out] - 输入时,在TCHAR中指定缓冲区的大小。在输出时,复制到目标缓冲区的TCHAR数,不包括终止空字符。   lpnSize参数指定所需缓冲区的大小,包括终止空字符。

对我而言,这意味着缓冲区本身及其在lpnSize中的大小应该足以容纳尽可能长的计算机名称和尾随\0

您的缓冲区大小为MAX_COMPUTERNAME_LENGTH + 1(根据文档可以很好),但dwNameLenght的值小于1个字符。 DESKTOP-IVHSIQD似乎也只是MAX_COMPUTERNAME_LENGTH长(15个字符),所以我想说当\0被附加到缓冲区时会发生溢出。将dwNameLenght设置为MAX_COMPUTERNAME_LENGTH + 1可能会解决您的问题。