OpenProcess 返回值是 0

dongfangshang2 2012-07-28 01:36:56

using System;
using System.Runtime.InteropServices;

namespace Text
{
class Program
{
[DllImport("kernel32.dll ")]
public static extern uint OpenProcess(UInt32 dwDesiredAccess, bool bInheritHandle, UInt32 dwProcessId);
[DllImport("User32.dll ")]
public static extern System.IntPtr FindWindowEx(System.IntPtr parent, System.IntPtr childe, string strclass, string strname);
[DllImport("user32.dll")]
public static extern uint GetWindowThreadProcessId(IntPtr hwnd, out int pid);
[DllImport("Kernel32")]
public static extern int GetProcAddress(int handle, String funcname);
[DllImport("kernel32", EntryPoint = "GetModuleHandle")]
public static extern int GetModuleHandle(string lpModuleName);
[DllImport("kernel32", EntryPoint = "WriteProcessMemory")]
public static extern int WriteProcessMemory(uint hwnd, UInt32 baseaddress, int lpBuffer, int nsize, int filewriten);


static void Main(string[] args)
{

#region 测试
unsafe
{
Console.WriteLine("----------Press Any Key To Start----------");
Console.ReadKey();

Console.WriteLine("开始");

const uint PROCESS_ALL_ACCESS = 0x1F0FFF; //定义权限
//const uint PROCESS_VM_READ = 0x0010;
//const uint PROCESS_VM_WRITE = 0x0020;
//string winName = "计算器";
string winName = "无标题 - 记事本";
IntPtr hwnd = FindWindowEx(System.IntPtr.Zero, System.IntPtr.Zero, null, winName); // 取句柄
int pid;
uint dwProcessId = GetWindowThreadProcessId(hwnd, out pid); // 取进程ID
uint hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, dwProcessId); // 打开进程

Console.WriteLine("Pid={0}, Hwnd={1},hProcess={2}", pid.ToString(), hwnd, hProcess);

if (hProcess > 0)
{
UInt16 ModiCode = 0xEB;
UInt32 MutexAAdd = (UInt32)GetProcAddress(GetModuleHandle("Kernel32.dll"), "CreateMutexA") + 13;
WriteProcessMemory(hProcess, (UInt32)MutexAAdd, (int)&ModiCode, System.Runtime.InteropServices.Marshal.SizeOf(ModiCode), 0);
Console.WriteLine("MutexAAdd={0}", MutexAAdd);
}
else
{
Console.WriteLine("打开失败,hProcess <=0, hProcess={0}", hProcess);
}

hProcess = 0;
Console.WriteLine("Press any key to end");
Console.ReadKey();
}
#endregion
}
}
}




OpenProcess 返回值总是0
...全文
373 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongfangshang2 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

引用 9 楼 的回复:
……
OpenProcess到底是用pid还是用dwProcessId ?

两者都可以,能找到的话。
[/Quote]

9楼代码很正确, 其实是不一样的, 另外BUG已经找到了, 多谢9楼!
iyomumx 2012-07-29
  • 打赏
  • 举报
回复
1.请尽量不要使用平台调用而是System.Diagnostics.Process
2.就算要用平台调用,也不要用平台调用来使用GetLastError,Marshal.GetLastWin32Error是其托管安全替代。
3.PInvoke出错可以打开代码分析并在自定义分析规则中勾选所有Microsoft.Interoperability规则,其中的建议很有帮助。
lijianli9 2012-07-29
  • 打赏
  • 举报
回复
悲催的bug
真相重于对错 2012-07-29
  • 打赏
  • 举报
回复
.net 下的 bool
不等于非托管c++ 的 BOOL

C++ BOOL 用int32
iyomumx 2012-07-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
……
OpenProcess到底是用pid还是用dwProcessId ?
[/Quote]
两者都可以,能找到的话。
wayouing 2012-07-29
  • 打赏
  • 举报
回复
哈哈 我都看出来应该传pid而不是openprocess
http://topic.csdn.net/u/20120729/19/d0e8667b-efae-4354-8e97-10cffd0a9a62.html?28389
SocketUpEx 2012-07-29
  • 打赏
  • 举报
