我正在编写一个 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。