给出以下代码段,谁能告诉我为什么第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,返回正确的名称。
答案 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]));