2 * ReactOS Access Control List Editor
3 * Copyright (C) 2004-2005 ReactOS Team
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 * PROJECT: ReactOS Access Control List Editor
22 * FILE: lib/aclui/misc.c
23 * PURPOSE: Access Control List Editor
24 * PROGRAMMER: Thomas Weidenmueller <w3seek@reactos.com>
35 static PCWSTR ObjectPickerAttributes
[] =
41 LengthOfStrResource(IN HINSTANCE hInst
,
53 /* There are always blocks of 16 strings */
54 lpName
= (LPWSTR
)MAKEINTRESOURCE((uID
>> 4) + 1);
56 /* Find the string table block */
57 if ((hrSrc
= FindResourceW(hInst
, lpName
, (LPWSTR
)RT_STRING
)) &&
58 (hRes
= LoadResource(hInst
, hrSrc
)) &&
59 (lpStr
= LockResource(hRes
)))
63 /* Find the string we're looking for */
64 uID
&= 0xF; /* position in the block, same as % 16 */
65 for (x
= 0; x
< uID
; x
++)
67 lpStr
+= (*lpStr
) + 1;
70 /* Found the string */
77 AllocAndLoadString(OUT LPWSTR
*lpTarget
,
83 ln
= LengthOfStrResource(hInst
,
87 (*lpTarget
) = (LPWSTR
)LocalAlloc(LMEM_FIXED
,
89 if ((*lpTarget
) != NULL
)
92 if (!(Ret
= LoadStringW(hInst
, uID
, *lpTarget
, ln
)))
94 LocalFree((HLOCAL
)(*lpTarget
));
103 LoadAndFormatString(IN HINSTANCE hInstance
,
105 OUT LPWSTR
*lpTarget
,
112 if (AllocAndLoadString(&lpFormat
,
116 va_start(lArgs
, lpTarget
);
117 /* let's use FormatMessage to format it because it has the ability to allocate
118 memory automatically */
119 Ret
= FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_FROM_STRING
,
128 LocalFree((HLOCAL
)lpFormat
);
135 OpenLSAPolicyHandle(IN LPWSTR SystemName
,
136 IN ACCESS_MASK DesiredAccess
,
137 OUT PLSA_HANDLE PolicyHandle
)
139 LSA_OBJECT_ATTRIBUTES LsaObjectAttributes
;
140 LSA_UNICODE_STRING LsaSystemName
, *psn
;
143 ZeroMemory(&LsaObjectAttributes
, sizeof(LSA_OBJECT_ATTRIBUTES
));
145 if (SystemName
!= NULL
)
147 LsaSystemName
.Buffer
= SystemName
;
148 LsaSystemName
.Length
= wcslen(SystemName
) * sizeof(WCHAR
);
149 LsaSystemName
.MaximumLength
= LsaSystemName
.Length
+ sizeof(WCHAR
);
150 psn
= &LsaSystemName
;
157 Status
= LsaOpenPolicy(psn
,
158 &LsaObjectAttributes
,
161 if (!NT_SUCCESS(Status
))
163 SetLastError(LsaNtStatusToWinError(Status
));
171 ListViewGetSelectedItemData(IN HWND hwnd
)
175 Index
= ListView_GetNextItem(hwnd
,
182 li
.mask
= LVIF_PARAM
;
186 if (ListView_GetItem(hwnd
,
197 ListViewSelectItem(IN HWND hwnd
,
202 li
.mask
= LVIF_STATE
;
205 li
.state
= LVIS_SELECTED
;
206 li
.stateMask
= LVIS_SELECTED
;
208 return ListView_SetItem(hwnd
,
213 InitializeObjectPicker(IN PCWSTR ServerName
,
214 IN PSI_OBJECT_INFO ObjectInfo
,
215 OUT IDsObjectPicker
**pDsObjectPicker
)
219 *pDsObjectPicker
= NULL
;
221 hRet
= CoCreateInstance(&CLSID_DsObjectPicker
,
223 CLSCTX_INPROC_SERVER
,
224 &IID_IDsObjectPicker
,
225 (LPVOID
*)pDsObjectPicker
);
228 DSOP_INIT_INFO InitInfo
;
230 DSOP_SCOPE_INIT_INFO Scopes
[] =
233 sizeof(DSOP_SCOPE_INIT_INFO
),
234 DSOP_SCOPE_TYPE_TARGET_COMPUTER
,
235 DSOP_SCOPE_FLAG_DEFAULT_FILTER_USERS
| DSOP_SCOPE_FLAG_DEFAULT_FILTER_GROUPS
|
236 DSOP_SCOPE_FLAG_STARTING_SCOPE
,
243 DSOP_DOWNLEVEL_FILTER_USERS
| DSOP_DOWNLEVEL_FILTER_LOCAL_GROUPS
|
244 DSOP_DOWNLEVEL_FILTER_GLOBAL_GROUPS
| DSOP_DOWNLEVEL_FILTER_ALL_WELLKNOWN_SIDS
252 InitInfo
.cbSize
= sizeof(InitInfo
);
253 InitInfo
.pwzTargetComputer
= ServerName
;
254 InitInfo
.cDsScopeInfos
= sizeof(Scopes
) / sizeof(Scopes
[0]);
255 InitInfo
.aDsScopeInfos
= Scopes
;
256 InitInfo
.flOptions
= DSOP_FLAG_MULTISELECT
| DSOP_SCOPE_TYPE_TARGET_COMPUTER
;
257 InitInfo
.cAttributesToFetch
= sizeof(ObjectPickerAttributes
) / sizeof(ObjectPickerAttributes
[0]);
258 InitInfo
.apwzAttributeNames
= ObjectPickerAttributes
;
260 for (i
= 0; i
< InitInfo
.cDsScopeInfos
; i
++)
262 if ((ObjectInfo
->dwFlags
& SI_SERVER_IS_DC
) &&
263 (InitInfo
.aDsScopeInfos
[i
].flType
& DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN
))
265 /* only set the domain controller string if we know the target
266 computer is a domain controller and the scope type is an
267 up-level domain to which the target computer is joined */
268 InitInfo
.aDsScopeInfos
[i
].pwzDcName
= InitInfo
.pwzTargetComputer
;
272 hRet
= (*pDsObjectPicker
)->lpVtbl
->Initialize(*pDsObjectPicker
,
277 /* delete the object picker in case initialization failed! */
278 (*pDsObjectPicker
)->lpVtbl
->Release(*pDsObjectPicker
);
286 InvokeObjectPickerDialog(IN IDsObjectPicker
*pDsObjectPicker
,
287 IN HWND hwndParent OPTIONAL
,
288 IN POBJPICK_SELECTED_SID SelectedSidCallback
,
289 IN PVOID Context OPTIONAL
)
291 IDataObject
*pdo
= NULL
;
294 hRet
= pDsObjectPicker
->lpVtbl
->InvokeDialog(pDsObjectPicker
,
302 fe
.cfFormat
= RegisterClipboardFormat(CFSTR_DSOP_DS_SELECTION_LIST
);
304 fe
.dwAspect
= DVASPECT_CONTENT
;
306 fe
.tymed
= TYMED_HGLOBAL
;
308 hRet
= pdo
->lpVtbl
->GetData(pdo
,
313 PDS_SELECTION_LIST SelectionList
= (PDS_SELECTION_LIST
)GlobalLock(stm
.hGlobal
);
314 if (SelectionList
!= NULL
)
319 BOOL contLoop
= TRUE
;
321 for (i
= 0; i
< SelectionList
->cItems
&& contLoop
; i
++)
323 vSid
= SelectionList
->aDsSelection
[i
].pvarFetchedAttributes
;
325 if (vSid
!= NULL
&& V_VT(vSid
) == (VT_ARRAY
| VT_UI1
))
327 hRet
= SafeArrayAccessData(V_ARRAY(vSid
),
328 (void HUGEP
**)&pSid
);
336 contLoop
= SelectedSidCallback(pDsObjectPicker
,
342 SafeArrayUnaccessData(V_ARRAY(vSid
));
346 GlobalUnlock(stm
.hGlobal
);
349 ReleaseStgMedium(&stm
);
352 pdo
->lpVtbl
->Release(pdo
);
359 FreeObjectPicker(IN IDsObjectPicker
*pDsObjectPicker
)
361 pDsObjectPicker
->lpVtbl
->Release(pDsObjectPicker
);