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
*/ */
if ( strncmp(Name,"\\??\\",3) != 0 ) {
strcat(fqname, Name); 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
@ -237,6 +256,9 @@ LdrLoadDll (
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,
@ -263,7 +285,7 @@ LdrLoadDll (
{ {
DPRINT("NTDLL.LDR: Entrypoint is NULL for \"%s\"\n", fqname); 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;
@ -885,12 +915,17 @@ 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 ) {
Dll->ReferenceCount--; Dll->ReferenceCount--;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
if ( Dll->Headers->FileHeader.Characteristics & IMAGE_FILE_DLL == IMAGE_FILE_DLL ) {
Entrypoint = Entrypoint =
(PDLLMAIN_FUNC) LdrPEStartup( (PDLLMAIN_FUNC) LdrPEStartup(
Dll->BaseAddress, Dll->BaseAddress,
@ -918,7 +953,7 @@ NTSTATUS LdrUnloadDll(PDLL Dll)
DPRINT("NTDLL.LDR: Entrypoint is NULL for \n"); 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;