Почему getcomputernameex не заполняет буфер данными

Учитывая приведенный ниже фрагмент кода, может ли кто-нибудь сказать мне, почему в строке 17 печатается только «Имя:»?

#include <Windows.h>
#include <stdio.h>
#pragma comment(lib, "Ws2_32.lib")

// Caller supplies function with a buffer to copy the name into as
// mentioned by nobugz here: https://social.msdn.microsoft.com/Forums/en-US/6547d2bf-2884-4ad2-b600-adaab0fa1031/warning-c4172-returning-address-of-local-variable-or-temporary?forum=Vsexpressvc
BOOL getName(int num, LPWSTR buffer) {
    DWORD size = sizeof(buffer);
    return GetComputerNameEx((COMPUTER_NAME_FORMAT)num, buffer, &size);
}

void main(int argc, char ** argv) {
    printf("%s\n", "RAT POC RUNNING");

    TCHAR buffer[256];
    getName((COMPUTER_NAME_FORMAT)1, buffer);
    printf("Name: %ws\n", buffer);

    TCHAR hostName[MAX_COMPUTERNAME_LENGTH + 1];
    DWORD hNsize = sizeof(hostName) / sizeof(hostName[0]);
    GetComputerNameEx((COMPUTER_NAME_FORMAT)1, hostName, &hNsize);
    printf("Hostname: %ws\n", hostName);

    TCHAR domainName[MAX_COMPUTERNAME_LENGTH + 1];
    DWORD dNsize = sizeof(domainName) / sizeof(domainName[0]);
    GetComputerNameEx((COMPUTER_NAME_FORMAT)2, domainName, &dNsize);
    printf("Domain name: %ws\n", domainName);
  }

Установив точку останова в строке 17, я обнаружил, что переменная buffer содержит 256 записей со значением 52428, что, как я подозреваю, связано с тем, что я делаю это в юникоде. Но я не уверен, почему GetComputerNameEx не заполняет указанный буфер фактическим именем? Строка 22, которая вызывает тот же GetComputerNameEx, возвращает правильное имя.

Я откатил редактирование, поскольку оно пытается добавить ответ на вопрос (что не так, как работает Stack Overflow). Это тоже было неправильно: указатель является допустимым аргументом для sizeof.

IInspectable 31.10.2018 13:10
0
1
133
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

в функции getname

BOOL getName(int num, LPWSTR buffer) {
    DWORD size = sizeof(buffer);
    ....

buffer относится к типу LPWSTR, который по сути является указателем на w_char.

В функции параметр buffer будет преобразован в указатель. Оператор sizeof вернет размер указателей в вашей системе. Обычно 4 или 8. При вызове GetComputerNameEx получаются неверные параметры.

Вам необходимо изменить функцию, чтобы она принимала параметр размера в качестве входных данных.

BOOL getName(int num, LPWSTR buffer, int size) {
    return GetComputerNameEx((COMPUTER_NAME_FORMAT)num, buffer, &size);
}

Назовите это с помощью.

TCHAR buffer[256];
getName((COMPUTER_NAME_FORMAT)1, buffer,sizeof(buffer)/sizeof(buffer[0]));

Спасибо! Почему вы называете sizeof(buffer)/sizeof(buffer[0]), а не просто sizeof(buffer)? Обновлено: я только что нашел здесь ответ: stackoverflow.com/questions/35020540/…

MadsRC 31.10.2018 13:02
sizeof(buffer) - это sizeof(TCHAR) * 256. sizeof(TCHAR) равен 2 для UNICODE, поэтому sizeof(buffer) составляет 512 байт. Вам нужно передать количество элементов TCHAR в GetComputerNameEx(), а не количество байтов, поэтому вам нужно передать 256, а не 512
Remy Lebeau 31.10.2018 21:53

Другие вопросы по теме