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

Rust 2021版本中调用EnumProcessModules返回错误998(无效访问)的问题排查求助

解决EnumProcessModules调用出现错误998(无效访问)的问题

我来帮你分析一下这个问题——你遇到的Windows错误998(ERROR_NOACCESS)其实是因为函数尝试写入一个无效的内存地址,咱们一步步拆解:

问题根源

EnumProcessModules函数的第四个参数module_list_size是一个指向DWORD的指针:当你传入空的模块数组(第二个参数ptr::null_mut())和0的缓冲区大小(第三个参数)时,函数会把需要的缓冲区字节数写入这个指针指向的内存。但你现在传的是ptr::null_mut()(空指针),函数没有可写入的有效内存,自然就触发了内存访问错误。

修正后的代码

你需要先创建一个有效的DWORD变量,把它的地址传给函数,让函数能正确写入所需的大小:

use std::ptr;
use winapi::um::psapi::EnumProcessModules;
use winapi::shared::minwindef::{DWORD, HMODULE};
use winapi::um::errhandlingapi::GetLastError;
use winapi::um::winbase::ERROR_INSUFFICIENT_BUFFER;

// 假设remote_handle和res已提前正确定义
let mut module_list_size: DWORD = 0;
res = EnumProcessModules(
    remote_handle,
    ptr::null_mut(),
    0,
    &mut module_list_size as *mut DWORD,
);

// 第一次调用预期会返回FALSE,错误码为ERROR_INSUFFICIENT_BUFFER
if res == 0 {
    let err = GetLastError();
    if err == ERROR_INSUFFICIENT_BUFFER {
        // 计算模块数量,分配足够的内存
        let module_count = module_list_size / std::mem::size_of::<HMODULE>() as DWORD;
        let mut modules = vec![ptr::null_mut(); module_count as usize];
        
        // 第二次调用获取实际的模块列表
        res = EnumProcessModules(
            remote_handle,
            modules.as_mut_ptr(),
            module_list_size,
            &mut module_list_size as *mut DWORD,
        );
        
        if res != 0 {
            // 这里处理模块列表获取成功后的逻辑
            println!("成功获取{}个模块", module_list_size / std::mem::size_of::<HMODULE>() as DWORD);
        }
    } else {
        // 处理其他非预期错误
        eprintln!("调用失败,错误码: {}", err);
    }
}

关键注意点

  • 第一次调用EnumProcessModules的核心目的就是获取所需的缓冲区大小,所以返回FALSE且错误码为ERROR_INSUFFICIENT_BUFFER是正常行为,不要误以为调用失败。
  • 分配模块数组时,必须用module_list_size除以HMODULE的内存大小来计算模块数量,避免出现内存不足的问题。
  • 调用Windows API后,一定要用GetLastError()获取具体错误信息,这是排查这类问题最直接的方式。

内容的提问来源于stack exchange,提问作者user12596391

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 10:38:13