Windows平台API積累

來源:互聯網
上載者:User
  1. 網站
    http://www.intodigi.com
  2. OpenProcessToken 
    要對一個任意進程(包括系統安全進程和服務進程)進行指定了寫相關的訪問權的OpenProcess操作,只要當前進程具有SeDeDebug許可權就可以了。要是一個使用者是Administrator或是被給予了相應的許可權,就可以具有該許可權。可是,就算我們用Administrator帳號對一個系統安全進程執行OpenProcess(PROCESS_ALL_ACCESS,FALSE,          dwProcessID)還是會遇到“訪問拒絕”的錯誤。什麼原因呢?原來在預設的情況下進程的一些存取權限是沒有被置為可用狀態(即Enabled)的,所以我們要做的首先是使這些許可權可用。與此相關的一些API函數有OpenProcessToken、LookupPrivilegevalue、AdjustTokenPrivileges。我們要修改一個進程的存取權杖,首先要獲得進程存取權杖的控制代碼,這可以通過OpenProcessToken得到,函數的原型如下:
    BOOL      OpenProcessToken(
               HANDLE      ProcessHandle,       //要修改存取權限的進程控制代碼
               DWORD      DesiredAccess,        //指定你要進行的操作類型
               PHANDLE      TokenHandle         //返回的存取權杖指標
         );
    成功返回非0;
    參數說明:
    第一參數是要修改存取權限的進程控制代碼;
    第三個參數就是返回的存取權杖指標;
    第二個參數指定你要進行的操作類型,如要修改令牌我們要指定第二個參數為TOKEN_ADJUST_PRIVILEGES(其它一些參數可參考Platform          SDK)。通過這個函數我們就可以得到當前進程的存取權杖的控制代碼(指定函數的第一個參數為GetCurrentProcess()就可以了)。接著我們可以調用AdjustTokenPrivileges對這個存取權杖進行修改。
    包含標頭檔Winbase.h
  3. LookupPrivilegeValue
    擷取當前系統上,指定許可權名字的唯一標誌(LUID),函數原形如下:
    BOOL LookupPrivilegeValue(
      LPCTSTR lpSystemName,
      LPCTSTR lpName,
      PLUID lpLuid
    );
    成功返回非0;
    參數說明:
    lpSystemName
     [in]傳入參數,字元傳指標;指定需要擷取許可權的作業系統名字,如果傳入null,那麼將在本地系統上查詢指定許可權名的LUID;
    lpName
     [in]傳入參數,字串指標;指定需要查詢LUID的許可權名字,可以系統中定義了的許可權產量(如SE_SECURITY_NAME),也可以是一個自己定義的字串(如"SeSecurityPrivilege");
    lpLuid
     [out]傳出參數,字串指標; 傳出許可權名字指定的LUID;
    包含標頭檔Winbase.h
  4. AdjustTokenPrivileges
     根據指定的許可權令牌,置進程的許可權為可用或不可用;
     函數原型:
    BOOL AdjustTokenPrivileges(
      HANDLE TokenHandle,
      BOOL DisableAllPrivileges,
      PTOKEN_PRIVILEGES NewState,
      DWORD BufferLength,
      PTOKEN_PRIVILEGES PreviousState,
      PDWORD ReturnLength
    );
    參數說明:
    TokenHandle
    [in]包含需要修改許可權的令牌控制代碼.這個參速需要有TOKEN_ADJUST_PRIVILEGES許可權.如果參數PreviousState=NULL,那麼控制代碼已應該擁有TOKEN_QUERY許可權.
    DisableAllPrivileges
    [in]是否置所有的許可權為不可用狀態.如果值=TRUE,使所有的許可權不可用,並且忽略NewState參數.如果為FALSE,那麼該函數將修改這些許可權為NewState參數所指的狀態.
    NewState
    [in]指向一個描述許可權屬性的TOKEN_PRIVILEGES結構數組.如果DisableAllPrivileges=FALSE,那麼AdjustTokenPrivileges將使數組中指向的屬性為可用,不可用狀態或者刪除.
       系統中定義的三個常量SE_PRIVILEGE_ENABLED,SE_PRIVILEGE_ENABLED,SE_PRIVILEGE_REMOVED.
      Windows XP/2000/NT中,不能刪除許可權
    BufferLength
    [in] 以位元組為單位指定了PreviousState所指緩衝buffer的長度,如果PreviousState參數為NULL,那麼BufferLength可以被置為0.
    PreviousState
    [out] 傳輸AdjustTokenPrivileges參作將修改的屬性的修改前狀態,可以被置為NULL;
    ReturnLength
    [out] 返回PreviousState請求位元組長度,如果PreviousState=NULL,這個參數可以為NULL;
    包含標頭檔Winbase.h
  5. OpenProcessToken ,LookupPrivilegeValue,AdjustTokenPrivileges引用舉例
    BOOL EnableDebugPrivilege(BOOL fEnable) {
    BOOL fOk = FALSE;    // Assume function fails
    HANDLE hToken;
       //以修改選項,擷取當前進程的令牌環
       if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
       {
          TOKEN_PRIVILEGES tp;
          tp.PrivilegeCount = 1;
       //擷取debug許可權的luid
          LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
       //將許可權屬性置為可用
          tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;
       //修改許可權
          AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
          fOk = (GetLastError() == ERROR_SUCCESS);
          CloseHandle(hToken);
       }
       return(fOk);
    }
  6. GetDlgItem
     擷取對話方塊中指定資源的控制代碼
     原型:
     HWND GetDlgItem(HWND hDlg,//對話方塊控制代碼
       int nIDDlgItem //資源id
     )
     如果成功,返回指定控制項的控制代碼;如果失敗返回NULL;
  7. ShowWindow
     控制視窗或者控制項的顯示模式(其實控制項也是一個視窗).
     BOOL ShowWindow(HWND hWnd,//視窗控制代碼
        int nCmdShow//模式,如SW_HIDE隱藏,SW_MAXIMIZE最大化,SW_MINIMIZE最小化等.
     );
     如果之前視窗是顯示的,那麼返回非0;之前視窗是隱藏的,返回0;
  8. GetStockFont
     擷取指定類型的畫筆,畫刷等字型原料;
     HGDIOBJ GetStockObject(
       int fnObject   //字型類型,如SYSTEM_FONT系統字型,DEFAULT_PALETTE預設調色盤等;
     );
     成功,返回擷取到的對象;失敗返回0;
  9. GetDC
     擷取裝置上下文
     HDC GetDC(
       HWND hWnd   //視窗或者控制項控制代碼,如果hWnd=NULL,那麼將擷取整個螢幕的上下文
     );
     成功,返回指定地區的裝置上下文;如果失敗,返回NULL;
  10. RedrawWindow
     更新指定的矩形地區
     BOOL RedrawWindow(
       HWND hWnd,               //視窗控制代碼
       CONST RECT *lprcUpdate,  //需要更新的矩形地區指標
       HRGN hrgnUpdate,         //需要更新的region控制代碼,如果lprcUpdate,hrgnUpdate都為空白,將更新整個用戶端區域
       UINT flags               //重畫選項,如果是NULL,整個指定的地區都將無效
     );
  11. CreateToolhelp32Snapshot
     為指定的進程、進程使用的堆[HEAP]、模組[MODULE]、線程[THREAD])建立一個快照[snapshot]。
     HANDLE WINAPI CreateToolhelp32Snapshot(
     DWORD dwFlags,
     DWORD th32ProcessID
     );
     參數:
     dwFlags
     [in]指定快照中包含的系統內容,這個參數能夠使用下列數值(變數)中的一個。
          TH32CS_INHERIT - 聲明快照控制代碼是可繼承的。
          TH32CS_SNAPALL - 在快照中包含系統中所有的進程和線程。
          TH32CS_SNAPHEAPLIST - 在快照中包含在th32ProcessID中指定的進程的所有的堆。
          TH32CS_SNAPMODULE - 在快照中包含在th32ProcessID中指定的進程的所有的模組。
          TH32CS_SNAPPROCESS - 在快照中包含系統中所有的進程。
          TH32CS_SNAPTHREAD - 在快照中包含系統中所有的線程。
     th32ProcessID
     [in]指定將要快照的進程ID。如果該參數為0表示快照當前進程。該參數只有在設定了TH32CS_SNAPHEAPLIST或TH32CS_SNAPMOUDLE後才有效,在其他情況下該參數被忽略,所有的進程都會被快照。
     傳回值:
     調用成功,返回快照的控制代碼,調用失敗,返回INVAID_HANDLE_VALUE。
  12. Process32First
     擷取快照中的第一個進程資訊,考核進程資訊到lppe中
     BOOL WINAPI Process32First(
       HANDLE hSnapshot,//CreateToolhelp32Snapshot返回的快照
       LPPROCESSENTRY32 lppe //[in,out]進程快照資訊結構
     );
     成功返回true,失敗返回false
  13. GetDialogBaseUnits
    函數功能:該函數返回系統的對話基本單位,該基本單位為系統字型字元的平均寬度和高度。對於使用系統字型的對話方塊,可以用這些值在對話方塊模板之間轉換,比如在對話方塊模板和像素之間。對於不使用系統字型的對話方塊,從對話方塊模板單位到像素的轉換要根據對話方塊使用的字型而定。對於對話方塊的其中一種類型用MaPDialogRect函數很容易地來執行轉換,MaPDialogRect考慮字型且正確的把一個長方形模板單位轉換為此像素。
    函數原型:LONG GetDialogBaseUnits(VOID);
    參數:無。
    傳回值:傳回值為一個32位的含有對話基本單位的值。傳回值的低位字含有水平對話方塊基本單位,且高低位字含有垂直對話方塊基本單位。
    備忘:GetDialogBaseUnits函數返回的水平基本單位同系統字型中字元以像素為單位的平均寬度相等;垂直基本單位同系統字型中字元的以像素為單位的平均高度相等; 對於一個沒有使用系統字型的對話方塊基本單位相等於對話方塊字型字元以像素為單位的平均寬度和平均高度。可以用GetTextMetrics和GetTextExtentPoint32函數為一個選擇的字型來計算這些值。但是,如果計算結果與那些通過系統執行的值不同,那麼可以用MapDialogRect函數避免可能發生的錯誤。每一個水平基本單位同四個水平對話方塊模板單位相等;每一個垂直基本單位同八個垂直對話方塊模板單位相等。所以用下列公式來把對話方塊模板單位轉換為像素:
    PiselX=(temptateunitX*baseunitX)/4;PiseIY=(templateunitY*baseunitY)/8
    同樣地.用下列公式來把像素轉換為對話方塊模板單位:
    templateunitX=(pixelX*4)/baseunitX;templateunitY=(plxelY*8)/baseunitY
  14. SetWindowPos
    函數功能:該函數改變一個子視窗,彈出式視窗式頂層視窗的尺寸,位置和Z序。子視窗,彈出式視窗,及頂層視窗根據它們在螢幕上出現的順序排序、頂層視窗設定的層級最高,並且被設定為Z序的第一個視窗。
        函數原型:BOOL SetWindowPos(HWN hWnd,HWND hWndlnsertAfter,int X,int Y,int cx,int cy,UNIT Flags);
        參數:
        hWnd:視窗控制代碼。
        hWndlnsertAfter:在z序中的位於被置位的視窗前的視窗控制代碼。該參數必須為一個視窗控制代碼,或下列值之一:
        HWND_BOTTOM:將視窗置於Z序的底部。如果參數hWnd標識了一個頂層視窗,則視窗失去頂級位置,並且被置在其他視窗的底部。
        HWND_DOTTOPMOST:將視窗置於所有非頂層視窗之上(即在所有頂層視窗之後)。如果視窗已經是非頂層視窗則該標誌不起作用。
        HWND_TOP:將視窗置於Z序的頂部。
        HWND_TOPMOST:將視窗置於所有非頂層視窗之上。即使視窗未被啟用視窗也將保持頂級位置。
        查g看該參數的使用方法,請看說明部分。
        x:以客戶座標指定視窗新位置的左邊界。
        Y:以客戶座標指定視窗新位置的頂邊界。
        cx:以像素指定視窗的新的寬度。
        cy:以像素指定視窗的新的高度。
        uFlags:視窗尺寸和定位的標誌。該參數可以是下列值的組合:
        SWP_ASNCWINDOWPOS:如果調用進程不擁有視窗,系統會向擁有視窗的線程發出需求。這就防止調用線程在其他線程處理需求的時候發生死結。
        SWP_DEFERERASE:防止產生WM_SYNCPAINT訊息。
        SWP_DRAWFRAME:在視窗周圍畫一個邊框(定義在視窗類別描述中)。
        SWP_FRAMECHANGED:給視窗發送WM_NCCALCSIZE訊息,即使視窗尺寸沒有改變也會發送該訊息。如果未指定這個標誌,只有在改變了視窗尺寸時才發送WM_NCCALCSIZE。
        SWP_HIDEWINDOW;隱藏視窗。
        SWP_NOACTIVATE:不啟用視窗。如果未設定標誌,則視窗被啟用,並被設定到其他最進階視窗或非最進階組的頂部(根據參數hWndlnsertAfter設定)。
        SWP_NOCOPYBITS:清除客戶區的所有內容。如果未設定該標誌,客戶區的有效內容被儲存並且在視窗尺寸更新和重定位後拷貝回客戶區。
        SWP_NOMOVE:維持當前位置(忽略X和Y參數)。
        SWP_NOOWNERZORDER:不改變z序中的所有者視窗的位置。
        SWP_NOREDRAW:不重畫改變的內容。如果設定了這個標誌,則不發生任何重畫動作。適用於客戶區和非客戶區(包括標題列和捲軸)和任何由於窗回移動而露出的父視窗的所有部分。如果設定了這個標誌,應用程式必須明確地使視窗無效並區重畫視窗的任何部分和父視窗需要重畫的部分。
        SWP_NOREPOSITION;與SWP_NOOWNERZORDER標誌相同。
        SWP_NOSENDCHANGING:防止視窗接收WM_WINDOWPOSCHANGING訊息。
        SWP_NOSIZE:維持當前尺寸(忽略cx和Cy參數)。
        SWP_NOZORDER:維持當前Z序(忽略hWndlnsertAfter參數)。
        SWP_SHOWWINDOW:顯示視窗。
        傳回值:如果函數成功,傳回值為非零;如果函數失敗,傳回值為零。若想獲得更多錯誤訊息,請調用GetLastError函數。
        備忘:如果設定了SWP_SHOWWINDOW和SWP_HIDEWINDOW標誌,則視窗不能被移動和改變大小。如果使用SetWindowLoog改變了視窗的某些資料,則必須調用函數SetWindowPos來作真正的改變。使用下列的組合標誌:SWP_NOMOVEISWP_NOSIZEISWP_FRAMECHANGED。
        有兩種方法將視窗設為最頂層視窗:一種是將參數hWndlnsertAfter設定為HWND_TOPMOST並確保沒有設定SWP_NOZORDER標誌;另一種是設定視窗在Z序中的位置以使其在其他存在的視窗之上。當一個視窗被置為最頂層視窗時,屬於它的所有視窗均為最頂層視窗,而它的所有者的z序並不改變。
        如果HWND_TOPMOST和HWND_NOTOPMOST標誌均未指定,即應用程式要求視窗在啟用的同時改變其在Z序中的位置時,在參數hWndinsertAfter中指定的值只有在下列條件中才使用:
        在hWndlnsertAfter參數中沒有設定HWND_NOTOPMOST和HWND_TOPMOST標誌。
        由hWnd參數標識的視窗不是啟用視窗。
        如果未將一個非啟用視窗設定到z序的頂端,應用程式不能啟用該視窗。應用程式可以無任何限制地改變被啟用視窗在Z序中的位置,或啟用一個視窗並將其移到最進階視窗的頂部或非最進階視窗的頂部。
        如果一個頂層視窗被重定位到z序的底部(HWND_BOTTOM)或在任何非最高序的視窗之後,該視窗就不再是最頂層視窗。當一個最頂層視窗被置為非最頂級,則它的所有者視窗和所屬者視窗均為非最頂層視窗。
        一個非最頂端視窗可以擁有一個最頂端視窗,但反之則不可以。任何屬於頂層視窗的視窗(例如一個對話方塊)本身就被置為頂層視窗,以確保所有被屬視窗都在它們的所有者之上。
        如果應用程式不在前台,但應該位於前台,就應調用SetForegroundWindow函數來設定。
        當在這個函數中的nFlags參數裡指定了SWP_FRAMECHANGED標誌時,WindowsCE重畫視窗的整個非客戶區,這可能會改變客戶區的大小。這也是重新計算客戶區的唯一途徑,也是通過調用SetwindowLong函數改變視窗風格後通常使用的方法。
  15. 查看dll匯出函數
    如果安裝了platform sdk可以直接使用depends程式查看dll的到處函數;
    操作方法,在命令列輸入depends,運行depends程式,大開菜單"File"=>"Open",開啟需要查看匯出函數的dll,就可以看到dll的匯出函數和相關資訊;
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.