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 GetWindowThreadProcessIdc#

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. 打开一个具备操做权限的句柄 OpenProcesswindows

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. 远程代码注入 VirtualAllocExide

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.建立远程线程 CreateRemoteThreadui

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

函数原型
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获得错误代码
相关文章
相关标签/搜索