mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 23:45:42 +00:00
Added/fixed resource 'loader'.
svn path=/trunk/; revision=1324
This commit is contained in:
parent
7550af7e4d
commit
3f36421f86
10 changed files with 401 additions and 131 deletions
|
@ -1,6 +1,19 @@
|
||||||
#ifndef __INCLUDE_DDK_LDRFUNCS_H
|
#ifndef __INCLUDE_DDK_LDRFUNCS_H
|
||||||
#define __INCLUDE_DDK_LDRFUNCS_H
|
#define __INCLUDE_DDK_LDRFUNCS_H
|
||||||
/* $Id: ldrfuncs.h,v 1.1 2000/08/27 22:35:22 ekohl Exp $ */
|
/* $Id: ldrfuncs.h,v 1.2 2000/08/28 21:45:08 ekohl Exp $ */
|
||||||
|
|
||||||
|
typedef struct _LDR_RESOURCE_INFO
|
||||||
|
{
|
||||||
|
ULONG Type;
|
||||||
|
ULONG Name;
|
||||||
|
ULONG Language;
|
||||||
|
} LDR_RESOURCE_INFO, *PLDR_RESOURCE_INFO;
|
||||||
|
|
||||||
|
#define RESOURCE_TYPE_LEVEL 0
|
||||||
|
#define RESOURCE_NAME_LEVEL 1
|
||||||
|
#define RESOURCE_LANGUAGE_LEVEL 2
|
||||||
|
#define RESOURCE_DATA_LEVEL 3
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
NTSTATUS STDCALL
|
||||||
LdrAccessResource(IN PVOID BaseAddress,
|
LdrAccessResource(IN PVOID BaseAddress,
|
||||||
|
@ -8,4 +21,10 @@ LdrAccessResource(IN PVOID BaseAddress,
|
||||||
OUT PVOID *Resource OPTIONAL,
|
OUT PVOID *Resource OPTIONAL,
|
||||||
OUT PULONG Size OPTIONAL);
|
OUT PULONG Size OPTIONAL);
|
||||||
|
|
||||||
|
NTSTATUS STDCALL
|
||||||
|
LdrFindResource_U(IN PVOID BaseAddress,
|
||||||
|
IN PLDR_RESOURCE_INFO ResourceInfo,
|
||||||
|
IN ULONG Level,
|
||||||
|
OUT PIMAGE_RESOURCE_DATA_ENTRY *ResourceDataEntry);
|
||||||
|
|
||||||
#endif /* __INCLUDE_DDK_LDRFUNCS_H */
|
#endif /* __INCLUDE_DDK_LDRFUNCS_H */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: res.c,v 1.6 2000/08/27 22:37:45 ekohl Exp $
|
/* $Id: res.c,v 1.7 2000/08/28 21:45:43 ekohl Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT : ReactOS user mode libraries
|
* PROJECT : ReactOS user mode libraries
|
||||||
|
@ -101,7 +101,8 @@ FindResourceExW (
|
||||||
WORD wLanguage
|
WORD wLanguage
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
IMAGE_RESOURCE_DATA_ENTRY *ResourceDataEntry;
|
PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry = NULL;
|
||||||
|
LDR_RESOURCE_INFO ResourceInfo;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
int i,l;
|
int i,l;
|
||||||
ULONG nType = 0, nName = 0;
|
ULONG nType = 0, nName = 0;
|
||||||
|
@ -118,7 +119,11 @@ FindResourceExW (
|
||||||
if ( i < l - 1 )
|
if ( i < l - 1 )
|
||||||
nName*= 10;
|
nName*= 10;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetLastErrorByStatus (STATUS_INVALID_PARAMETER);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
lpName = (LPWSTR)nName;
|
lpName = (LPWSTR)nName;
|
||||||
|
@ -135,16 +140,28 @@ FindResourceExW (
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
SetLastErrorByStatus (STATUS_INVALID_PARAMETER);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
nType = (ULONG)lpType;
|
|
||||||
|
|
||||||
Status = LdrFindResource_U(hModule,&ResourceDataEntry,lpName, nType,wLanguage);
|
lpType = (LPWSTR)nType;
|
||||||
if ( !NT_SUCCESS(Status ) ) {
|
}
|
||||||
|
|
||||||
|
ResourceInfo.Type = (ULONG)lpType;
|
||||||
|
ResourceInfo.Name = (ULONG)lpName;
|
||||||
|
ResourceInfo.Language = (ULONG)wLanguage;
|
||||||
|
|
||||||
|
Status = LdrFindResource_U (hModule,
|
||||||
|
&ResourceInfo,
|
||||||
|
RESOURCE_DATA_LEVEL,
|
||||||
|
&ResourceDataEntry);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
SetLastErrorByStatus (Status);
|
SetLastErrorByStatus (Status);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ResourceDataEntry;
|
return ResourceDataEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
; $Id: ntdll.def,v 1.62 2000/08/27 22:36:24 ekohl Exp $
|
; $Id: ntdll.def,v 1.63 2000/08/28 21:46:55 ekohl Exp $
|
||||||
;
|
;
|
||||||
; ReactOS Operating System
|
; ReactOS Operating System
|
||||||
;
|
;
|
||||||
|
@ -37,7 +37,7 @@ LdrDisableThreadCalloutsForDll@8
|
||||||
;LdrEnumResources
|
;LdrEnumResources
|
||||||
;LdrFindEntryForAddress
|
;LdrFindEntryForAddress
|
||||||
;LdrFindResourceDirectory_U
|
;LdrFindResourceDirectory_U
|
||||||
LdrFindResource_U
|
LdrFindResource_U@16
|
||||||
LdrGetDllHandle@16
|
LdrGetDllHandle@16
|
||||||
LdrGetProcedureAddress@16
|
LdrGetProcedureAddress@16
|
||||||
LdrInitializeThunk@16
|
LdrInitializeThunk@16
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
; $Id: ntdll.edf,v 1.51 2000/08/27 22:36:25 ekohl Exp $
|
; $Id: ntdll.edf,v 1.52 2000/08/28 21:46:55 ekohl Exp $
|
||||||
;
|
;
|
||||||
; ReactOS Operating System
|
; ReactOS Operating System
|
||||||
;
|
;
|
||||||
|
@ -37,7 +37,7 @@ LdrDisableThreadCalloutsForDll=LdrDisableThreadCalloutsForDll@8
|
||||||
;LdrEnumResources
|
;LdrEnumResources
|
||||||
;LdrFindEntryForAddress
|
;LdrFindEntryForAddress
|
||||||
;LdrFindResourceDirectory_U
|
;LdrFindResourceDirectory_U
|
||||||
LdrFindResource_U
|
LdrFindResource_U=LdrFindResource_U@16
|
||||||
LdrGetDllHandle=LdrGetDllHandle@16
|
LdrGetDllHandle=LdrGetDllHandle@16
|
||||||
LdrGetProcedureAddress=LdrGetProcedureAddress@16
|
LdrGetProcedureAddress=LdrGetProcedureAddress@16
|
||||||
LdrInitializeThunk=LdrInitializeThunk@16
|
LdrInitializeThunk=LdrInitializeThunk@16
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: utils.c,v 1.30 2000/08/27 22:36:45 ekohl Exp $
|
/* $Id: utils.c,v 1.31 2000/08/28 21:47:34 ekohl Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -57,8 +57,6 @@ LdrFindDll (PDLL* Dll,PUNICODE_STRING Name);
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// IN PCHAR Name,
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
NTSTATUS STDCALL
|
||||||
LdrLoadDll (IN PWSTR SearchPath OPTIONAL,
|
LdrLoadDll (IN PWSTR SearchPath OPTIONAL,
|
||||||
IN ULONG LoadFlags,
|
IN ULONG LoadFlags,
|
||||||
|
@ -66,7 +64,6 @@ LdrLoadDll (IN PWSTR SearchPath OPTIONAL,
|
||||||
OUT PVOID *BaseAddress OPTIONAL)
|
OUT PVOID *BaseAddress OPTIONAL)
|
||||||
{
|
{
|
||||||
WCHAR fqname [255] = L"\\SystemRoot\\system32\\";
|
WCHAR fqname [255] = L"\\SystemRoot\\system32\\";
|
||||||
// ANSI_STRING AnsiString;
|
|
||||||
UNICODE_STRING UnicodeString;
|
UNICODE_STRING UnicodeString;
|
||||||
OBJECT_ATTRIBUTES FileObjectAttributes;
|
OBJECT_ATTRIBUTES FileObjectAttributes;
|
||||||
char BlockBuffer [1024];
|
char BlockBuffer [1024];
|
||||||
|
@ -114,17 +111,7 @@ LdrLoadDll (IN PWSTR SearchPath OPTIONAL,
|
||||||
*BaseAddress = Dll->BaseAddress;
|
*BaseAddress = Dll->BaseAddress;
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
RtlInitAnsiString(
|
|
||||||
& AnsiString,
|
|
||||||
fqname
|
|
||||||
);
|
|
||||||
RtlAnsiStringToUnicodeString(
|
|
||||||
& UnicodeString,
|
|
||||||
& AnsiString,
|
|
||||||
TRUE
|
|
||||||
);
|
|
||||||
*/
|
|
||||||
RtlInitUnicodeString(&UnicodeString,
|
RtlInitUnicodeString(&UnicodeString,
|
||||||
fqname);
|
fqname);
|
||||||
|
|
||||||
|
@ -305,7 +292,6 @@ LdrLoadDll (IN PWSTR SearchPath OPTIONAL,
|
||||||
* NOTE
|
* NOTE
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
//static NTSTATUS LdrFindDll(PDLL* Dll, PCHAR Name)
|
|
||||||
static NTSTATUS LdrFindDll(PDLL* Dll, PUNICODE_STRING Name)
|
static NTSTATUS LdrFindDll(PDLL* Dll, PUNICODE_STRING Name)
|
||||||
{
|
{
|
||||||
PIMAGE_EXPORT_DIRECTORY ExportDir;
|
PIMAGE_EXPORT_DIRECTORY ExportDir;
|
||||||
|
@ -727,8 +713,6 @@ static NTSTATUS LdrFixupImports(PIMAGE_NT_HEADERS NTHeaders,
|
||||||
Status = LdrLoadDll(NULL,
|
Status = LdrLoadDll(NULL,
|
||||||
0,
|
0,
|
||||||
&DllName,
|
&DllName,
|
||||||
// (PCHAR)(ImageBase
|
|
||||||
// +ImportModuleDirectory->dwRVAModuleName),
|
|
||||||
&BaseAddress);
|
&BaseAddress);
|
||||||
RtlFreeUnicodeString (&DllName);
|
RtlFreeUnicodeString (&DllName);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
|
@ -954,110 +938,115 @@ LdrUnloadDll (IN PVOID BaseAddress)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static PIMAGE_RESOURCE_DIRECTORY_ENTRY
|
NTSTATUS STDCALL
|
||||||
LdrGetNextEntry(IMAGE_RESOURCE_DIRECTORY *ResourceDir, LPCWSTR ResourceName, ULONG Offset)
|
LdrFindResource_U(PVOID BaseAddress,
|
||||||
|
PLDR_RESOURCE_INFO ResourceInfo,
|
||||||
|
ULONG Level,
|
||||||
|
PIMAGE_RESOURCE_DATA_ENTRY *ResourceDataEntry)
|
||||||
{
|
{
|
||||||
WORD NumberOfNamedEntries;
|
PIMAGE_RESOURCE_DIRECTORY ResDir;
|
||||||
WORD NumberOfIdEntries;
|
PIMAGE_RESOURCE_DIRECTORY ResBase;
|
||||||
WORD Entries;
|
PIMAGE_RESOURCE_DIRECTORY_ENTRY ResEntry;
|
||||||
ULONG Length;
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
|
ULONG EntryCount;
|
||||||
|
PWCHAR ws;
|
||||||
|
ULONG i;
|
||||||
|
ULONG Id;
|
||||||
|
|
||||||
if ( (((ULONG)ResourceDir) & 0xF0000000) != 0 ) {
|
DPRINT ("LdrFindResource_U()\n");
|
||||||
return (IMAGE_RESOURCE_DIRECTORY_ENTRY *)NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
NumberOfIdEntries = ResourceDir->NumberOfIdEntries;
|
/* Get the pointer to the resource directory */
|
||||||
NumberOfNamedEntries = ResourceDir->NumberOfNamedEntries;
|
ResDir = (PIMAGE_RESOURCE_DIRECTORY)
|
||||||
if ( ( NumberOfIdEntries + NumberOfNamedEntries) == 0) {
|
RtlImageDirectoryEntryToData (BaseAddress,
|
||||||
return &ResourceDir->DirectoryEntries[0];
|
TRUE,
|
||||||
}
|
IMAGE_DIRECTORY_ENTRY_RESOURCE,
|
||||||
|
&i);
|
||||||
|
if (ResDir == NULL)
|
||||||
|
{
|
||||||
|
return STATUS_RESOURCE_DATA_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
if ( HIWORD(ResourceName) != 0 ) {
|
DPRINT("ResourceDirectory: %x\n", (ULONG)ResDir);
|
||||||
Length = wcslen(ResourceName);
|
|
||||||
Entries = ResourceDir->NumberOfNamedEntries;
|
|
||||||
do {
|
|
||||||
IMAGE_RESOURCE_DIR_STRING_U *DirString;
|
|
||||||
|
|
||||||
Entries--;
|
ResBase = ResDir;
|
||||||
DirString = (IMAGE_RESOURCE_DIR_STRING_U *)(((ULONG)ResourceDir->DirectoryEntries[Entries].Name & (~0xF0000000)) + Offset);
|
|
||||||
|
|
||||||
if ( DirString->Length == Length && wcscmp(DirString->NameString, ResourceName ) == 0 ) {
|
/* Let's go into resource tree */
|
||||||
return &ResourceDir->DirectoryEntries[Entries];
|
for (i = 0; i < Level; i++)
|
||||||
}
|
{
|
||||||
} while (Entries > 0);
|
DPRINT("ResDir: %x\n", (ULONG)ResDir);
|
||||||
}
|
Id = ((PULONG)ResourceInfo)[i];
|
||||||
else {
|
EntryCount = ResDir->NumberOfNamedEntries;
|
||||||
Entries = ResourceDir->NumberOfIdEntries + ResourceDir->NumberOfNamedEntries;
|
ResEntry = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)(ResDir + 1);
|
||||||
do {
|
DPRINT("ResEntry %x\n", (ULONG)ResEntry);
|
||||||
Entries--;
|
if (Id & 0xFFFF0000)
|
||||||
|
{
|
||||||
|
/* Resource name is a unicode string */
|
||||||
|
for (; EntryCount--; ResEntry++)
|
||||||
|
{
|
||||||
|
/* Scan entries for equal name */
|
||||||
|
if (ResEntry->Name & 0x80000000)
|
||||||
|
{
|
||||||
|
ws = (PWCHAR)((ULONG)ResDir + (ResEntry->Name & 0x7FFFFFFF));
|
||||||
|
if (!wcsncmp((PWCHAR)Id, ws + 1, *ws ) &&
|
||||||
|
wcslen((PWCHAR)Id) == (int)*ws )
|
||||||
|
{
|
||||||
|
goto found;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* We use ID number instead of string */
|
||||||
|
ResEntry += EntryCount;
|
||||||
|
EntryCount = ResDir->NumberOfIdEntries;
|
||||||
|
for (; EntryCount--; ResEntry++)
|
||||||
|
{
|
||||||
|
/* Scan entries for equal name */
|
||||||
|
if (ResEntry->Name == Id)
|
||||||
|
{
|
||||||
|
DPRINT("ID entry found %x\n", Id);
|
||||||
|
goto found;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DPRINT("Error %lu\n", i);
|
||||||
|
|
||||||
if ( (LPWSTR)ResourceDir->DirectoryEntries[Entries].Name == ResourceName ) {
|
switch (i)
|
||||||
return &ResourceDir->DirectoryEntries[Entries];
|
{
|
||||||
}
|
case 0:
|
||||||
} while (Entries > ResourceDir->NumberOfNamedEntries);
|
return STATUS_RESOURCE_TYPE_NOT_FOUND;
|
||||||
|
|
||||||
}
|
case 1:
|
||||||
|
return STATUS_RESOURCE_NAME_NOT_FOUND;
|
||||||
|
|
||||||
return NULL;
|
case 2:
|
||||||
}
|
if (ResDir->NumberOfNamedEntries || ResDir->NumberOfIdEntries)
|
||||||
|
{
|
||||||
|
/* Use the first available language */
|
||||||
|
ResEntry = (IMAGE_RESOURCE_DIRECTORY_ENTRY*)(ResDir + 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return STATUS_RESOURCE_LANG_NOT_FOUND;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
return STATUS_RESOURCE_DATA_NOT_FOUND;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
found:;
|
||||||
|
ResDir = (PIMAGE_RESOURCE_DIRECTORY)((ULONG)ResBase +
|
||||||
|
(ResEntry->OffsetToData & 0x7FFFFFFF));
|
||||||
|
}
|
||||||
|
DPRINT("ResourceDataEntry: %x\n", (ULONG)ResDir);
|
||||||
|
|
||||||
NTSTATUS LdrFindResource_U(DLL *Dll, IMAGE_RESOURCE_DATA_ENTRY **ResourceDataEntry,LPCWSTR ResourceName, ULONG ResourceType,ULONG Language)
|
if (ResourceDataEntry)
|
||||||
{
|
{
|
||||||
IMAGE_RESOURCE_DIRECTORY *ResourceTypeDir;
|
*ResourceDataEntry = (PVOID)ResDir;
|
||||||
IMAGE_RESOURCE_DIRECTORY *ResourceNameDir;
|
}
|
||||||
IMAGE_RESOURCE_DIRECTORY *ResourceLangDir;
|
|
||||||
|
|
||||||
IMAGE_RESOURCE_DIRECTORY_ENTRY *ResourceTypeDirEntry;
|
|
||||||
IMAGE_RESOURCE_DIRECTORY_ENTRY *ResourceNameDirEntry;
|
|
||||||
IMAGE_RESOURCE_DIRECTORY_ENTRY *ResourceLangDirEntry;
|
|
||||||
|
|
||||||
PIMAGE_OPTIONAL_HEADER OptionalHeader;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ULONG Offset;
|
|
||||||
|
|
||||||
OptionalHeader = & Dll->Headers->OptionalHeader;
|
|
||||||
ResourceTypeDir = (PIMAGE_RESOURCE_DIRECTORY)
|
|
||||||
OptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress;
|
|
||||||
ResourceTypeDir = (PIMAGE_RESOURCE_DIRECTORY)
|
|
||||||
((ULONG)ResourceTypeDir + (ULONG)Dll->BaseAddress);
|
|
||||||
|
|
||||||
|
|
||||||
Offset = (ULONG)ResourceTypeDir;
|
|
||||||
|
|
||||||
ResourceTypeDirEntry = LdrGetNextEntry(ResourceTypeDir, (LPWSTR)ResourceType, Offset);
|
|
||||||
|
|
||||||
if ( ResourceTypeDirEntry != NULL ) {
|
|
||||||
ResourceNameDir = (IMAGE_RESOURCE_DIRECTORY*)((ResourceTypeDirEntry->OffsetToData & (~0xF0000000)) + Offset);
|
|
||||||
|
|
||||||
ResourceNameDirEntry = LdrGetNextEntry(ResourceNameDir, ResourceName, Offset);
|
|
||||||
|
|
||||||
if ( ResourceNameDirEntry != NULL ) {
|
|
||||||
|
|
||||||
ResourceLangDir = (IMAGE_RESOURCE_DIRECTORY*)((ResourceNameDirEntry->OffsetToData & (~0xF0000000)) + Offset);
|
|
||||||
|
|
||||||
ResourceLangDirEntry = LdrGetNextEntry(ResourceLangDir, (LPWSTR)Language, Offset);
|
|
||||||
if ( ResourceLangDirEntry != NULL ) {
|
|
||||||
|
|
||||||
*ResourceDataEntry = (IMAGE_RESOURCE_DATA_ENTRY *)(ResourceLangDirEntry->OffsetToData +
|
|
||||||
(ULONG)ResourceTypeDir);
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
184
reactos/ntoskrnl/ldr/resource.c
Normal file
184
reactos/ntoskrnl/ldr/resource.c
Normal file
|
@ -0,0 +1,184 @@
|
||||||
|
/* $Id: resource.c,v 1.1 2000/08/28 21:49:11 ekohl Exp $
|
||||||
|
*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS kernel
|
||||||
|
* FILE: ntoskrnl/ldr/resource.c
|
||||||
|
* PURPOSE: Resource loader
|
||||||
|
* PROGRAMMERS: Eric Kohl (ekohl@rz-online.de)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES *****************************************************************/
|
||||||
|
|
||||||
|
#include <ddk/ntddk.h>
|
||||||
|
|
||||||
|
#define NDEBUG
|
||||||
|
#include <internal/debug.h>
|
||||||
|
|
||||||
|
/* FUNCTIONS ****************************************************************/
|
||||||
|
|
||||||
|
NTSTATUS STDCALL
|
||||||
|
LdrAccessResource(IN PVOID BaseAddress,
|
||||||
|
IN PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry,
|
||||||
|
OUT PVOID *Resource OPTIONAL,
|
||||||
|
OUT PULONG Size OPTIONAL)
|
||||||
|
{
|
||||||
|
PIMAGE_SECTION_HEADER Section;
|
||||||
|
PIMAGE_NT_HEADERS NtHeader;
|
||||||
|
ULONG SectionRva;
|
||||||
|
ULONG SectionVa;
|
||||||
|
ULONG DataSize;
|
||||||
|
ULONG Offset = 0;
|
||||||
|
ULONG Data;
|
||||||
|
|
||||||
|
Data = (ULONG)RtlImageDirectoryEntryToData (BaseAddress,
|
||||||
|
TRUE,
|
||||||
|
IMAGE_DIRECTORY_ENTRY_RESOURCE,
|
||||||
|
&DataSize);
|
||||||
|
if (Data == 0)
|
||||||
|
return STATUS_RESOURCE_DATA_NOT_FOUND;
|
||||||
|
|
||||||
|
if ((ULONG)BaseAddress & 1)
|
||||||
|
{
|
||||||
|
/* loaded as ordinary file */
|
||||||
|
NtHeader = RtlImageNtHeader((PVOID)((ULONG)BaseAddress & ~1UL));
|
||||||
|
Offset = (ULONG)BaseAddress - Data + NtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress;
|
||||||
|
Section = RtlImageRvaToSection (NtHeader, BaseAddress, NtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress);
|
||||||
|
if (Section == NULL)
|
||||||
|
{
|
||||||
|
return STATUS_RESOURCE_DATA_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Section->Misc.VirtualSize < ResourceDataEntry->OffsetToData)
|
||||||
|
{
|
||||||
|
SectionRva = RtlImageRvaToSection (NtHeader, BaseAddress, ResourceDataEntry->OffsetToData)->VirtualAddress;
|
||||||
|
SectionVa = RtlImageRvaToVa(NtHeader, BaseAddress, SectionRva, NULL);
|
||||||
|
Offset = SectionRva - SectionVa + Data - Section->VirtualAddress;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Resource)
|
||||||
|
{
|
||||||
|
*Resource = (PVOID)(ResourceDataEntry->OffsetToData - Offset + (ULONG)BaseAddress);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Size)
|
||||||
|
{
|
||||||
|
*Size = ResourceDataEntry->Size;
|
||||||
|
}
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NTSTATUS STDCALL
|
||||||
|
LdrFindResource_U(PVOID BaseAddress,
|
||||||
|
PLDR_RESOURCE_INFO ResourceInfo,
|
||||||
|
ULONG Level,
|
||||||
|
PIMAGE_RESOURCE_DATA_ENTRY *ResourceDataEntry)
|
||||||
|
{
|
||||||
|
PIMAGE_RESOURCE_DIRECTORY ResDir;
|
||||||
|
PIMAGE_RESOURCE_DIRECTORY ResBase;
|
||||||
|
PIMAGE_RESOURCE_DIRECTORY_ENTRY ResEntry;
|
||||||
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
|
ULONG EntryCount;
|
||||||
|
PWCHAR ws;
|
||||||
|
ULONG i;
|
||||||
|
ULONG Id;
|
||||||
|
|
||||||
|
DPRINT ("LdrFindResource_U()\n");
|
||||||
|
|
||||||
|
/* Get the pointer to the resource directory */
|
||||||
|
ResDir = (PIMAGE_RESOURCE_DIRECTORY)
|
||||||
|
RtlImageDirectoryEntryToData (BaseAddress,
|
||||||
|
TRUE,
|
||||||
|
IMAGE_DIRECTORY_ENTRY_RESOURCE,
|
||||||
|
&i);
|
||||||
|
if (ResDir == NULL)
|
||||||
|
{
|
||||||
|
return STATUS_RESOURCE_DATA_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
DPRINT("ResourceDirectory: %x\n", (ULONG)ResDir);
|
||||||
|
|
||||||
|
ResBase = ResDir;
|
||||||
|
|
||||||
|
/* Let's go into resource tree */
|
||||||
|
for (i = 0; i < Level; i++)
|
||||||
|
{
|
||||||
|
DPRINT("ResDir: %x\n", (ULONG)ResDir);
|
||||||
|
Id = ((PULONG)ResourceInfo)[i];
|
||||||
|
EntryCount = ResDir->NumberOfNamedEntries;
|
||||||
|
ResEntry = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)(ResDir + 1);
|
||||||
|
DPRINT("ResEntry %x\n", (ULONG)ResEntry);
|
||||||
|
if (Id & 0xFFFF0000)
|
||||||
|
{
|
||||||
|
/* Resource name is a unicode string */
|
||||||
|
for (; EntryCount--; ResEntry++)
|
||||||
|
{
|
||||||
|
/* Scan entries for equal name */
|
||||||
|
if (ResEntry->Name & 0x80000000)
|
||||||
|
{
|
||||||
|
ws = (PWCHAR)((ULONG)ResDir + (ResEntry->Name & 0x7FFFFFFF));
|
||||||
|
if (!wcsncmp((PWCHAR)Id, ws + 1, *ws ) &&
|
||||||
|
wcslen((PWCHAR)Id) == (int)*ws )
|
||||||
|
{
|
||||||
|
goto found;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* We use ID number instead of string */
|
||||||
|
ResEntry += EntryCount;
|
||||||
|
EntryCount = ResDir->NumberOfIdEntries;
|
||||||
|
for (; EntryCount--; ResEntry++)
|
||||||
|
{
|
||||||
|
/* Scan entries for equal name */
|
||||||
|
if (ResEntry->Name == Id)
|
||||||
|
{
|
||||||
|
DPRINT("ID entry found %x\n", Id);
|
||||||
|
goto found;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DPRINT("Error %lu\n", i);
|
||||||
|
|
||||||
|
switch (i)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
return STATUS_RESOURCE_TYPE_NOT_FOUND;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
return STATUS_RESOURCE_NAME_NOT_FOUND;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
if (ResDir->NumberOfNamedEntries || ResDir->NumberOfIdEntries)
|
||||||
|
{
|
||||||
|
/* Use the first available language */
|
||||||
|
ResEntry = (IMAGE_RESOURCE_DIRECTORY_ENTRY*)(ResDir + 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return STATUS_RESOURCE_LANG_NOT_FOUND;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
return STATUS_RESOURCE_DATA_NOT_FOUND;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
found:;
|
||||||
|
ResDir = (PIMAGE_RESOURCE_DIRECTORY)((ULONG)ResBase +
|
||||||
|
(ResEntry->OffsetToData & 0x7FFFFFFF));
|
||||||
|
}
|
||||||
|
DPRINT("ResourceDataEntry: %x\n", (ULONG)ResDir);
|
||||||
|
|
||||||
|
if (ResourceDataEntry)
|
||||||
|
{
|
||||||
|
*ResourceDataEntry = (PVOID)ResDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* EOF */
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: rtl.c,v 1.9 2000/08/05 18:01:53 dwelch Exp $
|
/* $Id: rtl.c,v 1.10 2000/08/28 21:49:11 ekohl Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -92,6 +92,66 @@ RtlImageDirectoryEntryToData (
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PIMAGE_SECTION_HEADER
|
||||||
|
STDCALL
|
||||||
|
RtlImageRvaToSection (
|
||||||
|
PIMAGE_NT_HEADERS NtHeader,
|
||||||
|
PVOID BaseAddress,
|
||||||
|
ULONG Rva
|
||||||
|
)
|
||||||
|
{
|
||||||
|
PIMAGE_SECTION_HEADER Section;
|
||||||
|
ULONG Va;
|
||||||
|
ULONG Count;
|
||||||
|
|
||||||
|
Count = NtHeader->FileHeader.NumberOfSections;
|
||||||
|
Section = (PIMAGE_SECTION_HEADER)((ULONG)&NtHeader->OptionalHeader +
|
||||||
|
NtHeader->FileHeader.SizeOfOptionalHeader);
|
||||||
|
while (Count)
|
||||||
|
{
|
||||||
|
Va = Section->VirtualAddress;
|
||||||
|
if ((Va <= Rva) &&
|
||||||
|
(Rva < Va + Section->SizeOfRawData))
|
||||||
|
return Section;
|
||||||
|
Section++;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ULONG
|
||||||
|
STDCALL
|
||||||
|
RtlImageRvaToVa (
|
||||||
|
PIMAGE_NT_HEADERS NtHeader,
|
||||||
|
PVOID BaseAddress,
|
||||||
|
ULONG Rva,
|
||||||
|
PIMAGE_SECTION_HEADER *SectionHeader
|
||||||
|
)
|
||||||
|
{
|
||||||
|
PIMAGE_SECTION_HEADER Section = NULL;
|
||||||
|
|
||||||
|
if (SectionHeader)
|
||||||
|
Section = *SectionHeader;
|
||||||
|
|
||||||
|
if (Section == NULL ||
|
||||||
|
Rva < Section->VirtualAddress ||
|
||||||
|
Rva >= Section->VirtualAddress + Section->SizeOfRawData)
|
||||||
|
{
|
||||||
|
Section = RtlImageRvaToSection (NtHeader, BaseAddress, Rva);
|
||||||
|
if (Section == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (SectionHeader)
|
||||||
|
*SectionHeader = Section;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (ULONG)(BaseAddress +
|
||||||
|
Rva +
|
||||||
|
Section->PointerToRawData -
|
||||||
|
Section->VirtualAddress);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
NTSTATUS STDCALL
|
||||||
LdrGetProcedureAddress (IN PVOID BaseAddress,
|
LdrGetProcedureAddress (IN PVOID BaseAddress,
|
||||||
IN PANSI_STRING Name,
|
IN PANSI_STRING Name,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# $Id: makefile_rex,v 1.84 2000/08/18 22:27:02 dwelch Exp $
|
# $Id: makefile_rex,v 1.85 2000/08/28 21:48:31 ekohl Exp $
|
||||||
#
|
#
|
||||||
# ReactOS Operating System
|
# ReactOS Operating System
|
||||||
#
|
#
|
||||||
|
@ -234,6 +234,7 @@ OBJECTS_DBG = \
|
||||||
OBJECTS_LDR = \
|
OBJECTS_LDR = \
|
||||||
ldr/init.o \
|
ldr/init.o \
|
||||||
ldr/loader.o \
|
ldr/loader.o \
|
||||||
|
ldr/resource.o \
|
||||||
ldr/rtl.o \
|
ldr/rtl.o \
|
||||||
ldr/sysdll.o \
|
ldr/sysdll.o \
|
||||||
ldr/userldr.o
|
ldr/userldr.o
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
; $Id: ntoskrnl.def,v 1.86 2000/08/26 16:18:58 ekohl Exp $
|
; $Id: ntoskrnl.def,v 1.87 2000/08/28 21:48:32 ekohl Exp $
|
||||||
;
|
;
|
||||||
; reactos/ntoskrnl/ntoskrnl.def
|
; reactos/ntoskrnl/ntoskrnl.def
|
||||||
;
|
;
|
||||||
|
@ -431,10 +431,10 @@ KiDispatchInterrupt@0
|
||||||
;KiReleaseSpinLock@4
|
;KiReleaseSpinLock@4
|
||||||
;KiUnexpectedInterrupt
|
;KiUnexpectedInterrupt
|
||||||
;Kii386SpinOnSpinLock
|
;Kii386SpinOnSpinLock
|
||||||
;LdrAccessResource@16
|
LdrAccessResource@16
|
||||||
;LdrEnumResources@20
|
;LdrEnumResources@20
|
||||||
;LdrFindResourceDirectory_U@16
|
;LdrFindResourceDirectory_U@16
|
||||||
;LdrFindResource_U@16
|
LdrFindResource_U@16
|
||||||
;LpcRequestPort@8
|
;LpcRequestPort@8
|
||||||
;LsaCallAuthenticationPackage
|
;LsaCallAuthenticationPackage
|
||||||
;LsaDeregisterLogonProcess
|
;LsaDeregisterLogonProcess
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
; $Id: ntoskrnl.edf,v 1.73 2000/08/26 16:18:58 ekohl Exp $
|
; $Id: ntoskrnl.edf,v 1.74 2000/08/28 21:48:32 ekohl Exp $
|
||||||
;
|
;
|
||||||
; reactos/ntoskrnl/ntoskrnl.def
|
; reactos/ntoskrnl/ntoskrnl.def
|
||||||
;
|
;
|
||||||
|
@ -431,10 +431,10 @@ KiDispatchInterrupt=KiDispatchInterrupt@0
|
||||||
;KiReleaseSpinLock@4
|
;KiReleaseSpinLock@4
|
||||||
;KiUnexpectedInterrupt
|
;KiUnexpectedInterrupt
|
||||||
;Kii386SpinOnSpinLock
|
;Kii386SpinOnSpinLock
|
||||||
;LdrAccessResource@16
|
LdrAccessResource=LdrAccessResource@16
|
||||||
;LdrEnumResources@20
|
;LdrEnumResources@20
|
||||||
;LdrFindResourceDirectory_U@16
|
;LdrFindResourceDirectory_U@16
|
||||||
;LdrFindResource_U@16
|
LdrFindResource_U=LdrFindResource_U@16
|
||||||
;LpcRequestPort@8
|
;LpcRequestPort@8
|
||||||
;LsaCallAuthenticationPackage
|
;LsaCallAuthenticationPackage
|
||||||
;LsaDeregisterLogonProcess
|
;LsaDeregisterLogonProcess
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue