On Thu, Apr 24, 2008 at 5:36 AM, Alexandre Julliard <[EMAIL PROTECTED]> wrote:
> You certainly don't want to call through explorer for that, showing a
> message box directly is fine. You have to be careful to only do it when
> loading the main exe, not for any random dll load; also you have to
> properly handle the case of a missing X display.
OK so is doing this in ntdll even the right case? I don't really see
where to do it only from the main exe. I understand we don't want to
report the error if the application is manually doing a
GetProcAddress/LoadLibrary but again don't really know how to limit
it. Here is my stab #2, it actually returns something sane to the
user.
--
Steven Edwards
"There is one thing stronger than all the armies in the world, and
that is an idea whose time has come." - Victor Hugo
From a9a763015d9d4738fc9187e6d913d54cd5d6f25f Mon Sep 17 00:00:00 2001
From: Steven Edwards <[EMAIL PROTECTED]>
Date: Thu, 24 Apr 2008 02:21:08 -0400
Subject: [PATCH] Took a stab at graphically reporting an error when a dll was not found
---
dlls/ntdll/loader.c | 33 +++++++++++++++++++++++++++++++++
1 files changed, 33 insertions(+), 0 deletions(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index b0000b8..4d37e64 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -464,6 +464,32 @@ static FARPROC find_named_export( HMODULE module, const IMAGE_EXPORT_DIRECTORY *
}
+FARPROC pMessageBoxW;
+static NTSTATUS report_error()
+{
+ NTSTATUS nts,nts2;
+ UNICODE_STRING wstr;
+ ANSI_STRING str;
+ HMODULE hdll;
+ WCHAR user32[] = {'u','s','e','r','3','2','.','d','l','l',0};
+
+ RtlInitUnicodeString( &wstr, user32 );
+ nts = LdrLoadDll(0, 0, &wstr, &hdll);
+ if (nts != STATUS_SUCCESS)
+ {
+ ERR("couldn't load user32 to display error\n");
+ return nts;
+ }
+
+ RtlInitAnsiString( &str, "MessageBoxW" );
+ nts2 = LdrGetProcedureAddress( hdll, &str, 0, (void**)&pMessageBoxW );
+ if (nts2 != STATUS_SUCCESS)
+ {
+ ERR("Couldn't import MessageBoxW\n");
+ return nts;
+ }
+ return nts;
+}
/*************************************************************************
* import_dll
@@ -514,8 +540,15 @@ static WINE_MODREF *import_dll( HMODULE module, const IMAGE_IMPORT_DESCRIPTOR *d
if (status)
{
if (status == STATUS_DLL_NOT_FOUND)
+ {
+ WCHAR dll_error[] = {'A',' ','r','e','q','i','u','r','e','d',' ','d','l','l',' ','w','a','s',' ','n','o','t',' ','f','o','u','n','d',0};
+ NTSTATUS nts = report_error();
+ if (nts == STATUS_SUCCESS)
+ pMessageBoxW(NULL,dll_error,NULL,NULL);
+
ERR("Library %s (which is needed by %s) not found\n",
name, debugstr_w(current_modref->ldr.FullDllName.Buffer));
+ }
else
ERR("Loading library %s (which is needed by %s) failed (error %x).\n",
name, debugstr_w(current_modref->ldr.FullDllName.Buffer), status);
--
1.5.3.7