diff --git a/reactos/lib/advapi32/advapi32.def b/reactos/lib/advapi32/advapi32.def index 05130e5b246..fbaf991d14e 100644 --- a/reactos/lib/advapi32/advapi32.def +++ b/reactos/lib/advapi32/advapi32.def @@ -632,8 +632,8 @@ SystemFunction041@12 ;TraceEventInstance ;TraceMessage ;TraceMessageVa -;TreeResetNamedSecurityInfoA -;TreeResetNamedSecurityInfoW +TreeResetNamedSecurityInfoA@44 +TreeResetNamedSecurityInfoW@44 ;TrusteeAccessToObjectA ;TrusteeAccessToObjectW ;UninstallApplication diff --git a/reactos/lib/advapi32/advapi32.h b/reactos/lib/advapi32/advapi32.h index 0f7bb07d66d..c768773dd1b 100644 --- a/reactos/lib/advapi32/advapi32.h +++ b/reactos/lib/advapi32/advapi32.h @@ -18,6 +18,13 @@ #define NTOS_MODE_USER #include +#ifndef HAS_FN_PROGRESSW +#define FN_PROGRESSW FN_PROGRESS +#endif +#ifndef HAS_FN_PROGRESSA +#define FN_PROGRESSA FN_PROGRESS +#endif + /* Interface to ntmarta.dll **************************************************/ typedef struct _NTMARTA @@ -71,7 +78,17 @@ typedef struct _NTMARTA PULONG pcCountOfExplicitEntries, PEXPLICIT_ACCESS_W* pListOfExplicitEntries); - PVOID TreeResetNamedSecurityInfo; + DWORD (STDCALL *TreeResetNamedSecurityInfo)(LPWSTR pObjectName, + SE_OBJECT_TYPE ObjectType, + SECURITY_INFORMATION SecurityInfo, + PSID pOwner, + PSID pGroup, + PACL pDacl, + PACL pSacl, + BOOL KeepExplicit, + FN_PROGRESSW fnProgress, + PROG_INVOKE_SETTING ProgressInvokeSetting, + PVOID Args); DWORD (STDCALL *GetInheritanceSource)(LPWSTR pObjectName, SE_OBJECT_TYPE ObjectType, diff --git a/reactos/lib/advapi32/sec/ac.c b/reactos/lib/advapi32/sec/ac.c index f476b840f67..3868b9de98a 100644 --- a/reactos/lib/advapi32/sec/ac.c +++ b/reactos/lib/advapi32/sec/ac.c @@ -609,7 +609,7 @@ SetEntriesInAclA( ErrorCode = GetLastError(); - while (i != 0) + do { if (ListOfExplicitEntriesW[i].Trustee.TrusteeForm == TRUSTEE_IS_NAME && ListOfExplicitEntriesW[i].Trustee.ptstrName != NULL) @@ -618,9 +618,7 @@ SetEntriesInAclA( 0, ListOfExplicitEntriesW[i].Trustee.ptstrName); } - - i--; - } + } while (i-- != 0); /* free the allocated array */ HeapFree(GetProcessHeap(), diff --git a/reactos/lib/advapi32/sec/misc.c b/reactos/lib/advapi32/sec/misc.c index c746520e11c..a8a435fb30e 100644 --- a/reactos/lib/advapi32/sec/misc.c +++ b/reactos/lib/advapi32/sec/misc.c @@ -60,9 +60,7 @@ LoadAndInitializeNtMarta(VOID) FindNtMartaProc(RewriteSetHandleRights); FindNtMartaProc(RewriteSetEntriesInAcl); FindNtMartaProc(RewriteGetExplicitEntriesFromAcl); -#if 0 FindNtMartaProc(TreeResetNamedSecurityInfo); -#endif FindNtMartaProc(GetInheritanceSource); FindNtMartaProc(FreeIndexArray); @@ -1840,4 +1838,99 @@ SetPrivateObjectSecurity(SECURITY_INFORMATION SecurityInformation, return TRUE; } + +/* + * @implemented + */ +DWORD STDCALL +TreeResetNamedSecurityInfoW(LPWSTR pObjectName, + SE_OBJECT_TYPE ObjectType, + SECURITY_INFORMATION SecurityInfo, + PSID pOwner, + PSID pGroup, + PACL pDacl, + PACL pSacl, + BOOL KeepExplicit, + FN_PROGRESSW fnProgress, + PROG_INVOKE_SETTING ProgressInvokeSetting, + PVOID Args) +{ + DWORD ErrorCode; + + if (pObjectName != NULL) + { + ErrorCode = CheckNtMartaPresent(); + if (ErrorCode == ERROR_SUCCESS) + { + switch (ObjectType) + { + case SE_FILE_OBJECT: + case SE_REGISTRY_KEY: + { + /* check the SecurityInfo flags for sanity (both, the protected + and unprotected dacl/sacl flag must not be passed together */ + if (((SecurityInfo & DACL_SECURITY_INFORMATION) && + (SecurityInfo & (PROTECTED_DACL_SECURITY_INFORMATION | UNPROTECTED_DACL_SECURITY_INFORMATION)) == + (PROTECTED_DACL_SECURITY_INFORMATION | UNPROTECTED_DACL_SECURITY_INFORMATION)) + + || + + ((SecurityInfo & SACL_SECURITY_INFORMATION) && + (SecurityInfo & (PROTECTED_SACL_SECURITY_INFORMATION | UNPROTECTED_SACL_SECURITY_INFORMATION)) == + (PROTECTED_SACL_SECURITY_INFORMATION | UNPROTECTED_SACL_SECURITY_INFORMATION))) + { + ErrorCode = ERROR_INVALID_PARAMETER; + break; + } + + /* call the MARTA provider */ + ErrorCode = AccTreeResetNamedSecurityInfo(pObjectName, + ObjectType, + SecurityInfo, + pOwner, + pGroup, + pDacl, + pSacl, + KeepExplicit, + fnProgress, + ProgressInvokeSetting, + Args); + break; + } + + default: + /* object type not supported */ + ErrorCode = ERROR_INVALID_PARAMETER; + break; + } + } + } + else + ErrorCode = ERROR_INVALID_PARAMETER; + + return ErrorCode; +} + + +/* + * @unimplemented + */ +DWORD STDCALL +TreeResetNamedSecurityInfoA(LPSTR pObjectName, + SE_OBJECT_TYPE ObjectType, + SECURITY_INFORMATION SecurityInfo, + PSID pOwner, + PSID pGroup, + PACL pDacl, + PACL pSacl, + BOOL KeepExplicit, + FN_PROGRESSA fnProgress, + PROG_INVOKE_SETTING ProgressInvokeSetting, + PVOID Args) +{ + /* That's all this function does, at least up to w2k3... Even MS was too + lazy to implement it... */ + return ERROR_CALL_NOT_IMPLEMENTED; +} + /* EOF */ diff --git a/reactos/lib/ntmarta/ntmarta.c b/reactos/lib/ntmarta/ntmarta.c index 60aeae3d916..405398a8b98 100644 --- a/reactos/lib/ntmarta/ntmarta.c +++ b/reactos/lib/ntmarta/ntmarta.c @@ -173,6 +173,29 @@ AccRewriteGetExplicitEntriesFromAcl(PACL pacl, } +/********************************************************************** + * AccTreeResetNamedSecurityInfo EXPORTED + * + * @unimplemented + */ +DWORD STDCALL +AccTreeResetNamedSecurityInfo(LPWSTR pObjectName, + SE_OBJECT_TYPE ObjectType, + SECURITY_INFORMATION SecurityInfo, + PSID pOwner, + PSID pGroup, + PACL pDacl, + PACL pSacl, + BOOL KeepExplicit, + FN_PROGRESSW fnProgress, + PROG_INVOKE_SETTING ProgressInvokeSetting, + PVOID Args) +{ + UNIMPLEMENTED; + return ERROR_CALL_NOT_IMPLEMENTED; +} + + BOOL STDCALL DllMain(IN HINSTANCE hinstDLL, IN DWORD dwReason, diff --git a/reactos/lib/ntmarta/ntmarta.def b/reactos/lib/ntmarta/ntmarta.def index 91bc4aa9e0d..a9b4571699a 100644 --- a/reactos/lib/ntmarta/ntmarta.def +++ b/reactos/lib/ntmarta/ntmarta.def @@ -3,14 +3,14 @@ LIBRARY ntmarta.dll EXPORTS AccFreeIndexArray@12 AccGetInheritanceSource@40 -;AccProvHandleGrantAccessRights; +;AccProvHandleGrantAccessRights AccRewriteGetExplicitEntriesFromAcl@12 AccRewriteGetHandleRights@32 AccRewriteGetNamedRights@32 AccRewriteSetEntriesInAcl@16 AccRewriteSetHandleRights@16 AccRewriteSetNamedRights@16 -;AccTreeResetNamedSecurityInfo +AccTreeResetNamedSecurityInfo@44 ;AccConvertAccessMaskToActrlAccess ;AccConvertAccessToSD ;AccConvertAccessToSecurityDescriptor diff --git a/reactos/lib/ntmarta/ntmarta.h b/reactos/lib/ntmarta/ntmarta.h index c32376a19d8..46a0390c818 100644 --- a/reactos/lib/ntmarta/ntmarta.h +++ b/reactos/lib/ntmarta/ntmarta.h @@ -1,6 +1,13 @@ #include #include +#ifndef HAS_FN_PROGRESSW +#define FN_PROGRESSW FN_PROGRESS +#endif +#ifndef HAS_FN_PROGRESSA +#define FN_PROGRESSA FN_PROGRESS +#endif + ULONG DbgPrint(PCH Format,...); extern HINSTANCE hDllInstance; diff --git a/reactos/w32api/include/accctrl.h b/reactos/w32api/include/accctrl.h index 94ef89a3cfb..e23346efaf0 100644 --- a/reactos/w32api/include/accctrl.h +++ b/reactos/w32api/include/accctrl.h @@ -352,6 +352,26 @@ typedef struct _FN_OBJECT_MGR_FUNCTIONS ULONG Placeholder; } FN_OBJECT_MGR_FUNCTS, *PFN_OBJECT_MGR_FUNCTS; +typedef enum _PROG_INVOKE_SETTING +{ + ProgressInvokeNever = 1, + ProgressInvokeEveryObject, + ProgressInvokeOnError, + ProgressCancelOperation, + ProgressRetryOperation +} PROG_INVOKE_SETTING, *PPROG_INVOKE_SETTING; + +typedef VOID (STDCALL *FN_PROGRESSW)(LPWSTR pObjectName, + DWORD Status, + PPROG_INVOKE_SETTING pInvokeSetting, + PVOID Args, + BOOL SecuritySet); +typedef VOID (STDCALL *FN_PROGRESSA)(LPSTR pObjectName, + DWORD Status, + PPROG_INVOKE_SETTING pInvokeSetting, + PVOID Args, + BOOL SecuritySet); + #ifdef UNICODE #define ACCCTRL_DEFAULT_PROVIDER ACCCTRL_DEFAULT_PROVIDERW typedef TRUSTEE_W TRUSTEE_, *PTRUSTEE_; @@ -368,6 +388,8 @@ typedef TRUSTEE_ACCESSW TRUSTEE_ACCESS, *PTRUSTEE_ACCESS; typedef OBJECTS_AND_NAME_W OBJECTS_AND_NAME_, *POBJECTS_AND_NAME_; #if (_WIN32_WINNT >= 0x0501) typedef INHERITED_FROMW INHERITED_FROM, *PINHERITED_FROM; +typedef FN_PROGRESSW FN_PROGRESS; +#define HAS_FN_PROGRESSW #endif #else #define ACCCTRL_DEFAULT_PROVIDER ACCCTRL_DEFAULT_PROVIDERA @@ -385,6 +407,8 @@ typedef TRUSTEE_ACCESSA TRUSTEE_ACCESS, *PTRUSTEE_ACCESS; typedef OBJECTS_AND_NAME_A OBJECTS_AND_NAME_, *POBJECTS_AND_NAME_; #if (_WIN32_WINNT >= 0x0501) typedef INHERITED_FROMA INHERITED_FROM, *PINHERITED_FROM; +typedef FN_PROGRESSA FN_PROGRESS; +#define HAS_FN_PROGRESSA #endif #endif /* UNICODE */