回复
using System;
using System.Runtime.InteropServices;

namespace Text
{
class Program
{
[DllImport("kernel32.dll ")]
public static extern uint OpenProcess(UInt32 dwDesiredAccess, bool bInheritHandle, int dwProcessId);
[DllImport("User32.dll ")]
public static extern System.IntPtr FindWindowEx(System.IntPtr parent, System.IntPtr childe, string strclass, string strname);
[DllImport("user32.dll")]
public static extern uint GetWindowThreadProcessId(IntPtr hwnd, out int pid);
[DllImport("Kernel32")]
public static extern int GetProcAddress(int handle, String funcname);
[DllImport("kernel32", EntryPoint = "GetModuleHandle")]
public static extern int GetModuleHandle(string lpModuleName);
[DllImport("kernel32", EntryPoint = "WriteProcessMemory")]
public static extern int WriteProcessMemory(uint hwnd, UInt32 baseaddress, int lpBuffer, int nsize, int filewriten);


static void Main(string[] args)
{

#region 测试
unsafe
{
Console.WriteLine("----------Press Any Key To Start----------");
Console.ReadKey();

Console.WriteLine("开始");

const uint PROCESS_ALL_ACCESS = 0x1F0FFF; //定义权限
//const uint PROCESS_VM_READ = 0x0010;
//const uint PROCESS_VM_WRITE = 0x0020;
//string winName = "计算器";
string winName = "无标题 - 记事本";
IntPtr hwnd = FindWindowEx(System.IntPtr.Zero, System.IntPtr.Zero, null, winName); // 取句柄
int pid;
uint dwProcessId = GetWindowThreadProcessId(hwnd, out pid); // 取进程ID
uint hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid); // 打开进程

Console.WriteLine("Pid={0}, Hwnd={1},hProcess={2}", pid.ToString(), hwnd, hProcess);

if (hProcess > 0)
{
UInt16 ModiCode = 0xEB;
UInt32 MutexAAdd = (UInt32)GetProcAddress(GetModuleHandle("Kernel32.dll"), "CreateMutexA") + 13;
WriteProcessMemory(hProcess, (UInt32)MutexAAdd, (int)&ModiCode, System.Runtime.InteropServices.Marshal.SizeOf(ModiCode), 0);
Console.WriteLine("MutexAAdd={0}", MutexAAdd);
}
else
{
Console.WriteLine("打开失败,hProcess <=0, hProcess={0}", hProcess);
}

hProcess = 0;
Console.WriteLine("Press any key to end");
Console.ReadKey();
}
#endregion
}
}
}



代码写得这么漂亮
竟然是因为一个小问题引起错误
下次认真点啊
uint dwProcessId = GetWindowThreadProcessId(hwnd, out pid); // 取进程ID
uint hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid); // 打开进程
OpenProcess到底是用pid还是用dwProcessId ?


stonespace 2012-07-29
  • 打赏
  • 举报
回复
一般是因为dwProcessId值不对引起的,你可以输出这个值看看对不对,
stonespace 2012-07-29
  • 打赏
  • 举报
回复
可能是dwProcessId不合法,或者PROCESS_ALL_ACCESS的值不对,
stonespace 2012-07-29
  • 打赏
  • 举报
回复
错误代码87表示参数错误,说明你传入OpenProcess的某个参数不合法,
bdmh 2012-07-28
  • 打赏
  • 举报
回复
打开失败,原因很多,比如权限等,你用GetLastError看看是什么错误
stonespace 2012-07-28
  • 打赏
  • 举报
回复
0表示NULL,说明OpenProcess没有成功,按照,msdn的建议,此时你应该调用另一个api函数GetLastError,来查询错误的原因,

加上这个:


[DllImport("user32.dll")]
public static extern uint GetLastError();


GetLastError返回一个错误代码,你可以查询msdn得到错误的原因,
dongfangshang2 2012-07-28
  • 打赏
  • 举报
回复

uint hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, dwProcessId); // 打开进程
Console.WriteLine(GetLastError());


返回值87 〖87〗-参数错误。

哪里有错误呢。。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