2 * ReactOS MARTA provider
3 * Copyright (C) 2005 - 2006 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 MARTA provider
22 * FILE: lib/ntmarta/ntmarta.c
23 * PURPOSE: ReactOS MARTA provider
24 * PROGRAMMER: Thomas Weidenmueller <w3seek@reactos.com>
34 HINSTANCE hDllInstance
;
37 AccpGetAceAccessMode(IN PACE_HEADER AceHeader
)
39 ACCESS_MODE Mode
= NOT_USED_ACCESS
;
41 switch (AceHeader
->AceType
)
43 case ACCESS_ALLOWED_ACE_TYPE
:
44 case ACCESS_ALLOWED_CALLBACK_ACE_TYPE
:
45 case ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE
:
46 case ACCESS_ALLOWED_OBJECT_ACE_TYPE
:
50 case ACCESS_DENIED_ACE_TYPE
:
51 case ACCESS_DENIED_CALLBACK_ACE_TYPE
:
52 case ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE
:
53 case ACCESS_DENIED_OBJECT_ACE_TYPE
:
57 case SYSTEM_AUDIT_ACE_TYPE
:
58 case SYSTEM_AUDIT_CALLBACK_ACE_TYPE
:
59 case SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE
:
60 case SYSTEM_AUDIT_OBJECT_ACE_TYPE
:
61 if (AceHeader
->AceFlags
& FAILED_ACCESS_ACE_FLAG
)
62 Mode
= SET_AUDIT_FAILURE
;
63 else if (AceHeader
->AceFlags
& SUCCESSFUL_ACCESS_ACE_FLAG
)
64 Mode
= SET_AUDIT_SUCCESS
;
72 AccpGetAceStructureSize(IN PACE_HEADER AceHeader
)
76 switch (AceHeader
->AceType
)
78 case ACCESS_ALLOWED_ACE_TYPE
:
79 case ACCESS_DENIED_ACE_TYPE
:
80 Size
= FIELD_OFFSET(ACCESS_ALLOWED_ACE
,
83 case ACCESS_ALLOWED_CALLBACK_ACE_TYPE
:
84 case ACCESS_DENIED_CALLBACK_ACE_TYPE
:
85 Size
= FIELD_OFFSET(ACCESS_ALLOWED_CALLBACK_ACE
,
88 case ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE
:
89 case ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE
:
91 PACCESS_ALLOWED_CALLBACK_OBJECT_ACE Ace
= (PACCESS_ALLOWED_CALLBACK_OBJECT_ACE
)AceHeader
;
92 Size
= FIELD_OFFSET(ACCESS_ALLOWED_CALLBACK_OBJECT_ACE
,
94 if (Ace
->Flags
& ACE_OBJECT_TYPE_PRESENT
)
95 Size
+= sizeof(Ace
->ObjectType
);
96 if (Ace
->Flags
& ACE_INHERITED_OBJECT_TYPE_PRESENT
)
97 Size
+= sizeof(Ace
->InheritedObjectType
);
100 case ACCESS_ALLOWED_OBJECT_ACE_TYPE
:
101 case ACCESS_DENIED_OBJECT_ACE_TYPE
:
103 PACCESS_ALLOWED_OBJECT_ACE Ace
= (PACCESS_ALLOWED_OBJECT_ACE
)AceHeader
;
104 Size
= FIELD_OFFSET(ACCESS_ALLOWED_OBJECT_ACE
,
106 if (Ace
->Flags
& ACE_OBJECT_TYPE_PRESENT
)
107 Size
+= sizeof(Ace
->ObjectType
);
108 if (Ace
->Flags
& ACE_INHERITED_OBJECT_TYPE_PRESENT
)
109 Size
+= sizeof(Ace
->InheritedObjectType
);
113 case SYSTEM_AUDIT_ACE_TYPE
:
114 Size
= FIELD_OFFSET(SYSTEM_AUDIT_ACE
,
117 case SYSTEM_AUDIT_CALLBACK_ACE_TYPE
:
118 Size
= FIELD_OFFSET(SYSTEM_AUDIT_CALLBACK_ACE
,
121 case SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE
:
123 PSYSTEM_AUDIT_CALLBACK_OBJECT_ACE Ace
= (PSYSTEM_AUDIT_CALLBACK_OBJECT_ACE
)AceHeader
;
124 Size
= FIELD_OFFSET(SYSTEM_AUDIT_CALLBACK_OBJECT_ACE
,
126 if (Ace
->Flags
& ACE_OBJECT_TYPE_PRESENT
)
127 Size
+= sizeof(Ace
->ObjectType
);
128 if (Ace
->Flags
& ACE_INHERITED_OBJECT_TYPE_PRESENT
)
129 Size
+= sizeof(Ace
->InheritedObjectType
);
132 case SYSTEM_AUDIT_OBJECT_ACE_TYPE
:
134 PSYSTEM_AUDIT_OBJECT_ACE Ace
= (PSYSTEM_AUDIT_OBJECT_ACE
)AceHeader
;
135 Size
= FIELD_OFFSET(SYSTEM_AUDIT_OBJECT_ACE
,
137 if (Ace
->Flags
& ACE_OBJECT_TYPE_PRESENT
)
138 Size
+= sizeof(Ace
->ObjectType
);
139 if (Ace
->Flags
& ACE_INHERITED_OBJECT_TYPE_PRESENT
)
140 Size
+= sizeof(Ace
->InheritedObjectType
);
149 AccpGetAceSid(IN PACE_HEADER AceHeader
)
151 return (PSID
)((ULONG_PTR
)AceHeader
+ AccpGetAceStructureSize(AceHeader
));
155 AccpGetAceAccessMask(IN PACE_HEADER AceHeader
)
157 return *((PACCESS_MASK
)(AceHeader
+ 1));
161 AccpIsObjectAce(IN PACE_HEADER AceHeader
)
165 switch (AceHeader
->AceType
)
167 case ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE
:
168 case ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE
:
169 case ACCESS_ALLOWED_OBJECT_ACE_TYPE
:
170 case ACCESS_DENIED_OBJECT_ACE_TYPE
:
171 case SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE
:
172 case SYSTEM_AUDIT_OBJECT_ACE_TYPE
:
185 AccpGetObjectAceObjectType(IN PACE_HEADER AceHeader
)
187 GUID
*ObjectType
= NULL
;
189 switch (AceHeader
->AceType
)
191 case ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE
:
192 case ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE
:
194 PACCESS_ALLOWED_CALLBACK_OBJECT_ACE Ace
= (PACCESS_ALLOWED_CALLBACK_OBJECT_ACE
)AceHeader
;
195 if (Ace
->Flags
& ACE_OBJECT_TYPE_PRESENT
)
196 ObjectType
= &Ace
->ObjectType
;
199 case ACCESS_ALLOWED_OBJECT_ACE_TYPE
:
200 case ACCESS_DENIED_OBJECT_ACE_TYPE
:
202 PACCESS_ALLOWED_OBJECT_ACE Ace
= (PACCESS_ALLOWED_OBJECT_ACE
)AceHeader
;
203 if (Ace
->Flags
& ACE_OBJECT_TYPE_PRESENT
)
204 ObjectType
= &Ace
->ObjectType
;
208 case SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE
:
210 PSYSTEM_AUDIT_CALLBACK_OBJECT_ACE Ace
= (PSYSTEM_AUDIT_CALLBACK_OBJECT_ACE
)AceHeader
;
211 if (Ace
->Flags
& ACE_OBJECT_TYPE_PRESENT
)
212 ObjectType
= &Ace
->ObjectType
;
215 case SYSTEM_AUDIT_OBJECT_ACE_TYPE
:
217 PSYSTEM_AUDIT_OBJECT_ACE Ace
= (PSYSTEM_AUDIT_OBJECT_ACE
)AceHeader
;
218 if (Ace
->Flags
& ACE_OBJECT_TYPE_PRESENT
)
219 ObjectType
= &Ace
->ObjectType
;
228 AccpGetObjectAceInheritedObjectType(IN PACE_HEADER AceHeader
)
230 GUID
*ObjectType
= NULL
;
232 switch (AceHeader
->AceType
)
234 case ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE
:
235 case ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE
:
237 PACCESS_ALLOWED_CALLBACK_OBJECT_ACE Ace
= (PACCESS_ALLOWED_CALLBACK_OBJECT_ACE
)AceHeader
;
238 if (Ace
->Flags
& ACE_INHERITED_OBJECT_TYPE_PRESENT
)
240 if (Ace
->Flags
& ACE_OBJECT_TYPE_PRESENT
)
241 ObjectType
= &Ace
->InheritedObjectType
;
243 ObjectType
= &Ace
->ObjectType
;
247 case ACCESS_ALLOWED_OBJECT_ACE_TYPE
:
248 case ACCESS_DENIED_OBJECT_ACE_TYPE
:
250 PACCESS_ALLOWED_OBJECT_ACE Ace
= (PACCESS_ALLOWED_OBJECT_ACE
)AceHeader
;
251 if (Ace
->Flags
& ACE_INHERITED_OBJECT_TYPE_PRESENT
)
253 if (Ace
->Flags
& ACE_OBJECT_TYPE_PRESENT
)
254 ObjectType
= &Ace
->InheritedObjectType
;
256 ObjectType
= &Ace
->ObjectType
;
261 case SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE
:
263 PSYSTEM_AUDIT_CALLBACK_OBJECT_ACE Ace
= (PSYSTEM_AUDIT_CALLBACK_OBJECT_ACE
)AceHeader
;
264 if (Ace
->Flags
& ACE_INHERITED_OBJECT_TYPE_PRESENT
)
266 if (Ace
->Flags
& ACE_OBJECT_TYPE_PRESENT
)
267 ObjectType
= &Ace
->InheritedObjectType
;
269 ObjectType
= &Ace
->ObjectType
;
273 case SYSTEM_AUDIT_OBJECT_ACE_TYPE
:
275 PSYSTEM_AUDIT_OBJECT_ACE Ace
= (PSYSTEM_AUDIT_OBJECT_ACE
)AceHeader
;
276 if (Ace
->Flags
& ACE_INHERITED_OBJECT_TYPE_PRESENT
)
278 if (Ace
->Flags
& ACE_OBJECT_TYPE_PRESENT
)
279 ObjectType
= &Ace
->InheritedObjectType
;
281 ObjectType
= &Ace
->ObjectType
;
291 /**********************************************************************
292 * AccRewriteGetHandleRights EXPORTED
297 AccRewriteGetHandleRights(HANDLE handle
,
298 SE_OBJECT_TYPE ObjectType
,
299 SECURITY_INFORMATION SecurityInfo
,
304 PSECURITY_DESCRIPTOR
* ppSecurityDescriptor
)
306 PSECURITY_DESCRIPTOR pSD
= NULL
;
312 /* save the last error code */
313 LastErr
= GetLastError();
319 /* allocate a buffer large enough to hold the
320 security descriptor we need to return */
324 pSD
= LocalAlloc(LMEM_FIXED
,
329 PSECURITY_DESCRIPTOR newSD
;
331 newSD
= LocalReAlloc((HLOCAL
)pSD
,
340 Ret
= GetLastError();
344 /* perform the actual query depending on the object type */
347 case SE_REGISTRY_KEY
:
349 Ret
= (DWORD
)RegGetKeySecurity((HKEY
)handle
,
357 /* FIXME - handle console handles? */
358 case SE_KERNEL_OBJECT
:
360 Status
= NtQuerySecurityObject(handle
,
365 if (!NT_SUCCESS(Status
))
367 Ret
= RtlNtStatusToDosError(Status
);
374 if (!QueryServiceObjectSecurity((SC_HANDLE
)handle
,
380 Ret
= GetLastError();
385 case SE_WINDOW_OBJECT
:
387 if (!GetUserObjectSecurity(handle
,
393 Ret
= GetLastError();
401 Ret
= ERROR_CALL_NOT_IMPLEMENTED
;
406 } while (Ret
== ERROR_INSUFFICIENT_BUFFER
);
408 if (Ret
== ERROR_SUCCESS
)
410 BOOL Present
, Defaulted
;
412 if (SecurityInfo
& OWNER_SECURITY_INFORMATION
&& ppsidOwner
!= NULL
)
415 if (!GetSecurityDescriptorOwner(pSD
,
419 Ret
= GetLastError();
424 if (SecurityInfo
& GROUP_SECURITY_INFORMATION
&& ppsidGroup
!= NULL
)
427 if (!GetSecurityDescriptorGroup(pSD
,
431 Ret
= GetLastError();
436 if (SecurityInfo
& DACL_SECURITY_INFORMATION
&& ppDacl
!= NULL
)
439 if (!GetSecurityDescriptorDacl(pSD
,
444 Ret
= GetLastError();
449 if (SecurityInfo
& SACL_SECURITY_INFORMATION
&& ppSacl
!= NULL
)
452 if (!GetSecurityDescriptorSacl(pSD
,
457 Ret
= GetLastError();
462 *ppSecurityDescriptor
= pSD
;
469 LocalFree((HLOCAL
)pSD
);
473 /* restore the last error code */
474 SetLastError(LastErr
);
480 /**********************************************************************
481 * AccRewriteSetHandleRights EXPORTED
486 AccRewriteSetHandleRights(HANDLE handle
,
487 SE_OBJECT_TYPE ObjectType
,
488 SECURITY_INFORMATION SecurityInfo
,
489 PSECURITY_DESCRIPTOR pSecurityDescriptor
)
493 DWORD Ret
= ERROR_SUCCESS
;
495 /* save the last error code */
496 LastErr
= GetLastError();
498 /* set the security according to the object type */
501 case SE_REGISTRY_KEY
:
503 Ret
= (DWORD
)RegSetKeySecurity((HKEY
)handle
,
505 pSecurityDescriptor
);
510 /* FIXME - handle console handles? */
511 case SE_KERNEL_OBJECT
:
513 Status
= NtSetSecurityObject(handle
,
515 pSecurityDescriptor
);
516 if (!NT_SUCCESS(Status
))
518 Ret
= RtlNtStatusToDosError(Status
);
525 if (!SetServiceObjectSecurity((SC_HANDLE
)handle
,
527 pSecurityDescriptor
))
529 Ret
= GetLastError();
534 case SE_WINDOW_OBJECT
:
536 if (!SetUserObjectSecurity(handle
,
538 pSecurityDescriptor
))
540 Ret
= GetLastError();
548 Ret
= ERROR_CALL_NOT_IMPLEMENTED
;
554 /* restore the last error code */
555 SetLastError(LastErr
);
562 AccpOpenNamedObject(LPWSTR pObjectName
,
563 SE_OBJECT_TYPE ObjectType
,
564 SECURITY_INFORMATION SecurityInfo
,
571 ACCESS_MASK DesiredAccess
= (ACCESS_MASK
)0;
572 DWORD Ret
= ERROR_SUCCESS
;
574 /* determine the required access rights */
577 case SE_REGISTRY_KEY
:
579 case SE_KERNEL_OBJECT
:
581 case SE_WINDOW_OBJECT
:
584 if (SecurityInfo
& (OWNER_SECURITY_INFORMATION
| GROUP_SECURITY_INFORMATION
))
585 DesiredAccess
|= WRITE_OWNER
;
586 if (SecurityInfo
& DACL_SECURITY_INFORMATION
)
587 DesiredAccess
|= WRITE_DAC
;
588 if (SecurityInfo
& SACL_SECURITY_INFORMATION
)
589 DesiredAccess
|= ACCESS_SYSTEM_SECURITY
;
593 if (SecurityInfo
& (OWNER_SECURITY_INFORMATION
| GROUP_SECURITY_INFORMATION
|
594 DACL_SECURITY_INFORMATION
))
595 DesiredAccess
|= READ_CONTROL
;
596 if (SecurityInfo
& SACL_SECURITY_INFORMATION
)
597 DesiredAccess
|= ACCESS_SYSTEM_SECURITY
;
605 /* make a copy of the path if we're modifying the string */
608 case SE_REGISTRY_KEY
:
610 lpPath
= (LPWSTR
)LocalAlloc(LMEM_FIXED
,
611 (wcslen(pObjectName
) + 1) * sizeof(WCHAR
));
614 Ret
= GetLastError();
623 lpPath
= pObjectName
;
627 /* open a handle to the path depending on the object type */
632 IO_STATUS_BLOCK IoStatusBlock
;
633 OBJECT_ATTRIBUTES ObjectAttributes
;
634 UNICODE_STRING FileName
;
636 if (!RtlDosPathNameToNtPathName_U(pObjectName
,
641 Ret
= ERROR_INVALID_NAME
;
645 InitializeObjectAttributes(&ObjectAttributes
,
647 OBJ_CASE_INSENSITIVE
,
651 Status
= NtOpenFile(Handle
,
655 FILE_SHARE_READ
| FILE_SHARE_WRITE
| FILE_SHARE_DELETE
,
656 FILE_SYNCHRONOUS_IO_NONALERT
);
658 RtlFreeHeap(RtlGetProcessHeap(),
662 if (!NT_SUCCESS(Status
))
664 Ret
= RtlNtStatusToDosError(Status
);
669 case SE_REGISTRY_KEY
:
677 {HKEY_CLASSES_ROOT
, L
"CLASSES_ROOT"},
678 {HKEY_CURRENT_USER
, L
"CURRENT_USER"},
679 {HKEY_LOCAL_MACHINE
, L
"MACHINE"},
680 {HKEY_USERS
, L
"USERS"},
681 {HKEY_CURRENT_CONFIG
, L
"CONFIG"},
683 LPWSTR lpMachineName
, lpRootKeyName
, lpKeyName
;
684 HKEY hRootKey
= NULL
;
687 /* parse the registry path */
688 if (lpPath
[0] == L
'\\' && lpPath
[1] == L
'\\')
690 lpMachineName
= lpPath
;
692 lpRootKeyName
= wcschr(lpPath
+ 2,
694 if (lpRootKeyName
== NULL
)
697 *(lpRootKeyName
++) = L
'\0';
701 lpMachineName
= NULL
;
702 lpRootKeyName
= lpPath
;
705 lpKeyName
= wcschr(lpRootKeyName
,
707 if (lpKeyName
!= NULL
)
709 *(lpKeyName
++) = L
'\0';
713 i
!= sizeof(AccRegRootKeys
) / sizeof(AccRegRootKeys
[0]);
716 if (!wcsicmp(lpRootKeyName
,
717 AccRegRootKeys
[i
].szRootKey
))
719 hRootKey
= AccRegRootKeys
[i
].hRootKey
;
724 if (hRootKey
== NULL
)
727 /* FIXME - right error code? */
728 Ret
= ERROR_INVALID_PARAMETER
;
732 /* open the registry key */
733 if (lpMachineName
!= NULL
)
735 Ret
= RegConnectRegistry(lpMachineName
,
739 if (Ret
!= ERROR_SUCCESS
)
742 hRootKey
= (HKEY
)(*Handle2
);
745 Ret
= RegOpenKeyEx(hRootKey
,
748 (REGSAM
)DesiredAccess
,
750 if (Ret
!= ERROR_SUCCESS
)
752 if (*Handle2
!= NULL
)
754 RegCloseKey((HKEY
)(*Handle2
));
764 LPWSTR lpServiceName
, lpMachineName
;
766 /* parse the service path */
767 if (lpPath
[0] == L
'\\' && lpPath
[1] == L
'\\')
769 DesiredAccess
|= SC_MANAGER_CONNECT
;
771 lpMachineName
= lpPath
;
773 lpServiceName
= wcschr(lpPath
+ 2,
775 if (lpServiceName
== NULL
)
777 /* FIXME - right error code? */
778 Ret
= ERROR_INVALID_PARAMETER
;
782 *(lpServiceName
++) = L
'\0';
786 lpMachineName
= NULL
;
787 lpServiceName
= lpPath
;
790 /* open the service */
791 *Handle2
= (HANDLE
)OpenSCManager(lpMachineName
,
793 (DWORD
)DesiredAccess
);
794 if (*Handle2
== NULL
)
796 goto FailOpenService
;
799 DesiredAccess
&= ~SC_MANAGER_CONNECT
;
800 *Handle
= (HANDLE
)OpenService((SC_HANDLE
)(*Handle2
),
802 (DWORD
)DesiredAccess
);
805 if (*Handle2
!= NULL
)
807 CloseServiceHandle((SC_HANDLE
)(*Handle2
));
811 Ret
= GetLastError();
820 Ret
= ERROR_CALL_NOT_IMPLEMENTED
;
826 if (lpPath
!= NULL
&& lpPath
!= pObjectName
)
828 LocalFree((HLOCAL
)lpPath
);
836 AccpCloseObjectHandle(SE_OBJECT_TYPE ObjectType
,
840 ASSERT(Handle
!= NULL
);
842 /* close allocated handlees depending on the object type */
845 case SE_REGISTRY_KEY
:
846 RegCloseKey((HKEY
)Handle
);
848 RegCloseKey((HKEY
)Handle2
);
855 case SE_KERNEL_OBJECT
:
856 case SE_WINDOW_OBJECT
:
861 CloseServiceHandle((SC_HANDLE
)Handle
);
862 ASSERT(Handle2
!= NULL
);
863 CloseServiceHandle((SC_HANDLE
)Handle2
);
872 /**********************************************************************
873 * AccRewriteGetNamedRights EXPORTED
878 AccRewriteGetNamedRights(LPWSTR pObjectName
,
879 SE_OBJECT_TYPE ObjectType
,
880 SECURITY_INFORMATION SecurityInfo
,
885 PSECURITY_DESCRIPTOR
* ppSecurityDescriptor
)
887 HANDLE Handle
= NULL
;
888 HANDLE Handle2
= NULL
;
892 /* save the last error code */
893 LastErr
= GetLastError();
895 /* create the handle */
896 Ret
= AccpOpenNamedObject(pObjectName
,
903 if (Ret
== ERROR_SUCCESS
)
905 ASSERT(Handle
!= NULL
);
907 /* perform the operation */
908 Ret
= AccRewriteGetHandleRights(Handle
,
915 ppSecurityDescriptor
);
917 /* close opened handles */
918 AccpCloseObjectHandle(ObjectType
,
923 /* restore the last error code */
924 SetLastError(LastErr
);
930 /**********************************************************************
931 * AccRewriteSetNamedRights EXPORTED
936 AccRewriteSetNamedRights(LPWSTR pObjectName
,
937 SE_OBJECT_TYPE ObjectType
,
938 SECURITY_INFORMATION SecurityInfo
,
939 PSECURITY_DESCRIPTOR pSecurityDescriptor
)
941 HANDLE Handle
= NULL
;
942 HANDLE Handle2
= NULL
;
946 /* save the last error code */
947 LastErr
= GetLastError();
949 /* create the handle */
950 Ret
= AccpOpenNamedObject(pObjectName
,
957 if (Ret
== ERROR_SUCCESS
)
959 ASSERT(Handle
!= NULL
);
961 /* perform the operation */
962 Ret
= AccRewriteSetHandleRights(Handle
,
965 pSecurityDescriptor
);
967 /* close opened handles */
968 AccpCloseObjectHandle(ObjectType
,
973 /* restore the last error code */
974 SetLastError(LastErr
);
980 /**********************************************************************
981 * AccRewriteSetEntriesInAcl EXPORTED
986 AccRewriteSetEntriesInAcl(ULONG cCountOfExplicitEntries
,
987 PEXPLICIT_ACCESS_W pListOfExplicitEntries
,
992 return ERROR_CALL_NOT_IMPLEMENTED
;
996 /**********************************************************************
997 * AccRewriteSetEntriesInAcl EXPORTED
1002 AccGetInheritanceSource(LPWSTR pObjectName
,
1003 SE_OBJECT_TYPE ObjectType
,
1004 SECURITY_INFORMATION SecurityInfo
,
1006 GUID
** pObjectClassGuids
,
1009 PFN_OBJECT_MGR_FUNCTS pfnArray
,
1010 PGENERIC_MAPPING pGenericMapping
,
1011 PINHERITED_FROMW pInheritArray
)
1014 return ERROR_CALL_NOT_IMPLEMENTED
;
1018 /**********************************************************************
1019 * AccFreeIndexArray EXPORTED
1024 AccFreeIndexArray(PINHERITED_FROMW pInheritArray
,
1026 PFN_OBJECT_MGR_FUNCTS pfnArray OPTIONAL
)
1028 PINHERITED_FROMW pLast
;
1030 UNREFERENCED_PARAMETER(pfnArray
);
1032 pLast
= pInheritArray
+ AceCnt
;
1033 while (pInheritArray
!= pLast
)
1035 if (pInheritArray
->AncestorName
!= NULL
)
1037 LocalFree((HLOCAL
)pInheritArray
->AncestorName
);
1038 pInheritArray
->AncestorName
= NULL
;
1044 return ERROR_SUCCESS
;
1048 /**********************************************************************
1049 * AccRewriteGetExplicitEntriesFromAcl EXPORTED
1054 AccRewriteGetExplicitEntriesFromAcl(PACL pacl
,
1055 PULONG pcCountOfExplicitEntries
,
1056 PEXPLICIT_ACCESS_W
* pListOfExplicitEntries
)
1058 PACE_HEADER AceHeader
;
1059 PSID Sid
, SidTarget
;
1060 ULONG ObjectAceCount
= 0;
1061 POBJECTS_AND_SID ObjSid
;
1063 PEXPLICIT_ACCESS_W peaw
;
1064 DWORD LastErr
, SidLen
;
1066 DWORD ErrorCode
= ERROR_SUCCESS
;
1068 /* save the last error code */
1069 LastErr
= GetLastError();
1073 if (pacl
->AceCount
!= 0)
1075 Size
= (SIZE_T
)pacl
->AceCount
* sizeof(EXPLICIT_ACCESS_W
);
1077 /* calculate the space needed */
1080 (LPVOID
*)&AceHeader
))
1082 Sid
= AccpGetAceSid(AceHeader
);
1083 Size
+= GetLengthSid(Sid
);
1085 if (AccpIsObjectAce(AceHeader
))
1091 Size
+= ObjectAceCount
* sizeof(OBJECTS_AND_SID
);
1093 ASSERT(pacl
->AceCount
== AceIndex
);
1095 /* allocate the array */
1096 peaw
= (PEXPLICIT_ACCESS_W
)LocalAlloc(LMEM_FIXED
,
1101 ObjSid
= (POBJECTS_AND_SID
)(peaw
+ pacl
->AceCount
);
1102 SidTarget
= (PSID
)(ObjSid
+ ObjectAceCount
);
1104 /* initialize the array */
1107 (LPVOID
*)&AceHeader
))
1109 Sid
= AccpGetAceSid(AceHeader
);
1110 SidLen
= GetLengthSid(Sid
);
1112 peaw
[AceIndex
].grfAccessPermissions
= AccpGetAceAccessMask(AceHeader
);
1113 peaw
[AceIndex
].grfAccessMode
= AccpGetAceAccessMode(AceHeader
);
1114 peaw
[AceIndex
].grfInheritance
= AceHeader
->AceFlags
& VALID_INHERIT_FLAGS
;
1120 if (AccpIsObjectAce(AceHeader
))
1122 BuildTrusteeWithObjectsAndSid(&peaw
[AceIndex
].Trustee
,
1124 AccpGetObjectAceObjectType(AceHeader
),
1125 AccpGetObjectAceInheritedObjectType(AceHeader
),
1130 BuildTrusteeWithSid(&peaw
[AceIndex
].Trustee
,
1134 SidTarget
= (PSID
)((ULONG_PTR
)SidTarget
+ SidLen
);
1138 /* copying the SID failed, treat it as an fatal error... */
1139 ErrorCode
= GetLastError();
1141 /* free allocated resources */
1151 *pcCountOfExplicitEntries
= AceIndex
;
1152 *pListOfExplicitEntries
= peaw
;
1155 ErrorCode
= ERROR_NOT_ENOUGH_MEMORY
;
1165 *pcCountOfExplicitEntries
= 0;
1166 *pListOfExplicitEntries
= NULL
;
1169 /* restore the last error code */
1170 SetLastError(LastErr
);
1176 /**********************************************************************
1177 * AccTreeResetNamedSecurityInfo EXPORTED
1182 AccTreeResetNamedSecurityInfo(LPWSTR pObjectName
,
1183 SE_OBJECT_TYPE ObjectType
,
1184 SECURITY_INFORMATION SecurityInfo
,
1190 FN_PROGRESSW fnProgress
,
1191 PROG_INVOKE_SETTING ProgressInvokeSetting
,
1195 return ERROR_CALL_NOT_IMPLEMENTED
;
1200 DllMain(IN HINSTANCE hinstDLL
,
1202 IN LPVOID lpvReserved
)
1206 case DLL_PROCESS_ATTACH
:
1207 hDllInstance
= hinstDLL
;
1208 DisableThreadLibraryCalls(hinstDLL
);
1211 case DLL_PROCESS_DETACH
: