VC++ MFC 游戏程序辅助开发所需要的Windows API函数 随笔

1.搜索windows 通过进程类名或者标题 FindWindow

HWND FindWindow
(
LPCSTR lpClassName,
LPCSTR lpWindowName
);

VC++中
头文件:afxwin.h

参数表
lpClassName
指向一个以NULL字符结尾的、用来指定类名的字符串或一个可以确定类名字符串的原子。如果这个参数是一个原子,那么它必须是一个在调用此函数前已经通过GlobalAddAtom函数创建好的全局原子。这个原子(一个16bit的值),必须被放置在lpClassName的低位字节中,lpClassName的高位字节置零。
如果该参数为null时,将会寻找任何与lpWindowName参数匹配的窗口。
lpWindowName
指向一个以NULL字符结尾的、用来指定窗口名(即窗口标题)的字符串。如果此参数为NULL,则匹配所有窗口名。

返回值
如果函数执行成功,则返回值是拥有指定窗口类名或窗口名的窗口的句柄。
如果函数执行失败,则返回值为 NULL 。可以通过调用GetLastError函数获得更加详细的错误信息。

C#中
导入库:user32.lib
头文件:winuser.h
***.Net 中运用
命名空间 using System.Runtime.InteropServices;
导入库 [DllImport("user32.dll")]
函数原型 public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
参数说明 lpClassName String,指向包含了窗口类名的空中止(C语言)字串的指针;或设为零,表示接收任何类
lpWindowName String,指向包含了窗口文本(或标签)的空中止(C语言)字串的指针;或设为零,表示接收 任何窗口标题
返回值 :句柄

2. 获取进程的PID GetWindowThreadProcessId

1.函数原型 
DWORD GetWindowThreadProcessId(
HWND hWnd,
LPDWORD lpdwProcessId
);

2.参数
hWnd[in] (向函数提供的)被查找窗口的句柄.
lpdwProcessId[out] 进程号的存放地址(变量地址) Pointer to a variable that receives the process identifier. If this parameter is not NULL, GetWindowThreadProcessId copies the identifier of the process to the variable; otherwise, it does not. (如果参数不为NULL,即提供了存放处--变量,那么本函数把进程标志拷贝到存放处,否则不动作。)

3.返回值 
The return value is the identifier of the thread that created the window.
返回线程号,注意,lpdwProcessId 是存放进程号的变量。返回值是线程号,lpdwProcessId 是进程号存放处。
当然可以把答案再放到其它地方。
如
DWORD dwPID, dwTID;
dwTID = GetWindowThreadProcessId( hWnd, &dwPID );

4.函数相关信息
头文件声明 Winuser.h, 包含头文件 Windows.h
导入库 User32.lib
操作系统最小支持 Windows 95, Windows NT 3.1

c#声明
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);
实例
int calcID=0;
int calcTD=0;
calcTD = GetWindowThreadProcessId(FrmMain.mainhWnd, out calcID);
返回值calcTD为线程ID
输出值calcID为进程ID

3. 打开一个具有操作权限的句柄 OpenProcess

OpenProcess 函数用来打开一个已存在的进程对象,并返回进程的句柄。
1.函数原型
HANDLE OpenProcess(
DWORD dwDesiredAccess, //渴望得到的访问权限(标志)
BOOL bInheritHandle, // 是否继承句柄
DWORD dwProcessId// 进程标示符
);

C# 声明
需要导入库 Kernel32.dll

2.返回值:
如成功,返回值为指定进程的句柄。
如失败,返回值为空,可调用GetLastError获得错误代码。

3.举例
HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pID );

4. 操作内存,读取进程的内存数据 ReadProcessMemory归属为为编程中的内存操作函数, 其作用为根据进程句柄读入该进程的某个内存空间。

函数原型为
BOOL ReadProcessMemory(
HANDLE hProcess,
 LPCVOID lpBaseAddress,
 LPVOID lpBuffer,
 DWORD nSize,
 LPDWORD lpNumberOfBytesRead
);
 由布尔声明可以看出, 当函数读取成功时返回1, 失败则返回0。

要求
系统版本: Windows CE 2.0 and later.
头文件: Winbase.h.
链接库: Coredll.lib, Nk.lib.

实际应用
hProcess [in]远程进程句柄。 被读取者
pvAddressRemote [in]远程进程中内存地址。 从具体何处读取
pvBufferLocal [out]本地进程中内存地址. 函数将读取的内容写入此处
dwSize [in]要传送的字节数。要写入多少
pdwNumBytesRead [out]实际传送的字节数. 函数返回时报告实际写入多少

C# 声明

/// <summary>
/// 从指定内存中读取字节集数据
/// </summary>
/// <param name="handle">进程句柄</param>
/// <param name="address">内存地址</param>
/// <param name="data">数据存储变量</param>
/// <param name="size">长度</param>
/// <param name="read">读取长度</param>
[DllImport("Kernel32.dll")]
private static extern void ReadProcessMemory(IntPtr handle, uint address, [Out] byte[] data, int size, int read);

5. 内存操作,写入进程内存数据 WriteProcessMemory

VC++声明
BOOL WriteProcessMemory(
HANDLE hProcess,
LPVOID lpBaseAddress,
LPVOID lpBuffer,
DWORD nSize,
LPDWORD lpNumberOfBytesWritten
);
参数:
hProcess
由OpenProcess返回的进程句柄。
如参数传数据为 INVALID_HANDLE_VALUE 【即-1】目标进程为自身进程
lpBaseAddress
要写的内存首地址
再写入之前,此函数将先检查目标地址是否可用,并能容纳待写入的数据。
lpBuffer
指向要写的数据的指针。
nSize
要写入的字节数。
返回值
非零值代表成功。
可用GetLastError获取更多的错误详细信息。
要求
操作系统版本: Windows CE 2.0及以上版本。
所在头文件: Winbase.h
链接库: Nk.lib

C#声明

6. 远程代码注入 VirtualAllocEx

VirtualAllocEx 函数的作用是在指定进程的虚拟空间保留或提交内存区域,除非指定MEM_RESET参数,否则将该内存区域置0。

函数原形:
LPVOID VirtualAllocEx(
HANDLE hProcess,
LPVOID lpAddress,
SIZE_T dwSize,
DWORD flAllocationType,
DWORD flProtect
);

hProcess:
申请内存所在的进程句柄。
lpAddress:
保留页面的内存地址;一般用NULL自动分配 。
dwSize:
欲分配的内存大小,字节单位;注意实际分 配的内存大小是页内存大小的整数倍

flAllocationType 可取下列值:
MEM_COMMIT:为特定的页面区域分配内存中或磁盘的页面文件中的物理存储
MEM_PHYSICAL :分配物理内存(仅用于地址窗口扩展内存)
MEM_RESERVE:保留进程的虚拟地址空间,而不分配任何物理存储。保留页面可通过继续调用VirtualAlloc()而被占用
MEM_RESET :指明在内存中由参数lpAddress和dwSize指定的数据无效
MEM_TOP_DOWN:在尽可能高的地址上分配内存(Windows 98忽略此标志)
MEM_WRITE_WATCH:必须与MEM_RESERVE一起指定,使系统跟踪那些被写入分配区域的页面(仅针对Windows 98)
flProtect可取下列值:
PAGE_READONLY: 该区域为只读。如果应用程序试图访问区域中的页的时候,将会被拒绝访
PAGE_READWRITE 区域可被应用程序读写
PAGE_EXECUTE: 区域包含可被系统执行的代码。试图读写该区域的操作将被拒绝。
PAGE_EXECUTE_READ :区域包含可执行代码,应用程序可以读该区域。
PAGE_EXECUTE_READWRITE: 区域包含可执行代码,应用程序可以读写该区域。
PAGE_GUARD: 区域第一次被访问时进入一个STATUS_GUARD_PAGE异常,这个标志要和其他保护标志合并使用,表明区域被第一次访问的权限
PAGE_NOACCESS: 任何访问该区域的操作将被拒绝
PAGE_NOCACHE: RAM中的页映射到该区域时将不会被微处理器缓存(cached)

