C语言中判断模块路径含Notepad.exe时if语句返回False的问题求助
Windows DLL开发中wcsstr匹配Notepad.exe失败问题排查
问题描述
遍历模块缓冲区时能正常显示包含C:\Program Files\WindowsApps\Microsoft.WindowsNotepad_11.2309.28.0_x64__8wekyb3d8bbwe\Notepad\Notepad.exe在内的所有模块路径,但使用wcsstr判断该路径是否包含Notepad.exe时,if语句返回False。其他DLL模块判断为False符合预期,唯独该模块不符合。
相关代码片段
FILE* file_pointer; HMODULE array_modules[1024]; DWORD number_bytes; WCHAR BUFFER[1024]; //Unicode characters int i; BOOL APIENTRY DllMain(HMODULE Base_DLL_Address, DWORD Reason_CALL, LPVOID Reserved) { switch (Reason_CALL) { case DLL_PROCESS_ATTACH: fopen_s(&file_pointer, "C:\\Users\\Jonas\\Documents\\test333.txt", "r+"); int Handle_Process = GetCurrentProcess(); char* ImageBase = NULL; if (EnumProcessModules(Handle_Process, array_modules, sizeof(array_modules), &number_bytes) != 0) { for (i = 0; i < (number_bytes / sizeof(HMODULE)); i++) { DWORD Module_LEN_string = GetModuleFileNameEx(Handle_Process, array_modules[i], BUFFER, sizeof(BUFFER)); fprintf(file_pointer, "%ls\n", BUFFER); fprintf(file_pointer, "%p\n", array_modules[i]); if (wcsstr(BUFFER, "Notepad.exe") != NULL) { ImageBase = array_modules[i]; fprintf(file_pointer, "s\n", ImageBase); } else fprintf(file_pointer, "%s\n", "FAILED"); } } fclose(file_pointer);
问题原因及修复方案
核心原因
- 宽/窄字符串不匹配:
wcsstr是宽字符串查找函数,要求第二个参数为const wchar_t*类型,但你传入的是窄字符串常量"Notepad.exe",编译器隐式转换后会生成错误的宽字符序列,导致匹配失败。 - GetModuleFileNameEx参数错误:该函数最后一个参数是缓冲区可容纳的宽字符数,而非字节数。你传入
sizeof(BUFFER)(值为2048),但BUFFER仅能容纳1024个宽字符,可能导致缓冲区溢出,破坏字符串终止符,让wcsstr无法正确识别完整字符串。 - 类型与格式化错误:
Handle_Process应为HANDLE类型而非int,ImageBase应为HMODULE类型而非char*;匹配成功时的fprintf缺少格式化占位符,无法正确打印模块地址。
修复后的代码片段
FILE* file_pointer; HMODULE array_modules[1024]; DWORD number_bytes; WCHAR BUFFER[1024]; //Unicode characters int i; BOOL APIENTRY DllMain(HMODULE Base_DLL_Address, DWORD Reason_CALL, LPVOID Reserved) { switch (Reason_CALL) { case DLL_PROCESS_ATTACH: // 用"w+"确保文件可写入,避免原文件不存在或权限问题 if (fopen_s(&file_pointer, "C:\\Users\\Jonas\\Documents\\test333.txt", "w+") != 0) break; HANDLE Handle_Process = GetCurrentProcess(); HMODULE ImageBase = NULL; if (EnumProcessModules(Handle_Process, array_modules, sizeof(array_modules), &number_bytes) != 0) { for (i = 0; i < (number_bytes / sizeof(HMODULE)); i++) { // 传入宽字符数,避免缓冲区溢出 DWORD Module_LEN_string = GetModuleFileNameEx(Handle_Process, array_modules[i], BUFFER, _countof(BUFFER)); fprintf(file_pointer, "%ls\n", BUFFER); fprintf(file_pointer, "%p\n", array_modules[i]); // 使用宽字符串常量L"Notepad.exe"匹配 if (wcsstr(BUFFER, L"Notepad.exe") != NULL) { ImageBase = array_modules[i]; fprintf(file_pointer, "匹配成功,模块地址:%p\n", ImageBase); } else fprintf(file_pointer, "%s\n", "FAILED"); } } fclose(file_pointer);
内容的提问来源于stack exchange,提问作者Questions123
相关产品推荐
相关产品推荐

