You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题原因及修复方案

核心原因

  1. 宽/窄字符串不匹配:wcsstr是宽字符串查找函数,要求第二个参数为const wchar_t*类型,但你传入的是窄字符串常量"Notepad.exe",编译器隐式转换后会生成错误的宽字符序列,导致匹配失败。
  2. GetModuleFileNameEx参数错误:该函数最后一个参数是缓冲区可容纳的宽字符数,而非字节数。你传入sizeof(BUFFER)(值为2048),但BUFFER仅能容纳1024个宽字符,可能导致缓冲区溢出,破坏字符串终止符,让wcsstr无法正确识别完整字符串。
  3. 类型与格式化错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 18:44:52