enumerate the permission names and display them
Modified: trunk/reactos/lib/aclui/aclui.c
Modified: trunk/reactos/lib/aclui/aclui_De.rc
Modified: trunk/reactos/lib/aclui/aclui_En.rc
Modified: trunk/reactos/lib/aclui/aclui_Sv.rc
Modified: trunk/reactos/lib/aclui/acluilib.h
Modified: trunk/reactos/lib/aclui/checklist.c
Modified: trunk/reactos/lib/aclui/resource.h

Modified: trunk/reactos/lib/aclui/aclui.c
--- trunk/reactos/lib/aclui/aclui.c	2005-07-01 23:33:34 UTC (rev 16374)
+++ trunk/reactos/lib/aclui/aclui.c	2005-07-02 01:34:18 UTC (rev 16375)
@@ -460,7 +460,78 @@
                 pt.x);
 }
 
+static VOID
+LoadPermissionsList(IN PSECURITY_PAGE sp,
+                    IN GUID *GuidObjectType,
+                    IN DWORD dwFlags,
+                    OUT SI_ACCESS *DefaultAccess)
+{
+    HRESULT hRet;
+    PSI_ACCESS AccessList;
+    ULONG nAccessList, DefaultAccessIndex;
+    
+    /* clear the permissions list */
+    
+    SendMessage(sp->hAceCheckList,
+                CLM_CLEAR,
+                0,
+                0);
+    
+    /* query the access rights from the server */
+    hRet = sp->psi->lpVtbl->GetAccessRights(sp->psi,
+                                            GuidObjectType,
+                                            dwFlags,
+                                            &AccessList,
+                                            &nAccessList,
+                                            &DefaultAccessIndex);
+    if (SUCCEEDED(hRet) && nAccessList != 0)
+    {
+        LPCWSTR NameStr;
+        PSI_ACCESS CurAccess, LastAccess;
+        WCHAR NameBuffer[MAX_PATH];
+        
+        /* save the default access rights to be used when adding ACEs later */
+        if (DefaultAccess != NULL)
+        {
+            *DefaultAccess = AccessList[DefaultAccessIndex];
+        }
+        
+        LastAccess = AccessList + nAccessList;
+        for (CurAccess = &AccessList[0];
+             CurAccess != LastAccess;
+             CurAccess++)
+        {
+            if (CurAccess->dwFlags & dwFlags)
+            {
+                /* get the permission name, load it from a string table if necessary */
+                if (IS_INTRESOURCE(CurAccess->pszName))
+                {
+                    if (!LoadString(sp->ObjectInfo.hInstance,
+                                    (UINT)((ULONG_PTR)CurAccess->pszName),
+                                    NameBuffer,
+                                    sizeof(NameBuffer) / sizeof(NameBuffer[0])))
+                    {
+                        LoadString(hDllInstance,
+                                   IDS_UNKNOWN,
+                                   NameBuffer,
+                                   sizeof(NameBuffer) / sizeof(NameBuffer[0]));
+                    }
+                    NameStr = NameBuffer;
+                }
+                else
+                {
+                    NameStr = CurAccess->pszName;
+                }
 
+                SendMessage(sp->hAceCheckList,
+                            CLM_ADDITEM,
+                            CIS_DISABLED | CIS_NONE,
+                            (LPARAM)NameStr);
+            }
+        }
+    }
+}
+
 static INT_PTR CALLBACK
 SecurityPageProc(IN HWND hwndDlg,
                  IN UINT uMsg,
@@ -547,6 +618,12 @@
                                        GetDlgItem(hwndDlg, IDC_LABEL_DENY));
 
                 /* FIXME - hide controls in case the flags aren't present */
+
+                LoadPermissionsList(sp,
+                                    NULL,
+                                    SI_ACCESS_GENERAL |
+                                    ((sp->ObjectInfo.dwFlags & SI_CONTAINER) ? SI_ACCESS_CONTAINER : 0),
+                                    &sp->DefaultAccess);
             }
             break;
         }
@@ -607,6 +684,8 @@
     sPage->psi = psi;
     sPage->ObjectInfo = ObjectInfo;
 
+    ZeroMemory(&psp, sizeof(psp));
+
     psp.dwSize = sizeof(PROPSHEETPAGE);
     psp.dwFlags = PSP_USECALLBACK;
     psp.hInstance = hDllInstance;
@@ -683,6 +762,7 @@
     {
         /* Set the page title if the flag is present and the string isn't empty */
         psh.pszCaption = ObjectInfo.pszPageTitle;
+        psh.dwFlags |= PSH_PROPTITLE;
         lpCaption = NULL;
     }
     else

Modified: trunk/reactos/lib/aclui/aclui_De.rc
--- trunk/reactos/lib/aclui/aclui_De.rc	2005-07-01 23:33:34 UTC (rev 16374)
+++ trunk/reactos/lib/aclui/aclui_De.rc	2005-07-02 01:34:18 UTC (rev 16375)
@@ -17,4 +17,5 @@
 STRINGTABLE DISCARDABLE
 {
   IDS_PSP_TITLE "Berechtigungen f³r %1"
+  IDS_UNKNOWN "Unbekannt"
 }

Modified: trunk/reactos/lib/aclui/aclui_En.rc
--- trunk/reactos/lib/aclui/aclui_En.rc	2005-07-01 23:33:34 UTC (rev 16374)
+++ trunk/reactos/lib/aclui/aclui_En.rc	2005-07-02 01:34:18 UTC (rev 16375)
@@ -17,5 +17,6 @@
 STRINGTABLE DISCARDABLE
 {
   IDS_PSP_TITLE "Permissions for %1"
+  IDS_UNKNOWN "Unknown"
 }
 

Modified: trunk/reactos/lib/aclui/aclui_Sv.rc
--- trunk/reactos/lib/aclui/aclui_Sv.rc	2005-07-01 23:33:34 UTC (rev 16374)
+++ trunk/reactos/lib/aclui/aclui_Sv.rc	2005-07-02 01:34:18 UTC (rev 16375)
@@ -35,5 +35,6 @@
 STRINGTABLE DISCARDABLE
 {
   IDS_PSP_TITLE "Beh÷righeter f÷r %1"
+  IDS_UNKNOWN "Unknown"
 }
 

Modified: trunk/reactos/lib/aclui/acluilib.h
--- trunk/reactos/lib/aclui/acluilib.h	2005-07-01 23:33:34 UTC (rev 16374)
+++ trunk/reactos/lib/aclui/acluilib.h	2005-07-02 01:34:18 UTC (rev 16375)
@@ -44,6 +44,8 @@
 
     LPSECURITYINFO psi;
     SI_OBJECT_INFO ObjectInfo;
+    
+    SI_ACCESS DefaultAccess;
 } SECURITY_PAGE, *PSECURITY_PAGE;
 
 /* MISC ***********************************************************************/
@@ -68,10 +70,11 @@
 
 /* CHECKLIST CONTROL **********************************************************/
 
-#define CIS_DISABLED    (0x2)
+#define CIS_DISABLED    (0x4)
 #define CIS_ENABLED     (0x0)
-#define CIS_ALLOW       (0x1)
-#define CIS_DENY        (0x0)
+#define CIS_ALLOW       (0x2)
+#define CIS_DENY        (0x1)
+#define CIS_NONE        (0x0)
 
 #define CLB_ALLOW       (0x1)
 #define CLB_DENY        (0x0)

