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
|
* 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;
|
||||||
|
|
Loading…
Reference in a new issue