C#调用API函数VirtualProtectEx总是返回0 这是一个植物大战僵尸的游戏修改器..
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#调用API函数VirtualProtectEx总是返回0 这是一个植物大战僵尸的游戏修改器..相关的知识,希望对你有一定的参考价值。
为什么调用VirtualProtectEx函数后总是返回0,
获取的句柄是绝对没有问题的..
以下是代码:
[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(UInt32 dwDesiredAcess, Int32 bInheritHandle, UInt32 dxProcessId);
[DllImport("kernel32.dll")]
public static extern int VirtualProtectEx(IntPtr hWnd, uint[] lpAddress, Int32 dwSize, Int32 flNewProtect, Int32 lpflOldProtect);
private void button1_Click(object sender, EventArgs e)
uint[] ads_ps = 0x41ba74 ;//起始地址
Int32 xiugaiqian=0; //放置修改前的保护方式
int temp = 0; //放置VirtualProtectEx函数的返回值
System.Diagnostics.Process[] PinCallProcessId = System.Diagnostics.Process.GetProcessesByName("PlantsVsZombies");//获取进程ID
if (PinCallProcessId.Length != 0)
IntPtr hWnd = OpenProcess(0x1F0FFF, 0, (UInt32)PinCallProcessId[0].Id); //获取进程句柄
temp = VirtualProtectEx(hWnd, ads_ps, 2, 4, xiugaiqian); //执行VirtualProtectEx函数
MessageBox.Show(temp.ToString());
OpenProcess 函数用来打开一个已存在的进程对象,并返回进程的句柄。
HANDLE OpenProcess(
DWORD dwDesiredAccess, //渴望得到的访问权限(标志)
BOOL bInheritHandle, // 是否继承句柄
DWORD dwProcessId// 进程标示符
);
在输入访问权限时错误 0为默认 dwDesiredAccess 要采用读写权限
PROCESS_VM_READ or PROCESS_VM_WRITE
参数说明:
dwDesiredAccess: 指定打开后,该进程的访问权限
PROCESS_ALL_ACCESS 给予进程所有可能允许的权限.
PROCESS_DUP_HANDLE允许使用DuplicateHandle函数进行进程句柄的复制操作.
PROCESS_QUERY_INFORMATION允许函数GetExitCodeProcess 或函数GetPriorityClass functions 查询进程的信息时使用该句柄.
PROCESS_SET_INFORMATION允许函数SetPriorityClass使用此句柄进行优先级设置.
PROCESS_TERMINATE允许函数TerminateProcess 使用此句柄关闭进程.
PROCESS_VM_OPERATION 允许函数VirtualProtectEx使用此句柄修改进程的虚拟内存.
PROCESS_VM_READ or PROCESS_VM_WRITE 允许函数访问和写入权限
SYNCHRONIZE Windows NT 专用: 允许同步函数使用此句柄.追问
请问OpenProcess函数哪里错了??
第一个参数的PROCESS_ALL_ACCESS不是等于0x1F0FFF吗?
而且我用我上面的OpenProcess返回的进程句柄可以读取内存地址的值..请问是哪里错??
也谢谢你了...就是因为声明的时候声明错了..~`!感谢感谢....已经解决了
给分本回答被提问者采纳
如何从托管 C# 代码调用 SystemParametersInfoW 函数
【中文标题】如何从托管 C# 代码调用 SystemParametersInfoW 函数【英文标题】:How to call SystemParametersInfoW function from Managed C# code 【发布时间】:2019-02-14 14:42:31 【问题描述】:我希望运行来自 C++ API 的 SystemParametersInfoW 函数。 (https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-systemparametersinfow#return-value)。
但是,此方法需要从 C# 应用程序运行。
下面链接的 Microsoft pinvoke 示例对我来说毫无意义。 (https://docs.microsoft.com/en-us/cpp/dotnet/calling-native-functions-from-managed-code?view=vs-2017)
我该怎么做?我对 C++ 比较陌生。
谢谢。
【问题讨论】:
为什么你需要使用SystemParametersInfoW
,你确定没有c#
等价物吗?
为什么不直接使用docs.microsoft.com/en-us/dotnet/api/…?
【参考方案1】:
我还没有测试过,但是这样的东西应该可以工作:
[DllImport("user32"), CharSet=CharSet::Ansi)]
extern "C" bool SystemParametersInfoW(
uint uiAction,
uint uiParam,
IntPtr pvParam,
uint fWinIni
);
一般:
[DllImport(<dll-file of function>]
extern "C" return_value function_name(<function_parameters>);
【讨论】:
[DllImport("user32"), CharSet=CharSet::Ansi)] extern "C" bool SystemParametersInfoW
WinAPiFunctionW
不是安西..以上是关于C#调用API函数VirtualProtectEx总是返回0 这是一个植物大战僵尸的游戏修改器..的主要内容,如果未能解决你的问题,请参考以下文章
高分求助:C#中如何调用UpdateResource这个API函数!