• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 26  文章 - 6  trackbacks - 0
            <2009年11月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            朋友

            • cqh
            • 大學(xué)室友...

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

             

            1、何為內(nèi)核對象
                  每個內(nèi)核對象都只是一個內(nèi)存塊,它由操作系統(tǒng)內(nèi)核分配,并只能由操作系統(tǒng)內(nèi)核訪問。這個內(nèi)存塊是一個數(shù)據(jù)結(jié)構(gòu),其成員維護著于對象相關(guān)的信息。少數(shù)成員(安全描述符何使用計數(shù)等)是所有對象都有的,但其他大多數(shù)成員都是不同類型的對象特有的。
                  e.g. 訪問令牌(access token)對象、事件對象、文件對象、文件映射對象、I/O完成端口對象、作業(yè)對象、郵件槽(mailsolt)對象、互斥量(mutex)對象、管道(pipe)對象等
                  *可利用Sysintenals的WinObj(http://technet.microsoft.com/zh-cn/sysinternals/bb896657.aspx)工具查看內(nèi)核對象類型的列表。
            1.1、使用計數(shù)
                  使用計數(shù)事所有內(nèi)核對象類型都有的一個數(shù)據(jù)成員。初次創(chuàng)建對象事,其使用計數(shù)被設(shè)為1。如果另
            一進程獲得對現(xiàn)有內(nèi)核對象的訪問后,使用計數(shù)會遞增。進程終止運行后,操作系統(tǒng)內(nèi)核將自動遞減進程仍然打開的所有內(nèi)核對象的使用計數(shù)。一旦對象的使用計數(shù)變?yōu)?span style="COLOR: red">0,操作系統(tǒng)內(nèi)核就會銷毀該對象。
            1.2、內(nèi)核對象的安全性
                  內(nèi)核對象可以用一個安全描述(security descriptor, SD)符來保護。它描述了誰擁有對象;哪些組和用戶被允許訪問或使用此對象;哪些組何用戶被拒絕訪問此對象。
                  用于創(chuàng)建內(nèi)核對象的所有函數(shù)幾乎都有指向一個SECURITY_ATTRIBUTES結(jié)構(gòu)的指針
                                  typedef struct _SECURITY_ATTRIBUTES { 
                                      DWORD  nLength;                         //Specifies the size, in bytes, of this structure,一般為sizeof(此結(jié)構(gòu)變量)
                                      LPVOID nLength;                         //Specifies the size, in bytes, of this structure,一般為sizeof(此結(jié)構(gòu)變量)
                                      LPVOID nLength;                         //Specifies the size, in bytes, of this structure,一般為sizeof(此結(jié)構(gòu)變量)
                                      LPVOID nLength;                         //Specifies the size, in bytes, of this structure,一般為sizeof(此結(jié)構(gòu)變量)
                                      LPVOID nLength;                         //Specifies the size, in bytes, of this structure,一般為sizeof(此結(jié)構(gòu)變量)
                                      LPVOID nLength;                         //Specifies the size, in bytes, of this structure,一般為sizeof(此結(jié)構(gòu)變量)
                                      LPVOID nLength;                         //Specifies the size, in bytes, of this structure,一般為sizeof(此結(jié)構(gòu)變量)
                                      LPVOID nLength;                         //Specifies the size, in bytes, of this structure,一般為sizeof(此結(jié)構(gòu)變量)
                                      LPVOID lpSecurityDescriptor;       //和安全性有關(guān)的成員
                                      BOOL   lpSecurityDescriptor;       //和安全性有關(guān)的成員
                                      BOOL   lpSecurityDescriptor;       //和安全性有關(guān)的成員
                                      BOOL   lpSecurityDescriptor;       //和安全性有關(guān)的成員
                                      BOOL   lpSecurityDescriptor;       //和安全性有關(guān)的成員
                                      BOOL   lpSecurityDescriptor;       //和安全性有關(guān)的成員
                                      BOOL   lpSecurityDescriptor;       //和安全性有關(guān)的成員
                                      BOOL   bInheritHandle
                                 } SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES;    

            2、進程內(nèi)核對象句柄表
                     進程的句柄表結(jié)構(gòu)

            索引

            指向內(nèi)核對象內(nèi)存塊的指針

            訪問掩碼(包含標志位的一個DWORD

            標志

            1

            0x?????????

            0x?????????

            0x?????????

            2

            0x?????????

            0x?????????

            0x?????????

            2.1、創(chuàng)建一個內(nèi)核對象
                  用于創(chuàng)建內(nèi)核對象的任何函數(shù)都會返回一個與進程相關(guān)的句柄,這個句柄可由同一個進程中運行的所有線程使用。由于句柄值實際事作為進程句柄表的索引來使用的,索引這些句柄是與當前這個進程相關(guān)的,無法供其他進程使用。
                   調(diào)用函數(shù)來創(chuàng)建一個內(nèi)核對象時,如果調(diào)用失敗,多數(shù)返回的句柄值是0(NULL),但有幾個函數(shù)會返回-1(也就是在Winbase.h中定義的INVALID_HANDLE_VALUE)。檢查它們的返回值是,務(wù)必相當仔細。
            2.2、關(guān)閉內(nèi)核對象
               無論以什么方式創(chuàng)建內(nèi)核對象,我們都要調(diào)用CloseHandle向系統(tǒng)表明我們已經(jīng)結(jié)束使用對象。
                     BOOL CloseHandle(
                             HANDLE
            hObject   // handle to object
                      );            
               在內(nèi)部,該函數(shù)首先檢查主調(diào)進程的句柄表,驗證“傳給函數(shù)的句柄值”標識的是“進程確實有權(quán)訪問的一個對象”。
               1)如果句柄是有效的,系統(tǒng)就將獲得內(nèi)核對象的數(shù)據(jù)結(jié)構(gòu)的地址,并將結(jié)構(gòu)中的“使用計數(shù)”成員遞減,如果使用計數(shù)變成0,內(nèi)核對象將被銷毀,并從內(nèi)存中去除。
               2)如果句柄是無效的,
                     如果進程是正常運行的,CloseHandle將返回FALSE,而GetLastError返回ERROR_INVALID_HANDLE。
                     如果進程正在被調(diào)試,那么系統(tǒng)將拋出0xC0000008異常(“指定了無效的句柄”)。
            hObject   // handle to object
                      );            
               在內(nèi)部,該函數(shù)首先檢查主調(diào)進程的句柄表,驗證“傳給函數(shù)的句柄值”標識的是“進程確實有權(quán)訪問的一個對象”。
               1)如果句柄是有效的,系統(tǒng)就將獲得內(nèi)核對象的數(shù)據(jù)結(jié)構(gòu)的地址,并將結(jié)構(gòu)中的“使用計數(shù)”成員遞減,如果使用計數(shù)變成0,內(nèi)核對象將被銷毀,并從內(nèi)存中去除。
               2)如果句柄是無效的,
                     如果進程是正常運行的,CloseHandle將返回FALSE,而GetLastError返回ERROR_INVALID_HANDLE。
                     如果進程正在被調(diào)試,那么系統(tǒng)將拋出0xC0000008異常(“指定了無效的句柄”)。
               *檢測內(nèi)核對象泄露
                   用Windows任務(wù)管理器,選擇(查看)->(選擇列),然后選擇顯示(句柄數(shù))。便可在進程出監(jiān)視任何一個應(yīng)用程序的內(nèi)核對象數(shù)了。
                    使用Sysinternals提供的Process Explorer工具(http://technet.microsoft.com/zh-cn/sysinternals/bb896653.aspx),選擇(View)->(Select Columns),選擇(Handle),選中所有列標題。 在頂部選擇想要檢查的進程,按F5來獲得一份最新的內(nèi)核對象列表。 然后啟動應(yīng)用程序并開始指向一個待查的工作流。完成之后,再次按F5。在此期間生成的每個內(nèi)核對象都顯示為綠色

            3、跨進程邊界共享內(nèi)核對象
                  內(nèi)核對象的句柄是與每一個進程相關(guān)的,是為確保健壯性(可靠性)和安全性。
            3.1、使用對象句柄繼承
               只有在進程之間有一個父-子關(guān)系的時候,才可以使用對象句柄繼承。   
               首先,父進程必須向系統(tǒng)指出它希望這個對象的句柄是可繼承的。
                        e.g.

                SECURITY_ATTRIBUTES sa;
                sa.nLength 
            = siezof(sa);
                sa.lpSecurityDescriptor 
            = NULL;
                sa.bInheritHandle 
            = TRUE;        //Make the returned handle inheritable

                HANDLE hMutex 
            = CreateMutex(&sa, FALSE, NULL);
               然后,由父進程生成子進程,通過CreateProcess函數(shù)完成    
            BOOL CreateProcess(
              LPCTSTR lpApplicationName,
              LPTSTR lpCommandLine,
              LPSECURITY_ATTRIBUTES lpProcessAttributes,
              LPSECURITY_ATTRIBUTES lpThreadAttributes,
              BOOL bInheritHandles,            
            //通常情況下設(shè)為FALSE(表明我們不希望子進程繼承父進程句柄表中的“可繼承句柄”)
                                                                  
            //如果傳遞TRUE,子進程就會繼承父進程的“可繼承句柄”的值。
                                                                            
            //(系統(tǒng)會遍歷符進程的句柄表,對它的每一個記錄項進行檢查,凡是包含一個
                                                                           
            //有效的“可繼承句柄”的項,都會被完整地復(fù)制到子進程的句柄表)
              DWORD dwCreationFlags,
              LPVOID lpEnvironment,
              LPCTSTR lpCurrentDirectory,
              LPSTARTUPINFO lpStartupInfo,
              LPPROCESS_INFORMATION lpProcessInformation
            );
                    除了復(fù)制句柄表的記錄項,系統(tǒng)還會遞增內(nèi)核對象的使用計數(shù),引擎兩個進程現(xiàn)在都在使用這個對象。
            3.2改變句柄的標志
                 1)父進程想控制哪些子進程能繼承內(nèi)核對象句柄。可以調(diào)用SetHandleInformation函數(shù)來改變內(nèi)核對象句柄的繼承標志。
            BOOL SetHandleInformation(
              HANDLE hObject,        
            //有效句柄標志
              DWORD dwMask,            //想要更改那個或哪些標志
              DWORD dwFlags            //希望把標志設(shè)為什么
            );
               每個句柄都關(guān)聯(lián)了兩個標志:
            #define HANDLE_FLAG_INHERIT                                       0x00000001
            #define HANDLE_FLAG_PROTECT_FROM_CLOSE        0x00000002
               如果想打開一個內(nèi)核對象句柄的繼承標志
            SetHandleInformation(hObj, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);
               如果想關(guān)閉這個標志
            SetHandleInformation(hObj, HANDLE_FLAG_INHERIT, 0);
               如果告訴系統(tǒng)不允許關(guān)閉句柄
            SetHandleInformation(hObj,,HANDLE_FLAG_PROTECT_FROM_CLOSE, HANDLE_FLAG_PROTECT_FROM_CLOSE);
            CloseHandle(hObj);    
            //會引發(fā)異常
               2)使用GetHandleInformation函數(shù)返回句柄標志
            BOOL GetHandleInformation(
              HANDLE hObject,
              LPDWORD lpdwFlags
            );
               e.g.檢查句柄是否可繼承
            DWORD dwFlags;
            GetHandleInformation(hObj, 
            &dwFlags);
            BOOL fHandleIsInheritable 
            = (0 != (dwFlags & HANDLE_FLAG_INHERIT));
            3.3為對象命名
            HANDLE CreateMutex(
              LPSECURITY_ATTRIBUTES lpMutexAttributes,
              BOOL bInitialOwner,
              LPCTSTR lpName
            );

            HANDLE CreateEvent(
              LPSECURITY_ATTRIBUTES lpEventAttributes,
              BOOL bManualReset,
              BOOL bInitialState,
              LPCTSTR lpName
            );

            HANDLE CreateEvent(
              LPSECURITY_ATTRIBUTES lpEventAttributes,
              BOOL bManualReset,
              BOOL bInitialState,
              LPCTSTR lpName
            );
               所有這些函數(shù)的最后一個參數(shù)都是pszName。傳入NULL,相當于向系統(tǒng)表明我們要創(chuàng)建一個未命名的(即匿名)內(nèi)核對象。
               要根據(jù)對象名稱來共享一個對象,我們必須為此對象指定一個名稱。傳入一個“以0為終止的名稱字符串”的地址。
            //進程A
            HANDLE hMutexProcessA = CreateMutex(NULL, FALSE, TEXT("JeffMutex"));

            //進程B
            HANDLE hMutexProcessB = CreateMutex(NULL, FALSE, TEXT("JeffMutex"));
                  當進程B調(diào)用CreateMutex時,系統(tǒng)會查看是否存在一個名為 "JeffMutex "("JeffMutex "的對象是一個互斥量對象)的內(nèi)核對象。如果存在,接著檢查對象的類型,和調(diào)用者是否擁有該對象的完全訪問權(quán)限。 如果答案是肯定的,系統(tǒng)就會在進程B的句柄表中查找一個空白記錄項,并將其初始化為指向現(xiàn)有的內(nèi)核對象;否則,返回NULL(失敗)。
                   也可以調(diào)用Open*函數(shù):
            posted on 2009-11-26 11:06 longshen 閱讀(976) 評論(0)  編輯 收藏 引用 所屬分類: VC++
            国产一区二区三精品久久久无广告 | 欧美伊香蕉久久综合类网站| 日韩精品久久久久久久电影蜜臀 | 中文字幕久久亚洲一区| 亚洲中文精品久久久久久不卡| 精品国产VA久久久久久久冰| 嫩草影院久久国产精品| 少妇无套内谢久久久久| 中文字幕久久欲求不满| 久久99精品久久久久久久久久| 久久久久亚洲AV无码专区网站 | 97久久国产亚洲精品超碰热| 久久中文字幕无码专区| 国产呻吟久久久久久久92| 久久不见久久见免费视频7| 午夜久久久久久禁播电影| 热综合一本伊人久久精品| 国产99久久久国产精品小说| 久久精品国产一区二区电影| 亚洲综合久久综合激情久久| 99久久99久久精品国产片果冻| 久久久久婷婷| 99精品国产99久久久久久97| 久久99国产精品尤物| 久久久久亚洲AV无码去区首| 亚洲国产日韩欧美综合久久| 久久精品国产99久久无毒不卡| 国产精品久久久久久久| 久久久久久国产精品无码下载| 久久精品国产99久久久| 久久亚洲色一区二区三区| 一本一本久久aa综合精品| 国产福利电影一区二区三区,免费久久久久久久精 | 久久国产精品无码HDAV | 99精品久久久久久久婷婷| 2021国产精品久久精品| 91久久精品无码一区二区毛片| 久久久精品人妻一区二区三区四 | 久久国产精品99精品国产987| 久久人人青草97香蕉| 日本高清无卡码一区二区久久|