# [PATCH] Windows: avoid static dependency on advapi32.dll

2 messages from 2010-01-24 to 2010-01-24. Participants: Michael Lukashov, Johannes Sixt.
Thread: https://gitlist.dev/t/22371

## Michael Lukashov, 2010-01-24 18:53

Subject: [PATCH] Windows: avoid static dependency on advapi32.dll
Message-ID: <1264359231-4672-1-git-send-email-michael.lukashov@gmail.com>
URL: https://gitlist.dev/e/1264359231-4672-1-git-send-email-michael.lukashov%40gmail.com

```
This DLL is used to get default user name. By looking
up the only function that we need at runtime, we can
avoid the startup costs of this DLL.

Signed-off-by: Michael Lukashov <michael.lukashov@gmail.com>
---
 compat/mingw.c |   31 ++++++++++++++++++++++++++++++-
 1 files changed, 30 insertions(+), 1 deletions(-)

diff --git a/compat/mingw.c b/compat/mingw.c
index ab65f77..6ce398c 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -1176,13 +1176,42 @@ int mingw_getpagesize(void)
 	return si.dwAllocationGranularity;
 }
 
+static HMODULE advapi32_dll = NULL;
+static BOOL (WINAPI *advapi32_get_user_name)(char *, DWORD *);
+
+static void advapi32_cleanup(void)
+{
+	if (advapi32_dll)
+		FreeLibrary(advapi32_dll);
+	advapi32_dll = NULL;
+	advapi32_get_user_name = NULL;
+}
+
 struct passwd *getpwuid(int uid)
 {
 	static char user_name[100];
 	static struct passwd p;
+	static int advapi32_initialized = 0;
 
 	DWORD len = sizeof(user_name);
-	if (!GetUserName(user_name, &len))
+
+	if (!advapi32_initialized)
+	{
+		advapi32_dll = LoadLibrary("advapi32.dll");
+		if (!advapi32_dll)
+			die("cannot load advapi32.dll");
+		advapi32_get_user_name = (BOOL (WINAPI *)(char *, DWORD *))
+			GetProcAddress(advapi32_dll, "GetUserNameA");
+		if (!advapi32_get_user_name) {
+			FreeLibrary(advapi32_dll);
+			advapi32_dll = NULL;
+			die("cannot find GetUserNameA");
+		}
+		atexit(advapi32_cleanup);
+		advapi32_initialized = 1;
+	}
+
+	if (!advapi32_get_user_name(user_name, &len))
 		return NULL;
 	p.pw_name = user_name;
 	p.pw_gecos = "unknown";
-- 
1.6.6.1599.gaed1a

```

## Johannes Sixt, 2010-01-24 19:20

Subject: Re: [PATCH] Windows: avoid static dependency on advapi32.dll
Message-ID: <201001242020.08534.j6t@kdbg.org>
URL: https://gitlist.dev/e/201001242020.08534.j6t%40kdbg.org
In-Reply-To: <1264359231-4672-1-git-send-email-michael.lukashov@gmail.com>

```
On Sonntag, 24. Januar 2010, Michael Lukashov wrote:
> This DLL is used to get default user name. By looking
> up the only function that we need at runtime, we can
> avoid the startup costs of this DLL.

Sorry, no. This doesn't work. Even though git.exe does no longer depend on 
advapi32.dll directly, it does so indirectly (via ws_32.dll). This patch is 
not an improvement, therefore: NAK.

-- Hannes

```
