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
* PROJECT: ReactOS kernel
@ -82,20 +82,39 @@ LdrLoadDll (
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);
if ( LdrFindDll(Dll,Name) == STATUS_SUCCESS )
return STATUS_SUCCESS;
/*
* Build the DLL's absolute name
*/
if ( strncmp(Name,"\\??\\",3) != 0 ) {
strcat(fqname, Name);
}
else
strncpy(fqname, Name, 256);
DPRINT("fqname \"%s\"\n", fqname);
/*
* Open the DLL's image file.
*/
if ( LdrFindDll(Dll,fqname) == STATUS_SUCCESS )
return STATUS_SUCCESS;
RtlInitAnsiString(
& AnsiString,
fqname
@ -237,6 +256,9 @@ LdrLoadDll (
LdrDllListHead.Next->Prev = (*Dll);
LdrDllListHead.Next = (*Dll);
if ( (*Dll)->Headers->FileHeader.Characteristics & IMAGE_FILE_DLL == IMAGE_FILE_DLL ) {
Entrypoint =
(PDLLMAIN_FUNC) LdrPEStartup(
ImageBase,
@ -263,7 +285,7 @@ LdrLoadDll (
{
DPRINT("NTDLL.LDR: Entrypoint is NULL for \"%s\"\n", fqname);
}
}
return STATUS_SUCCESS;
}
@ -298,6 +320,14 @@ LdrFindDll (
// DPRINT("NTDLL.LdrFindDll(Name %s)\n", Name);
current = & LdrDllListHead;
// NULL is the current process
if ( Name == NULL ) {
*Dll = current;
return STATUS_SUCCESS;
}
do
{
OptionalHeader = & current->Headers->OptionalHeader;
@ -885,12 +915,17 @@ NTSTATUS LdrUnloadDll(PDLL Dll)
PDLLMAIN_FUNC Entrypoint;
NTSTATUS Status;
if ( Dll == NULL || Dll == &LdrDllListHead )
return -1;
if ( Dll->ReferenceCount > 1 ) {
Dll->ReferenceCount--;
return STATUS_SUCCESS;
}
if ( Dll->Headers->FileHeader.Characteristics & IMAGE_FILE_DLL == IMAGE_FILE_DLL ) {
Entrypoint =
(PDLLMAIN_FUNC) LdrPEStartup(
Dll->BaseAddress,
@ -918,7 +953,7 @@ NTSTATUS LdrUnloadDll(PDLL Dll)
DPRINT("NTDLL.LDR: Entrypoint is NULL for \n");
}
}
Status = ZwUnmapViewOfSection(
NtCurrentProcess(),
Dll->BaseAddress
@ -929,7 +964,7 @@ NTSTATUS LdrUnloadDll(PDLL Dll)
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 *ResourceNameDir;