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
相关产品推荐
相关产品推荐

