handle the WM_SIZE message and resize/move the controls appropriately
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_Nl.rc
Modified: trunk/reactos/lib/aclui/aclui_Sv.rc
Modified: trunk/reactos/lib/aclui/checklist.c
Modified: trunk/reactos/lib/aclui/misc.c
Modified: trunk/reactos/lib/aclui/precomp.h
Modified: trunk/reactos/lib/aclui/resource.h

Modified: trunk/reactos/lib/aclui/aclui.c
--- trunk/reactos/lib/aclui/aclui.c	2005-08-05 23:29:52 UTC (rev 17091)
+++ trunk/reactos/lib/aclui/aclui.c	2005-08-06 01:14:09 UTC (rev 17092)
@@ -30,12 +30,17 @@
 
 HINSTANCE hDllInstance;
 
+static PCWSTR ObjectPickerAttributes[] =
+{
+    L"ObjectSid",
+};
+
 static VOID
 DestroySecurityPage(IN PSECURITY_PAGE sp)
 {
-    if(sp->hiUsrs != NULL)
+    if(sp->hiPrincipals != NULL)
     {
-        ImageList_Destroy(sp->hiUsrs);
+        ImageList_Destroy(sp->hiPrincipals);
     }
 
     HeapFree(GetProcessHeap(),
@@ -46,11 +51,11 @@
 }
 
 static VOID
-FreeAceList(IN PACE_LISTITEM *AceListHead)
+FreePrincipalsList(IN PPRINCIPAL_LISTITEM *PrincipalsListHead)
 {
-    PACE_LISTITEM CurItem, NextItem;
+    PPRINCIPAL_LISTITEM CurItem, NextItem;
     
-    CurItem = *AceListHead;
+    CurItem = *PrincipalsListHead;
     while (CurItem != NULL)
     {
         /* free the SID string if present */
@@ -67,16 +72,16 @@
         CurItem = NextItem;
     }
     
-    *AceListHead = NULL;
+    *PrincipalsListHead = NULL;
 }
 
-static PACE_LISTITEM
-FindSidInAceList(IN PACE_LISTITEM AceListHead,
-                 IN PSID Sid)
+static PPRINCIPAL_LISTITEM
+FindSidInPrincipalsList(IN PPRINCIPAL_LISTITEM PrincipalsListHead,
+                        IN PSID Sid)
 {
-    PACE_LISTITEM CurItem;
+    PPRINCIPAL_LISTITEM CurItem;
     
-    for (CurItem = AceListHead;
+    for (CurItem = PrincipalsListHead;
          CurItem != NULL;
          CurItem = CurItem->Next)
     {
@@ -91,7 +96,7 @@
 }
 
 static VOID
-ReloadUsersGroupsList(IN PSECURITY_PAGE sp)
+ReloadPrincipalsList(IN PSECURITY_PAGE sp)
 {
     PSECURITY_DESCRIPTOR SecurityDescriptor;
     BOOL DaclPresent, DaclDefaulted;
@@ -99,7 +104,7 @@
     HRESULT hRet;
 
     /* delete the cached ACL */
-    FreeAceList(&sp->AceListHead);
+    FreePrincipalsList(&sp->PrincipalsListHead);
 
     /* query the ACL */
     hRet = sp->psi->lpVtbl->GetSecurity(sp->psi,
@@ -113,7 +118,7 @@
                                       &Dacl,
                                       &DaclDefaulted))
         {
-            PACE_LISTITEM AceListItem, *NextAcePtr;
+            PPRINCIPAL_LISTITEM AceListItem, *NextAcePtr;
             PSID Sid;
             PVOID Ace;
             ULONG AceIndex;
@@ -121,7 +126,7 @@
             SID_NAME_USE SidNameUse;
             DWORD LookupResult;
             
-            NextAcePtr = &sp->AceListHead;
+            NextAcePtr = &sp->PrincipalsListHead;
             
             for (AceIndex = 0;
                  AceIndex < Dacl->AceCount;
@@ -133,11 +138,11 @@
 
                 Sid = (PSID)&((PACCESS_ALLOWED_ACE)Ace)->SidStart;
 
-                if (!FindSidInAceList(sp->AceListHead,
-                                      Sid))
+                if (!FindSidInPrincipalsList(sp->PrincipalsListHead,
+                                             Sid))
                 {
                     SidLength = GetLengthSid(Sid);
-                    
+
                     AccountNameSize = 0;
                     DomainNameSize = 0;
 
@@ -153,7 +158,7 @@
                     /* allocate the ace */
                     AceListItem = HeapAlloc(GetProcessHeap(),
                                             0,
-                                            sizeof(ACE_LISTITEM) +
+                                            sizeof(PRINCIPAL_LISTITEM) +
                                             SidLength +
                                             ((AccountNameSize + DomainNameSize) * sizeof(WCHAR)));
                     if (AceListItem != NULL)
@@ -183,7 +188,7 @@
                                 continue;
                             }
                         }
-                        
+
                         if (AccountNameSize == 0)
                         {
                             AceListItem->AccountName = NULL;
@@ -206,9 +211,9 @@
                         {
                             LSA_HANDLE LsaHandle;
                             NTSTATUS Status;
-                            
+
                             AceListItem->DisplayString = NULL;
-                            
+
                             /* read the domain of the SID */
                             if (OpenLSAPolicyHandle(sp->ServerName,
                                                     POLICY_LOOKUP_NAMES | POLICY_VIEW_LOCAL_INFORMATION,
@@ -238,7 +243,7 @@
                                         Domain = NULL;
                                         DomainName = NULL;
                                     }
-                                    
+
                                     AceListItem->SidNameUse = Names->Use;
 
                                     switch (Names->Use)
@@ -272,7 +277,7 @@
                                                 if (AceListItem->DisplayString != NULL)
                                                 {
                                                     WCHAR *s;
-                                                    
+
                                                     /* NOTE: LSA_UNICODE_STRINGs are not always NULL-terminated! */
 
                                                     wcscpy(AceListItem->DisplayString,
@@ -292,7 +297,7 @@
                                                     *(s++) = L')';
                                                     *s = L'\0';
                                                 }
-                                                
+
                                                 /* mark the ace as a user unless it's a
                                                    BUILTIN account */
                                                 if (PolicyAccountDomainInfo == NULL)
@@ -302,26 +307,26 @@
                                             }
                                             break;
                                         }
-                                        
+
                                         case SidTypeWellKnownGroup:
                                         {
                                             /* make the user believe this is a group */
                                             AceListItem->SidNameUse = SidTypeGroup;
                                             break;
                                         }
-                                        
+
                                         default:
                                         {
                                             DPRINT("Unhandled SID type: 0x%x\n", Names->Use);
                                             break;
                                         }
                                     }
-                                    
+
                                     if (PolicyAccountDomainInfo != NULL)
                                     {
                                         LsaFreeMemory(PolicyAccountDomainInfo);
                                     }
-                                    
+
                                     LsaFreeMemory(ReferencedDomain);
                                     LsaFreeMemory(Names);
                                 }
@@ -341,10 +346,10 @@
 }
 
 static INT
-AddAceListEntry(IN PSECURITY_PAGE sp,
-                IN PACE_LISTITEM AceListItem,
-                IN INT Index,
-                IN BOOL Selected)
+AddPrincipalListEntry(IN PSECURITY_PAGE sp,
+                      IN PPRINCIPAL_LISTITEM PrincipalListItem,
+                      IN INT Index,
+                      IN BOOL Selected)
 {
     LVITEM li;
 
@@ -353,8 +358,8 @@
     li.iSubItem = 0;
     li.state = (Selected ? LVIS_SELECTED : 0);
     li.stateMask = LVIS_SELECTED;
-    li.pszText = (AceListItem->DisplayString != NULL ? AceListItem->DisplayString : AceListItem->AccountName);
-    switch (AceListItem->SidNameUse)
+    li.pszText = (PrincipalListItem->DisplayString != NULL ? PrincipalListItem->DisplayString : PrincipalListItem->AccountName);
+    switch (PrincipalListItem->SidNameUse)
     {
         case SidTypeUser:
             li.iImage = 0;
@@ -366,42 +371,42 @@
             li.iImage = -1;
             break;
     }
-    li.lParam = (LPARAM)AceListItem;
+    li.lParam = (LPARAM)PrincipalListItem;
 
-    return ListView_InsertItem(sp->hWndAceList,
+    return ListView_InsertItem(sp->hWndPrincipalsList,
                                &li);
 }
 
 static VOID
-FillUsersGroupsList(IN PSECURITY_PAGE sp)
+FillPrincipalsList(IN PSECURITY_PAGE sp)
 {
     LPARAM SelLParam;
-    PACE_LISTITEM CurItem;
+    PPRINCIPAL_LISTITEM CurItem;
     RECT rcLvClient;
 
-    SelLParam = ListViewGetSelectedItemData(sp->hWndAceList);
+    SelLParam = ListViewGetSelectedItemData(sp->hWndPrincipalsList);
 
-    DisableRedrawWindow(sp->hWndAceList);
+    DisableRedrawWindow(sp->hWndPrincipalsList);
 
-    ListView_DeleteAllItems(sp->hWndAceList);
+    ListView_DeleteAllItems(sp->hWndPrincipalsList);
 
-    ReloadUsersGroupsList(sp);
+    ReloadPrincipalsList(sp);
 
-    for (CurItem = sp->AceListHead;
+    for (CurItem = sp->PrincipalsListHead;
          CurItem != NULL;
          CurItem = CurItem->Next)
     {
-        AddAceListEntry(sp,
-                        CurItem,
-                        -1,
-                        (SelLParam == (LPARAM)CurItem));
+        AddPrincipalListEntry(sp,
+                              CurItem,
+                              -1,
+                              (SelLParam == (LPARAM)CurItem));
     }
     
-    EnableRedrawWindow(sp->hWndAceList);
+    EnableRedrawWindow(sp->hWndPrincipalsList);
     
-    GetClientRect(sp->hWndAceList, &rcLvClient);
+    GetClientRect(sp->hWndPrincipalsList, &rcLvClient);
     
-    ListView_SetColumnWidth(sp->hWndAceList,
+    ListView_SetColumnWidth(sp->hWndPrincipalsList,
                             0,
                             rcLvClient.right);
 }
@@ -409,7 +414,7 @@
 static VOID
 UpdateControlStates(IN PSECURITY_PAGE sp)
 {
-    PACE_LISTITEM Selected = (PACE_LISTITEM)ListViewGetSelectedItemData(sp->hWndAceList);
+    PPRINCIPAL_LISTITEM Selected = (PPRINCIPAL_LISTITEM)ListViewGetSelectedItemData(sp->hWndPrincipalsList);
 
     EnableWindow(sp->hBtnRemove, Selected != NULL);
     EnableWindow(sp->hAceCheckList, Selected != NULL);
@@ -570,80 +575,246 @@
     }
 }
 
-static HRESULT
-InitializeObjectPicker(IN PSECURITY_PAGE sp,
-                       OUT IDsObjectPicker **pDsObjectPicker)
+static VOID
+ResizeControls(IN PSECURITY_PAGE sp,
+               IN INT Width,
+               IN INT Height)
 {
-    HRESULT hRet;
+    HWND hWndAllow, hWndDeny;
+    RECT rcControl, rcControl2, rcControl3, rcWnd;
+    INT cxWidth, cxEdge, btnSpacing;
+    POINT pt, pt2;
+    HDWP dwp;
+    INT nControls = 7;
+    LVCOLUMN lvc;
     
-    *pDsObjectPicker = NULL;
+    hWndAllow = GetDlgItem(sp->hWnd,
+                           IDC_LABEL_ALLOW);
+    hWndDeny = GetDlgItem(sp->hWnd,
+                          IDC_LABEL_DENY);
+    
+    GetWindowRect(sp->hWnd,
+                  &rcWnd);
 
-    hRet = CoCreateInstance(&CLSID_DsObjectPicker,
-                            NULL,
-                            CLSCTX_INPROC_SERVER,
-                            &IID_IDsObjectPicker,
-                            (LPVOID*)pDsObjectPicker);
-    if (SUCCEEDED(hRet))
+    cxEdge = GetSystemMetrics(SM_CXEDGE);
+    
+    /* use the left margin of the principal list view control for all control
+       margins */
+    pt.x = 0;
+    pt.y = 0;
+    MapWindowPoints(sp->hWndPrincipalsList,
+                    sp->hWnd,
+                    &pt,
+                    1);
+    cxWidth = Width - (2 * pt.x);
+    
+    if (sp->ObjectInfo.dwFlags & SI_ADVANCED)
     {
-        DSOP_INIT_INFO InitInfo;
-        UINT i;
-        PCWSTR Attributes[] =
+        nControls += 2;
+    }
+    
+    if (!(dwp = BeginDeferWindowPos(nControls)))
+    {
+        return;
+    }
+    
+    /* resize the Principal list view */
+    GetWindowRect(sp->hWndPrincipalsList,
+                  &rcControl);
+    if (!(dwp = DeferWindowPos(dwp,
+                               sp->hWndPrincipalsList,
+                               NULL,
+                               0,
+                               0,
+                               cxWidth,
+                               rcControl.bottom - rcControl.top,
+                               SWP_NOMOVE | SWP_NOZORDER)))
+    {
+        return;
+    }
+    
+    /* move the Add Principal button */
+    GetWindowRect(sp->hBtnAdd,
+                  &rcControl);
+    GetWindowRect(sp->hBtnRemove,
+                  &rcControl2);
+    btnSpacing = rcControl2.left - rcControl.right;
+    pt2.x = 0;
+    pt2.y = 0;
+    MapWindowPoints(sp->hBtnAdd,
+                    sp->hWnd,
+                    &pt2,
+                    1);
+    if (!(dwp = DeferWindowPos(dwp,
+                               sp->hBtnAdd,
+                               NULL,
+                               pt.x + cxWidth - (rcControl2.right - rcControl2.left) -
+                                   (rcControl.right - rcControl.left) -
+                                   btnSpacing - cxEdge,
+                               pt2.y,
+                               0,
+                               0,
+                               SWP_NOSIZE | SWP_NOZORDER)))
+    {
+        return;
+    }
+    
+    /* move the Delete Principal button */
+    pt2.x = 0;
+    pt2.y = 0;
+    MapWindowPoints(sp->hBtnRemove,
+                    sp->hWnd,
+                    &pt2,
+                    1);
+    if (!(dwp = DeferWindowPos(dwp,
+                               sp->hBtnRemove,
+                               NULL,
+                               pt.x + cxWidth - (rcControl2.right - rcControl2.left) - cxEdge,
+                               pt2.y,
+                               0,
+                               0,
+                               SWP_NOSIZE | SWP_NOZORDER)))
+    {
+        return;
+    }
+    
+    /* move the Permissions For label */
+    GetWindowRect(hWndAllow,
+                  &rcControl);
+    GetWindowRect(hWndDeny,
+                  &rcControl2);
+    GetWindowRect(sp->hPermissionsForLabel,
+                  &rcControl3);
+    pt2.x = 0;
+    pt2.y = 0;
+    MapWindowPoints(sp->hPermissionsForLabel,
+                    sp->hWnd,
+                    &pt2,
+                    1);
+    if (!(dwp = DeferWindowPos(dwp,
+                               sp->hPermissionsForLabel,
+                               NULL,
+                               0,
+                               0,
+                               cxWidth - (rcControl2.right - rcControl2.left) -
+                                   (rcControl.right - rcControl.left) -
+                                   (2 * btnSpacing) - cxEdge,
+                               rcControl3.bottom - rcControl3.top,
+                               SWP_NOMOVE | SWP_NOZORDER)))
+    {
+        return;
+    }
+    
+    /* move the Allow label */
+    pt2.x = 0;
+    pt2.y = 0;
+    MapWindowPoints(hWndAllow,
+                    sp->hWnd,
+                    &pt2,
+                    1);
+    if (!(dwp = DeferWindowPos(dwp,
+                               hWndAllow,
+                               NULL,
+                               cxWidth - (rcControl2.right - rcControl2.left) -
+                                   (rcControl.right - rcControl.left) -
+                                   btnSpacing - cxEdge,
+                               pt2.y,
+                               0,
+                               0,
+                               SWP_NOSIZE | SWP_NOZORDER)))
+    {
+        return;
+    }
+    
+    /* move the Deny label */
+    pt2.x = 0;
+    pt2.y = 0;
+    MapWindowPoints(hWndDeny,
+                    sp->hWnd,
+                    &pt2,
+                    1);
+    if (!(dwp = DeferWindowPos(dwp,
+                               hWndDeny,
+                               NULL,
+                               cxWidth - (rcControl2.right - rcControl2.left) - cxEdge,
+                               pt2.y,
+                               0,
+                               0,
+                               SWP_NOSIZE | SWP_NOZORDER)))
+    {
+        return;
+    }
+    
+    /* resize the Permissions check list box */
+    GetWindowRect(sp->hAceCheckList,
+                  &rcControl);
+    GetWindowRect(sp->hBtnAdvanced,
+                  &rcControl2);
+    GetWindowRect(GetDlgItem(sp->hWnd,
+                             IDC_LABEL_ADVANCED),
+                  &rcControl3);
+    if (!(dwp = DeferWindowPos(dwp,
+                               sp->hAceCheckList,
+                               NULL,
+                               0,
+                               0,
+                               cxWidth,
+                               ((sp->ObjectInfo.dwFlags & SI_ADVANCED) ?
+                                   Height - (rcControl.top - rcWnd.top) - (rcControl3.bottom - rcControl3.top) - pt.x - btnSpacing :
+                                   Height - (rcControl.top - rcWnd.top) - pt.x),
+                               SWP_NOMOVE | SWP_NOZORDER)))
+    {
+        return;
+    }
+    
+    if (sp->ObjectInfo.dwFlags & SI_ADVANCED)
+    {
+        /* move and resize the Advanced label */
+        if (!(dwp = DeferWindowPos(dwp,
+                                   GetDlgItem(sp->hWnd,
+                                              IDC_LABEL_ADVANCED),
+                                   NULL,
+                                   pt.x,
+                                   Height - (rcControl3.bottom - rcControl3.top) - pt.x,
+                                   cxWidth - (rcControl2.right - rcControl2.left) - cxEdge,
+                                   rcControl3.bottom - rcControl3.top,
+                                   SWP_NOZORDER)))
         {
-            L"ObjectSid",
-        };
-        DSOP_SCOPE_INIT_INFO Scopes[] =
-        {
-            {
-                sizeof(DSOP_SCOPE_INIT_INFO),
-                DSOP_SCOPE_TYPE_TARGET_COMPUTER,
-                DSOP_SCOPE_FLAG_DEFAULT_FILTER_USERS | DSOP_SCOPE_FLAG_DEFAULT_FILTER_GROUPS |
-                DSOP_SCOPE_FLAG_STARTING_SCOPE,
-                {
-                    {
-                        0,
-                        0,
-                        0
-                    },
-                    DSOP_DOWNLEVEL_FILTER_USERS | DSOP_DOWNLEVEL_FILTER_LOCAL_GROUPS |
-                    DSOP_DOWNLEVEL_FILTER_GLOBAL_GROUPS | DSOP_DOWNLEVEL_FILTER_ALL_WELLKNOWN_SIDS
-                },
-                NULL,
-                NULL,
-                S_OK
-            },
-        };
-
-        InitInfo.cbSize = sizeof(InitInfo);
-        InitInfo.pwzTargetComputer = (PCWSTR)sp->ServerName;
-        InitInfo.cDsScopeInfos = sizeof(Scopes) / sizeof(Scopes[0]);
-        InitInfo.aDsScopeInfos = Scopes;
-        InitInfo.flOptions = DSOP_FLAG_MULTISELECT | DSOP_SCOPE_TYPE_TARGET_COMPUTER;
-        InitInfo.cAttributesToFetch = sizeof(Attributes) / sizeof(Attributes[0]);
-        InitInfo.apwzAttributeNames = Attributes;
+            return;
+        }
         
-        for (i = 0; i < InitInfo.cDsScopeInfos; i++)
+        /* move and resize the Advanced button */
+        if (!(dwp = DeferWindowPos(dwp,
+                                   sp->hBtnAdvanced,
+                                   NULL,
+                                   cxWidth - (rcControl2.right - rcControl2.left) + pt.x,
+                                   Height - (rcControl2.bottom - rcControl2.top) - pt.x,
+                                   0,
+                                   0,
+                                   SWP_NOSIZE | SWP_NOZORDER)))
         {
-            if ((sp->ObjectInfo.dwFlags & SI_SERVER_IS_DC) &&
-                (InitInfo.aDsScopeInfos[i].flType & DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN))
-            {
-                /* only set the domain controller string if we know the target
-                   computer is a domain controller and the scope type is an
-                   up-level domain to which the target computer is joined */
-                InitInfo.aDsScopeInfos[i].pwzDcName = InitInfo.pwzTargetComputer;
-            }
+            return;
         }
-
-        hRet = (*pDsObjectPicker)->lpVtbl->Initialize(*pDsObjectPicker,
-                                                      &InitInfo);
-
-        if (FAILED(hRet))
-        {
-            /* delete the object picker in case initialization failed! */
-            (*pDsObjectPicker)->lpVtbl->Release(*pDsObjectPicker);
-        }
     }
     
-    return hRet;
+    EndDeferWindowPos(dwp);
+    
+    /* update the width of the principal list view column */
+    GetClientRect(sp->hWndPrincipalsList,
+                  &rcControl);
+    lvc.mask = LVCF_WIDTH;
+    lvc.cx = rcControl.right;
+    ListView_SetColumn(sp->hWndPrincipalsList,
+                       0,
+                       &lvc);
+
+    /* calculate the columns of the allow/deny checkboxes */
+    SetAceCheckListColumns(sp->hAceCheckList,
+                           CLB_ALLOW,
+                           hWndAllow);
+    SetAceCheckListColumns(sp->hAceCheckList,
+                           CLB_DENY,
+                           hWndDeny);
 }
 
 static INT_PTR CALLBACK
@@ -663,7 +834,7 @@
                                                   DWL_USER);
             if (sp != NULL)
             {
-                if (pnmh->hwndFrom == sp->hWndAceList)
+                if (pnmh->hwndFrom == sp->hWndPrincipalsList)
                 {
                     switch (pnmh->code)
                     {
@@ -707,7 +878,7 @@
         {
             switch (LOWORD(wParam))
             {
-                case IDC_ACELIST_ADD:
+                case IDC_ADD_PRINCIPAL:
                 {
                     HRESULT hRet;
                     IDsObjectPicker *pDsObjectPicker = NULL;
@@ -716,7 +887,9 @@
                     sp = (PSECURITY_PAGE)GetWindowLongPtr(hwndDlg,
                                                           DWL_USER);
                     
-                    hRet = InitializeObjectPicker(sp,
+                    hRet = InitializeObjectPicker(sp->ServerName,
+                                                  &sp->ObjectInfo,
+                                                  ObjectPickerAttributes,
                                                   &pDsObjectPicker);
                     if (SUCCEEDED(hRet))
                     {
@@ -737,6 +910,17 @@
             break;
         }
         
+        case WM_SIZE:
+        {
+            sp = (PSECURITY_PAGE)GetWindowLongPtr(hwndDlg,
+                                                  DWL_USER);
+
+            ResizeControls(sp,
+                           (INT)LOWORD(lParam),
+                           (INT)HIWORD(lParam));
+            break;
+        }
+        
         case WM_INITDIALOG:
         {
             sp = (PSECURITY_PAGE)((LPPROPSHEETPAGE)lParam)->lParam;
@@ -746,8 +930,9 @@
                 RECT rcLvClient;
                 
                 sp->hWnd = hwndDlg;
-                sp->hWndAceList = GetDlgItem(hwndDlg, IDC_ACELIST);
-                sp->hBtnRemove = GetDlgItem(hwndDlg, IDC_ACELIST_REMOVE);
+                sp->hWndPrincipalsList = GetDlgItem(hwndDlg, IDC_PRINCIPALS);
+                sp->hBtnAdd = GetDlgItem(hwndDlg, IDC_ADD_PRINCIPAL);
+                sp->hBtnRemove = GetDlgItem(hwndDlg, IDC_REMOVE_PRINCIPAL);
                 sp->hBtnAdvanced = GetDlgItem(hwndDlg, IDC_ADVANCED);
                 sp->hAceCheckList = GetDlgItem(hwndDlg, IDC_ACE_CHECKLIST);
                 sp->hPermissionsForLabel = GetDlgItem(hwndDlg, IDC_LABEL_PERMISSIONS_FOR);
@@ -766,31 +951,31 @@
                                  DWL_USER,
                                  (DWORD_PTR)sp);
 
-                sp->hiUsrs = ImageList_LoadBitmap(hDllInstance,
+                sp->hiPrincipals = ImageList_LoadBitmap(hDllInstance,
                                                   MAKEINTRESOURCE(IDB_USRGRPIMAGES),
                                                   16,
                                                   3,
                                                   0);
 
                 /* setup the listview control */
-                ListView_SetExtendedListViewStyleEx(sp->hWndAceList,
+                ListView_SetExtendedListViewStyleEx(sp->hWndPrincipalsList,
                                                     LVS_EX_FULLROWSELECT,
                                                     LVS_EX_FULLROWSELECT);
-                ListView_SetImageList(sp->hWndAceList,
-                                      sp->hiUsrs,
+                ListView_SetImageList(sp->hWndPrincipalsList,
+                                      sp->hiPrincipals,
                                       LVSIL_SMALL);
 
-                GetClientRect(sp->hWndAceList, &rcLvClient);
+                GetClientRect(sp->hWndPrincipalsList, &rcLvClient);
                 
                 /* add a column to the list view */
                 lvc.mask = LVCF_FMT | LVCF_WIDTH;
                 lvc.fmt = LVCFMT_LEFT;
                 lvc.cx = rcLvClient.right;
-                ListView_InsertColumn(sp->hWndAceList, 0, &lvc);
+                ListView_InsertColumn(sp->hWndPrincipalsList, 0, &lvc);
 
-                FillUsersGroupsList(sp);
+                FillPrincipalsList(sp);
                 
-                ListViewSelectItem(sp->hWndAceList,
+                ListViewSelectItem(sp->hWndPrincipalsList,
                                    0);
 
                 /* calculate the columns of the allow/deny checkboxes */
@@ -841,6 +1026,8 @@
                             CLM_ENABLEQUICKSEARCH,
                             TRUE,
                             0);
+
+                UpdateControlStates(sp);
             }
             break;
         }

Modified: trunk/reactos/lib/aclui/aclui_De.rc
--- trunk/reactos/lib/aclui/aclui_De.rc	2005-08-05 23:29:52 UTC (rev 17091)
+++ trunk/reactos/lib/aclui/aclui_De.rc	2005-08-06 01:14:09 UTC (rev 17092)
@@ -6,9 +6,9 @@
 FONT 8, "MS Shell Dlg", 0, 0, 0x0
 BEGIN
   LTEXT "&Gruppen oder Benutzernamen:", -1, 7, 7, 105, 8
-  CONTROL "", IDC_ACELIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 7, 17, 213, 66, WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
-  PUSHBUTTON "&Hinzuf³gen...", IDC_ACELIST_ADD, 116, 87, 50, 14
-  PUSHBUTTON "&Entfernen", IDC_ACELIST_REMOVE, 170, 87, 50, 14
+  CONTROL "", IDC_PRINCIPALS, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 7, 17, 213, 66, WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
+  PUSHBUTTON "&Hinzuf³gen...", IDC_ADD_PRINCIPAL, 116, 87, 50, 14
+  PUSHBUTTON "&Entfernen", IDC_REMOVE_PRINCIPAL, 170, 87, 50, 14
   LTEXT "", IDC_LABEL_PERMISSIONS_FOR, 7, 107, 105, 8, SS_LEFT | SS_NOPREFIX
   LTEXT "Erlauben", IDC_LABEL_ALLOW, 135, 107, 32, 8, SS_CENTER
   LTEXT "Verbieten", IDC_LABEL_DENY, 176, 107, 32, 8, SS_CENTER

Modified: trunk/reactos/lib/aclui/aclui_En.rc
--- trunk/reactos/lib/aclui/aclui_En.rc	2005-08-05 23:29:52 UTC (rev 17091)
+++ trunk/reactos/lib/aclui/aclui_En.rc	2005-08-06 01:14:09 UTC (rev 17092)
@@ -6,9 +6,9 @@
 FONT 8, "MS Shell Dlg", 0, 0, 0x0
 BEGIN
   LTEXT "&Group or user names:", -1, 7, 7, 105, 8
-  CONTROL "", IDC_ACELIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 7, 17, 213, 66, WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
-  PUSHBUTTON "A&dd...", IDC_ACELIST_ADD, 116, 87, 50, 14
-  PUSHBUTTON "&Remove", IDC_ACELIST_REMOVE, 170, 87, 50, 14
+  CONTROL "", IDC_PRINCIPALS, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 7, 17, 213, 66, WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
+  PUSHBUTTON "A&dd...", IDC_ADD_PRINCIPAL, 116, 87, 50, 14
+  PUSHBUTTON "&Remove", IDC_REMOVE_PRINCIPAL, 170, 87, 50, 14
   LTEXT "", IDC_LABEL_PERMISSIONS_FOR, 7, 107, 105, 8, SS_LEFT | SS_NOPREFIX
   LTEXT "Allow", IDC_LABEL_ALLOW, 135, 107, 32, 8, SS_CENTER
   LTEXT "Deny", IDC_LABEL_DENY, 176, 107, 32, 8, SS_CENTER

Modified: trunk/reactos/lib/aclui/aclui_Nl.rc
--- trunk/reactos/lib/aclui/aclui_Nl.rc	2005-08-05 23:29:52 UTC (rev 17091)
+++ trunk/reactos/lib/aclui/aclui_Nl.rc	2005-08-06 01:14:09 UTC (rev 17092)
@@ -6,9 +6,9 @@
 FONT 8, "MS Shell Dlg", 0, 0, 0x0
 BEGIN
   LTEXT "&Groep of gebruikersnamen:", -1, 7, 7, 105, 8
-  CONTROL "", IDC_ACELIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 7, 17, 213, 66, WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
-  PUSHBUTTON "&Toevoegen...", IDC_ACELIST_ADD, 116, 87, 50, 14
-  PUSHBUTTON "&Verwijderen", IDC_ACELIST_REMOVE, 170, 87, 50, 14
+  CONTROL "", IDC_PRINCIPALS, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 7, 17, 213, 66, WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
+  PUSHBUTTON "&Toevoegen...", IDC_ADD_PRINCIPAL, 116, 87, 50, 14
+  PUSHBUTTON "&Verwijderen", IDC_REMOVE_PRINCIPAL, 170, 87, 50, 14
   LTEXT "", IDC_LABEL_PERMISSIONS_FOR, 7, 107, 105, 8, SS_LEFT | SS_NOPREFIX
   LTEXT "Toestaan", IDC_LABEL_ALLOW, 135, 107, 32, 8, SS_CENTER
   LTEXT "Weigeren", IDC_LABEL_DENY, 176, 107, 32, 8, SS_CENTER

Modified: trunk/reactos/lib/aclui/aclui_Sv.rc
--- trunk/reactos/lib/aclui/aclui_Sv.rc	2005-08-05 23:29:52 UTC (rev 17091)
+++ trunk/reactos/lib/aclui/aclui_Sv.rc	2005-08-06 01:14:09 UTC (rev 17092)
@@ -24,9 +24,9 @@
 FONT 8, "MS Shell Dlg", 0, 0, 0x0
 BEGIN
   LTEXT "&Grupp eller anvõndarnamn:", -1, 7, 7, 105, 8
-  CONTROL "", IDC_ACELIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 7, 17, 213, 66, WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
-  PUSHBUTTON "&Lõgg till...", IDC_ACELIST_ADD, 116, 87, 50, 14
-  PUSHBUTTON "&Ta bort", IDC_ACELIST_REMOVE, 170, 87, 50, 14
+  CONTROL "", IDC_PRINCIPALS, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 7, 17, 213, 66, WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
+  PUSHBUTTON "&Lõgg till...", IDC_ADD_PRINCIPAL, 116, 87, 50, 14
+  PUSHBUTTON "&Ta bort", IDC_REMOVE_PRINCIPAL, 170, 87, 50, 14
   LTEXT "", IDC_LABEL_PERMISSIONS_FOR, 7, 107, 105, 8, SS_LEFT | SS_NOPREFIX
   LTEXT "TillÕt", IDC_LABEL_ALLOW, 135, 107, 32, 8, SS_CENTER
   LTEXT "Neka", IDC_LABEL_DENY, 176, 107, 32, 8, SS_CENTER

Modified: trunk/reactos/lib/aclui/checklist.c
--- trunk/reactos/lib/aclui/checklist.c	2005-08-05 23:29:52 UTC (rev 17091)
+++ trunk/reactos/lib/aclui/checklist.c	2005-08-06 01:14:09 UTC (rev 17092)
@@ -1776,6 +1776,7 @@
         case CLM_SETCHECKBOXCOLUMN:
         {
             infoPtr->CheckBoxLeft[wParam != CLB_DENY] = (INT)lParam;
+            UpdateControl(infoPtr);
             Ret = 1;
             break;
         }

Modified: trunk/reactos/lib/aclui/misc.c
--- trunk/reactos/lib/aclui/misc.c	2005-08-05 23:29:52 UTC (rev 17091)
+++ trunk/reactos/lib/aclui/misc.c	2005-08-06 01:14:09 UTC (rev 17092)
@@ -204,3 +204,77 @@
                             &li);
 }
 
+HRESULT
+InitializeObjectPicker(IN PCWSTR ServerName,
+                       IN PSI_OBJECT_INFO ObjectInfo,
+                       IN PCWSTR Attributes[],
+                       OUT IDsObjectPicker **pDsObjectPicker)
+{
+    HRESULT hRet;
+
+    *pDsObjectPicker = NULL;
+
+    hRet = CoCreateInstance(&CLSID_DsObjectPicker,
+                            NULL,
+                            CLSCTX_INPROC_SERVER,
+                            &IID_IDsObjectPicker,
+                            (LPVOID*)pDsObjectPicker);
+    if (SUCCEEDED(hRet))
+    {
+        DSOP_INIT_INFO InitInfo;
+        UINT i;
+        DSOP_SCOPE_INIT_INFO Scopes[] =
+        {
+            {
+                sizeof(DSOP_SCOPE_INIT_INFO),
+                DSOP_SCOPE_TYPE_TARGET_COMPUTER,
+                DSOP_SCOPE_FLAG_DEFAULT_FILTER_USERS | DSOP_SCOPE_FLAG_DEFAULT_FILTER_GROUPS |
+                DSOP_SCOPE_FLAG_STARTING_SCOPE,
+                {
+                    {
+                        0,
+                        0,
+                        0
+                    },
+                    DSOP_DOWNLEVEL_FILTER_USERS | DSOP_DOWNLEVEL_FILTER_LOCAL_GROUPS |
+                    DSOP_DOWNLEVEL_FILTER_GLOBAL_GROUPS | DSOP_DOWNLEVEL_FILTER_ALL_WELLKNOWN_SIDS
+                },
+                NULL,
+                NULL,
+                S_OK
+            },
+        };
+
+        InitInfo.cbSize = sizeof(InitInfo);
+        InitInfo.pwzTargetComputer = ServerName;
+        InitInfo.cDsScopeInfos = sizeof(Scopes) / sizeof(Scopes[0]);
+        InitInfo.aDsScopeInfos = Scopes;
+        InitInfo.flOptions = DSOP_FLAG_MULTISELECT | DSOP_SCOPE_TYPE_TARGET_COMPUTER;
+        InitInfo.cAttributesToFetch = sizeof(Attributes) / sizeof(Attributes[0]);
+        InitInfo.apwzAttributeNames = Attributes;
+
+        for (i = 0; i < InitInfo.cDsScopeInfos; i++)
+        {
+            if ((ObjectInfo->dwFlags & SI_SERVER_IS_DC) &&
+                (InitInfo.aDsScopeInfos[i].flType & DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN))
+            {
+                /* only set the domain controller string if we know the target
+                   computer is a domain controller and the scope type is an
+                   up-level domain to which the target computer is joined */
+                InitInfo.aDsScopeInfos[i].pwzDcName = InitInfo.pwzTargetComputer;
+            }
+        }
+
+        hRet = (*pDsObjectPicker)->lpVtbl->Initialize(*pDsObjectPicker,
+                                                      &InitInfo);
+
+        if (FAILED(hRet))
+        {
+            /* delete the object picker in case initialization failed! */
+            (*pDsObjectPicker)->lpVtbl->Release(*pDsObjectPicker);
+        }
+    }
+
+    return hRet;
+}
+

Modified: trunk/reactos/lib/aclui/precomp.h
--- trunk/reactos/lib/aclui/precomp.h	2005-08-05 23:29:52 UTC (rev 17091)
+++ trunk/reactos/lib/aclui/precomp.h	2005-08-06 01:14:09 UTC (rev 17092)
@@ -26,30 +26,33 @@
 
 extern HINSTANCE hDllInstance;
 
-typedef struct _ACE_LISTITEM
+typedef struct _PRINCIPAL_LISTITEM
 {
-    struct _ACE_LISTITEM *Next;
+    struct _PRINCIPAL_LISTITEM *Next;
     SID_NAME_USE SidNameUse;
     WCHAR *DisplayString;
     WCHAR *AccountName;
     WCHAR *DomainName;
-} ACE_LISTITEM, *PACE_LISTITEM;
+} PRINCIPAL_LISTITEM, *PPRINCIPAL_LISTITEM;
 
 typedef struct _SECURITY_PAGE
 {
     HWND hWnd;
+    HWND hBtnAdd;
     HWND hBtnRemove;
     HWND hBtnAdvanced;
     HWND hAceCheckList;
     HWND hPermissionsForLabel;
 
-    /* Main ACE List */
-    HWND hWndAceList;
-    PACE_LISTITEM AceListHead;
+    /* Main Principals List */
+    HWND hWndPrincipalsList;
+    PPRINCIPAL_LISTITEM PrincipalsListHead;
     
+    INT ControlsMargin;
+    
     INT SpecialPermCheckIndex;
 
-    HIMAGELIST hiUsrs;
+    HIMAGELIST hiPrincipals;
 
     LPSECURITYINFO psi;
     SI_OBJECT_INFO ObjectInfo;
@@ -79,6 +82,12 @@
 ListViewSelectItem(IN HWND hwnd,
                    IN INT Index);
 
+HRESULT
+InitializeObjectPicker(IN PCWSTR ServerName,
+                       IN PSI_OBJECT_INFO ObjectInfo,
+                       IN PCWSTR Attributes[],
+                       OUT IDsObjectPicker **pDsObjectPicker);
+
 /* CHECKLIST CONTROL **********************************************************/
 
 #define CIS_DENYDISABLED        (0x8)

Modified: trunk/reactos/lib/aclui/resource.h
--- trunk/reactos/lib/aclui/resource.h	2005-08-05 23:29:52 UTC (rev 17091)
+++ trunk/reactos/lib/aclui/resource.h	2005-08-06 01:14:09 UTC (rev 17092)
@@ -3,9 +3,9 @@
 
 #define IDD_SECPAGE	101
 
-#define IDC_ACELIST	1001
-#define IDC_ACELIST_ADD	1002
-#define IDC_ACELIST_REMOVE	1003
+#define IDC_PRINCIPALS	1001
+#define IDC_ADD_PRINCIPAL	1002
+#define IDC_REMOVE_PRINCIPAL	1003
 #define IDC_ACE_CHECKLIST       1004
 #define IDC_LABEL_ALLOW 1005
 #define IDC_LABEL_DENY  1006