• <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 閱讀(1529) 評論(0)  編輯 收藏 引用
            久久久久久毛片免费播放| 精品蜜臀久久久久99网站| 国产精品久久久久久久午夜片| 久久人人爽人人人人片av| 国产午夜久久影院| 精品国产一区二区三区久久蜜臀| 青青青国产精品国产精品久久久久 | 久久av免费天堂小草播放| 午夜精品久久久内射近拍高清| 亚洲国产欧美国产综合久久| 久久91这里精品国产2020| 少妇人妻88久久中文字幕| 亚洲а∨天堂久久精品9966| 99久久国产亚洲高清观看2024| 99蜜桃臀久久久欧美精品网站| 久久久久国产一区二区| 99久久er这里只有精品18| 97久久国产综合精品女不卡| 久久综合狠狠综合久久97色| 欧美亚洲国产精品久久蜜芽| 麻豆AV一区二区三区久久| 亚洲成色WWW久久网站| 久久天天躁狠狠躁夜夜躁2014| 久久亚洲高清综合| 韩国三级中文字幕hd久久精品| 国内精品久久久久久99蜜桃| 日韩AV无码久久一区二区| 97精品伊人久久大香线蕉| 亚洲国产精品成人久久蜜臀| 久久久人妻精品无码一区| 久久久久一级精品亚洲国产成人综合AV区 | 精品久久久久久久久午夜福利| 久久福利资源国产精品999| 少妇久久久久久被弄到高潮 | 久久人人超碰精品CAOPOREN | 无码久久精品国产亚洲Av影片| 久久久午夜精品福利内容| 武侠古典久久婷婷狼人伊人| 久久成人小视频| 久久人妻少妇嫩草AV无码专区| 久久精品国产亚洲av麻豆小说 |