Raise hard error (show message box) when imports cannot be resolved. Windows only...
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Wed, 8 Oct 2008 14:09:30 +0000 (14:09 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Wed, 8 Oct 2008 14:09:30 +0000 (14:09 +0000)
See issue #1228 for more details.

svn path=/trunk/; revision=36693

reactos/dll/ntdll/ldr/utils.c

index fc3bbcb..6d7cee7 100644 (file)
@@ -1365,6 +1365,29 @@ LdrpGetOrLoadModule(PWCHAR SearchPath,
    return Status;
 }
 
+void
+RtlpRaiseImportNotFound(CHAR *FuncName, ULONG Ordinal, PUNICODE_STRING DllName)
+{
+    ULONG ErrorResponse;
+    ULONG_PTR ErrorParameters[2];
+    ANSI_STRING ProcNameAnsi;
+    UNICODE_STRING ProcName;
+    CHAR Buffer[8];
+
+    if (!FuncName)
+    {
+        _snprintf(Buffer, 8, "# %ld", Ordinal);
+        FuncName = Buffer;
+    }
+
+    RtlInitAnsiString(&ProcNameAnsi, FuncName);
+    RtlAnsiStringToUnicodeString(&ProcName, &ProcNameAnsi, TRUE);
+    ErrorParameters[0] = (ULONG_PTR)&ProcName;
+    ErrorParameters[1] = (ULONG_PTR)DllName;
+    NtRaiseHardError(STATUS_ENTRYPOINT_NOT_FOUND, 2, 3, ErrorParameters, OptionOk, &ErrorResponse);
+    RtlFreeUnicodeString(&ProcName);
+}
+
 static NTSTATUS
 LdrpProcessImportDirectoryEntry(PLDR_DATA_TABLE_ENTRY Module,
                                 PLDR_DATA_TABLE_ENTRY ImportedModule,
@@ -1427,7 +1450,8 @@ LdrpProcessImportDirectoryEntry(PLDR_DATA_TABLE_ENTRY Module,
            if ((*ImportAddressList) == NULL)
              {
                DPRINT1("Failed to import #%ld from %wZ\n", Ordinal, &ImportedModule->FullDllName);
-               return STATUS_UNSUCCESSFUL;
+               RtlpRaiseImportNotFound(NULL, Ordinal, &ImportedModule->FullDllName);
+               return STATUS_ENTRYPOINT_NOT_FOUND;
              }
          }
        else
@@ -1438,7 +1462,8 @@ LdrpProcessImportDirectoryEntry(PLDR_DATA_TABLE_ENTRY Module,
            if ((*ImportAddressList) == NULL)
              {
                DPRINT1("Failed to import %s from %wZ\n", pe_name->Name, &ImportedModule->FullDllName);
-               return STATUS_UNSUCCESSFUL;
+               RtlpRaiseImportNotFound((CHAR*)pe_name->Name, 0, &ImportedModule->FullDllName);
+               return STATUS_ENTRYPOINT_NOT_FOUND;
              }
          }
        ImportAddressList++;