2015-10-28 4 views
2

Я искал в Интернете об этой проблеме, и мне кажется, это действительно странно. В моей программе я получаю имя компьютера следующего кода:GetComputerNameW вызывает переполнение буфера в Windows 10

TCHAR ComputerName[MAX_COMPUTERNAME_LENGTH + 1]; 

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

DWORD dwNameLenght = MAX_COMPUTERNAME_LENGTH; 

GetComputerNameW(ComputerName, &dwNameLenght); 

Я проверил его с именем компьютера (ÆÆØ), который содержит символы Юникода и она отлично работает (хотя GetLastError() возвращает код 203). Если имя DESKTOP-IVHSIQD, имя компьютера не получено, и GetLastError() возвращает 111, который называется переполнением буфера. Операционная система - Windows 10 x64.

+0

Определен ли UNICODE? И в этом случае, если вы собираетесь использовать опцию с макросами и использовать 'GetComputerNameW' напрямую, зачем использовать' TCHAR' вместо 'wchar_t'? –

ответ

4

Я думаю, что ваш буфер действительно слишком мал ... Документация по GetComputerNameW состояниях:

lpnSize [в, из] - На входе, задает размер буфера, в TCHARs. На выходе количество TCHAR копируется в буфер назначения, не включая завершающий нулевой символ. Параметр lpnSize указывает размер требуемого буфера, , включая конечный нулевой символ.

Для меня это означает, что и сам буфер, и его размер в lpnSize должен быть достаточно, чтобы держать максимально возможное имя компьютера и заднюю \0.

Ваш буфер имеет размер MAX_COMPUTERNAME_LENGTH + 1 (что хорошо в соответствии с документацией), но значение dwNameLenght составляет 1 символ меньше. DESKTOP-IVHSIQD также выглядит точно MAX_COMPUTERNAME_LENGTH длинным (15 символов), поэтому я бы сказал, что переполнение происходит, когда \0 добавляется в буфер. Установка dwNameLenght на MAX_COMPUTERNAME_LENGTH + 1 может решить вашу проблему.

+0

Спасибо! Это была именно эта проблема. Кажется, мне нужно быть очень осторожным с документацией :) –

+0

@ АлександрДемерджиев, пожалуйста. – SingerOfTheFall

+0

@ АлександрДемерджиев: Действительно, вы должны быть осторожны. Когда Windows сообщает вам передать длину буфера, вы не должны передавать длину-1. – MSalters

Смежные вопросы