178 lines
3.6 KiB
C
178 lines
3.6 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1991 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
blbind.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module contains the code that implements the funtions required
|
|||
|
to relocate an image and bind DLL entry points.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
David N. Cutler (davec) 21-May-1991
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "bldr.h"
|
|||
|
#include "ctype.h"
|
|||
|
#include "string.h"
|
|||
|
|
|||
|
//
|
|||
|
// Define local procedure prototypes.
|
|||
|
//
|
|||
|
|
|||
|
ARC_STATUS
|
|||
|
BlpBindImportName (
|
|||
|
IN PVOID DllBase,
|
|||
|
IN PVOID ImageBase,
|
|||
|
IN PIMAGE_THUNK_DATA ThunkEntry,
|
|||
|
IN PIMAGE_EXPORT_DIRECTORY ExportDirectory,
|
|||
|
IN ULONG ExportSize,
|
|||
|
IN BOOLEAN SnapForwarder
|
|||
|
);
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
BlpCompareDllName (
|
|||
|
IN PCHAR Name,
|
|||
|
IN PUNICODE_STRING UnicodeString
|
|||
|
);
|
|||
|
|
|||
|
ARC_STATUS
|
|||
|
BlpScanImportAddressTable(
|
|||
|
IN PVOID DllBase,
|
|||
|
IN PVOID ImageBase,
|
|||
|
IN PIMAGE_THUNK_DATA ThunkTable
|
|||
|
);
|
|||
|
|
|||
|
#include "blbindt.c"
|
|||
|
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
BlCheckForLoadedDll (
|
|||
|
IN PCHAR DllName,
|
|||
|
OUT PKLDR_DATA_TABLE_ENTRY *FoundEntry
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine scans the loaded DLL list to determine if the specified
|
|||
|
DLL has already been loaded. If the DLL has already been loaded, then
|
|||
|
its reference count is incremented.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
DllName - Supplies a pointer to a null terminated DLL name.
|
|||
|
|
|||
|
FoundEntry - Supplies a pointer to a variable that receives a pointer
|
|||
|
to the matching data table entry.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
If the specified DLL has already been loaded, then TRUE is returned.
|
|||
|
Otherwise, FALSE is returned.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
PKLDR_DATA_TABLE_ENTRY DataTableEntry;
|
|||
|
PLIST_ENTRY NextEntry;
|
|||
|
|
|||
|
//
|
|||
|
// Scan the loaded data table list to determine if the specified DLL
|
|||
|
// has already been loaded.
|
|||
|
//
|
|||
|
|
|||
|
NextEntry = BlLoaderBlock->LoadOrderListHead.Flink;
|
|||
|
while (NextEntry != &BlLoaderBlock->LoadOrderListHead) {
|
|||
|
DataTableEntry = CONTAINING_RECORD(NextEntry,
|
|||
|
KLDR_DATA_TABLE_ENTRY,
|
|||
|
InLoadOrderLinks);
|
|||
|
|
|||
|
if (BlpCompareDllName(DllName, &DataTableEntry->BaseDllName) != FALSE) {
|
|||
|
*FoundEntry = DataTableEntry;
|
|||
|
DataTableEntry->LoadCount += 1;
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
NextEntry = NextEntry->Flink;
|
|||
|
}
|
|||
|
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
BlpCompareDllName (
|
|||
|
IN PCHAR DllName,
|
|||
|
IN PUNICODE_STRING UnicodeString
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine compares a zero terminated character string with a unicode
|
|||
|
string. The UnicodeString's extension is ignored.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
DllName - Supplies a pointer to a null terminated DLL name.
|
|||
|
|
|||
|
UnicodeString - Supplies a pointer to a Unicode string descriptor.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
If the specified name matches the Unicode name, then TRUE is returned.
|
|||
|
Otherwise, FALSE is returned.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
PWSTR Buffer;
|
|||
|
ULONG Index;
|
|||
|
ULONG Length;
|
|||
|
|
|||
|
//
|
|||
|
// Compute the length of the DLL Name and compare with the length of
|
|||
|
// the Unicode name. If the DLL Name is longer, the strings are not
|
|||
|
// equal.
|
|||
|
//
|
|||
|
|
|||
|
Length = strlen(DllName);
|
|||
|
if ((Length * sizeof(WCHAR)) > UnicodeString->Length) {
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Compare the two strings case insensitive, ignoring the Unicode
|
|||
|
// string's extension.
|
|||
|
//
|
|||
|
|
|||
|
Buffer = UnicodeString->Buffer;
|
|||
|
for (Index = 0; Index < Length; Index += 1) {
|
|||
|
if (toupper(*DllName) != toupper((CHAR)*Buffer)) {
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
DllName += 1;
|
|||
|
Buffer += 1;
|
|||
|
}
|
|||
|
if ((UnicodeString->Length == Length * sizeof(WCHAR)) ||
|
|||
|
(*Buffer == L'.')) {
|
|||
|
//
|
|||
|
// Strings match exactly or match up until the UnicodeString's extension.
|
|||
|
//
|
|||
|
return(TRUE);
|
|||
|
}
|
|||
|
return FALSE;
|
|||
|
}
|