implemented TreeResetNamedSecurityInfo and forward it to the MARTA provider
Modified: trunk/reactos/lib/advapi32/advapi32.def
Modified: trunk/reactos/lib/advapi32/advapi32.h
Modified: trunk/reactos/lib/advapi32/sec/ac.c
Modified: trunk/reactos/lib/advapi32/sec/misc.c
Modified: trunk/reactos/lib/ntmarta/ntmarta.c
Modified: trunk/reactos/lib/ntmarta/ntmarta.def
Modified: trunk/reactos/lib/ntmarta/ntmarta.h
Modified: trunk/reactos/w32api/include/accctrl.h

Modified: trunk/reactos/lib/advapi32/advapi32.def
--- trunk/reactos/lib/advapi32/advapi32.def	2005-07-27 21:48:47 UTC (rev 16822)
+++ trunk/reactos/lib/advapi32/advapi32.def	2005-07-27 23:11:38 UTC (rev 16823)
@@ -632,8 +632,8 @@
 ;TraceEventInstance
 ;TraceMessage
 ;TraceMessageVa
-;TreeResetNamedSecurityInfoA
-;TreeResetNamedSecurityInfoW
+TreeResetNamedSecurityInfoA@44
+TreeResetNamedSecurityInfoW@44
 ;TrusteeAccessToObjectA
 ;TrusteeAccessToObjectW
 ;UninstallApplication

Modified: trunk/reactos/lib/advapi32/advapi32.h
--- trunk/reactos/lib/advapi32/advapi32.h	2005-07-27 21:48:47 UTC (rev 16822)
+++ trunk/reactos/lib/advapi32/advapi32.h	2005-07-27 23:11:38 UTC (rev 16823)
@@ -18,6 +18,13 @@
 #define NTOS_MODE_USER
 #include <ndk/ntndk.h>
 
+#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 @@
                                                       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,

Modified: trunk/reactos/lib/advapi32/sec/ac.c
--- trunk/reactos/lib/advapi32/sec/ac.c	2005-07-27 21:48:47 UTC (rev 16822)
+++ trunk/reactos/lib/advapi32/sec/ac.c	2005-07-27 23:11:38 UTC (rev 16823)
@@ -609,7 +609,7 @@
 
                         ErrorCode = GetLastError();
 
-                        while (i != 0)
+                        do
                         {
                             if (ListOfExplicitEntriesW[i].Trustee.TrusteeForm == TRUSTEE_IS_NAME &&
                                 ListOfExplicitEntriesW[i].Trustee.ptstrName != NULL)
@@ -618,10 +618,8 @@
                                          0,
                                          ListOfExplicitEntriesW[i].Trustee.ptstrName);
                             }
+                        } while (i-- != 0);
 
-                            i--;
-                        }
-
                         /* free the allocated array */
                         HeapFree(GetProcessHeap(),
                                  0,

Modified: trunk/reactos/lib/advapi32/sec/misc.c
--- trunk/reactos/lib/advapi32/sec/misc.c	2005-07-27 21:48:47 UTC (rev 16822)
+++ trunk/reactos/lib/advapi32/sec/misc.c	2005-07-27 23:11:38 UTC (rev 16823)
@@ -60,9 +60,7 @@
     FindNtMartaProc(RewriteSetHandleRights);
     FindNtMartaProc(RewriteSetEntriesInAcl);
     FindNtMartaProc(RewriteGetExplicitEntriesFromAcl);
-#if 0
     FindNtMartaProc(TreeResetNamedSecurityInfo);
-#endif
     FindNtMartaProc(GetInheritanceSource);
     FindNtMartaProc(FreeIndexArray);
     
@@ -1840,4 +1838,99 @@
     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 */

Modified: trunk/reactos/lib/ntmarta/ntmarta.c
--- trunk/reactos/lib/ntmarta/ntmarta.c	2005-07-27 21:48:47 UTC (rev 16822)
+++ trunk/reactos/lib/ntmarta/ntmarta.c	2005-07-27 23:11:38 UTC (rev 16823)
@@ -173,6 +173,29 @@
 }
 
 
+/**********************************************************************
+ * 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,

Modified: trunk/reactos/lib/ntmarta/ntmarta.def
--- trunk/reactos/lib/ntmarta/ntmarta.def	2005-07-27 21:48:47 UTC (rev 16822)
+++ trunk/reactos/lib/ntmarta/ntmarta.def	2005-07-27 23:11:38 UTC (rev 16823)
@@ -3,14 +3,14 @@
 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

Modified: trunk/reactos/lib/ntmarta/ntmarta.h
--- trunk/reactos/lib/ntmarta/ntmarta.h	2005-07-27 21:48:47 UTC (rev 16822)
+++ trunk/reactos/lib/ntmarta/ntmarta.h	2005-07-27 23:11:38 UTC (rev 16823)
@@ -1,6 +1,13 @@
 #include <windows.h>
 #include <accctrl.h>
 
+#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;

Modified: trunk/reactos/w32api/include/accctrl.h
--- trunk/reactos/w32api/include/accctrl.h	2005-07-27 21:48:47 UTC (rev 16822)
+++ trunk/reactos/w32api/include/accctrl.h	2005-07-27 23:11:38 UTC (rev 16823)
@@ -352,6 +352,26 @@
     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 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 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 */