Author: tkreuzer Date: Sat Nov 7 04:33:00 2009 New Revision: 43993
URL: http://svn.reactos.org/svn/reactos?rev=43993&view=rev Log: [RTL] Simplify RtlLookupFunctionTable
Modified: branches/ros-amd64-bringup/reactos/lib/rtl/amd64/unwind.c
Modified: branches/ros-amd64-bringup/reactos/lib/rtl/amd64/unwind.c URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/lib/rt... ============================================================================== --- branches/ros-amd64-bringup/reactos/lib/rtl/amd64/unwind.c [iso-8859-1] (original) +++ branches/ros-amd64-bringup/reactos/lib/rtl/amd64/unwind.c [iso-8859-1] Sat Nov 7 04:33:00 2009 @@ -60,6 +60,17 @@
/* FUNCTIONS *****************************************************************/
+/*! RtlLookupFunctionTable + * \brief Locates the table of RUNTIME_FUNCTION entries for a code address. + * \param ControlPc + * Address of the code, for which the table should be searched. + * \param ImageBase + * Pointer to a DWORD64 that receives the base address of the + * corresponding executable image. + * \param Length + * Pointer to an ULONG that receives the number of table entries + * present in the table. + */ PRUNTIME_FUNCTION NTAPI RtlLookupFunctionTable( @@ -67,34 +78,27 @@ OUT PDWORD64 ImageBase, OUT PULONG Length) { - PIMAGE_DOS_HEADER DosHeader; - PIMAGE_NT_HEADERS NtHeader; - PIMAGE_DATA_DIRECTORY Directory; - - /* Find ModuleBase */ - if (!RtlPcToFileHeader((PVOID)ControlPc, (PVOID*)&DosHeader)) - { + PVOID Table; + ULONG Size; + + /* Find corresponding file header from code address */ + if (!RtlPcToFileHeader((PVOID)ControlPc, (PVOID*)ImageBase)) + { + /* Nothing found */ return NULL; }
- /* Locate NT header and check number of directories */ - NtHeader = (PVOID)((ULONG64)DosHeader + DosHeader->e_lfanew); - if (NtHeader->OptionalHeader.NumberOfRvaAndSizes - < IMAGE_DIRECTORY_ENTRY_EXCEPTION) - { - return NULL; - } - /* Locate the exception directory */ - Directory = &NtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION]; - *Length = Directory->Size / sizeof(RUNTIME_FUNCTION); - *ImageBase = (ULONG64)DosHeader; - if (!Directory->VirtualAddress) - { - return NULL; - } - - return (PVOID)((ULONG64)DosHeader + Directory->VirtualAddress); + Table = RtlImageDirectoryEntryToData((PVOID)*ImageBase, + TRUE, + IMAGE_DIRECTORY_ENTRY_EXCEPTION, + &Size); + + /* Return the number of entries */ + *Length = Size / sizeof(RUNTIME_FUNCTION); + + /* Return the address of the table */ + return Table; }
/*! RtlLookupFunctionEntry @@ -119,7 +123,7 @@ /* Fail, if no table is found */ if (!FunctionTable) { - return (PVOID)1; + return NULL; }
/* Use relative virtual address */