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 SetSecurityAccessMask(SecurityInfo
,
585 (PDWORD
)&DesiredAccess
);
589 QuerySecurityAccessMask(SecurityInfo
,
590 (PDWORD
)&DesiredAccess
);
598 /* make a copy of the path if we're modifying the string */
601 case SE_REGISTRY_KEY
:
603 lpPath
= (LPWSTR
)LocalAlloc(LMEM_FIXED
,
604 (wcslen(pObjectName
) + 1) * sizeof(WCHAR
));
607 Ret
= GetLastError();
616 lpPath
= pObjectName
;
620 /* open a handle to the path depending on the object type */
625 IO_STATUS_BLOCK IoStatusBlock
;
626 OBJECT_ATTRIBUTES ObjectAttributes
;
627 UNICODE_STRING FileName
;
629 if (!RtlDosPathNameToNtPathName_U(pObjectName
,
634 Ret
= ERROR_INVALID_NAME
;
638 InitializeObjectAttributes(&ObjectAttributes
,
640 OBJ_CASE_INSENSITIVE
,
644 Status
= NtOpenFile(Handle
,
648 FILE_SHARE_READ
| FILE_SHARE_WRITE
| FILE_SHARE_DELETE
,
649 FILE_SYNCHRONOUS_IO_NONALERT
);
651 RtlFreeHeap(RtlGetProcessHeap(),
655 if (!NT_SUCCESS(Status
))
657 Ret
= RtlNtStatusToDosError(Status
);
662 case SE_REGISTRY_KEY
:
670 {HKEY_CLASSES_ROOT
, L
"CLASSES_ROOT"},
671 {HKEY_CURRENT_USER
, L
"CURRENT_USER"},
672 {HKEY_LOCAL_MACHINE
, L
"MACHINE"},
673 {HKEY_USERS
, L
"USERS"},
674 {HKEY_CURRENT_CONFIG
, L
"CONFIG"},
676 LPWSTR lpMachineName
, lpRootKeyName
, lpKeyName
;
677 HKEY hRootKey
= NULL
;
680 /* parse the registry path */
681 if (lpPath
[0] == L
'\\' && lpPath
[1] == L
'\\')
683 lpMachineName
= lpPath
;
685 lpRootKeyName
= wcschr(lpPath
+ 2,
687 if (lpRootKeyName
== NULL
)
690 *(lpRootKeyName
++) = L
'\0';
694 lpMachineName
= NULL
;
695 lpRootKeyName
= lpPath
;
698 lpKeyName
= wcschr(lpRootKeyName
,
700 if (lpKeyName
!= NULL
)
702 *(lpKeyName
++) = L
'\0';
706 i
!= sizeof(AccRegRootKeys
) / sizeof(AccRegRootKeys
[0]);
709 if (!wcsicmp(lpRootKeyName
,
710 AccRegRootKeys
[i
].szRootKey
))
712 hRootKey
= AccRegRootKeys
[i
].hRootKey
;
717 if (hRootKey
== NULL
)
720 /* FIXME - right error code? */
721 Ret
= ERROR_INVALID_PARAMETER
;
725 /* open the registry key */
726 if (lpMachineName
!= NULL
)
728 Ret
= RegConnectRegistry(lpMachineName
,
732 if (Ret
!= ERROR_SUCCESS
)
735 hRootKey
= (HKEY
)(*Handle2
);
738 Ret
= RegOpenKeyEx(hRootKey
,
741 (REGSAM
)DesiredAccess
,
743 if (Ret
!= ERROR_SUCCESS
)
745 if (*Handle2
!= NULL
)
747 RegCloseKey((HKEY
)(*Handle2
));
757 LPWSTR lpServiceName
, lpMachineName
;
759 /* parse the service path */
760 if (lpPath
[0] == L
'\\' && lpPath
[1] == L
'\\')
762 DesiredAccess
|= SC_MANAGER_CONNECT
;
764 lpMachineName
= lpPath
;
766 lpServiceName
= wcschr(lpPath
+ 2,
768 if (lpServiceName
== NULL
)
770 /* FIXME - right error code? */
771 Ret
= ERROR_INVALID_PARAMETER
;
775 *(lpServiceName
++) = L
'\0';
779 lpMachineName
= NULL
;
780 lpServiceName
= lpPath
;
783 /* open the service */
784 *Handle2
= (HANDLE
)OpenSCManager(lpMachineName
,
786 (DWORD
)DesiredAccess
);
787 if (*Handle2
== NULL
)
789 goto FailOpenService
;
792 DesiredAccess
&= ~SC_MANAGER_CONNECT
;
793 *Handle
= (HANDLE
)OpenService((SC_HANDLE
)(*Handle2
),
795 (DWORD
)DesiredAccess
);
798 if (*Handle2
!= NULL
)
800 CloseServiceHandle((SC_HANDLE
)(*Handle2
));
804 Ret
= GetLastError();
813 Ret
= ERROR_CALL_NOT_IMPLEMENTED
;
819 if (lpPath
!= NULL
&& lpPath
!= pObjectName
)
821 LocalFree((HLOCAL
)lpPath
);
829 AccpCloseObjectHandle(SE_OBJECT_TYPE ObjectType
,
833 ASSERT(Handle
!= NULL
);
835 /* close allocated handlees depending on the object type */
838 case SE_REGISTRY_KEY
:
839 RegCloseKey((HKEY
)Handle
);
841 RegCloseKey((HKEY
)Handle2
);
848 case SE_KERNEL_OBJECT
:
849 case SE_WINDOW_OBJECT
:
854 CloseServiceHandle((SC_HANDLE
)Handle
);
855 ASSERT(Handle2
!= NULL
);
856 CloseServiceHandle((SC_HANDLE
)Handle2
);
865 /**********************************************************************
866 * AccRewriteGetNamedRights EXPORTED
871 AccRewriteGetNamedRights(LPWSTR pObjectName
,
872 SE_OBJECT_TYPE ObjectType
,
873 SECURITY_INFORMATION SecurityInfo
,
878 PSECURITY_DESCRIPTOR
* ppSecurityDescriptor
)
880 HANDLE Handle
= NULL
;
881 HANDLE Handle2
= NULL
;
885 /* save the last error code */
886 LastErr
= GetLastError();
888 /* create the handle */
889 Ret
= AccpOpenNamedObject(pObjectName
,
896 if (Ret
== ERROR_SUCCESS
)
898 ASSERT(Handle
!= NULL
);
900 /* perform the operation */
901 Ret
= AccRewriteGetHandleRights(Handle
,
908 ppSecurityDescriptor
);
910 /* close opened handles */
911 AccpCloseObjectHandle(ObjectType
,
916 /* restore the last error code */
917 SetLastError(LastErr
);
923 /**********************************************************************
924 * AccRewriteSetNamedRights EXPORTED
929 AccRewriteSetNamedRights(LPWSTR pObjectName
,
930 SE_OBJECT_TYPE ObjectType
,
931 SECURITY_INFORMATION SecurityInfo
,
932 PSECURITY_DESCRIPTOR pSecurityDescriptor
)
934 HANDLE Handle
= NULL
;
935 HANDLE Handle2
= NULL
;
939 /* save the last error code */
940 LastErr
= GetLastError();
942 /* create the handle */
943 Ret
= AccpOpenNamedObject(pObjectName
,
950 if (Ret
== ERROR_SUCCESS
)
952 ASSERT(Handle
!= NULL
);
954 /* perform the operation */
955 Ret
= AccRewriteSetHandleRights(Handle
,
958 pSecurityDescriptor
);
960 /* close opened handles */
961 AccpCloseObjectHandle(ObjectType
,
966 /* restore the last error code */
967 SetLastError(LastErr
);
973 /**********************************************************************
974 * AccRewriteSetEntriesInAcl EXPORTED
979 AccRewriteSetEntriesInAcl(ULONG cCountOfExplicitEntries
,
980 PEXPLICIT_ACCESS_W pListOfExplicitEntries
,
985 return ERROR_CALL_NOT_IMPLEMENTED
;
989 /**********************************************************************
990 * AccRewriteSetEntriesInAcl EXPORTED
995 AccGetInheritanceSource(LPWSTR pObjectName
,
996 SE_OBJECT_TYPE ObjectType
,
997 SECURITY_INFORMATION SecurityInfo
,
999 GUID
** pObjectClassGuids
,
1002 PFN_OBJECT_MGR_FUNCTS pfnArray
,
1003 PGENERIC_MAPPING pGenericMapping
,
1004 PINHERITED_FROMW pInheritArray
)
1007 return ERROR_CALL_NOT_IMPLEMENTED
;
1011 /**********************************************************************
1012 * AccFreeIndexArray EXPORTED
1017 AccFreeIndexArray(PINHERITED_FROMW pInheritArray
,
1019 PFN_OBJECT_MGR_FUNCTS pfnArray OPTIONAL
)
1021 PINHERITED_FROMW pLast
;
1023 UNREFERENCED_PARAMETER(pfnArray
);
1025 pLast
= pInheritArray
+ AceCnt
;
1026 while (pInheritArray
!= pLast
)
1028 if (pInheritArray
->AncestorName
!= NULL
)
1030 LocalFree((HLOCAL
)pInheritArray
->AncestorName
);
1031 pInheritArray
->AncestorName
= NULL
;
1037 return ERROR_SUCCESS
;
1041 /**********************************************************************
1042 * AccRewriteGetExplicitEntriesFromAcl EXPORTED
1047 AccRewriteGetExplicitEntriesFromAcl(PACL pacl
,
1048 PULONG pcCountOfExplicitEntries
,
1049 PEXPLICIT_ACCESS_W
* pListOfExplicitEntries
)
1051 PACE_HEADER AceHeader
;
1052 PSID Sid
, SidTarget
;
1053 ULONG ObjectAceCount
= 0;
1054 POBJECTS_AND_SID ObjSid
;
1056 PEXPLICIT_ACCESS_W peaw
;
1057 DWORD LastErr
, SidLen
;
1059 DWORD ErrorCode
= ERROR_SUCCESS
;
1061 /* save the last error code */
1062 LastErr
= GetLastError();
1066 if (pacl
->AceCount
!= 0)
1068 Size
= (SIZE_T
)pacl
->AceCount
* sizeof(EXPLICIT_ACCESS_W
);
1070 /* calculate the space needed */
1073 (LPVOID
*)&AceHeader
))
1075 Sid
= AccpGetAceSid(AceHeader
);
1076 Size
+= GetLengthSid(Sid
);
1078 if (AccpIsObjectAce(AceHeader
))
1084 Size
+= ObjectAceCount
* sizeof(OBJECTS_AND_SID
);
1086 ASSERT(pacl
->AceCount
== AceIndex
);
1088 /* allocate the array */
1089 peaw
= (PEXPLICIT_ACCESS_W
)LocalAlloc(LMEM_FIXED
,
1094 ObjSid
= (POBJECTS_AND_SID
)(peaw
+ pacl
->AceCount
);
1095 SidTarget
= (PSID
)(ObjSid
+ ObjectAceCount
);
1097 /* initialize the array */
1100 (LPVOID
*)&AceHeader
))
1102 Sid
= AccpGetAceSid(AceHeader
);
1103 SidLen
= GetLengthSid(Sid
);
1105 peaw
[AceIndex
].grfAccessPermissions
= AccpGetAceAccessMask(AceHeader
);
1106 peaw
[AceIndex
].grfAccessMode
= AccpGetAceAccessMode(AceHeader
);
1107 peaw
[AceIndex
].grfInheritance
= AceHeader
->AceFlags
& VALID_INHERIT_FLAGS
;
1113 if (AccpIsObjectAce(AceHeader
))
1115 BuildTrusteeWithObjectsAndSid(&peaw
[AceIndex
].Trustee
,
1117 AccpGetObjectAceObjectType(AceHeader
),
1118 AccpGetObjectAceInheritedObjectType(AceHeader
),
1123 BuildTrusteeWithSid(&peaw
[AceIndex
].Trustee
,
1127 SidTarget
= (PSID
)((ULONG_PTR
)SidTarget
+ SidLen
);
1131 /* copying the SID failed, treat it as an fatal error... */
1132 ErrorCode
= GetLastError();
1134 /* free allocated resources */
1144 *pcCountOfExplicitEntries
= AceIndex
;
1145 *pListOfExplicitEntries
= peaw
;
1148 ErrorCode
= ERROR_NOT_ENOUGH_MEMORY
;
1158 *pcCountOfExplicitEntries
= 0;
1159 *pListOfExplicitEntries
= NULL
;
1162 /* restore the last error code */
1163 SetLastError(LastErr
);
1169 /**********************************************************************
1170 * AccTreeResetNamedSecurityInfo EXPORTED
1175 AccTreeResetNamedSecurityInfo(LPWSTR pObjectName
,
1176 SE_OBJECT_TYPE ObjectType
,
1177 SECURITY_INFORMATION SecurityInfo
,
1183 FN_PROGRESSW fnProgress
,
1184 PROG_INVOKE_SETTING ProgressInvokeSetting
,
1188 return ERROR_CALL_NOT_IMPLEMENTED
;
1193 DllMain(IN HINSTANCE hinstDLL
,
1195 IN LPVOID lpvReserved
)
1199 case DLL_PROCESS_ATTACH
:
1200 hDllInstance
= hinstDLL
;
1201 DisableThreadLibraryCalls(hinstDLL
);
1204 case DLL_PROCESS_DETACH
: