mirror of
https://github.com/reactos/reactos.git
synced 2024-10-15 05:37:44 +00:00
fixed some bugs in LdrLoadDll
svn path=/trunk/; revision=779
This commit is contained in:
parent
0d7b93783b
commit
e04faee634
|
@ -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
|
||||
*/
|
||||
strcat(fqname, 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,33 +256,36 @@ LdrLoadDll (
|
|||
LdrDllListHead.Next->Prev = (*Dll);
|
||||
LdrDllListHead.Next = (*Dll);
|
||||
|
||||
Entrypoint =
|
||||
|
||||
if ( (*Dll)->Headers->FileHeader.Characteristics & IMAGE_FILE_DLL == IMAGE_FILE_DLL ) {
|
||||
|
||||
Entrypoint =
|
||||
(PDLLMAIN_FUNC) LdrPEStartup(
|
||||
ImageBase,
|
||||
SectionHandle
|
||||
);
|
||||
if (Entrypoint != NULL)
|
||||
{
|
||||
DPRINT("Calling entry point at 0x%08x\n", Entrypoint);
|
||||
if (FALSE == Entrypoint(
|
||||
if (Entrypoint != NULL)
|
||||
{
|
||||
DPRINT("Calling entry point at 0x%08x\n", Entrypoint);
|
||||
if (FALSE == Entrypoint(
|
||||
Dll,
|
||||
DLL_PROCESS_ATTACH,
|
||||
NULL
|
||||
))
|
||||
{
|
||||
DPRINT("NTDLL.LDR: DLL \"%s\" failed to initialize\n", fqname);
|
||||
/* FIXME: should clean up and fail */
|
||||
{
|
||||
DPRINT("NTDLL.LDR: DLL \"%s\" failed to initialize\n", fqname);
|
||||
/* FIXME: should clean up and fail */
|
||||
}
|
||||
else
|
||||
{
|
||||
DPRINT("NTDLL.LDR: DLL \"%s\" initialized successfully\n", fqname);
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -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,40 +915,45 @@ 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;
|
||||
}
|
||||
|
||||
Entrypoint =
|
||||
(PDLLMAIN_FUNC) LdrPEStartup(
|
||||
if ( Dll->Headers->FileHeader.Characteristics & IMAGE_FILE_DLL == IMAGE_FILE_DLL ) {
|
||||
|
||||
Entrypoint =
|
||||
(PDLLMAIN_FUNC) LdrPEStartup(
|
||||
Dll->BaseAddress,
|
||||
Dll->SectionHandle
|
||||
);
|
||||
if (Entrypoint != NULL)
|
||||
{
|
||||
DPRINT("Calling entry point at 0x%08x\n", Entrypoint);
|
||||
if (FALSE == Entrypoint(
|
||||
if (Entrypoint != NULL)
|
||||
{
|
||||
DPRINT("Calling entry point at 0x%08x\n", Entrypoint);
|
||||
if (FALSE == Entrypoint(
|
||||
Dll,
|
||||
DLL_PROCESS_DETACH,
|
||||
NULL
|
||||
))
|
||||
{
|
||||
DPRINT("NTDLL.LDR: DLL failed to detach\n");
|
||||
return -1;
|
||||
{
|
||||
DPRINT("NTDLL.LDR: DLL failed to detach\n");
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
DPRINT("NTDLL.LDR: DLL detached successfully\n");
|
||||
}
|
||||
}
|
||||
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(
|
||||
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;
|
||||
|
|
Loading…
Reference in a new issue