• <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>
            隨筆-60  評論-262  文章-1  trackbacks-0
            我們編寫服務程序的時候可能會創建具名內核對象如互斥量, 信號量, 事件, 文件映射, 等等, 然后, 這個有名字的內核對象可能在某一個具體的用戶賬號內運行的程序被訪問到, 甚至是受限的用戶帳戶內運行的程序. 這時就會出現創建不了該具名內核對象的現象, 錯誤碼為 "拒絕訪問".

            經過反復查閱資料, 我給出一個解決方案, 就是在創建內核對象之前, 先創建一個屬于 everyone 群組的權限為完全控制的安全描述符, 然后將這個安全描述符作為創建內核對象的函數的必須的參數傳入. 這樣, 整個正在運行的操作系統的任何進程都能訪問這個內核對象了.

            代碼如下:

            typedef struct SDSTUFF
            {
                PSID psidEveryone;
                PACL pDACL;
                PSECURITY_DESCRIPTOR pSD;
            } SDSTUFF;

            typedef union _ACE_UNION{ 
                ACE_HEADER aceHeader; 
                ACCESS_ALLOWED_ACE aceAllowed; 
                ACCESS_DENIED_ACE aceDenied; 
                SYSTEM_AUDIT_ACE aceAudit; 
            * PACE_UNION; 

            ULONG CalculateACLSize(PACL pACLOld, PSID
            * ppSidArray, int nNumSids, PACE_UNION * ppACEs, int nNumACEs); 

            EXTERN_C BOOL CreateEveryoneSD(OUT SDSTUFF 
            * pSDStuff) 
            {
                BOOL bResult 
            = FALSE; 
                PSID psidArray[
            2= { 0 };
                ULONG lACLSize 
            = 0
                
                
            do 
                {
                    
            // 為內建的 Everyone 群組建立一個 SID 
                    SID_IDENTIFIER_AUTHORITY sidAuth = SECURITY_WORLD_SID_AUTHORITY;

                    
            if (NULL == pSDStuff) { 
                        
            break
                    }
                    
                    
            if (!AllocateAndInitializeSid( &sidAuth, 1, SECURITY_WORLD_RID,
                        
            0000000&pSDStuff->psidEveryone ))
                    { 
                        
            break
                    }
                    
                    
            // 我們建立兩個ACEs,兩者都使用 Everyone 群組
                    psidArray[0= pSDStuff->psidEveryone;
                    psidArray[
            1= pSDStuff->psidEveryone;
                    
                    
            // 取得新ACL的大小
                    lACLSize = CalculateACLSize(NULL, psidArray, 2, NULL, 0);
                    
            if (0 == lACLSize){
                        
            break
                    }
                    
                    
            // 分配內存給ACL
                    pSDStuff->pDACL = (PACL)HeapAlloc(GetProcessHeap(), 0, lACLSize);
                    
            if (pSDStuff->pDACL == NULL){
                        
            break
                    }
                    
                    
            // 初始化ACL
                    if (!InitializeAcl(pSDStuff->pDACL, lACLSize, ACL_REVISION)){
                        
            break
                    }
                    
                   // 加入允許的ACE
                    if (!AddAccessAllowedAce(pSDStuff->pDACL, ACL_REVISION, 
                        STANDARD_RIGHTS_ALL
            |SPECIFIC_RIGHTS_ALL, psidArray[1])) 
                    {
                        GetLastError(); 
            //錯誤
                        break
                    }
                    
                    
            // 分配空間給安全描述項
                    pSDStuff->pSD = HeapAlloc(GetProcessHeap(), 0, SECURITY_DESCRIPTOR_MIN_LENGTH);
                    
            if (pSDStuff->pSD == NULL){
                        
            break
                    }
                    
            // 我們現在有一個空的安全描述項
                    if (!InitializeSecurityDescriptor(pSDStuff->pSD, SECURITY_DESCRIPTOR_REVISION)) {
                        
            break
                    }
                    
            // 我們的 DACL
                    if (!SetSecurityDescriptorDacl(pSDStuff->pSD, TRUE, pSDStuff->pDACL, FALSE)) {
                        
            break
                    }
                    bResult 
            = TRUE; 
                } 
            while(FALSE); 
                
            return bResult; 
            }

            EXTERN_C BOOL ClearupEveryoneSD(IN SDSTUFF stSDStuff) 
            {
                
            // 清除
                HeapFree(GetProcessHeap(), 0, stSDStuff.pSD);
                HeapFree(GetProcessHeap(), 
            0, stSDStuff.pDACL);
                FreeSid(stSDStuff.psidEveryone); 
                
            return TRUE; 
            }


            ULONG CalculateACLSize(PACL pACLOld, PSID
            * ppSidArray, int nNumSids, PACE_UNION* ppACEs, int nNumACEs)

                ULONG lACLSize 
            = 0
                
                
            do 
                { 
                    
            // 假如我們包括一個現存的 ACL, 那么找出它的大小 
                    if (pACLOld != NULL){ 
                        ACL_SIZE_INFORMATION aclSize 
            = { 0 }; 
                        
            if(!GetAclInformation(pACLOld, &aclSize, sizeof(aclSize), AclSizeInformation)){ 
                            
            break
                        } 
                        lACLSize 
            = aclSize.AclBytesInUse; 
                    } 
                    
            if (ppSidArray != NULL) { 
                        
            // 逐步瀏覽每個SID 
                        while (nNumSids--) { 
                            
            // 假如SID無效, 那么就跳出 
                            if (!IsValidSid(ppSidArray[nNumSids])) { 
                                lACLSize 
            = 0
                                
            break
                            } 
                            
            // 取得 SID 的長度 
                            lACLSize += GetLengthSid(ppSidArray[nNumSids]); 
                            
            // 加入ACE 結構大小, 減去 SidStart 成員的大小 
                            lACLSize += sizeof(ACCESS_ALLOWED_ACE) - sizeof(((ACCESS_ALLOWED_ACE*)0)->SidStart); 
                        } 
                        
            if(0 == lACLSize) { break; } 
                    } 
                    
            if (ppACEs != NULL) { 
                        
            // 逐步瀏覽每個ACE 
                        while (nNumACEs--){ 
                            
            // 取得SIDs長度 
                            lACLSize += ppACEs[nNumACEs]->aceHeader.AceSize; 
                        } 
                    } 
                    
            // 加入 ACL 結構本身 
                    lACLSize += sizeof(ACL); 
                } 
            while (FALSE); 
                
                
            return (lACLSize); 
            }
            希望這段代碼能對被同樣問題困擾的人有所幫助. 對它的使用極其簡單:

                SECURITY_ATTRIBUTES sa = {0};
                SDSTUFF stSDStuff = { 0 };

                CreateEveryoneSD(
            &stSDStuff); 
                sa.nLength 
            = sizeof(sa);
                sa.lpSecurityDescriptor 
            = stSDStuff.pSD;
                
                g_hMap = CreateFileMapping(INVALID_HANDLE_VALUE,  // Current file handle. 
                    &sa,      // Default security. 
                    PAGE_READWRITE,                     // Read/write permission. 
                    0,                                  // Max. object size. 
                    ulCodeLen,                          // Size of hFile. 
                    "xxxxxxxxxxxxxxxxxxxxxxx");         // Name of mapping object. 

                ClearupEveryoneSD(stSDStuff); 


            posted on 2008-07-30 09:23 free2000fly 閱讀(1522) 評論(0)  編輯 收藏 引用
            亚洲狠狠婷婷综合久久蜜芽| 97超级碰碰碰碰久久久久| 久久精品国产精品亜洲毛片| 久久精品成人影院| 伊人情人综合成人久久网小说| 日本WV一本一道久久香蕉| 欧洲人妻丰满av无码久久不卡| 久久久噜噜噜www成人网| 国产精品九九九久久九九 | 久久最新免费视频| 久久无码专区国产精品发布| 国产亚洲婷婷香蕉久久精品| 久久久久亚洲国产| 国产精品美女久久久久久2018| 久久强奷乱码老熟女| 97久久精品无码一区二区| 亚洲Av无码国产情品久久| 久久99热狠狠色精品一区| 久久天天躁夜夜躁狠狠躁2022| 久久国产精品成人免费 | AV无码久久久久不卡网站下载| 久久久久一级精品亚洲国产成人综合AV区 | 久久精品成人免费网站| 热久久最新网站获取| 精品乱码久久久久久夜夜嗨| 97精品国产91久久久久久| 日韩欧美亚洲综合久久| 欧美与黑人午夜性猛交久久久 | 欧美激情精品久久久久久| 精品国产乱码久久久久久郑州公司 | 四虎亚洲国产成人久久精品| 国产99久久久久久免费看| 亚洲国产精品无码久久久蜜芽| 色综合久久天天综线观看| 久久精品亚洲福利| 欧美精品一本久久男人的天堂| avtt天堂网久久精品| 久久精品国产亚洲av麻豆小说| 日本强好片久久久久久AAA| 18岁日韩内射颜射午夜久久成人| 精品久久久久久久国产潘金莲|