c++ - 为什么 wchar_t* 变量被破坏?
问题描述
我正在使用以下代码。DLLName 的类型是wchar_t*
,并且它在我的程序的早期设置。在我的代码中达到这一点之前,DLLName 是 DLL 的有效路径,例如L"C:\\Windows\\System32\\advapi32.dll"
wprintf(L"Location: %s\n", DLLName);
HMODULE hDLL = LoadLibraryW(DLLName);
当我的代码到达时会发生什么wprintf
?不打印 DLLName 的值。事实上,DLLName 现在是一个空字符串,L""
! 这导致调用LoadLibraryW()
失败。
诡异的。我注释掉wprintf
。当调试器到达时LoadLibraryW()
,DLLName 是正确的宽字符串,其中包含指向我的 DLL 的路径。之后LoadLibraryW()
,DLLName 的值为L"\x4"
,调用失败。
这里发生了什么?我对如何调试它一无所知。
编辑:我所有的代码
BOOL FindOriginalCOMServer(wchar_t* GUID, wchar_t** DLLName)
{
HKEY hKey;
HKEY hCLSIDKey;
wchar_t name[MAX_PATH];
DWORD nameLength = MAX_PATH;
wprintf(L"[*] Beginning search for GUID %s\n", GUID);
LONG lResult = RegOpenKeyExW(HKEY_LOCAL_MACHINE, (LPCWSTR)L"SOFTWARE\\Classes\\CLSID", 0, KEY_READ, &hKey);
if (lResult != ERROR_SUCCESS) {
wprintf(L"[-] Error getting CLSID path\n");
return FALSE;
}
// Make sure HKLM\Software\Classes\CLSID\{GUID} exists
lResult = RegOpenKeyExW(hKey, GUID, 0, KEY_READ, &hCLSIDKey);
if (lResult != ERROR_SUCCESS) {
wprintf(L"[-] Error getting GUID path\n");
RegCloseKey(hKey);
return FALSE;
}
// Read the value of HKLM's InProcServer32
lResult = RegGetValueW(hCLSIDKey, (LPCWSTR)L"InProcServer32", NULL, RRF_RT_ANY, NULL, (PVOID)&name, &nameLength);
if (lResult != ERROR_SUCCESS) {
wprintf(L"[-] Error getting InProcServer32 value: %d\n", lResult);
RegCloseKey(hKey);
RegCloseKey(hCLSIDKey);
return FALSE;
}
*DLLName = name;
return TRUE;
}
然后:
wchar_t* DLLName = new wchar_t[MAX_PATH];
if (!FindOriginalCOMServer((wchar_t*)lplpsz, &DLLName))
{
wprintf(L"[-] Couldn't find original COM server\n");
return S_FALSE;
}
wprintf("[+] Found original COM server: %s\n", DLLName);
HMODULE hDLL = LoadLibraryW(DLLName);
解决方案
DLLName
将指向 中的本地 char 数组FindOriginalCOMServer
,一旦该函数返回,该数组将不再存在。
您应该将DLLName
toFindOriginalCOMServer()
作为wchar_t*
(一个指针,而不是两个)传递,然后摆脱name
并DLLName
直接使用。或者,您可以使用wcscpy_s()
将字符串从 复制name
到DLLName
。
推荐阅读
- c# - 如何使用 C# 中的 WooCommerce 发布记录
- python - 如何将一列的 Pandas 字符串值转换为字符串列表的一列?
- python - 在 Python 中读取 Sharepoint Excel 文件 - Pandas
- reactjs - 过滤获取数据到复选框 react.js
- d3.js - D3 力图奇数链接行为
- javascript - 在会话存储键值对中,值字符串的长度是否有字符限制?
- android - 应用程序不断收到 Resources$NotFoundException
- javascript - 用户单击图像时如何记录正确的对象值?
- python-3.x - 域过滤器没有效果(odoo12)
- reactjs - ReCharts:如果一开始就隐藏了线条动画,如何启用它?