系統(tǒng)安全基礎(chǔ)之常用Win32API函數(shù)簡介

字號(hào):

現(xiàn)在很多講Windows程序設(shè)計(jì)的書都是講基于MFC庫和OWL庫的Windows設(shè)計(jì),對(duì)Windows實(shí)現(xiàn)的細(xì)節(jié)都鮮有討論,而調(diào)試程序都是和系統(tǒng)底層打交道,所以有必要掌握一些Win32 API函數(shù)的知識(shí),這樣我們可快捷地找出程序調(diào)用錯(cuò)在哪?是哪個(gè)參數(shù)出了問題。
    Windows程序模塊包括KERNEL、USER和GDI,其中KERNEL完成內(nèi)存管理、程序的裝人與執(zhí)行和任務(wù)調(diào)度等功能,它需要調(diào)用原MS―DOS中的文件管理、磁盤輸入輸出和程序執(zhí)行等功能;USER是一個(gè)程序庫,它用來對(duì)聲音、時(shí)鐘、鼠標(biāo)器及鍵盤輸入等操作進(jìn)行管理;GDI是一功能十分豐富的子程序庫,它提供了圖形與文字輸出、圖象操作和窗口管理等各種與顯示和打印有關(guān)的功能。上述KERNEL、USER和GDI模塊中的庫函數(shù)可被應(yīng)用程序調(diào)用,也可被其他程序模塊調(diào)用。把包含庫函數(shù)的模塊稱為輸出者(export)。你應(yīng)明白為什么跟蹤軟件時(shí)經(jīng)常在KERNEL32!。text和USER32.text等系統(tǒng)領(lǐng)空轉(zhuǎn)的問題吧。
    這里列出幾個(gè)經(jīng)常碰到的Win 32 API函數(shù),它們都是存在Windows系統(tǒng)核心文件KERNEL32.DLL中和視窗管理文件USER32.DLL中。
    Windows函數(shù)是區(qū)分字符集的:A表示ANSI,W表示W(wǎng)ide,即Unicode (Wide character-set),前者就是通常使用的單字節(jié)方式,但這種方式處理象中文這樣的雙字節(jié)字符不方便,容易出現(xiàn)半個(gè)漢字的情況。而后者是雙字節(jié)方式,方便處理雙字節(jié)字符。Windows的所有與字符有關(guān)的函數(shù)都提供兩種方式的版本。盡管你編程時(shí)使用GetWindowText,但實(shí)際上編譯程序會(huì)根據(jù)設(shè)置自動(dòng)調(diào)用GetWindowTextA或GetWindowTextW.函數(shù)的最后一個(gè)字母告訴我們函數(shù)是使用單字節(jié)還是雙字節(jié)字符串。
    1、Hmemcpy函數(shù)
    void hmemcpy(hpvDest, hpvSource, cbCopy)
    void _huge* hpvDest; // 目的數(shù)據(jù)地址
    const void _huge* hpvSource; // 源數(shù)據(jù)地址
    long cbCopy; // 數(shù)據(jù)大小 (Bytes)
    這個(gè)函數(shù)在KERNEL32.DLL中,它很常用,俗稱萬能斷點(diǎn),但一般的編程書籍上很少提到,原因它是底層的東西,沒有特殊需要,一般不直接調(diào)用。但的確它是很有用的!有意思的是它執(zhí)行的操作很簡單,只是將內(nèi)存中的一塊數(shù)據(jù)拷貝到另一個(gè)地方。
    注意:此函數(shù)只在Windows 9x系統(tǒng)上有效,在Win NT/2K系統(tǒng)上相關(guān)的函數(shù)是memcpy,但在Win NT/2K上不同于Windows 9x上,很少再調(diào)用memcpy來處理數(shù)據(jù)了,用此函數(shù)設(shè)斷基本上什么也攔不住。
    2、GetWindowText函數(shù)
    此函數(shù)在USER32.DLL用戶模塊中,它的作用是復(fù)制指定窗口中的字符到緩沖區(qū)。函數(shù)原型:
     int GetWindowText(
    HWND hWnd//欲獲取文字的那個(gè)窗口的句柄
    LPTSTR lpString //預(yù)定義的一個(gè)緩沖區(qū),至少有cch+1個(gè)字符大小;隨同窗口文字載入
    int nMaxCount//lpString緩沖區(qū)的長度
    );
    16位:GetWindowText
    32位:GetWindowTextA,GetWindowTextW
    3、GetDlgItemText
    3、GetDlgItemText
    此函數(shù)在USER32.DLL用戶模塊中,它的作用是返回對(duì)話框中某一個(gè)窗口的標(biāo)題或文字。函數(shù)原型:
     UINT GetDlgItemText(
    HWND hDlg, // 對(duì)話框句柄
    int nIDDlgItem, //控制標(biāo)識(shí)符
    LPTSTR lpString, / 預(yù)定義的一個(gè)字符緩沖區(qū)
    int nMaxCount// 字符緩沖區(qū)的長度
    );
    16位:GetDlgItemText
    32位:GetDlgItemTextA,GetDlgItemTextW
    4、MessageBox函數(shù)
    此函數(shù)是在USER32.DLL用戶模塊中,它的作用創(chuàng)建、顯示和操作信息框。函數(shù)原型:
     int MessageBox(
    HWND hWnd, //窗口句柄
    LPCTSTR lpText, // 信息框中文字的地址
    LPCTSTR lpCaption, // 信息框標(biāo)題地址
    UINT uType // 信息框類型
    );
    16位:MessageBox
    32位:MessageBoxA,MessageBoxW