Modified: trunk/reactos/lib/aclui/checklist.c
--- trunk/reactos/lib/aclui/checklist.c	2005-07-01 23:33:34 UTC (rev 16374)
+++ trunk/reactos/lib/aclui/checklist.c	2005-07-02 01:34:18 UTC (rev 16375)
@@ -281,12 +281,11 @@
                                      ScrollPos + VisibleFirstIndex);
     if (FirstItem != NULL)
     {
-        RECT TextRect, ItemRect;
+        RECT TextRect, ItemRect, CheckBox;
         HFONT hOldFont;
         DWORD CurrentIndex;
         COLORREF OldTextColor;
         BOOL Enabled, PrevEnabled;
-        POINT ptOld;
         
         Enabled = IsWindowEnabled(infoPtr->hSelf);
         PrevEnabled = Enabled;
@@ -299,11 +298,6 @@
         TextRect.right = ItemRect.right - 6;
         TextRect.top = ItemRect.top + 2;
         
-        MoveToEx(hDC,
-                 infoPtr->CheckBoxLeft[CLB_ALLOW],
-                 ItemRect.top,
-                 &ptOld);
-        
         OldTextColor = SetTextColor(hDC,
                                     infoPtr->TextColor[Enabled]);
 
@@ -324,27 +318,35 @@
                              infoPtr->TextColor[PrevEnabled]);
             }
             
+            /* draw the text */
             DrawText(hDC,
                      Item->Name,
                      -1,
                      &TextRect,
                      DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER);
             
-            MoveToEx(hDC,
-                     infoPtr->CheckBoxLeft[CLB_ALLOW],
-                     TextRect.top - 6,
-                     NULL);
-            LineTo(hDC,
-                   infoPtr->CheckBoxLeft[CLB_ALLOW],
-                   TextRect.bottom - 6);
-            MoveToEx(hDC,
-                     infoPtr->CheckBoxLeft[CLB_DENY],
-                     TextRect.top - 6,
-                     NULL);
-            LineTo(hDC,
-                   infoPtr->CheckBoxLeft[CLB_DENY],
-                   TextRect.bottom - 6);
+            /* draw the Allow checkbox */
+            CheckBox.left = infoPtr->CheckBoxLeft[CLB_ALLOW] - ((TextRect.bottom - TextRect.top) / 2);
+            CheckBox.right = CheckBox.left + (TextRect.bottom - TextRect.top) - 4;
+            CheckBox.top = TextRect.top;
+            CheckBox.bottom = CheckBox.top + (TextRect.bottom - TextRect.top) - 4;
+            DrawFrameControl(hDC,
+                             &CheckBox,
+                             DFC_BUTTON,
+                             DFCS_BUTTONCHECK | DFCS_FLAT |
+                             ((Item->State & CIS_DISABLED) && Enabled ? DFCS_INACTIVE : 0) |
+                             ((Item->State & CIS_ALLOW) ? DFCS_CHECKED : 0));
 
+            /* draw the Deny checkbox */
+            CheckBox.left = infoPtr->CheckBoxLeft[CLB_DENY] - ((TextRect.bottom - TextRect.top) / 2);
+            CheckBox.right = CheckBox.left + (TextRect.bottom - TextRect.top) - 4;
+            DrawFrameControl(hDC,
+                             &CheckBox,
+                             DFC_BUTTON,
+                             DFCS_BUTTONCHECK | DFCS_FLAT |
+                             ((Item->State & CIS_DISABLED) && Enabled ? DFCS_INACTIVE : 0) |
+                             ((Item->State & CIS_DENY) ? DFCS_CHECKED : 0));
+
             TextRect.top += infoPtr->ItemHeight;
         }
 
@@ -353,11 +355,6 @@
 
         SetTextColor(hDC,
                      OldTextColor);
-
-        MoveToEx(hDC,
-                 ptOld.x,
-                 ptOld.y,
-                 NULL);
     }
 }
 

Modified: trunk/reactos/lib/aclui/resource.h
--- trunk/reactos/lib/aclui/resource.h	2005-07-01 23:33:34 UTC (rev 16374)
+++ trunk/reactos/lib/aclui/resource.h	2005-07-02 01:34:18 UTC (rev 16375)
@@ -13,6 +13,7 @@
 #define IDI_DEVMGR	100
 
 #define IDS_PSP_TITLE	1001
+#define IDS_UNKNOWN     1002
 
 #define IDB_USRGRPIMAGES	1001