diff --git a/src/os/win32/sigar_os.h b/src/os/win32/sigar_os.h index f9bf2e72..a3a50a82 100644 --- a/src/os/win32/sigar_os.h +++ b/src/os/win32/sigar_os.h @@ -204,6 +204,9 @@ typedef struct { } MIB_UDPEXTABLE, *PMIB_UDPEXTABLE; /* end undocumented structures */ + +typedef BOOL (CALLBACK *LPCONVERTSTRINGSID)(LPCSTR, PSID *); + typedef DWORD (CALLBACK *LPGETIPFORWARDTABLE)(PMIB_IPFORWARDTABLE, PULONG, BOOL); typedef DWORD (CALLBACK *LPGETIFTABLE)(PMIB_IFTABLE, PULONG, BOOL); @@ -279,11 +282,13 @@ struct sigar_t { HKEY handle; char *perfbuf; DWORD perfbuf_size; + HINSTANCE adv_handle; HINSTANCE ip_handle; HINSTANCE nt_handle; HINSTANCE ps_handle; HINSTANCE wts_handle; HINSTANCE sta_handle; + LPCONVERTSTRINGSID convert_string_sid; LPGETIFTABLE get_if_table; LPGETIPFORWARDTABLE get_ipforward_table; LPGETTCPTABLE get_tcp_table; diff --git a/src/os/win32/win32_sigar.c b/src/os/win32/win32_sigar.c index 9ce3aa02..df42d6ee 100644 --- a/src/os/win32/win32_sigar.c +++ b/src/os/win32/win32_sigar.c @@ -258,6 +258,17 @@ int sigar_os_open(sigar_t **sigar) (*sigar)->ip_handle = NULL; } + if ((h = LoadLibrary("advapi32.dll"))) { + (*sigar)->convert_string_sid = + (LPCONVERTSTRINGSID)GetProcAddress(h, + "ConvertStringSidToSidA"); + (*sigar)->adv_handle = h; + } + else { + (*sigar)->adv_handle = NULL; + (*sigar)->convert_string_sid = NULL; + } + if ((h = LoadLibrary("Ntdll.dll"))) { (*sigar)->get_ntsys_info = (LPSYSINFO)GetProcAddress(h, "NtQuerySystemInformation"); @@ -2212,15 +2223,16 @@ static int get_logon_info(HKEY users, return SIGAR_OK; } -/*XXX dlload, not in NT */ -BOOL WINAPI ConvertStringSidToSidA(LPCSTR, PSID *); - static int sigar_who_registry(sigar_t *sigar, sigar_who_list_t *wholist) { HKEY users; DWORD index=0, status; + if (!sigar->convert_string_sid) { + return ENOENT; + } + status = RegOpenKey(HKEY_USERS, NULL, &users); if (status != ERROR_SUCCESS) { return status; @@ -2249,7 +2261,7 @@ static int sigar_who_registry(sigar_t *sigar, continue; } - if (!ConvertStringSidToSidA(subkey, &sid)) { + if (!sigar->convert_string_sid(subkey, &sid)) { continue; }