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]

[PATCH] performance patch for /proc/registry


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]