* autoload.cc (EnumProcessModules): Remove.

* dlfcn.cc (dlopen): Make sure errno is set if an error occurs.
	(dlsym): Rewrite using RtlQueryProcessDebugInformation instead of
	EnumProcessModules.
	* ntdll.h (struct _DEBUG_MODULE_ARRAY): Define.
	(RtlCreateQueryDebugBuffer): Declare.
	(RtlDestroyQueryDebugBuffer): Declare.
	(RtlQueryProcessDebugInformation): Declare.
This commit is contained in:
Corinna Vinschen 2011-05-11 13:25:27 +00:00
parent b27800ad45
commit 31ddf45dd8
4 changed files with 57 additions and 17 deletions

View File

@ -1,3 +1,14 @@
2011-05-11 Corinna Vinschen <corinna@vinschen.de>
* autoload.cc (EnumProcessModules): Remove.
* dlfcn.cc (dlopen): Make sure errno is set if an error occurs.
(dlsym): Rewrite using RtlQueryProcessDebugInformation instead of
EnumProcessModules.
* ntdll.h (struct _DEBUG_MODULE_ARRAY): Define.
(RtlCreateQueryDebugBuffer): Declare.
(RtlDestroyQueryDebugBuffer): Declare.
(RtlQueryProcessDebugInformation): Declare.
2011-05-11 Corinna Vinschen <corinna@vinschen.de>
* autoload.cc (GetModuleFileNameExW): Remove.

View File

@ -414,8 +414,6 @@ LoadDLLfunc (RtlSetCurrentTransaction, 4, ntdll)
LoadDLLfunc (CoTaskMemFree, 4, ole32)
LoadDLLfunc (EnumProcessModules, 16, psapi)
LoadDLLfunc (LsaDeregisterLogonProcess, 4, secur32)
LoadDLLfunc (LsaFreeReturnBuffer, 4, secur32)
LoadDLLfunc (LsaLogonUser, 56, secur32)

View File

@ -1,6 +1,7 @@
/* dlfcn.cc
Copyright 1998, 2000, 2001, 2002, 2003, 2004, 2008, 2009, 2010 Red Hat, Inc.
Copyright 1998, 2000, 2001, 2002, 2003, 2004, 2008, 2009, 2010,
2011 Red Hat, Inc.
This file is part of Cygwin.
@ -17,6 +18,7 @@ details. */
#include "dlfcn.h"
#include "cygtls.h"
#include "tls_pbuf.h"
#include "ntdll.h"
static void __stdcall
set_dl_error (const char *str)
@ -71,7 +73,11 @@ dlopen (const char *name, int)
void *ret;
if (name == NULL)
ret = (void *) GetModuleHandle (NULL); /* handle for the current module */
{
ret = (void *) GetModuleHandle (NULL); /* handle for the current module */
if (!ret)
__seterrno ();
}
else
{
/* handle for the named library */
@ -112,7 +118,7 @@ dlopen (const char *name, int)
/* Restore original cxx_malloc pointer. */
__cygwin_user_data.cxx_malloc = tmp_malloc;
if (ret == NULL)
if (!ret)
__seterrno ();
}
}
@ -128,26 +134,42 @@ void *
dlsym (void *handle, const char *name)
{
void *ret = NULL;
if (handle == RTLD_DEFAULT)
{ /* search all modules */
HANDLE cur_proc = GetCurrentProcess ();
HMODULE *modules;
DWORD needed, i;
if (!EnumProcessModules (cur_proc, NULL, 0, &needed))
PDEBUG_BUFFER buf;
NTSTATUS status;
buf = RtlCreateQueryDebugBuffer (0, FALSE);
if (!buf)
{
dlsym_fail:
set_errno (ENOMEM);
set_dl_error ("dlsym");
return NULL;
}
modules = (HMODULE*) alloca (needed);
if (!EnumProcessModules (cur_proc, modules, needed, &needed))
goto dlsym_fail;
for (i = 0; i < needed / sizeof (HMODULE); i++)
if ((ret = (void *) GetProcAddress (modules[i], name)))
break;
status = RtlQueryProcessDebugInformation (GetCurrentProcessId (),
PDI_MODULES, buf);
if (!NT_SUCCESS (status))
__seterrno_from_nt_status (status);
else
{
PDEBUG_MODULE_ARRAY mods = (PDEBUG_MODULE_ARRAY)
buf->ModuleInformation;
for (ULONG i = 0; i < mods->Count; ++i)
if ((ret = (void *)
GetProcAddress ((HMODULE) mods->Modules[i].Base, name)))
break;
if (!ret)
set_errno (ENOENT);
}
RtlDestroyQueryDebugBuffer (buf);
}
else
ret = (void *) GetProcAddress ((HMODULE)handle, name);
{
ret = (void *) GetProcAddress ((HMODULE) handle, name);
if (!ret)
__seterrno ();
}
if (!ret)
set_dl_error ("dlsym");
debug_printf ("ret %p", ret);

View File

@ -538,6 +538,12 @@ typedef struct _DEBUG_MODULE_INFORMATION
CHAR ImageName[256];
} DEBUG_MODULE_INFORMATION, *PDEBUG_MODULE_INFORMATION;
typedef struct _DEBUG_MODULE_ARRAY
{
ULONG Count;
DEBUG_MODULE_INFORMATION Modules[1];
} DEBUG_MODULE_ARRAY, *PDEBUG_MODULE_ARRAY;
typedef struct _KERNEL_USER_TIMES
{
LARGE_INTEGER CreateTime;
@ -1143,10 +1149,12 @@ extern "C"
NTSTATUS NTAPI RtlCopySid (ULONG, PSID, PSID);
VOID NTAPI RtlCopyUnicodeString (PUNICODE_STRING, PUNICODE_STRING);
NTSTATUS NTAPI RtlCreateAcl (PACL, ULONG, ULONG);
PDEBUG_BUFFER NTAPI RtlCreateQueryDebugBuffer (ULONG, BOOLEAN);
NTSTATUS NTAPI RtlCreateRegistryKey (ULONG, PCWSTR);
NTSTATUS NTAPI RtlCreateSecurityDescriptor (PSECURITY_DESCRIPTOR, ULONG);
BOOLEAN NTAPI RtlCreateUnicodeStringFromAsciiz (PUNICODE_STRING, PCSTR);
NTSTATUS NTAPI RtlDeleteSecurityObject (PSECURITY_DESCRIPTOR *);
NTSTATUS NTAPI RtlDestroyQueryDebugBuffer (PDEBUG_BUFFER);
NTSTATUS NTAPI RtlDowncaseUnicodeString (PUNICODE_STRING, PUNICODE_STRING,
BOOLEAN);
NTSTATUS NTAPI RtlEnterCriticalSection (PRTL_CRITICAL_SECTION);
@ -1184,6 +1192,7 @@ extern "C"
BOOLEAN);
BOOLEAN NTAPI RtlPrefixUnicodeString (PUNICODE_STRING, PUNICODE_STRING,
BOOLEAN);
NTSTATUS NTAPI RtlQueryProcessDebugInformation (ULONG, ULONG, PDEBUG_BUFFER);
NTSTATUS NTAPI RtlQueryRegistryValues (ULONG, PCWSTR,
PRTL_QUERY_REGISTRY_TABLE, PVOID,
PVOID);