gpt4 book ai didi

c - 为什么 GetComputerNameEx 没有用数据填充缓冲区

转载 作者:行者123 更新时间:2023-11-30 14:45:25 29 4
gpt4 key购买 nike

鉴于下面的代码片段,谁能告诉我为什么第 17 行只打印“Name:”?

#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变量包含值 52428 的 256 个条目,我怀疑这是因为我在 unicode 中执行此操作。但我不确定为什么 GetComputerNameEx 没有用实际名称填充所述缓冲区?第 22 行调用相同的 GetComputerNameEx 返回正确的名称。

最佳答案

在函数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]));

关于c - 为什么 GetComputerNameEx 没有用数据填充缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53081711/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com