我正在编写一个 MSN Plus 脚本,实际上是 javascript。
对于与 Windows 的互操作,有一个名为Interop
.
使用它的静态函数Call
,可以调用指定 dll 中的指定函数,最多 12 个参数。
我的目标是编写一个从 PID 中获取进程名称的脚本。
我做的一切都是正确的,但它仍然不起作用。
函数 GetProcNameFromPID(pid) { var hnd = Interop.Call("kernel32", "CreateToolhelp32Snapshot", 2, 0); var handle = Interop.Call("kernel32", "GetCurrentProcess"); var StructP = Interop.Allocate(4+4+4+4+4+4+4+4+4+260);//*为ProcessEntry32结构分配空间* var hnd_ptr = Interop.Allocate(4); var ress = Interop.Call("kernel32", "WriteProcessMemory", 句柄, StructP, StructP.size.DataPtr, 4, hnd_ptr); Debug.Trace(ReadInt(hnd_ptr, 0)); var res = Interop.Call("kernel32", "Process32FirstW", hnd, StructP.DataPtr); 如果(!res) { Debug.Trace("FAAAAIIIILLLLL / " + Interop.Call("kernel32", "GetLastError") + " / " + ress); } 别的 { 做 { 变量位置 = 0; ReadInt(StructP, pos); ReadInt(StructP, pos); var owpid = ReadInt(StructP, pos); ReadInt(StructP, pos); ReadInt(StructP, pos); ReadInt(StructP, pos); var parpid = ReadInt(StructP, pos); ReadInt(StructP, pos); ReadInt(StructP, pos); ReadInt(StructP, pos); var name = ReadString(pos, 50); 如果(pid == owpid) 返回名称; StructP = Interop.Allocate(4+4+4+4+4+4+4+8+4+50); Interop.Call("kernel32", "WriteProcessMemory", 句柄, StructP.DataPtr, StructP.size.DataPtr, 4, null); } while(Interop.Call("kernel32", "Process32NextW", hnd, StructP.DataPtr) == true) } } 函数 ReadInt(缓冲区,位置) { 变量 res = 0; for(var i = 0; i >> 24; var b2 = 地址 >> 24; var b3 = 地址 >> 24; var b4 = 地址 >> 24; 返回 b4 + b3*256 + b2*256*256 + b1*256*256*256; }
该Process32FirstW
函数始终成功,但结构为空。
该WriteProcessMemory
功能也成功了。但写入的字节数始终为 0。