Author: tkreuzer Date: Sun Nov 29 16:51:46 2009 New Revision: 44320
URL: http://svn.reactos.org/svn/reactos?rev=44320&view=rev Log: [MM] MiReloadBootLoadedDrivers: - Allow images with relocations stripped. - Make sure NumberOfRvaAndSizes is *>* IMAGE_DIRECTORY_ENTRY_BASERELOC (== is not enough) - Move one ASSERT, remove a useless ASSERT
Modified: branches/ros-amd64-bringup/reactos/ntoskrnl/mm/sysldr.c
Modified: branches/ros-amd64-bringup/reactos/ntoskrnl/mm/sysldr.c URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/ntoskr... ============================================================================== --- branches/ros-amd64-bringup/reactos/ntoskrnl/mm/sysldr.c [iso-8859-1] (original) +++ branches/ros-amd64-bringup/reactos/ntoskrnl/mm/sysldr.c [iso-8859-1] Sun Nov 29 16:51:46 2009 @@ -1200,10 +1200,13 @@ PIMAGE_NT_HEADERS NtHeader; PLDR_DATA_TABLE_ENTRY LdrEntry; PIMAGE_FILE_HEADER FileHeader; - BOOLEAN ValidRelocs; + BOOLEAN ValidRelocs = FALSE; PIMAGE_DATA_DIRECTORY DataDirectory; PVOID DllBase, NewImageAddress; NTSTATUS Status; + + /* Sanity check */ + ASSERT(ExpInitializationPhase == 0);
/* Loop driver list */ for (NextEntry = LoaderBlock->LoadOrderListHead.Flink; @@ -1230,32 +1233,28 @@ /* Skip non-drivers */ if (!NtHeader) continue;
- /* Get the file header and make sure we can relocate */ + /* Get the file header and check if we can relocate */ FileHeader = &NtHeader->FileHeader; - if (FileHeader->Characteristics & IMAGE_FILE_RELOCS_STRIPPED) continue; - if (NtHeader->OptionalHeader.NumberOfRvaAndSizes < - IMAGE_DIRECTORY_ENTRY_BASERELOC) continue; - - /* Everything made sense until now, check the relocation section too */ - DataDirectory = &NtHeader->OptionalHeader. - DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC]; - if (!DataDirectory->VirtualAddress) - { - /* We don't really have relocations */ - ValidRelocs = FALSE; - } - else - { - /* Make sure the size is valid */ - if ((DataDirectory->VirtualAddress + DataDirectory->Size) > - LdrEntry->SizeOfImage) + if ( !(FileHeader->Characteristics & IMAGE_FILE_RELOCS_STRIPPED) && + (NtHeader->OptionalHeader.NumberOfRvaAndSizes > + IMAGE_DIRECTORY_ENTRY_BASERELOC) ) + { + /* Everything made sense until now, check the relocation section too */ + DataDirectory = &NtHeader->OptionalHeader. + DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC]; + if (DataDirectory->VirtualAddress) { - /* They're not, skip */ - continue; + /* Make sure the size is valid */ + if ((DataDirectory->VirtualAddress + DataDirectory->Size) > + LdrEntry->SizeOfImage) + { + /* They're not, skip */ + continue; + } + + /* We have relocations */ + ValidRelocs = TRUE; } - - /* We have relocations */ - ValidRelocs = TRUE; }
/* Remember the original address */ @@ -1270,9 +1269,7 @@ while (TRUE); }
- /* Sanity check */ DPRINT("[Mm0]: Copying from: %p to: %p\n", DllBase, NewImageAddress); - ASSERT(ExpInitializationPhase == 0);
/* Now copy the entire driver over */ RtlCopyMemory(NewImageAddress, DllBase, LdrEntry->SizeOfImage);