使用kernel.dll获取进程mdoules c#



运行以下程序时遇到一些问题:

public MODULEENTRY32 getModule(String ModuleName)
{
MODULEENTRY32 module32;
module32.dwSize = (uint) Marshal.SizeOf(typeof(MODULEENTRY32));
IntPtr hSnap = CreateToolhelp32Snapshot(SnapshotFlags.TH32CS_SNAPMODULE | SnapshotFlags.TH32CS_SNAPMODULE32, (uint) process.Id);
Module32First(hSnap, out module32);
if (hSnap == IntPtr.Zero)
{
return new MODULEENTRY32();
}
do
{
if (module32.szModule.Equals(ModuleName))
{
CloseHandle(hSnap);
return module32;
}
} while (Module32Next(hSnap, out module32));
return new MODULEENTRY32();
}

我试图从进程中获取模块,但它总是返回0,我确信模块名称是正确的,进程id也是

我认为您没有提供足够的信息来确定问题所在。

如果阅读CreateToolHelp32Snapshot文档,则应检查返回的hSnap是否为INVALID_HANDLE_VALUE(-1)。如果是,则需要调用GetLastError来确定失败的原因。

记录故障的可能原因:

如果指定的进程是空闲进程或CSRSS之一进程,此函数失败,最后一个错误代码为ERROR_ACCESS_DENIED,因为它们的访问限制阻止用户级代码。

如果指定的进程是64位进程,并且调用者是32位进程,此函数失败,最后一个错误代码为ERROR_PARTIAL_COPY(299)。

和:

在为进程拍摄包括堆和模块的快照时除了当前进程,CreateToolhelp32Snapshot函数可能由于各种原因而失败或返回不正确的信息。对于例如,如果目标进程中的加载程序数据表已损坏或未初始化,或者如果模块列表在功能期间发生更改调用时,函数可能失败,返回ERROR_BAD_LENGTH或其他错误代码。确保目标进程未在挂起状态下启动,请尝试调用再次运行。如果函数在以下情况下出现ERROR_BAD_LENGTH故障使用TH32CS_SNAPMODULE或TH32CS_StNAPMODULE32调用,调用再次运行,直到成功为止。

相关内容

最新更新