注:PAGE_GUARD和PAGE_NOCHACHE标志可以和其他标志合并使用以进一步指定页的特征。PAGE_GUARD标志指定了一个防护页(guard page),即当一个页被提交时会因第一次被访问而产生一个one-shot异常,接着取得指定的访问权限。PAGE_NOCACHE防止当它映射到虚拟页的时候被微处理器缓存。这个标志方便设备驱动使用直接内存访问方式(DMA)来共享内存块。

返回值:
执行成功就返回分配内存的首地址,不成功就是NULL。

7.创建远程线程 CreateRemoteThread

CreateRemoteThread是创建一个在其它进程地址空间中运行的线程(也称:创建远程线程).。

函数原型
HANDLE WINAPI CreateRemoteThread(
__in HANDLE hProcess,
__in LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in SIZE_T dwStackSize,
__in LPTHREAD_START_ROUTINE lpStartAddress,
__in LPVOID lpParameter,
__in DWORD dwCreationFlags,
__out LPDWORD lpThreadId
);

参数说明
hProcess [in]
线程所属进程的进程句柄.
该句柄必须具有 PROCESS_CREATE_THREAD, PROCESS_QUERY_INFORMATION, PROCESS_VM_OPERATION, PROCESS_VM_WRITE,和PROCESS_VM_READ 访问权限.
lpThreadAttributes [in]
一个指向 SECURITY_ATTRIBUTES 结构的指针, 该结指定了线程的安全属性.
dwStackSize [in]
线程初始大小,以字节为单位,如果该值设为0,那么使用系统默认大小.
lpStartAddress [in]
在远程进程的地址空间中,该线程的线程函数的起始地址.
lpParameter [in]
传给线程函数的参数.
dwCreationFlags [in]
线程的创建标志.
值                             含义
0                           线程创建后立即运行
CREATE_SUSPENDED 
0x00000004                  线程创建后先将线程挂起,直到 ResumeThread 被调用.
STACK_SIZE_PARAM_IS_A_RESERVATION
0x00010000
dwStackSize 参数指定为线程栈预订大小,如果STACK_SIZE_PARAM_IS_A_RESERVATION没有被指定,dwStackSize 参数指定为线程栈分配大小.
lpThreadId [out]
指向所创建线程句柄的指针,如果创建失败,该参数为NULL.

函数返回值
如果调用成功,返回新线程句柄.
如果失败,返回NULL.

要求
最低支持客户端系统
Windows 2000 Professional
最低支持服务端系统
Windows 2000 Server
头文件
inbase.h (include Windows.h)
库
Kernel32.lib
DLL
Kernel32.dll

8.等待远程线程执行完毕 WaitForSingleObject

Windows API函数。当等待仍在挂起状态时,句柄被关闭,那么函数行为是未定义的。该句柄必须具有 SYNCHRONIZE 访问权限。

说明
DWORD WINAPI WaitForSingleObject(
__in HANDLE hHandle,
__in DWORD dwMilliseconds
);

参数
hHandle[in]对象句柄。可以指定一系列的对象,如Event、Job、Memory resource notification、Mutex、Process、Semaphore、Thread、Waitable timer等。
dwMilliseconds[in]定时时间间隔,单位为milliseconds(毫秒).如果指定一个非零值,函数处于等待状态直到hHandle标记的对象被触发,或者时间到了。如果dwMilliseconds为0,对象没有被触发信号,函数不会进入一个等待状态,它总是立即返回。如果dwMilliseconds为INFINITE,对象被触发信号后,函数才会返回。

返回值
执行成功,返回值指示出引发函数返回的事件。它可能为以下值:
WaitForSingleObject函数用来检测hHandle事件的信号状态,在某一线程中调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返回。参数dwMilliseconds有两个具有特殊意义的值:0和INFINITE。若为0,则该函数立即返回;若为INFINITE,则线程一直被挂起,直到hHandle所指向的对象变为有信号状态时为止。
WAIT_ABANDONED 0x00000080:当hHandle为mutex时,如果拥有mutex的线程在结束时没有释放核心对象会引发此返回值。
WAIT_OBJECT_0 0x00000000 :指定的对象出有有信号状态
WAIT_TIMEOUT 0x00000102:等待超时
WAIT_FAILED 0xFFFFFFFF :出现错误,可通过GetLastError得到错误代码

 

转载于:https://my.oschina.net/sokes/blog/678182

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值