Go 调用EnumProcessModule时出现“意外错误地址”

Go 调用EnumProcessModule时出现“意外错误地址”,go,winapi,Go,Winapi,我正在编写一个枚举进程基址的函数。这是通过几个Windows API调用完成的,但是,我相信是我对EnumProcessModule的调用造成了错误 还应注意,并非每个进程都会发生此错误 我已经尝试过将一些uint32更改为uint64,反之亦然,以及创建moduleHandles数组的不同方法,但我无法让任何东西正常工作 这只是我创建的应用程序中的一个函数,用于检索和扫描另一个进程的内存 这是我的函数的源代码: func getBaseAddresshandle UINTPTTR int64{

我正在编写一个枚举进程基址的函数。这是通过几个Windows API调用完成的,但是,我相信是我对EnumProcessModule的调用造成了错误

还应注意,并非每个进程都会发生此错误

我已经尝试过将一些uint32更改为uint64,反之亦然,以及创建moduleHandles数组的不同方法,但我无法让任何东西正常工作

这只是我创建的应用程序中的一个函数,用于检索和扫描另一个进程的内存

这是我的函数的源代码:

func getBaseAddresshandle UINTPTTR int64{ //GetProcessImageFileNameA var imageFileName[200]字节 var fileSize uint32=200 变量文件名字符串 ret,,:=procGetProcessImageFileNameA.Callhandle,uintptrunsafe.Pointer&imageFileName,uintptrfileSize 对于u,char:=范围imageFileName{ 如果char==0{ 打破 } fileName+=stringchar } fileName=文件名[24:] //枚举进程模块 var n uint32 所需var uint64 ret,,=procEnumProcessModules.Callhandle,0,uintpttrn,uintpttrunsafe.Pointer&needed moduleHandles:=make[]syscall.Handle,需要 如果ret==1&&needed>0{ ret,,=procEnumProcessModules.Callhandle,uintprunsafe.Pointer&modulehandle,uintprneeded,uintprunsafe.Pointer&needed } //GetModuleFileNameExA var finalModuleHandle UINTPTTR 对于u,moduleHandle:=范围moduleHandles{ 如果moduleHandle>0{ var moduleFileName[200]字节 var模块化uint32=200 变量moduleName字符串 ret,,=progetModuleFileName.Callhandle,uintptrmoduleHandle,uintptrunsafe.Pointer&moduleFileName,uintptrmoduleSize 如果ret!=0{ 对于,char:=范围moduleFileName{ 如果char==0{ 打破 } moduleName+=stringchar } moduleName=moduleName[3:] 如果moduleName==文件名{ finalModuleHandle=uintptrmoduleHandle 打破 } } } } 返回int64finalModuleHandle }
我解决了这个问题。我与EnumProcessModule的交互不正确。这里有一个工作函数:

func getBaseAddresshandle UINTPTTR int64{ //GetProcessImageFileNameA var imageFileName[200]字节 var fileSize uint32=200 变量文件名字符串 ret,,:=procGetProcessImageFileNameA.Callhandle,uintptrunsafe.Pointer&imageFileName,uintptrfileSize 对于u,char:=范围imageFileName{ 如果char==0{ 打破 } fileName+=stringchar } fileName=文件名[24:] //枚举进程模块 模块句柄:=make[]uintpttr,1024 var需要int32 const handleSize=unsafe.SizeofmoduleHandles[0] ret,,=procEnumProcessModules.Calluintptrhandle,uintprunsafe.Pointer和moduleHandles[0],handleSize*uintprlenmodulehandles,uintprunsafe.Pointer和needed //GetModuleFileNameExA var finalModuleHandle UINTPTTR 对于u,moduleHandle:=范围moduleHandles{ 如果moduleHandle>0{ var moduleFileName[200]字节 var模块化uint32=200 变量moduleName字符串 ret,,=progetModuleFileName.Callhandle,uintptrmoduleHandle,uintptrunsafe.Pointer&moduleFileName,uintptrmoduleSize 如果ret!=0{ 对于,char:=范围moduleFileName{ 如果char==0{ 打破 } moduleName+=stringchar } moduleName=moduleName[3:] 如果moduleName==文件名{ finalModuleHandle=uintptrmoduleHandle 打破 } } } } 返回int64finalModuleHandle }
我希望这能帮助一些人,我花了很多时间在这个函数上。

EnumProcessModules的第二个参数不能是空指针0,即使您只是试图确定所需的条目数。

感谢您的回复。我最终发现我做错了什么,我错误地调用了EnumProcessModules,并且错误地将指针传递给了数组。