3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/ldr/rtl.c
6 * PURPOSE: Loader utilities
8 * PROGRAMMERS: Jean Michault
9 * Rex Jolliff (rex@lvcablemodem.com)
12 /* INCLUDES *****************************************************************/
16 #include <internal/debug.h>
18 /* FUNCTIONS ****************************************************************/
20 #define RVA(m, b) ((ULONG)b + m)
23 LdrGetProcedureAddress (IN PVOID BaseAddress
,
26 OUT PVOID
*ProcedureAddress
)
28 PIMAGE_EXPORT_DIRECTORY ExportDir
;
34 /* get the pointer to the export directory */
35 ExportDir
= (PIMAGE_EXPORT_DIRECTORY
)
36 RtlImageDirectoryEntryToData (BaseAddress
, TRUE
,
37 IMAGE_DIRECTORY_ENTRY_EXPORT
, &i
);
39 if (!ExportDir
|| !i
|| !ProcedureAddress
)
41 return(STATUS_INVALID_PARAMETER
);
44 AddressPtr
= (PULONG
)RVA((char*)BaseAddress
, ExportDir
->AddressOfFunctions
);
45 if (Name
&& Name
->Length
)
51 (PUSHORT
)RVA((char*)BaseAddress
, ExportDir
->AddressOfNameOrdinals
);
52 NamePtr
= (PULONG
)RVA((char*)BaseAddress
, ExportDir
->AddressOfNames
);
54 minn
= 0; maxn
= ExportDir
->NumberOfNames
;
60 mid
= (minn
+ maxn
) / 2;
61 res
= _strnicmp(Name
->Buffer
, (PCH
)RVA((char*)BaseAddress
, NamePtr
[mid
]),
66 (PVOID
)RVA((char*)BaseAddress
, AddressPtr
[OrdinalPtr
[mid
]]);
67 return(STATUS_SUCCESS
);
79 for (i
= 0; i
< ExportDir
->NumberOfNames
; i
++, NamePtr
++, OrdinalPtr
++)
81 if (!_strnicmp(Name
->Buffer
,
82 (char*)((char*)BaseAddress
+ *NamePtr
), Name
->Length
))
85 (PVOID
)((ULONG
)BaseAddress
+
86 (ULONG
)AddressPtr
[*OrdinalPtr
]);
87 return STATUS_SUCCESS
;
90 CPRINT("LdrGetProcedureAddress: Can't resolve symbol '%Z'\n", Name
);
95 Ordinal
&= 0x0000FFFF;
96 if (Ordinal
- ExportDir
->Base
< ExportDir
->NumberOfFunctions
)
99 (PVOID
)((ULONG
)BaseAddress
+
100 (ULONG
)AddressPtr
[Ordinal
- ExportDir
->Base
]);
101 return STATUS_SUCCESS
;
103 CPRINT("LdrGetProcedureAddress: Can't resolve symbol @%d\n",
107 return STATUS_PROCEDURE_NOT_FOUND
;