fixed some bugs in LdrLoadDll

svn path=/trunk/; revision=779
This commit is contained in:
Boudewijn Dekker 1999-11-17 21:32:57 +00:00
parent 0d7b93783b
commit e04faee634

View file

@ -1,4 +1,4 @@
/* $Id: utils.c,v 1.14 1999/11/14 12:59:53 ariadne Exp $ /* $Id: utils.c,v 1.15 1999/11/17 21:32:57 ariadne Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -82,20 +82,39 @@ LdrLoadDll (
PDLLMAIN_FUNC Entrypoint; PDLLMAIN_FUNC Entrypoint;
if ( Dll == NULL )
return -1;
if ( Name == NULL ) {
*Dll = &LdrDllListHead;
return STATUS_SUCCESS;
}
DPRINT("LdrLoadDll(Base %x, Name \"%s\")\n", Dll, Name); DPRINT("LdrLoadDll(Base %x, Name \"%s\")\n", Dll, Name);
if ( LdrFindDll(Dll,Name) == STATUS_SUCCESS )
return STATUS_SUCCESS;
/* /*
* Build the DLL's absolute name * Build the DLL's absolute name
*/ */
strcat(fqname, Name);
if ( strncmp(Name,"\\??\\",3) != 0 ) {
strcat(fqname, Name);
}
else
strncpy(fqname, Name, 256);
DPRINT("fqname \"%s\"\n", fqname); DPRINT("fqname \"%s\"\n", fqname);
/* /*
* Open the DLL's image file. * Open the DLL's image file.
*/ */
if ( LdrFindDll(Dll,fqname) == STATUS_SUCCESS )
return STATUS_SUCCESS;
RtlInitAnsiString( RtlInitAnsiString(
& AnsiString, & AnsiString,
fqname fqname
@ -236,34 +255,37 @@ LdrLoadDll (
(*Dll)->ReferenceCount = 1; (*Dll)->ReferenceCount = 1;
LdrDllListHead.Next->Prev = (*Dll); LdrDllListHead.Next->Prev = (*Dll);
LdrDllListHead.Next = (*Dll); LdrDllListHead.Next = (*Dll);
if ( (*Dll)->Headers->FileHeader.Characteristics & IMAGE_FILE_DLL == IMAGE_FILE_DLL ) {
Entrypoint = Entrypoint =
(PDLLMAIN_FUNC) LdrPEStartup( (PDLLMAIN_FUNC) LdrPEStartup(
ImageBase, ImageBase,
SectionHandle SectionHandle
); );
if (Entrypoint != NULL) if (Entrypoint != NULL)
{ {
DPRINT("Calling entry point at 0x%08x\n", Entrypoint); DPRINT("Calling entry point at 0x%08x\n", Entrypoint);
if (FALSE == Entrypoint( if (FALSE == Entrypoint(
Dll, Dll,
DLL_PROCESS_ATTACH, DLL_PROCESS_ATTACH,
NULL NULL
)) ))
{ {
DPRINT("NTDLL.LDR: DLL \"%s\" failed to initialize\n", fqname); DPRINT("NTDLL.LDR: DLL \"%s\" failed to initialize\n", fqname);
/* FIXME: should clean up and fail */ /* FIXME: should clean up and fail */
}
else
{
DPRINT("NTDLL.LDR: DLL \"%s\" initialized successfully\n", fqname);
}
} }
else else
{ {
DPRINT("NTDLL.LDR: DLL \"%s\" initialized successfully\n", fqname); DPRINT("NTDLL.LDR: Entrypoint is NULL for \"%s\"\n", fqname);
} }
} }
else
{
DPRINT("NTDLL.LDR: Entrypoint is NULL for \"%s\"\n", fqname);
}
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -298,6 +320,14 @@ LdrFindDll (
// DPRINT("NTDLL.LdrFindDll(Name %s)\n", Name); // DPRINT("NTDLL.LdrFindDll(Name %s)\n", Name);
current = & LdrDllListHead; current = & LdrDllListHead;
// NULL is the current process
if ( Name == NULL ) {
*Dll = current;
return STATUS_SUCCESS;
}
do do
{ {
OptionalHeader = & current->Headers->OptionalHeader; OptionalHeader = & current->Headers->OptionalHeader;
@ -884,6 +914,9 @@ NTSTATUS LdrUnloadDll(PDLL Dll)
PDLLMAIN_FUNC Entrypoint; PDLLMAIN_FUNC Entrypoint;
NTSTATUS Status; NTSTATUS Status;
if ( Dll == NULL || Dll == &LdrDllListHead )
return -1;
if ( Dll->ReferenceCount > 1 ) { if ( Dll->ReferenceCount > 1 ) {
@ -891,34 +924,36 @@ NTSTATUS LdrUnloadDll(PDLL Dll)
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
Entrypoint = if ( Dll->Headers->FileHeader.Characteristics & IMAGE_FILE_DLL == IMAGE_FILE_DLL ) {
(PDLLMAIN_FUNC) LdrPEStartup(
Entrypoint =
(PDLLMAIN_FUNC) LdrPEStartup(
Dll->BaseAddress, Dll->BaseAddress,
Dll->SectionHandle Dll->SectionHandle
); );
if (Entrypoint != NULL) if (Entrypoint != NULL)
{ {
DPRINT("Calling entry point at 0x%08x\n", Entrypoint); DPRINT("Calling entry point at 0x%08x\n", Entrypoint);
if (FALSE == Entrypoint( if (FALSE == Entrypoint(
Dll, Dll,
DLL_PROCESS_DETACH, DLL_PROCESS_DETACH,
NULL NULL
)) ))
{ {
DPRINT("NTDLL.LDR: DLL failed to detach\n"); DPRINT("NTDLL.LDR: DLL failed to detach\n");
return -1; return -1;
}
else
{
DPRINT("NTDLL.LDR: DLL detached successfully\n");
}
} }
else else
{ {
DPRINT("NTDLL.LDR: DLL detached successfully\n"); DPRINT("NTDLL.LDR: Entrypoint is NULL for \n");
} }
}
else
{
DPRINT("NTDLL.LDR: Entrypoint is NULL for \n");
}
}
Status = ZwUnmapViewOfSection( Status = ZwUnmapViewOfSection(
NtCurrentProcess(), NtCurrentProcess(),
Dll->BaseAddress Dll->BaseAddress
@ -929,7 +964,7 @@ NTSTATUS LdrUnloadDll(PDLL Dll)
return Status; return Status;
} }
static IMAGE_RESOURCE_DIRECTORY_ENTRY * LdrGetNextEntry(IMAGE_RESOURCE_DIRECTORY *ResourceDir, LPWSTR ResourceName, ULONG Offset) static IMAGE_RESOURCE_DIRECTORY_ENTRY * LdrGetNextEntry(IMAGE_RESOURCE_DIRECTORY *ResourceDir, LPCWSTR ResourceName, ULONG Offset)
{ {
@ -983,7 +1018,7 @@ static IMAGE_RESOURCE_DIRECTORY_ENTRY * LdrGetNextEntry(IMAGE_RESOURCE_DIRECTORY
NTSTATUS LdrFindResource_U(DLL *Dll, IMAGE_RESOURCE_DATA_ENTRY **ResourceDataEntry,LPWSTR ResourceName, ULONG ResourceType,ULONG Language) NTSTATUS LdrFindResource_U(DLL *Dll, IMAGE_RESOURCE_DATA_ENTRY **ResourceDataEntry,LPCWSTR ResourceName, ULONG ResourceType,ULONG Language)
{ {
IMAGE_RESOURCE_DIRECTORY *ResourceTypeDir; IMAGE_RESOURCE_DIRECTORY *ResourceTypeDir;
IMAGE_RESOURCE_DIRECTORY *ResourceNameDir; IMAGE_RESOURCE_DIRECTORY *ResourceNameDir;