为什么GetComputerNameEx无法用数据填充缓冲区

时间:2018-10-31 10:56:15

标签: c winapi

给出以下代码段,谁能告诉我为什么第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的条目,我怀疑这是因为我正在用Unicode执行此操作。但是我不确定GetComputerNameEx为什么不使用实际名称填充所述缓冲区?第22行调用了相同的GetComputerNameEx,返回正确的名称。

1 个答案:

答案 0 :(得分:1)

函数getname

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

buffer的类型为LPWSTR,实际上是指向w_char的指针

在函数中,参数buffer将衰减为指针。 sizeof运算符将返回系统中指针的大小。通常为4或8。对GetComputerNameEx的调用使用了错误的参数。

您需要修改函数以将size参数作为输入

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]));