This is the mail archive of the cygwin-developers@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] performance patch for /proc/registry


Would you mind sending cygwin patches to the cygwin-patches mailing list?

Other than that, I hope that Chris January and Pierre/Corinna will comment.

Thanks.

cgf

On Tue, Mar 25, 2003 at 02:40:59PM -0500, Joe Buehler wrote:
>This patch provides a drastic performance improvement for /proc/registry
>access (at least on the NT machines I use at work).
>
>On an NT machine running SP5, an "ls -l" on
>/proc/registry/HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services
>returns in 0.25 seconds now.  Without the patch, I killed it after
>7 minutes because I got tired of waiting for it to finish.
>
>I do not have a lot of experience at writing Windows software -- please
>proofread this carefully.
>
>2003-03-25  Joe Buehler  <jhpb at draco dot hekimian dot com>
>
>	* autoload.cc: added RegGetKeySecurity()
>	* security.cc (get_nt_object_attribute): use RegGetKeySecurity() for 
>	performance.
>
>Index: autoload.cc
>===================================================================
>RCS file: /cvs/src/src/winsup/cygwin/autoload.cc,v
>retrieving revision 1.65
>diff -u -r1.65 autoload.cc
>--- autoload.cc	13 Mar 2003 22:53:15 -0000	1.65
>+++ autoload.cc	25 Mar 2003 19:28:24 -0000
>@@ -375,6 +373,7 @@
> LoadDLLfunc (SetSecurityDescriptorGroup, 12, advapi32)
> LoadDLLfunc (SetSecurityDescriptorOwner, 12, advapi32)
> LoadDLLfunc (SetTokenInformation, 16, advapi32)
>+LoadDLLfunc (RegGetKeySecurity, 16, advapi32)
>
> LoadDLLfunc (NetApiBufferFree, 4, netapi32)
> LoadDLLfuncEx (NetGetDCName, 12, netapi32, 1)
>Index: security.cc
>===================================================================
>RCS file: /cvs/src/src/winsup/cygwin/security.cc,v
>retrieving revision 1.141
>diff -u -r1.141 security.cc
>--- security.cc	19 Mar 2003 21:34:38 -0000	1.141
>+++ security.cc	25 Mar 2003 19:29:57 -0000
>@@ -1443,20 +1443,81 @@
>   PSECURITY_DESCRIPTOR psd = NULL;
>   cygpsid owner_sid;
>   cygpsid group_sid;
>-  PACL acl;
>+  PACL acl = NULL;
>
>-  if (ERROR_SUCCESS != GetSecurityInfo (handle, object_type,
>-					DACL_SECURITY_INFORMATION |
>-					GROUP_SECURITY_INFORMATION |
>-					OWNER_SECURITY_INFORMATION,
>-					(PSID *) &owner_sid,
>-					(PSID *) &group_sid,
>-					&acl, NULL, &psd))
>-    {
>-      __seterrno ();
>-      debug_printf ("GetSecurityInfo %E");
>-      return -1;
>-    }
>+  if (object_type == SE_REGISTRY_KEY) {
>+	// use different code for registry handles, for performance reasons
>+	char sd_buf[4096];
>+	PSECURITY_DESCRIPTOR psd2 = (PSECURITY_DESCRIPTOR)&sd_buf[0];
>+	DWORD len = sizeof(sd_buf);
>+	if (ERROR_SUCCESS != RegGetKeySecurity(
>+			(HKEY)handle,
>+			DACL_SECURITY_INFORMATION |
>+			GROUP_SECURITY_INFORMATION |
>+			OWNER_SECURITY_INFORMATION,
>+			psd2,
>+			&len
>+			))
>+	{
>+		__seterrno ();
>+		debug_printf ("RegGetKeySecurity %E");
>+		return -1;
>+	}
>+
>+	BOOL bDaclPresent;
>+	BOOL bDaclDefaulted;
>+	if (!GetSecurityDescriptorDacl(
>+			psd2,
>+			&bDaclPresent,
>+			&acl,
>+			&bDaclDefaulted
>+			))
>+	{
>+		__seterrno ();
>+		debug_printf ("GetSecurityDescriptorDacl %E");
>+		return -1;
>+	}
>+	if (!bDaclPresent) {
>+		acl = NULL;
>+	}
>+
>+	BOOL bGroupDefaulted;
>+	if (!GetSecurityDescriptorGroup(
>+			psd2,
>+			(PSID *)&group_sid,
>+			&bGroupDefaulted
>+			))
>+	{
>+		__seterrno ();
>+		debug_printf ("GetSecurityDescriptorGroup %E");
>+		return -1;
>+	}
>+
>+	BOOL bOwnerDefaulted;
>+	if (!GetSecurityDescriptorOwner(
>+			psd2,
>+			(PSID *)&owner_sid,
>+			&bOwnerDefaulted
>+			))
>+	{
>+		__seterrno ();
>+		debug_printf ("GetSecurityDescriptorOwner %E");
>+		return -1;
>+	}
>+  } else {
>+	if (ERROR_SUCCESS != GetSecurityInfo (handle, object_type,
>+					  DACL_SECURITY_INFORMATION |
>+					  GROUP_SECURITY_INFORMATION |
>+					  OWNER_SECURITY_INFORMATION,
>+					  (PSID *) &owner_sid,
>+					  (PSID *) &group_sid,
>+					  &acl, NULL, &psd))
>+	  {
>+		__seterrno ();
>+		debug_printf ("GetSecurityInfo %E");
>+		return -1;
>+	  }
>+  }
>
>   __uid32_t uid;
>   __gid32_t gid;
>-- 
>Joe Buehler


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]