3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/ldr/resource.c
6 * PURPOSE: Resource loader
7 * PROGRAMMERS: Eric Kohl (ekohl@rz-online.de)
10 /* INCLUDES *****************************************************************/
14 #include <internal/debug.h>
16 /* FUNCTIONS ****************************************************************/
22 LdrAccessResource(IN PVOID BaseAddress
,
23 IN PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry
,
24 OUT PVOID
*Resource OPTIONAL
,
25 OUT PULONG Size OPTIONAL
)
27 PIMAGE_SECTION_HEADER Section
;
28 PIMAGE_NT_HEADERS NtHeader
;
35 if(!ResourceDataEntry
)
36 return STATUS_RESOURCE_DATA_NOT_FOUND
;
38 Data
= (ULONG
)RtlImageDirectoryEntryToData (BaseAddress
,
40 IMAGE_DIRECTORY_ENTRY_RESOURCE
,
43 return STATUS_RESOURCE_DATA_NOT_FOUND
;
45 if ((ULONG
)BaseAddress
& 1)
47 /* loaded as ordinary file */
48 NtHeader
= RtlImageNtHeader((PVOID
)((ULONG
)BaseAddress
& ~1UL));
49 Offset
= (ULONG
)BaseAddress
- Data
+ NtHeader
->OptionalHeader
.DataDirectory
[IMAGE_DIRECTORY_ENTRY_RESOURCE
].VirtualAddress
;
50 Section
= RtlImageRvaToSection (NtHeader
, BaseAddress
, NtHeader
->OptionalHeader
.DataDirectory
[IMAGE_DIRECTORY_ENTRY_RESOURCE
].VirtualAddress
);
53 return STATUS_RESOURCE_DATA_NOT_FOUND
;
56 if (Section
->Misc
.VirtualSize
< ResourceDataEntry
->OffsetToData
)
58 SectionRva
= RtlImageRvaToSection (NtHeader
, BaseAddress
, ResourceDataEntry
->OffsetToData
)->VirtualAddress
;
59 SectionVa
= RtlImageRvaToVa(NtHeader
, BaseAddress
, SectionRva
, NULL
);
60 Offset
= SectionRva
- SectionVa
+ Data
- Section
->VirtualAddress
;
66 *Resource
= (PVOID
)(ResourceDataEntry
->OffsetToData
- Offset
+ (ULONG
)BaseAddress
);
71 *Size
= ResourceDataEntry
->Size
;
74 return STATUS_SUCCESS
;
82 LdrFindResource_U(PVOID BaseAddress
,
83 PLDR_RESOURCE_INFO ResourceInfo
,
85 PIMAGE_RESOURCE_DATA_ENTRY
*ResourceDataEntry
)
87 PIMAGE_RESOURCE_DIRECTORY ResDir
;
88 PIMAGE_RESOURCE_DIRECTORY ResBase
;
89 PIMAGE_RESOURCE_DIRECTORY_ENTRY ResEntry
;
90 NTSTATUS Status
= STATUS_SUCCESS
;
96 DPRINT ("LdrFindResource_U()\n");
98 /* Get the pointer to the resource directory */
99 ResDir
= (PIMAGE_RESOURCE_DIRECTORY
)
100 RtlImageDirectoryEntryToData (BaseAddress
,
102 IMAGE_DIRECTORY_ENTRY_RESOURCE
,
106 return STATUS_RESOURCE_DATA_NOT_FOUND
;
109 DPRINT("ResourceDirectory: %x\n", (ULONG
)ResDir
);
113 /* Let's go into resource tree */
114 for (i
= 0; i
< Level
; i
++)
116 DPRINT("ResDir: %x\n", (ULONG
)ResDir
);
117 Id
= ((PULONG
)ResourceInfo
)[i
];
118 EntryCount
= ResDir
->NumberOfNamedEntries
;
119 ResEntry
= (PIMAGE_RESOURCE_DIRECTORY_ENTRY
)(ResDir
+ 1);
120 DPRINT("ResEntry %x\n", (ULONG
)ResEntry
);
123 /* Resource name is a unicode string */
124 for (; EntryCount
--; ResEntry
++)
126 /* Scan entries for equal name */
127 if (ResEntry
->Name
& 0x80000000)
129 ws
= (PWCHAR
)((ULONG
)ResDir
+ (ResEntry
->Name
& 0x7FFFFFFF));
130 if (!wcsncmp((PWCHAR
)Id
, ws
+ 1, *ws
) &&
131 wcslen((PWCHAR
)Id
) == (ULONG
)*ws
)
140 /* We use ID number instead of string */
141 ResEntry
+= EntryCount
;
142 EntryCount
= ResDir
->NumberOfIdEntries
;
143 for (; EntryCount
--; ResEntry
++)
145 /* Scan entries for equal name */
146 if (ResEntry
->Name
== Id
)
148 DPRINT("ID entry found %x\n", Id
);
153 DPRINT("Error %lu\n", i
);
158 return STATUS_RESOURCE_TYPE_NOT_FOUND
;
161 return STATUS_RESOURCE_NAME_NOT_FOUND
;
164 if (ResDir
->NumberOfNamedEntries
|| ResDir
->NumberOfIdEntries
)
166 /* Use the first available language */
167 ResEntry
= (IMAGE_RESOURCE_DIRECTORY_ENTRY
*)(ResDir
+ 1);
170 return STATUS_RESOURCE_LANG_NOT_FOUND
;
173 return STATUS_RESOURCE_DATA_NOT_FOUND
;
176 return STATUS_INVALID_PARAMETER
;
179 ResDir
= (PIMAGE_RESOURCE_DIRECTORY
)((ULONG
)ResBase
+
180 (ResEntry
->OffsetToData
& 0x7FFFFFFF));
182 DPRINT("ResourceDataEntry: %x\n", (ULONG
)ResDir
);
184 if (ResourceDataEntry
)
186 *ResourceDataEntry
= (PVOID
)ResDir
;
199 LdrFindResourceDirectory_U(
200 IN PVOID BaseAddress
,
201 IN PLDR_RESOURCE_INFO ResourceInfo
,
203 OUT PIMAGE_RESOURCE_DIRECTORY
*ResourceDirectory
207 return STATUS_NOT_IMPLEMENTED
;
216 IN PVOID BaseAddress
,
217 IN PLDR_RESOURCE_INFO ResourceInfo
,
219 IN OUT PULONG ResourceCount
,
220 OUT PVOID Resources OPTIONAL
224 return STATUS_NOT_IMPLEMENTED
;