📄 aclui.c
字号:
li->iSubItem = 0;
li->state = (Selected ? LVIS_SELECTED : 0);
li->stateMask = LVIS_SELECTED;
li->pszText = PrincipalListItem->DisplayString;
li->iImage = ImageIndex;
li->lParam = (LPARAM)PrincipalListItem;
}
static INT
AddPrincipalListEntry(IN PSECURITY_PAGE sp,
IN PPRINCIPAL_LISTITEM PrincipalListItem,
IN INT Index,
IN BOOL Selected)
{
LVITEM li;
INT Ret;
if (PrincipalListItem->DisplayString != NULL)
{
LocalFree((HLOCAL)PrincipalListItem->DisplayString);
}
PrincipalListItem->DisplayString = GetPrincipalDisplayString(PrincipalListItem);
CreatePrincipalListItem(&li,
sp,
PrincipalListItem,
Index,
Selected);
Ret = ListView_InsertItem(sp->hWndPrincipalsList,
&li);
return Ret;
}
static int CALLBACK
PrincipalCompare(IN LPARAM lParam1,
IN LPARAM lParam2,
IN LPARAM lParamSort)
{
PPRINCIPAL_LISTITEM Item1 = (PPRINCIPAL_LISTITEM)lParam1;
PPRINCIPAL_LISTITEM Item2 = (PPRINCIPAL_LISTITEM)lParam2;
if (Item1->DisplayString != NULL && Item2->DisplayString != NULL)
{
return wcscmp(Item1->DisplayString,
Item2->DisplayString);
}
return 0;
}
static VOID
UpdatePrincipalListItem(IN PSECURITY_PAGE sp,
IN INT PrincipalIndex,
IN PPRINCIPAL_LISTITEM PrincipalListItem,
IN PSIDREQRESULT SidReqResult)
{
LVITEM li;
/* replace the request result structure */
if (PrincipalListItem->SidReqResult != NULL)
{
DereferenceSidReqResult(sp->SidCacheMgr,
PrincipalListItem->SidReqResult);
}
ReferenceSidReqResult(sp->SidCacheMgr,
SidReqResult);
PrincipalListItem->SidReqResult = SidReqResult;
/* update the display string */
if (PrincipalListItem->DisplayString != NULL)
{
LocalFree((HLOCAL)PrincipalListItem->DisplayString);
}
PrincipalListItem->DisplayString = GetPrincipalDisplayString(PrincipalListItem);
/* update the list item */
CreatePrincipalListItem(&li,
sp,
PrincipalListItem,
PrincipalIndex,
FALSE);
/* don't change the list item state */
li.mask &= ~(LVIF_STATE | LVIF_PARAM);
(void)ListView_SetItem(sp->hWndPrincipalsList,
&li);
/* sort the principals list view again */
(void)ListView_SortItems(sp->hWndPrincipalsList,
PrincipalCompare,
(LPARAM)sp);
}
static VOID
ReloadPrincipalsList(IN PSECURITY_PAGE sp)
{
PSECURITY_DESCRIPTOR SecurityDescriptor;
BOOL DaclPresent, DaclDefaulted;
PACL Dacl = NULL;
HRESULT hRet;
/* delete the cached ACL */
FreePrincipalsList(sp,
&sp->PrincipalsListHead);
/* query the ACL */
hRet = sp->psi->lpVtbl->GetSecurity(sp->psi,
DACL_SECURITY_INFORMATION,
&SecurityDescriptor,
FALSE);
if (SUCCEEDED(hRet) && SecurityDescriptor != NULL)
{
if (GetSecurityDescriptorDacl(SecurityDescriptor,
&DaclPresent,
&Dacl,
&DaclDefaulted) &&
DaclPresent && Dacl != NULL)
{
PSID Sid;
PACE_HEADER AceHeader;
ULONG AceIndex;
for (AceIndex = 0;
AceIndex < Dacl->AceCount;
AceIndex++)
{
if (GetAce(Dacl,
AceIndex,
(LPVOID*)&AceHeader) &&
AceHeader != NULL)
{
BOOL LookupDeferred;
PPRINCIPAL_LISTITEM PrincipalListItem;
Sid = AceHeaderToSID(AceHeader);
PrincipalListItem = AddPrincipalToList(sp,
Sid,
AceHeader,
&LookupDeferred);
if (PrincipalListItem != NULL && LookupDeferred)
{
AddPrincipalListEntry(sp,
PrincipalListItem,
-1,
FALSE);
}
}
}
}
LocalFree((HLOCAL)SecurityDescriptor);
}
}
static VOID
UpdateControlStates(IN PSECURITY_PAGE sp)
{
PPRINCIPAL_LISTITEM Selected = (PPRINCIPAL_LISTITEM)ListViewGetSelectedItemData(sp->hWndPrincipalsList);
EnableWindow(sp->hBtnRemove,
Selected != NULL);
EnableWindow(sp->hAceCheckList,
Selected != NULL);
if (Selected != NULL)
{
LPWSTR szLabel;
LPWSTR szDisplayString;
szDisplayString = GetPrincipalAccountNameString(Selected);
if (LoadAndFormatString(hDllInstance,
IDS_PERMISSIONS_FOR,
&szLabel,
szDisplayString))
{
SetWindowText(sp->hPermissionsForLabel,
szLabel);
LocalFree((HLOCAL)szLabel);
}
LocalFree((HLOCAL)szDisplayString);
/* FIXME - update the checkboxes */
}
else
{
WCHAR szPermissions[255];
if (LoadString(hDllInstance,
IDS_PERMISSIONS,
szPermissions,
sizeof(szPermissions) / sizeof(szPermissions[0])))
{
SetWindowText(sp->hPermissionsForLabel,
szPermissions);
}
SendMessage(sp->hAceCheckList,
CLM_CLEARCHECKBOXES,
0,
0);
}
}
static void
UpdatePrincipalInfo(IN PSECURITY_PAGE sp,
IN PSIDLOOKUPNOTIFYINFO LookupInfo)
{
PPRINCIPAL_LISTITEM CurItem;
for (CurItem = sp->PrincipalsListHead;
CurItem != NULL;
CurItem = CurItem->Next)
{
if (EqualSid((PSID)(CurItem + 1),
LookupInfo->Sid))
{
INT PrincipalIndex;
LVFINDINFO lvfi;
/* find the principal in the list */
lvfi.flags = LVFI_PARAM;
lvfi.lParam = (LPARAM)CurItem;
PrincipalIndex = ListView_FindItem(sp->hWndPrincipalsList,
-1,
&lvfi);
if (PrincipalIndex != -1)
{
/* update the principal in the list view control */
UpdatePrincipalListItem(sp,
PrincipalIndex,
CurItem,
LookupInfo->SidRequestResult);
if (ListViewGetSelectedItemData(sp->hWndPrincipalsList) == (LPARAM)CurItem)
{
UpdateControlStates(sp);
}
}
else
{
AddPrincipalListEntry(sp,
CurItem,
-1,
FALSE);
}
break;
}
}
}
static UINT CALLBACK
SecurityPageCallback(IN HWND hwnd,
IN UINT uMsg,
IN LPPROPSHEETPAGE ppsp)
{
PSECURITY_PAGE sp = (PSECURITY_PAGE)ppsp->lParam;
switch (uMsg)
{
case PSPCB_CREATE:
{
return TRUE;
}
case PSPCB_RELEASE:
{
DestroySecurityPage(sp);
return FALSE;
}
}
return FALSE;
}
static VOID
SetAceCheckListColumns(IN HWND hAceCheckList,
IN UINT Button,
IN HWND hLabel)
{
POINT pt;
RECT rcLabel;
GetWindowRect(hLabel,
&rcLabel);
pt.y = 0;
pt.x = (rcLabel.right - rcLabel.left) / 2;
MapWindowPoints(hLabel,
hAceCheckList,
&pt,
1);
SendMessage(hAceCheckList,
CLM_SETCHECKBOXCOLUMN,
Button,
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;
WCHAR szSpecialPermissions[255];
BOOLEAN SpecialPermissionsPresent = FALSE;
ACCESS_MASK SpecialPermissionsMask = 0;
/* 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, /* FIXME */
&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,
(WPARAM)CurAccess->mask,
(LPARAM)NameStr);
}
else if (CurAccess->dwFlags & SI_ACCESS_SPECIFIC)
{
SpecialPermissionsPresent = TRUE;
SpecialPermissionsMask |= CurAccess->mask;
}
}
}
/* add the special permissions check item in case the specific access rights
aren't displayed */
if (SpecialPermissionsPresent &&
LoadString(hDllInstance,
IDS_SPECIAL_PERMISSIONS,
szSpecialPermissions,
sizeof(szSpecialPermissions) / sizeof(szSpecialPermissions[0])))
{
/* add the special permissions check item */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -