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

Ale*_*iev 2 c++ mfc windows-10

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

\n\n
TCHAR ComputerName[MAX_COMPUTERNAME_LENGTH + 1];\n\nmemset( ComputerName, 0, sizeof( ComputerName ) );\n\nDWORD dwNameLenght = MAX_COMPUTERNAME_LENGTH;\n\nGetComputerNameW(ComputerName, &dwNameLenght);\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xc3\x86\xc3\x86\xc3\x98我已经用包含 unicode 字符的计算机名()进行了测试,它工作正常(尽管GetLastError()返回代码为 203)。\n如果名称为DESKTOP-IVHSIQD无计算机名,则获取并GetLastError()返回 111,据说是缓冲区溢出。\ n操作系统为Windows 10 x64。

\n

Sin*_*all 5

我认为你的缓冲区确实太小了......文档说明GetComputerNameW

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

对我来说,这意味着缓冲区本身及其大小lpnSize应该足以容纳最长的计算机名称和尾随的\0.

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