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獲得錯誤代碼
相關文章
相關標籤/搜索