[ros-diffs] [fireball] 51117: [NTDLL] - Implement LdrpInitializeProcess(). Currently unused. - Add a whole bunch of supportive PE related code. Used only by the new code, which is not enabled yet in trunk. - I...

fireball at svn.reactos.org fireball at svn.reactos.org
Tue Mar 22 12:41:52 UTC 2011


Author: fireball
Date: Tue Mar 22 12:41:52 2011
New Revision: 51117

URL: http://svn.reactos.org/svn/reactos?rev=51117&view=rev
Log:
[NTDLL]
- Implement LdrpInitializeProcess(). Currently unused.
- Add a whole bunch of supportive PE related code. Used only by the new code, which is not enabled yet in trunk.
- Implement LdrpCheckForLoadedDll().
- Move on to usage of various global vars defined in the new code, rename some of them to match.
- Almost no changes for the codepath in trunk.

Modified:
    trunk/reactos/dll/ntdll/include/ntdllp.h
    trunk/reactos/dll/ntdll/ldr/ldrinit.c
    trunk/reactos/dll/ntdll/ldr/ldrpe.c
    trunk/reactos/dll/ntdll/ldr/ldrutils.c
    trunk/reactos/dll/ntdll/ldr/startup.c
    trunk/reactos/dll/ntdll/ldr/utils.c

Modified: trunk/reactos/dll/ntdll/include/ntdllp.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/ntdll/include/ntdllp.h?rev=51117&r1=51116&r2=51117&view=diff
==============================================================================
--- trunk/reactos/dll/ntdll/include/ntdllp.h [iso-8859-1] (original)
+++ trunk/reactos/dll/ntdll/include/ntdllp.h [iso-8859-1] Tue Mar 22 12:41:52 2011
@@ -26,6 +26,7 @@
 extern BOOLEAN LdrpInLdrInit;
 extern LIST_ENTRY LdrpHashTable[LDR_HASH_TABLE_ENTRIES];
 extern BOOLEAN ShowSnaps;
+extern UNICODE_STRING LdrpDefaultPath;
 
 /* ldrinit.c */
 NTSTATUS NTAPI LdrpRunInitializeRoutines(IN PCONTEXT Context OPTIONAL);

Modified: trunk/reactos/dll/ntdll/ldr/ldrinit.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/ntdll/ldr/ldrinit.c?rev=51117&r1=51116&r2=51117&view=diff
==============================================================================
--- trunk/reactos/dll/ntdll/ldr/ldrinit.c [iso-8859-1] (original)
+++ trunk/reactos/dll/ntdll/ldr/ldrinit.c [iso-8859-1] Tue Mar 22 12:41:52 2011
@@ -19,31 +19,69 @@
 HKEY Wow64ExecOptionsKey;
 UNICODE_STRING ImageExecOptionsString = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options");
 UNICODE_STRING Wow64OptionsString = RTL_CONSTANT_STRING(L"");
+UNICODE_STRING NtDllString = RTL_CONSTANT_STRING(L"ntdll.dll");
 
 BOOLEAN LdrpInLdrInit;
 LONG LdrpProcessInitialized;
+BOOLEAN LdrpLoaderLockInit;
+BOOLEAN LdrpLdrDatabaseIsSetup;
+
+BOOLEAN LdrpDllValidation;
 
 PLDR_DATA_TABLE_ENTRY LdrpImageEntry;
 PUNICODE_STRING LdrpTopLevelDllBeingLoaded;
 extern PTEB LdrpTopLevelDllBeingLoadedTeb; // defined in rtlsupp.c!
 PLDR_DATA_TABLE_ENTRY LdrpCurrentDllInitializer;
-
-//RTL_BITMAP TlsBitMap;
-//RTL_BITMAP TlsExpansionBitMap;
-//RTL_BITMAP FlsBitMap;
+PLDR_DATA_TABLE_ENTRY LdrpNtDllDataTableEntry;
+
+RTL_BITMAP TlsBitMap;
+RTL_BITMAP TlsExpansionBitMap;
+RTL_BITMAP FlsBitMap;
 BOOLEAN LdrpImageHasTls;
 LIST_ENTRY LdrpTlsList;
 ULONG LdrpNumberOfTlsEntries;
 ULONG LdrpNumberOfProcessors;
-
-RTL_CRITICAL_SECTION LdrpLoaderLock;
+PVOID NtDllBase;
+LARGE_INTEGER RtlpTimeout;
+BOOLEAN RtlpTimeoutDisable;
+LIST_ENTRY LdrpHashTable[LDR_HASH_TABLE_ENTRIES];
+LIST_ENTRY LdrpDllNotificationList;
+HANDLE LdrpKnownDllObjectDirectory;
+UNICODE_STRING LdrpKnownDllPath;
+WCHAR LdrpKnownDllPathBuffer[128];
+UNICODE_STRING LdrpDefaultPath;
+
+PEB_LDR_DATA PebLdr;
+
+RTL_CRITICAL_SECTION_DEBUG LdrpLoaderLockDebug;
+RTL_CRITICAL_SECTION LdrpLoaderLock =
+{
+    &LdrpLoaderLockDebug,
+    -1,
+    0,
+    0,
+    0,
+    0
+};
+RTL_CRITICAL_SECTION FastPebLock;
 
 BOOLEAN ShowSnaps;
 
 ULONG LdrpFatalHardErrorCount;
+
+//extern LIST_ENTRY RtlCriticalSectionList;
 
 VOID RtlpInitializeVectoredExceptionHandling(VOID);
 VOID NTAPI RtlpInitDeferedCriticalSection(VOID);
+VOID RtlInitializeHeapManager(VOID);
+extern BOOLEAN RtlpPageHeapEnabled;
+extern ULONG RtlpDphGlobalFlags;
+
+NTSTATUS LdrPerformRelocations(PIMAGE_NT_HEADERS NTHeaders, PVOID ImageBase);
+NTSTATUS NTAPI
+LdrpInitializeProcess_(PCONTEXT Context,
+                      PVOID SystemArgument1);
+
 
 /* FUNCTIONS *****************************************************************/
 
@@ -455,12 +493,10 @@
     /* Show debug message */
     if (ShowSnaps)
     {
-        DPRINT1("[%x,%x] LDR: Real INIT LIST for Process %wZ pid %u %0x%x\n",
+        DPRINT1("[%x,%x] LDR: Real INIT LIST for Process %wZ\n",
                 NtCurrentTeb()->RealClientId.UniqueThread,
                 NtCurrentTeb()->RealClientId.UniqueProcess,
-                Peb->ProcessParameters->ImagePathName,
-                NtCurrentTeb()->RealClientId.UniqueThread,
-                NtCurrentTeb()->RealClientId.UniqueProcess);
+                &Peb->ProcessParameters->ImagePathName);
     }
 
     /* Loop in order */
@@ -838,6 +874,644 @@
                 TlsVector);
 }
 
+NTSTATUS
+NTAPI
+LdrpInitializeExecutionOptions(PUNICODE_STRING ImagePathName, PPEB Peb, PULONG Options)
+{
+    UNIMPLEMENTED;
+    *Options = 0;
+    return STATUS_SUCCESS;
+}
+
+VOID
+NTAPI
+LdrpValidateImageForMp(IN PLDR_DATA_TABLE_ENTRY LdrDataTableEntry)
+{
+    UNIMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+LdrpInitializeProcess(IN PCONTEXT Context,
+                      IN PVOID SystemArgument1)
+{
+    RTL_HEAP_PARAMETERS HeapParameters;
+    ULONG ComSectionSize;
+    //ANSI_STRING FunctionName = RTL_CONSTANT_STRING("BaseQueryModuleData");
+    PVOID OldShimData;
+    OBJECT_ATTRIBUTES ObjectAttributes;
+    //UNICODE_STRING LocalFileName, FullImageName;
+    HANDLE SymLinkHandle;
+    //ULONG DebugHeapOnly;
+    UNICODE_STRING CommandLine, NtSystemRoot, ImagePathName, FullPath, ImageFileName, KnownDllString;
+    PPEB Peb = NtCurrentPeb();
+    BOOLEAN IsDotNetImage = FALSE;
+    BOOLEAN FreeCurDir = FALSE;
+    //HKEY CompatKey;
+    PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
+    //LPWSTR ImagePathBuffer;
+    ULONG ConfigSize;
+    UNICODE_STRING CurrentDirectory;
+    ULONG ExecuteOptions;
+    ULONG HeapFlags;
+    PIMAGE_NT_HEADERS NtHeader;
+    LPWSTR NtDllName = NULL;
+    NTSTATUS Status;
+    NLSTABLEINFO NlsTable;
+    PIMAGE_LOAD_CONFIG_DIRECTORY LoadConfig;
+    PTEB Teb = NtCurrentTeb();
+    PLIST_ENTRY ListHead;
+    PLIST_ENTRY NextEntry;
+    ULONG i;
+    PWSTR ImagePath;
+    ULONG DebugProcessHeapOnly = 0;
+    WCHAR FullNtDllPath[MAX_PATH];
+    PLDR_DATA_TABLE_ENTRY NtLdrEntry;
+    PWCHAR Current;
+
+    /* Set a NULL SEH Filter */
+    RtlSetUnhandledExceptionFilter(NULL);
+
+    /* Get the image path */
+    ImagePath = Peb->ProcessParameters->ImagePathName.Buffer;
+
+    /* Check if it's normalized */
+    if (Peb->ProcessParameters->Flags & RTL_USER_PROCESS_PARAMETERS_NORMALIZED)
+    {
+        /* Normalize it*/
+        ImagePath = (PWSTR)((ULONG_PTR)ImagePath + (ULONG_PTR)Peb->ProcessParameters);
+    }
+
+    /* Create a unicode string for the Image Path */
+    ImagePathName.Length = Peb->ProcessParameters->ImagePathName.Length;
+    ImagePathName.MaximumLength = ImagePathName.Length + sizeof(WCHAR);
+    ImagePathName.Buffer = ImagePath;
+
+    /* Get the NT Headers */
+    NtHeader = RtlImageNtHeader(Peb->ImageBaseAddress);
+
+    /* Get the execution options */
+    Status = LdrpInitializeExecutionOptions(&ImagePathName, Peb, &ExecuteOptions);
+
+    /* Check if this is a .NET executable */
+    if (RtlImageDirectoryEntryToData(Peb->ImageBaseAddress,
+                                     TRUE,
+                                     IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR,
+                                     &ComSectionSize))
+    {
+        /* Remeber this for later */
+        IsDotNetImage = TRUE;
+    }
+
+    /* Save the NTDLL Base address */
+    NtDllBase = SystemArgument1;
+
+    /* If this is a Native Image */
+    if (NtHeader->OptionalHeader.Subsystem == IMAGE_SUBSYSTEM_NATIVE)
+    {
+        /* Then do DLL Validation */
+        LdrpDllValidation = TRUE;
+    }
+
+    /* Save the old Shim Data */
+    OldShimData = Peb->pShimData;
+
+    /* Clear it */
+    Peb->pShimData = NULL;
+
+    /* Save the number of processors and CS Timeout */
+    LdrpNumberOfProcessors = Peb->NumberOfProcessors;
+    RtlpTimeout = Peb->CriticalSectionTimeout;
+
+    /* Normalize the parameters */
+    ProcessParameters = RtlNormalizeProcessParams(Peb->ProcessParameters);
+    ProcessParameters = Peb->ProcessParameters;
+    if (ProcessParameters)
+    {
+        /* Save the Image and Command Line Names */
+        ImageFileName = ProcessParameters->ImagePathName;
+        CommandLine = ProcessParameters->CommandLine;
+    }
+    else
+    {
+        /* It failed, initialize empty strings */
+        RtlInitUnicodeString(&ImageFileName, NULL);
+        RtlInitUnicodeString(&CommandLine, NULL);
+    }
+
+    /* Initialize NLS data */
+    RtlInitNlsTables(Peb->AnsiCodePageData,
+                     Peb->OemCodePageData,
+                     Peb->UnicodeCaseTableData,
+                     &NlsTable);
+
+    /* Reset NLS Translations */
+    RtlResetRtlTranslations(&NlsTable);
+
+    /* Get the Image Config Directory */
+    LoadConfig = RtlImageDirectoryEntryToData(Peb->ImageBaseAddress,
+                                              TRUE,
+                                              IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG,
+                                              &ConfigSize);
+
+    /* Setup the Heap Parameters */
+    RtlZeroMemory(&HeapParameters, sizeof(RTL_HEAP_PARAMETERS));
+    HeapFlags = HEAP_GROWABLE;
+    HeapParameters.Length = sizeof(RTL_HEAP_PARAMETERS);
+
+    /* Check if we have Configuration Data */
+    if ((LoadConfig) && (ConfigSize == sizeof(IMAGE_LOAD_CONFIG_DIRECTORY)))
+    {
+        /* FIXME: Custom heap settings and misc. */
+        DPRINT1("We don't support LOAD_CONFIG data yet\n");
+    }
+
+    /* Check for custom affinity mask */
+    if (Peb->ImageProcessAffinityMask)
+    {
+        /* Set it */
+        Status = NtSetInformationProcess(NtCurrentProcess(),
+                                         ProcessAffinityMask,
+                                         &Peb->ImageProcessAffinityMask,
+                                         sizeof(Peb->ImageProcessAffinityMask));
+    }
+
+    /* Check if verbose debugging (ShowSnaps) was requested */
+    ShowSnaps = TRUE;//Peb->NtGlobalFlag & FLG_SHOW_LDR_SNAPS;
+
+    /* Start verbose debugging messages right now if they were requested */
+    if (ShowSnaps)
+    {
+        DPRINT1("LDR: PID: 0x%x started - '%wZ'\n",
+                Teb->ClientId.UniqueProcess,
+                &CommandLine);
+    }
+
+    /* If the timeout is too long */
+    if (RtlpTimeout.QuadPart < Int32x32To64(3600, -10000000))
+    {
+        /* Then disable CS Timeout */
+        RtlpTimeoutDisable = TRUE;
+    }
+
+    /* Initialize Critical Section Data */
+    RtlpInitDeferedCriticalSection();
+
+    /* Initialize VEH Call lists */
+    RtlpInitializeVectoredExceptionHandling();
+
+    /* Set TLS/FLS Bitmap data */
+    Peb->FlsBitmap = &FlsBitMap;
+    Peb->TlsBitmap = &TlsBitMap;
+    Peb->TlsExpansionBitmap = &TlsExpansionBitMap;
+
+    /* Initialize FLS Bitmap */
+    RtlInitializeBitMap(&FlsBitMap,
+                        Peb->FlsBitmapBits,
+                        FLS_MAXIMUM_AVAILABLE);
+    RtlSetBit(&FlsBitMap, 0);
+
+    /* Initialize TLS Bitmap */
+    RtlInitializeBitMap(&TlsBitMap,
+                        Peb->TlsBitmapBits,
+                        TLS_MINIMUM_AVAILABLE);
+    RtlSetBit(&TlsBitMap, 0);
+    RtlInitializeBitMap(&TlsExpansionBitMap,
+                        Peb->TlsExpansionBitmapBits,
+                        TLS_EXPANSION_SLOTS);
+    RtlSetBit(&TlsExpansionBitMap, 0);
+
+    /* Initialize the Hash Table */
+    for (i = 0; i < LDR_HASH_TABLE_ENTRIES; i++)
+    {
+        InitializeListHead(&LdrpHashTable[i]);
+    }
+
+    /* Initialize the Loader Lock */
+    //InsertTailList(&RtlCriticalSectionList, &LdrpLoaderLock.DebugInfo->ProcessLocksList);
+    //LdrpLoaderLock.DebugInfo->CriticalSection = &LdrpLoaderLock;
+    UNIMPLEMENTED;
+    LdrpLoaderLockInit = TRUE;
+
+    /* Check if User Stack Trace Database support was requested */
+    if (Peb->NtGlobalFlag & FLG_USER_STACK_TRACE_DB)
+    {
+        DPRINT1("We don't support user stack trace databases yet\n");
+    }
+
+    /* Setup Fast PEB Lock */
+    RtlInitializeCriticalSection(&FastPebLock);
+    Peb->FastPebLock = &FastPebLock;
+    //Peb->FastPebLockRoutine = (PPEBLOCKROUTINE)RtlEnterCriticalSection;
+    //Peb->FastPebUnlockRoutine = (PPEBLOCKROUTINE)RtlLeaveCriticalSection;
+
+    /* Setup Callout Lock and Notification list */
+    //RtlInitializeCriticalSection(&RtlpCalloutEntryLock);
+    InitializeListHead(&LdrpDllNotificationList);
+
+    /* For old executables, use 16-byte aligned heap */
+    if ((NtHeader->OptionalHeader.MajorSubsystemVersion <= 3) &&
+        (NtHeader->OptionalHeader.MinorSubsystemVersion < 51))
+    {
+        HeapFlags |= HEAP_CREATE_ALIGN_16;
+    }
+
+    /* Setup the Heap */
+    RtlInitializeHeapManager();
+    Peb->ProcessHeap = RtlCreateHeap(HeapFlags,
+                                     NULL,
+                                     NtHeader->OptionalHeader.SizeOfHeapReserve,
+                                     NtHeader->OptionalHeader.SizeOfHeapCommit,
+                                     NULL,
+                                     &HeapParameters);
+
+    if (!Peb->ProcessHeap)
+    {
+        DPRINT1("Failed to create process heap\n");
+        return STATUS_NO_MEMORY;
+    }
+
+    /* Allocate an Activation Context Stack */
+    Status = RtlAllocateActivationContextStack((PVOID *)&Teb->ActivationContextStackPointer);
+    if (!NT_SUCCESS(Status)) return Status;
+
+    // FIXME: Loader private heap is missing
+    DPRINT1("Loader private heap is missing\n");
+
+    /* Check for Debug Heap */
+    DPRINT1("Check for a debug heap is missing\n");
+    if (FALSE)
+    {
+        /* Query the setting */
+        Status = LdrQueryImageFileKeyOption(NULL,//hKey
+                                            L"DebugProcessHeapOnly",
+                                            REG_DWORD,
+                                            &DebugProcessHeapOnly,
+                                            sizeof(ULONG),
+                                            NULL);
+
+        if (NT_SUCCESS(Status))
+        {
+            /* Reset DPH if requested */
+            if (RtlpPageHeapEnabled && DebugProcessHeapOnly)
+            {
+                RtlpDphGlobalFlags &= ~0x40;
+                RtlpPageHeapEnabled = FALSE;
+            }
+        }
+    }
+
+    /* Build the NTDLL Path */
+    FullPath.Buffer = FullNtDllPath;
+    FullPath.Length = 0;
+    FullPath.MaximumLength = sizeof(FullNtDllPath);
+    RtlInitUnicodeString(&NtSystemRoot, SharedUserData->NtSystemRoot);
+    RtlAppendUnicodeStringToString(&FullPath, &NtSystemRoot);
+    RtlAppendUnicodeToString(&FullPath, L"\\System32\\");
+
+    /* Open the Known DLLs directory */
+    RtlInitUnicodeString(&KnownDllString, L"\\KnownDlls");
+    InitializeObjectAttributes(&ObjectAttributes,
+                               &KnownDllString,
+                               OBJ_CASE_INSENSITIVE,
+                               NULL,
+                               NULL);
+    Status = ZwOpenDirectoryObject(&LdrpKnownDllObjectDirectory,
+                                   DIRECTORY_QUERY | DIRECTORY_TRAVERSE,
+                                   &ObjectAttributes);
+
+    /* Check if it exists */
+    if (!NT_SUCCESS(Status))
+    {
+        /* It doesn't, so assume System32 */
+        LdrpKnownDllObjectDirectory = NULL;
+        RtlInitUnicodeString(&LdrpKnownDllPath, FullPath.Buffer);
+        LdrpKnownDllPath.Length -= sizeof(WCHAR);
+    }
+    else
+    {
+        /* Open the Known DLLs Path */
+        InitializeObjectAttributes(&ObjectAttributes,
+                                   &KnownDllString,
+                                   OBJ_CASE_INSENSITIVE,
+                                   LdrpKnownDllObjectDirectory,
+                                   NULL);
+        Status = NtOpenSymbolicLinkObject(&SymLinkHandle,
+                                          SYMBOLIC_LINK_QUERY,
+                                          &ObjectAttributes);
+        if (NT_SUCCESS(Status))
+        {
+            /* Query the path */
+            LdrpKnownDllPath.Length = 0;
+            LdrpKnownDllPath.MaximumLength = sizeof(LdrpKnownDllPathBuffer);
+            LdrpKnownDllPath.Buffer = LdrpKnownDllPathBuffer;
+            Status = ZwQuerySymbolicLinkObject(SymLinkHandle, &LdrpKnownDllPath, NULL);
+            NtClose(SymLinkHandle);
+            if (!NT_SUCCESS(Status))
+            {
+                DPRINT1("LDR: %s - failed call to ZwQuerySymbolicLinkObject with status %x\n", "", Status);
+                return Status;
+            }
+        }
+    }
+
+    /* If we have process parameters, get the default path and current path */
+    if (ProcessParameters)
+    {
+        /* Check if we have a Dll Path */
+        if (ProcessParameters->DllPath.Length)
+        {
+            /* Get the path */
+            LdrpDefaultPath = *(PUNICODE_STRING)&ProcessParameters->DllPath;
+        }
+        else
+        {
+            /* We need a valid path */
+            LdrpInitFailure(STATUS_INVALID_PARAMETER);
+        }
+
+        /* Set the current directory */
+        CurrentDirectory = ProcessParameters->CurrentDirectory.DosPath;
+
+        /* Check if it's empty or invalid */
+        if ((!CurrentDirectory.Buffer) ||
+            (CurrentDirectory.Buffer[0] == UNICODE_NULL) ||
+            (!CurrentDirectory.Length))
+        {
+            /* Allocate space for the buffer */
+            CurrentDirectory.Buffer = RtlAllocateHeap(Peb->ProcessHeap,
+                                                      0,
+                                                      3 * sizeof(WCHAR) +
+                                                      sizeof(UNICODE_NULL));
+
+            /* Copy the drive of the system root */
+            RtlMoveMemory(CurrentDirectory.Buffer,
+                          SharedUserData->NtSystemRoot,
+                          3 * sizeof(WCHAR));
+            CurrentDirectory.Buffer[3] = UNICODE_NULL;
+            CurrentDirectory.Length = 3 * sizeof(WCHAR);
+            CurrentDirectory.MaximumLength = CurrentDirectory.Length + sizeof(WCHAR);
+
+            FreeCurDir = TRUE;
+        }
+        else
+        {
+            /* Use the local buffer */
+            CurrentDirectory.Length = NtSystemRoot.Length;
+            CurrentDirectory.Buffer = NtSystemRoot.Buffer;
+        }
+    }
+
+    /* Setup Loader Data */
+    Peb->Ldr = &PebLdr;
+    InitializeListHead(&PebLdr.InLoadOrderModuleList);
+    InitializeListHead(&PebLdr.InMemoryOrderModuleList);
+    InitializeListHead(&PebLdr.InInitializationOrderModuleList);
+    PebLdr.Length = sizeof(PEB_LDR_DATA);
+    PebLdr.Initialized = TRUE;
+
+    /* Allocate a data entry for the Image */
+    LdrpImageEntry = NtLdrEntry = LdrpAllocateDataTableEntry(Peb->ImageBaseAddress);
+
+    /* Set it up */
+    NtLdrEntry->EntryPoint = LdrpFetchAddressOfEntryPoint(NtLdrEntry->DllBase);
+    NtLdrEntry->LoadCount = -1;
+    NtLdrEntry->EntryPointActivationContext = 0;
+    NtLdrEntry->FullDllName.Length = ImageFileName.Length;
+    NtLdrEntry->FullDllName.Buffer = ImageFileName.Buffer;
+    if (IsDotNetImage)
+        NtLdrEntry->Flags = LDRP_COR_IMAGE;
+    else
+        NtLdrEntry->Flags = 0;
+
+    /* Check if the name is empty */
+    if (!ImageFileName.Buffer[0])
+    {
+        /* Use the same Base name */
+        NtLdrEntry->BaseDllName = NtLdrEntry->BaseDllName;
+    }
+    else
+    {
+        /* Find the last slash */
+        Current = ImageFileName.Buffer;
+        while (*Current)
+        {
+            if (*Current++ == '\\')
+            {
+                /* Set this path */
+                NtDllName = Current;
+            }
+        }
+
+        /* Did we find anything? */
+        if (!NtDllName)
+        {
+            /* Use the same Base name */
+            NtLdrEntry->BaseDllName = NtLdrEntry->FullDllName;
+        }
+        else
+        {
+            /* Setup the name */
+            NtLdrEntry->BaseDllName.Length = (USHORT)((ULONG_PTR)ImageFileName.Buffer + ImageFileName.Length - (ULONG_PTR)NtDllName);
+            NtLdrEntry->BaseDllName.MaximumLength = NtLdrEntry->BaseDllName.Length + sizeof(WCHAR);
+            NtLdrEntry->BaseDllName.Buffer = (PWSTR)((ULONG_PTR)ImageFileName.Buffer +
+                                                     (ImageFileName.Length - NtLdrEntry->BaseDllName.Length));
+        }
+    }
+
+    /* Processing done, insert it */
+    LdrpInsertMemoryTableEntry(NtLdrEntry);
+    NtLdrEntry->Flags |= LDRP_ENTRY_PROCESSED;
+
+    /* Now add an entry for NTDLL */
+    NtLdrEntry = LdrpAllocateDataTableEntry(SystemArgument1);
+    NtLdrEntry->Flags = LDRP_IMAGE_DLL;
+    NtLdrEntry->EntryPoint = LdrpFetchAddressOfEntryPoint(NtLdrEntry->DllBase);
+    NtLdrEntry->LoadCount = -1;
+    NtLdrEntry->EntryPointActivationContext = 0;
+    //NtLdrEntry->BaseDllName.Length = NtSystemRoot.Length;
+    //RtlAppendUnicodeStringToString(&NtSystemRoot, &NtDllString);
+    NtLdrEntry->BaseDllName.Length = NtDllString.Length;
+    NtLdrEntry->BaseDllName.MaximumLength = NtDllString.MaximumLength;
+    NtLdrEntry->BaseDllName.Buffer = NtDllString.Buffer;
+
+    // FIXME: Full DLL name?!
+
+    /* Processing done, insert it */
+    LdrpNtDllDataTableEntry = NtLdrEntry;
+    LdrpInsertMemoryTableEntry(NtLdrEntry);
+
+    /* Let the world know */
+    if (ShowSnaps)
+    {
+        DPRINT1("LDR: NEW PROCESS\n");
+        DPRINT1("     Image Path: %wZ (%wZ)\n", &LdrpImageEntry->FullDllName, &LdrpImageEntry->BaseDllName);
+        DPRINT1("     Current Directory: %wZ\n", &CurrentDirectory);
+        DPRINT1("     Search Path: %wZ\n", &LdrpDefaultPath);
+    }
+
+    /* Link the Init Order List */
+    InsertHeadList(&Peb->Ldr->InInitializationOrderModuleList,
+                   &LdrpNtDllDataTableEntry->InInitializationOrderModuleList);
+
+    /* Set the current directory */
+    Status = RtlSetCurrentDirectory_U(&CurrentDirectory);
+    if (!NT_SUCCESS(Status))
+    {
+        /* We failed, check if we should free it */
+        if (FreeCurDir) RtlFreeUnicodeString(&CurrentDirectory);
+
+        /* Set it to the NT Root */
+        CurrentDirectory = NtSystemRoot;
+        RtlSetCurrentDirectory_U(&CurrentDirectory);
+    }
+    else
+    {
+        /* We're done with it, free it */
+        if (FreeCurDir) RtlFreeUnicodeString(&CurrentDirectory);
+    }
+
+    /* Check if we should look for a .local file */
+    if (ProcessParameters->Flags & RTL_USER_PROCESS_PARAMETERS_LOCAL_DLL_PATH)
+    {
+        /* FIXME */
+        DPRINT1("We don't support .local overrides yet\n");
+    }
+
+    /* Check if the Application Verifier was enabled */
+    if (Peb->NtGlobalFlag & FLG_POOL_ENABLE_TAIL_CHECK)
+    {
+        /* FIXME */
+        DPRINT1("We don't support Application Verifier yet\n");
+    }
+
+    if (IsDotNetImage)
+    {
+        /* FIXME */
+        DPRINT1("We don't support .NET applications yet\n");
+    }
+
+    /* FIXME: Load support for Terminal Services */
+    if (NtHeader->OptionalHeader.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_GUI)
+    {
+        /* Load kernel32 and call BasePostImportInit... */
+        DPRINT1("Unimplemented codepath!\n");
+    }
+
+    /* Walk the IAT and load all the DLLs */
+    LdrpWalkImportDescriptor(LdrpDefaultPath.Buffer, LdrpImageEntry);
+
+    /* Check if relocation is needed */
+    if (Peb->ImageBaseAddress != (PVOID)NtHeader->OptionalHeader.ImageBase)
+    {
+        DPRINT("LDR: Performing relocations\n");
+        Status = LdrPerformRelocations(NtHeader, Peb->ImageBaseAddress);
+        if (!NT_SUCCESS(Status))
+        {
+            DPRINT1("LdrPerformRelocations() failed\n");
+            return STATUS_INVALID_IMAGE_FORMAT;
+        }
+    }
+
+    /* Lock the DLLs */
+    ListHead = &Peb->Ldr->InLoadOrderModuleList;
+    NextEntry = ListHead->Flink;
+    while (ListHead != NextEntry)
+    {
+        NtLdrEntry = CONTAINING_RECORD(NextEntry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
+        NtLdrEntry->LoadCount = -1;
+        NextEntry = NextEntry->Flink;
+    }
+
+    /* Phase 0 is done */
+    LdrpLdrDatabaseIsSetup = TRUE;
+
+    /* Initialize TLS */
+    Status = LdrpInitializeTls();
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("LDR: LdrpProcessInitialization failed to initialize TLS slots; status %x\n",
+                Status);
+        return Status;
+    }
+
+    /* FIXME Mark the DLL Ranges for Stack Traces later */
+
+    /* Notify the debugger now */
+    if (Peb->BeingDebugged)
+    {
+        /* Break */
+        DbgBreakPoint();
+
+        /* Update show snaps again */
+        ShowSnaps = Peb->NtGlobalFlag & FLG_SHOW_LDR_SNAPS;
+    }
+
+    /* Validate the Image for MP Usage */
+    if (LdrpNumberOfProcessors > 1) LdrpValidateImageForMp(LdrpImageEntry);
+
+    /* Check NX Options */
+    if (SharedUserData->NXSupportPolicy == 1)
+    {
+        ExecuteOptions = 0xD;
+    }
+    else if (!SharedUserData->NXSupportPolicy)
+    {
+        ExecuteOptions = 0xA;
+    }
+
+    /* Let Mm know */
+    ZwSetInformationProcess(NtCurrentProcess(),
+                            ProcessExecuteFlags,
+                            &ExecuteOptions,
+                            sizeof(ULONG));
+
+    /* Check if we had Shim Data */
+    if (OldShimData)
+    {
+        /* Load the Shim Engine */
+        Peb->AppCompatInfo = NULL;
+        //LdrpLoadShimEngine(OldShimData, ImagePathName, OldShimData);
+        DPRINT1("We do not support shims yet\n");
+    }
+    else
+    {
+        /* Check for Application Compatibility Goo */
+        //LdrQueryApplicationCompatibilityGoo(hKey);
+        DPRINT1("Querying app compat hacks is missing!\n");
+    }
+
+    /*
+     * FIXME: Check for special images, SecuROM, SafeDisc and other NX-
+     * incompatible images.
+     */
+
+    /* Now call the Init Routines */
+    Status = LdrpRunInitializeRoutines(Context);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("LDR: LdrpProcessInitialization failed running initialization routines; status %x\n",
+                Status);
+        return Status;
+    }
+
+    /* FIXME: Unload the Shim Engine if it was loaded */
+
+    /* Check if we have a user-defined Post Process Routine */
+    if (NT_SUCCESS(Status) && Peb->PostProcessInitRoutine)
+    {
+        DPRINT1("CP\n");
+        /* Call it */
+        Peb->PostProcessInitRoutine();
+    }
+
+    ///* Close the key if we have one opened */
+    //if (hKey) NtClose(hKey);
+DbgBreakPoint();
+    /* Return status */
+    return Status;
+}
+
 VOID
 NTAPI
 LdrpInitFailure(NTSTATUS Status)
@@ -915,17 +1589,11 @@
         /* Let other code know we're initializing */
         LdrpInLdrInit = TRUE;
 
-        /* Initialize Critical Section Data */
-        RtlpInitDeferedCriticalSection();
-
-        /* Initialize VEH Call lists */
-        RtlpInitializeVectoredExceptionHandling();
-
         /* Protect with SEH */
         _SEH2_TRY
         {
             /* Initialize the Process */
-            LoaderStatus = LdrpInitializeProcess(Context,
+            LoaderStatus = LdrpInitializeProcess_(Context,
                                                  SystemArgument1);
 
             /* Check for success and if MinimumStackCommit was requested */

Modified: trunk/reactos/dll/ntdll/ldr/ldrpe.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/ntdll/ldr/ldrpe.c?rev=51117&r1=51116&r2=51117&view=diff
==============================================================================
--- trunk/reactos/dll/ntdll/ldr/ldrpe.c [iso-8859-1] (original)
+++ trunk/reactos/dll/ntdll/ldr/ldrpe.c [iso-8859-1] Tue Mar 22 12:41:52 2011
@@ -29,6 +29,595 @@
                      OUT PBOOLEAN Existing);
 
 /* FUNCTIONS *****************************************************************/
+
+NTSTATUS
+NTAPI
+LdrpSnapIAT(IN PLDR_DATA_TABLE_ENTRY ExportLdrEntry,
+            IN PLDR_DATA_TABLE_ENTRY ImportLdrEntry,
+            IN PIMAGE_IMPORT_DESCRIPTOR IatEntry,
+            IN BOOLEAN EntriesValid)
+{
+    PIMAGE_EXPORT_DIRECTORY ExportDirectory;
+    ULONG ExportSize;
+    PVOID Iat;
+    SIZE_T ImportSize;
+    ULONG IatSize;
+    //PPEB Peb = NtCurrentPeb();
+    NTSTATUS Status;
+    PIMAGE_THUNK_DATA Thunk, OriginalThunk, FirstThunk;
+    LPSTR ImportName;
+    ULONG ForwarderChain;
+    PIMAGE_NT_HEADERS NtHeader;
+    PIMAGE_SECTION_HEADER SectionHeader;
+    ULONG i, Rva;
+    ULONG OldProtect;
+
+    /* Get export directory */
+    ExportDirectory = RtlImageDirectoryEntryToData(ExportLdrEntry->DllBase,
+                                                   TRUE,
+                                                   IMAGE_DIRECTORY_ENTRY_EXPORT,
+                                                   &ExportSize);
+
+    /* Make sure it has one */
+    if (!ExportDirectory) return STATUS_INVALID_IMAGE_FORMAT;
+
+    /* Get the IAT */
+    Iat = RtlImageDirectoryEntryToData(ImportLdrEntry->DllBase,
+                                       TRUE,
+                                       IMAGE_DIRECTORY_ENTRY_IAT,
+                                       &IatSize);
+    ImportSize = IatSize;
+
+    /* Check if we don't have one */
+    if (!Iat)
+    {
+        /* Get the NT Header and the first section */
+        NtHeader = RtlImageNtHeader(ImportLdrEntry->DllBase);
+        SectionHeader = IMAGE_FIRST_SECTION(NtHeader);
+
+        /* Get the RVA of the import directory */
+        Rva = NtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
+
+        /* Make sure we got one */
+        if (Rva)
+        {
+            /* Loop all the sections */
+            for (i = 0; i < NtHeader->FileHeader.NumberOfSections; i++)
+            {
+                /* Check if we are inside this section */
+                if ((Rva >= SectionHeader->VirtualAddress) &&
+                    (Rva < (SectionHeader->VirtualAddress +
+                     SectionHeader->SizeOfRawData)))
+                {
+                    /* We are, so set the IAT here */
+                    Iat = (PVOID)((ULONG_PTR)(ImportLdrEntry->DllBase) +
+                                      SectionHeader->VirtualAddress);
+
+                    /* Set the size */
+                    IatSize = SectionHeader->Misc.VirtualSize;
+
+                    /* Deal with Watcom and other retarded compilers */
+                    if (!IatSize)
+                    {
+                        IatSize = SectionHeader->SizeOfRawData;
+                    }
+                    
+                    /* Found it, get out */
+                    break;
+                }
+
+                /* No match, move to the next section */
+                ++SectionHeader;
+            }
+        }
+
+        /* If we still don't have an IAT, that's bad */
+        if (!Iat) return STATUS_INVALID_IMAGE_FORMAT;
+
+        /* Set the right size */
+        ImportSize = IatSize;
+    }
+
+    /* Unprotect the IAT */
+    Status = NtProtectVirtualMemory(NtCurrentProcess(),
+                                    &Iat,
+                                    &ImportSize,
+                                    PAGE_READWRITE,
+                                    &OldProtect);
+    if (!NT_SUCCESS(Status)) return Status;
+
+    /* Check if the Thunks are already valid */
+    if (EntriesValid)
+    {
+        /* We'll only do forwarders. Get the import name */
+        ImportName = (LPSTR)((ULONG_PTR)ImportLdrEntry->DllBase + IatEntry->Name);
+
+        /* Get the list of forwaders */
+        ForwarderChain = IatEntry->ForwarderChain;
+
+        /* Loop them */
+        while (ForwarderChain != -1)
+        {
+            /* Get the cached thunk VA*/
+            OriginalThunk = (PIMAGE_THUNK_DATA)
+                            ((ULONG_PTR)ImportLdrEntry->DllBase +
+                             IatEntry->OriginalFirstThunk +
+                             (ForwarderChain * sizeof(IMAGE_THUNK_DATA)));
+
+            /* Get the first thunk */
+            FirstThunk = (PIMAGE_THUNK_DATA)
+                         ((ULONG_PTR)ImportLdrEntry->DllBase +
+                          IatEntry->FirstThunk +
+                          (ForwarderChain * sizeof(IMAGE_THUNK_DATA)));
+
+            /* Get the Forwarder from the thunk */
+            ForwarderChain = (ULONG)FirstThunk->u1.Ordinal;
+
+            /* Snap the thunk */
+            Status = LdrpSnapThunk(ExportLdrEntry->DllBase,
+                                   ImportLdrEntry->DllBase,
+                                   OriginalThunk,
+                                   FirstThunk,
+                                   ExportDirectory,
+                                   ExportSize,
+                                   TRUE,
+                                   ImportName);
+
+            /* Move to the next thunk */
+            FirstThunk++;
+
+            /* If we messed up, exit */
+            if (!NT_SUCCESS(Status)) break;
+        }
+    }
+    else if (IatEntry->FirstThunk)
+    {
+        /* Full snapping. Get the First thunk */
+        FirstThunk = (PIMAGE_THUNK_DATA)
+                      ((ULONG_PTR)ImportLdrEntry->DllBase +
+                       IatEntry->FirstThunk);
+
+        /* Get the NT Header */
+        NtHeader = RtlImageNtHeader(ImportLdrEntry->DllBase);
+
+        /* Get the Original thunk VA, watch out for weird images */
+        if ((IatEntry->Characteristics < NtHeader->OptionalHeader.SizeOfHeaders) ||
+            (IatEntry->Characteristics >= NtHeader->OptionalHeader.SizeOfImage))
+        {
+            /* Reuse it, this is a strange linked file */
+            OriginalThunk = FirstThunk;
+        }
+        else
+        {
+            /* Get the address from the field and convert to VA */
+            OriginalThunk = (PIMAGE_THUNK_DATA)
+                            ((ULONG_PTR)ImportLdrEntry->DllBase +
+                             IatEntry->OriginalFirstThunk);
+        }
+
+        /* Get the Import name VA */
+        ImportName = (LPSTR)((ULONG_PTR)ImportLdrEntry->DllBase +
+                             IatEntry->Name);
+
+        /* Loop while it's valid */
+        while (OriginalThunk->u1.AddressOfData)
+        {
+            /* Snap the Thunk */
+            Status = LdrpSnapThunk(ExportLdrEntry->DllBase,
+                                   ImportLdrEntry->DllBase,
+                                   OriginalThunk,
+                                   FirstThunk,
+                                   ExportDirectory,
+                                   ExportSize,
+                                   TRUE,
+                                   ImportName);
+
+            /* Next thunks */
+            OriginalThunk++;
+            Thunk++;
+
+            /* If we failed the snap, break out */
+            if (!NT_SUCCESS(Status)) break;
+        }
+    }
+
+    /* Protect the IAT again */
+    NtProtectVirtualMemory(NtCurrentProcess(),
+                           &Iat,
+                           &ImportSize,
+                           OldProtect,
+                           &OldProtect);
+
+    /* Also flush out the cache */
+    NtFlushInstructionCache(NtCurrentProcess(), Iat, IatSize);
+
+    /* Return to Caller */
+    return Status;
+}
+
+NTSTATUS
+NTAPI
+LdrpHandleOneNewFormatImportDescriptor(IN LPWSTR DllPath OPTIONAL,
+                                       IN PLDR_DATA_TABLE_ENTRY LdrEntry,
+                                       IN PIMAGE_BOUND_IMPORT_DESCRIPTOR BoundEntry,
+                                       IN PIMAGE_BOUND_IMPORT_DESCRIPTOR FirstEntry)
+{
+    LPSTR ImportName = NULL, BoundImportName, ForwarderName;
+    NTSTATUS Status;
+    BOOLEAN AlreadyLoaded = FALSE, Stale;
+    PIMAGE_IMPORT_DESCRIPTOR ImportEntry;
+    PLDR_DATA_TABLE_ENTRY DllLdrEntry, ForwarderLdrEntry;
+    PIMAGE_BOUND_FORWARDER_REF ForwarderEntry;
+    PPEB Peb = NtCurrentPeb();
+    ULONG i, IatSize;
+
+    /* Get the name's VA */
+    BoundImportName = (LPSTR)(BoundEntry + BoundEntry->OffsetModuleName);
+
+    /* Show debug mesage */
+    if (ShowSnaps)
+    {
+        DPRINT1("LDR: %wZ bound to %s\n", &LdrEntry->BaseDllName, BoundImportName);
+    }
+
+    /* Load the module for this entry */
+    Status = LdrpLoadImportModule(DllPath,
+                                  BoundImportName,
+                                  LdrEntry->DllBase,
+                                  &DllLdrEntry,
+                                  &AlreadyLoaded);
+    if (!NT_SUCCESS(Status))
+    {
+        /* Show debug message */
+        if (ShowSnaps)
+        {
+            DPRINT1("LDR: %wZ failed to load import module %s; status = %x\n",
+                    &LdrEntry->BaseDllName,
+                    BoundImportName,
+                    Status);
+        }
+        goto Quickie;
+    }
+
+    /* Check if it wasn't already loaded */
+    if (!AlreadyLoaded)
+    {
+        /* Add it to our list */
+        InsertTailList(&Peb->Ldr->InInitializationOrderModuleList,
+                       &DllLdrEntry->InInitializationOrderModuleList);
+    }
+
+    /* Check if the Bound Entry is now invalid */
+    if ((BoundEntry->TimeDateStamp != DllLdrEntry->TimeDateStamp) ||
+        (DllLdrEntry->Flags & LDRP_IMAGE_NOT_AT_BASE))
+    {
+        /* Show debug message */
+        if (ShowSnaps)
+        {
+            DPRINT1("LDR: %wZ has stale binding to %s\n",
+                    &DllLdrEntry->BaseDllName,
+                    BoundImportName);
+        }
+
+        /* Remember it's become stale */
+        Stale = TRUE;
+    }
+    else
+    {
+        /* Show debug message */
+        if (ShowSnaps)
+        {
+            DPRINT1("LDR: %wZ has correct binding to %s\n",
+                    &DllLdrEntry->BaseDllName,
+                    BoundImportName);
+        }
+
+        /* Remember it's valid */
+        Stale = FALSE;
+    }
+
+    /* Get the forwarders */
+    ForwarderEntry = (PIMAGE_BOUND_FORWARDER_REF)(BoundEntry + 1);
+
+    /* Loop them */
+    for (i = 0; i < BoundEntry->NumberOfModuleForwarderRefs; i++)
+    {
+        /* Get the name */
+        ForwarderName = (LPSTR)(FirstEntry + ForwarderEntry->OffsetModuleName);
+
+        /* Show debug message */
+        if (ShowSnaps)
+        {
+            DPRINT1("LDR: %wZ bound to %s via forwarder(s) from %wZ\n",
+                    &LdrEntry->BaseDllName,
+                    ForwarderName,
+                    &DllLdrEntry->BaseDllName);
+        }
+
+        /* Load the module */
+        Status = LdrpLoadImportModule(DllPath,
+                                      ForwarderName,
+                                      LdrEntry->DllBase,
+                                      &ForwarderLdrEntry,
+                                      &AlreadyLoaded);
+        if (NT_SUCCESS(Status))
+        {
+            /* Loaded it, was it already loaded? */
+            if (!AlreadyLoaded)
+            {
+                /* Add it to our list */
+                InsertTailList(&Peb->Ldr->InInitializationOrderModuleList,
+                               &ForwarderLdrEntry->InInitializationOrderModuleList);
+            }
+        }
+
+        /* Check if the Bound Entry is now invalid */
+        if (!(NT_SUCCESS(Status)) ||
+            (ForwarderEntry->TimeDateStamp != ForwarderLdrEntry->TimeDateStamp) ||
+            (ForwarderLdrEntry->Flags & LDRP_IMAGE_NOT_AT_BASE))
+        {
+            /* Show debug message */
+            if (ShowSnaps)
+            {
+                DPRINT1("LDR: %wZ has stale binding to %s\n",
+                        &ForwarderLdrEntry->BaseDllName,
+                        ForwarderName);
+            }
+
+            /* Remember it's become stale */
+            Stale = TRUE;
+        }
+        else
+        {
+            /* Show debug message */
+            if (ShowSnaps)
+            {
+                DPRINT1("LDR: %wZ has correct binding to %s\n",
+                        &ForwarderLdrEntry->BaseDllName,
+                        ForwarderName);
+            }
+
+            /* Remember it's valid */
+            Stale = FALSE;
+        }
+
+        /* Move to the next one */
+        ForwarderEntry++;
+    }
+
+    /* Set the next bound entry to the forwarder */
+    FirstEntry = (PIMAGE_BOUND_IMPORT_DESCRIPTOR)ForwarderEntry;
+
+    /* Check if the binding was stale */
+    if (Stale)
+    {
+        /* It was, so find the IAT entry for it */
+        ImportEntry = RtlImageDirectoryEntryToData(LdrEntry->DllBase,
+                                                   TRUE,
+                                                   IMAGE_DIRECTORY_ENTRY_IMPORT,
+                                                   &IatSize);
+
+        /* Make sure it has a name */
+        while (ImportEntry->Name)
+        {
+            /* Get the name */
+            ImportName = (LPSTR)((ULONG_PTR)LdrEntry->DllBase + ImportEntry->Name);
+
+            /* Compare it */
+            if (!_stricmp(ImportName, BoundImportName)) break;
+
+            /* Move to next entry */
+            ImportEntry += 1;
+        }
+
+        /* If we didn't find a name, fail */
+        if (!ImportEntry->Name)
+        {
+            /* Show debug message */
+            if (ShowSnaps)
+            {
+                DPRINT1("LDR: LdrpWalkImportTable - failing with"
+                        "STATUS_OBJECT_NAME_INVALID due to no import descriptor name\n");
+            }
+
+            /* Return error */
+            Status = STATUS_OBJECT_NAME_INVALID;
+            goto Quickie;
+        }
+
+        /* Show debug message */
+        if (ShowSnaps)
+        {
+            DPRINT1("LDR: Stale Bind %s from %wZ\n",
+                    ImportName,
+                    &LdrEntry->BaseDllName);
+        }
+
+        /* Snap the IAT Entry*/
+        Status = LdrpSnapIAT(DllLdrEntry,
+                             LdrEntry,
+                             ImportEntry,
+                             FALSE);
+
+        /* Make sure we didn't fail */
+        if (!NT_SUCCESS(Status))
+        {
+            /* Show debug message */
+            if (ShowSnaps)
+            {
+                DPRINT1("LDR: %wZ failed to load import module %s; status = %x\n",
+                        &LdrEntry->BaseDllName,
+                        BoundImportName,
+                        Status);
+            }
+
+            /* Return */
+            goto Quickie;
+        }
+    }
+
+    /* All done */
+    Status = STATUS_SUCCESS;
+
+Quickie:
+    /* Write where we are now and return */
+    *BoundEntry = *FirstEntry;
+    return Status;
+}
+
+NTSTATUS
+NTAPI
+LdrpHandleNewFormatImportDescriptors(IN LPWSTR DllPath OPTIONAL,
+                                    IN PLDR_DATA_TABLE_ENTRY LdrEntry,
+                                    IN PIMAGE_BOUND_IMPORT_DESCRIPTOR BoundEntry)
+{
+    PIMAGE_BOUND_IMPORT_DESCRIPTOR FirstEntry = BoundEntry;
+    NTSTATUS Status;
+
+    /* Make sure we have a name */
+    while (BoundEntry->OffsetModuleName)
+    {
+        /* Parse this descriptor */
+        Status = LdrpHandleOneNewFormatImportDescriptor(DllPath,
+                                                        LdrEntry,
+                                                        BoundEntry,
+                                                        FirstEntry);
+        if (!NT_SUCCESS(Status)) return Status;
+    }
+
+    /* Done */
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+LdrpHandleOneOldFormatImportDescriptor(IN LPWSTR DllPath OPTIONAL,
+                                       IN PLDR_DATA_TABLE_ENTRY LdrEntry,
+                                       IN PIMAGE_IMPORT_DESCRIPTOR ImportEntry)
+{
+    //ULONG IatSize, i;
+    LPSTR ImportName;
+    NTSTATUS Status;
+    BOOLEAN AlreadyLoaded = FALSE, StaticEntriesValid = FALSE, SkipSnap = TRUE;
+    PLDR_DATA_TABLE_ENTRY DllLdrEntry;
+    PIMAGE_THUNK_DATA FirstThunk;
+    PPEB Peb = NtCurrentPeb();
+
+    /* Get the import name's VA */
+    ImportName = (LPSTR)((ULONG_PTR)LdrEntry->DllBase + ImportEntry->Name);
+
+    /* Get the first thunk */
+    FirstThunk = (PIMAGE_THUNK_DATA)((ULONG_PTR)LdrEntry->DllBase +
+                                     ImportEntry->FirstThunk);
+
+    /* Make sure it's valid */
+    if (!FirstThunk->u1.Function) goto SkipEntry;
+
+    /* Show debug message */
+    if (ShowSnaps)
+    {
+        DPRINT1("LDR: %s used by %wZ\n",
+                ImportName,
+                &LdrEntry->BaseDllName);
+    }
+
+    /* Load the module associated to it */
+    Status = LdrpLoadImportModule(DllPath,
+                                  ImportName,
+                                  LdrEntry->DllBase,
+                                  &DllLdrEntry,
+                                  &AlreadyLoaded);
+    if (!NT_SUCCESS(Status)) return Status;
+
+    /* Show debug message */
+    if (ShowSnaps)
+    {
+        DPRINT1("LDR: Snapping imports for %wZ from %s\n",
+                &LdrEntry->BaseDllName,
+                ImportName);
+    }
+
+    /* Check if the image was bound when compiled */
+    if (ImportEntry->OriginalFirstThunk)
+    {
+        /* It was, so check if the static IAT entries are still valid */
+        if ((ImportEntry->TimeDateStamp) &&
+            (ImportEntry->TimeDateStamp == DllLdrEntry->TimeDateStamp) &&
+            (!(DllLdrEntry->Flags & LDRP_IMAGE_NOT_AT_BASE)))
+        {
+            /* Show debug message */
+            if (ShowSnaps)
+            {
+                DPRINT1("LDR: Snap bypass %s from %wZ\n",
+                        ImportName,
+                        &LdrEntry->BaseDllName);
+            }
+
+            /*
+             * They are still valid, so we can skip snapping them.
+             * Additionally, if we have no forwarders, we are totally
+             * done.
+             */
+            if (ImportEntry->ForwarderChain == -1)
+            {
+                /* Totally skip LdrpSnapIAT */
+                SkipSnap = TRUE;
+            }
+            else
+            {
+                /* Set this so LdrpSnapIAT will only do forwarders */
+                StaticEntriesValid = TRUE;
+            }
+        }
+    }
+
+    /* Check if it wasn't already loaded */
+    if (!AlreadyLoaded)
+    {
+        /* Add the DLL to our list */
+        InsertTailList(&Peb->Ldr->InInitializationOrderModuleList,
+                       &DllLdrEntry->InInitializationOrderModuleList);
+    }
+
+    /* Check if we should snap at all */
+    if (!SkipSnap)
+    {
+        /* Now snap the IAT Entry */
+        Status = LdrpSnapIAT(DllLdrEntry,
+                             LdrEntry,
+                             ImportEntry,
+                             StaticEntriesValid);
+        if (!NT_SUCCESS(Status)) return Status;
+    }
+
+SkipEntry:
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+LdrpHandleOldFormatImportDescriptors(IN LPWSTR DllPath OPTIONAL,
+                                     IN PLDR_DATA_TABLE_ENTRY LdrEntry,
+                                     IN PIMAGE_IMPORT_DESCRIPTOR ImportEntry)
+{
+    NTSTATUS Status;
+
+    /* Check for Name and Thunk */
+    while (ImportEntry->Name && ImportEntry->FirstThunk)
+    {
+        /* Parse this descriptor */
+        Status = LdrpHandleOneOldFormatImportDescriptor(DllPath,
+                                                        LdrEntry,
+                                                        ImportEntry);
+        if (!NT_SUCCESS(Status)) return Status;
+
+        /* Move to the next entry */
+        ImportEntry++;
+    }
+
+    /* Done */
+    return STATUS_SUCCESS;
+}
 
 USHORT NTAPI
 LdrpNameToOrdinal(LPSTR ImportName,
@@ -41,6 +630,169 @@
     return 0;
 }
 
+NTSTATUS
+NTAPI
+LdrpWalkImportDescriptor(IN LPWSTR DllPath OPTIONAL,
+                         IN PLDR_DATA_TABLE_ENTRY LdrEntry)
+{
+    RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED ActCtx;
+    PPEB Peb = NtCurrentPeb();
+    NTSTATUS Status = STATUS_SUCCESS;
+    PIMAGE_BOUND_IMPORT_DESCRIPTOR BoundEntry = NULL;
+    PIMAGE_IMPORT_DESCRIPTOR ImportEntry;
+    ULONG BoundSize, IatSize;
+DPRINT1("LdrpWalkImportDescriptor('%S' %x)\n", DllPath, LdrEntry);
+    /* Set up the Act Ctx */
+    ActCtx.Size = sizeof(ActCtx);
+    ActCtx.Frame.Flags = ACTCTX_FLAG_PROCESSOR_ARCHITECTURE_VALID;
+    RtlZeroMemory(&ActCtx, sizeof(ActCtx));
+
+    /* Check if we have a manifest prober routine */
+    if (LdrpManifestProberRoutine)
+    {
+        DPRINT1("We don't support manifests yet, much less prober routines\n");
+    }
+
+    /* Check if we failed above */
+    if (!NT_SUCCESS(Status)) return Status;
+
+    /* Get the Active ActCtx */
+    Status = RtlGetActiveActivationContext(&LdrEntry->EntryPointActivationContext);
+    if (!NT_SUCCESS(Status)) return Status;
+
+    /* Activate the ActCtx */
+    RtlActivateActivationContextUnsafeFast(&ActCtx,
+                                           LdrEntry->EntryPointActivationContext);
+
+    /* Check if we were directed */
+    if (!(LdrEntry->Flags & LDRP_REDIRECTED))
+    {
+        /* Get the Bound IAT */
+        BoundEntry = RtlImageDirectoryEntryToData(LdrEntry->DllBase,
+                                                  TRUE,
+                                                  IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT,
+                                                  &BoundSize);
+    }
+
+    /* Get the regular IAT, for fallback */
+    ImportEntry = RtlImageDirectoryEntryToData(LdrEntry->DllBase,
+                                               TRUE,
+                                               IMAGE_DIRECTORY_ENTRY_IMPORT,
+                                               &IatSize);
+
+    /* Check if we got at least one */
+    if (BoundEntry || ImportEntry)
+    {
+        /* Do we have a Bound IAT */
+        if (BoundEntry)
+        {
+            /* Handle the descriptor */
+            Status = LdrpHandleNewFormatImportDescriptors(DllPath,
+                                                          LdrEntry,
+                                                          BoundEntry);
+        }
+        else
+        {
+            /* Handle the descriptor */
+            Status = LdrpHandleOldFormatImportDescriptors(DllPath,
+                                                          LdrEntry,
+                                                          ImportEntry);
+        }
+
+        /* Check the status of the handlers */
+        if (NT_SUCCESS(Status))
+        {
+            /* Check for Per-DLL Heap Tagging */
+            if (Peb->NtGlobalFlag & FLG_HEAP_ENABLE_TAG_BY_DLL)
+            {
+                /* FIXME */
+                DPRINT1("We don't support Per-DLL Heap Tagging yet!\n");
+            }
+
+            /* Check if Page Heap was enabled */
+            if (Peb->NtGlobalFlag & FLG_HEAP_PAGE_ALLOCS)
+            {
+                /* FIXME */
+                DPRINT1("We don't support Page Heaps yet!\n");
+            }
+
+            /* Check if Application Verifier was enabled */
+            if (Peb->NtGlobalFlag & FLG_HEAP_ENABLE_TAIL_CHECK)
+            {
+                /* FIXME */
+                DPRINT1("We don't support Application Verifier yet!\n");
+            }
+
+            /* Just to be safe */
+            Status = STATUS_SUCCESS;
+        }
+    }
+
+    /* Release the activation context */
+    RtlDeactivateActivationContextUnsafeFast(&ActCtx);
+
+    /* Return status */
+    return Status;
+}
+
+NTSTATUS
+NTAPI
+LdrpLoadImportModule(IN PWSTR DllPath OPTIONAL,
+                     IN LPSTR ImportName,
+                     IN PVOID DllBase,
+                     OUT PLDR_DATA_TABLE_ENTRY *DataTableEntry,
+                     OUT PBOOLEAN Existing)
+{
+    ANSI_STRING AnsiString;
+    PUNICODE_STRING ImpDescName;
+    NTSTATUS Status;
+    PPEB Peb = RtlGetCurrentPeb();
+    PTEB Teb = NtCurrentTeb();
+DPRINT1("LdrpLoadImportModule('%S' '%s' %p %p %p)\n", DllPath, ImportName, DllBase, DataTableEntry, Existing);
+    /* Convert import descriptor name to unicode string */
+    ImpDescName = &Teb->StaticUnicodeString;
+    RtlInitAnsiString(&AnsiString, ImportName);
+    Status = RtlAnsiStringToUnicodeString(ImpDescName, &AnsiString, FALSE);
+    if (!NT_SUCCESS(Status)) return Status;
+
+    /* Check if it's loaded */
+    if (LdrpCheckForLoadedDll(DllPath,
+                              ImpDescName,
+                              TRUE,
+                              FALSE,
+                              DataTableEntry))
+    {
+        /* It's already existing in the list */
+        *Existing = TRUE;
+        return STATUS_SUCCESS;
+    }
+
+    /* We're loading it for the first time */
+    *Existing = FALSE;
+
+    /* Map it */
+    Status = LdrpMapDll(DllPath,
+                        ImpDescName->Buffer,
+                        NULL,
+                        NULL,
+                        TRUE,
+                        FALSE,
+                        DataTableEntry);
+
+    if (!NT_SUCCESS(Status)) return Status;
+
+    /* Walk its import descriptor table */
+    Status = LdrpWalkImportDescriptor(DllPath,
+                                      *DataTableEntry);
+    if (!NT_SUCCESS(Status))
+    {
+        /* Add it to the in-init-order list in case of failure */
+        InsertTailList(&Peb->Ldr->InInitializationOrderModuleList,
+                       &(*DataTableEntry)->InInitializationOrderModuleList);
+    }
+
+    return Status;
+}
 
 NTSTATUS
 NTAPI

Modified: trunk/reactos/dll/ntdll/ldr/ldrutils.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/ntdll/ldr/ldrutils.c?rev=51117&r1=51116&r2=51117&view=diff
==============================================================================
--- trunk/reactos/dll/ntdll/ldr/ldrutils.c [iso-8859-1] (original)
+++ trunk/reactos/dll/ntdll/ldr/ldrutils.c [iso-8859-1] Tue Mar 22 12:41:52 2011
@@ -16,7 +16,6 @@
 /* GLOBALS *******************************************************************/
 
 PLDR_DATA_TABLE_ENTRY LdrpLoadedDllHandleCache;
-LIST_ENTRY LdrpHashTable[LDR_HASH_TABLE_ENTRIES];
 
 #define LDR_GET_HASH_ENTRY(x) (RtlUpcaseUnicodeChar((x)) & (LDR_HASH_TABLE_ENTRIES - 1))
 
@@ -217,7 +216,261 @@
                       IN BOOLEAN RedirectedDll,
                       OUT PLDR_DATA_TABLE_ENTRY *LdrEntry)
 {
-    UNIMPLEMENTED;
+    ULONG HashIndex;
+    PLIST_ENTRY ListHead, ListEntry;
+    PLDR_DATA_TABLE_ENTRY CurEntry;
+    BOOLEAN FullPath = FALSE;
+    PWCHAR wc;
+    WCHAR NameBuf[266];
+    UNICODE_STRING FullDllName, NtPathName;
+    ULONG Length;
+    OBJECT_ATTRIBUTES ObjectAttributes;
+    NTSTATUS Status;
+    HANDLE FileHandle, SectionHandle;
+    IO_STATUS_BLOCK Iosb;
+    PVOID ViewBase = NULL;
+    SIZE_T ViewSize = 0;
+    PIMAGE_NT_HEADERS NtHeader, NtHeader2;
+DPRINT1("LdrpCheckForLoadedDll('%S' '%wZ' %d %d %p)\n", DllPath, DllName, Flag, RedirectedDll, LdrEntry);
+    /* Check if a dll name was provided */
+    if (!DllName->Buffer || !DllName->Buffer[0]) return FALSE;
+
+    /* Look in the hash table if flag was set */
+lookinhash:
+    if (Flag)
+    {
+        /* Get hash index */
+        HashIndex = LDR_GET_HASH_ENTRY(DllName->Buffer[0]);
+
+        /* Traverse that list */
+        ListHead = &LdrpHashTable[HashIndex];
+        ListEntry = ListHead->Flink;
+        while (ListEntry != ListHead)
+        {
+            /* Get the current entry */
+            CurEntry = CONTAINING_RECORD(ListEntry, LDR_DATA_TABLE_ENTRY, HashLinks);
+
+            /* Check base name of that module */
+            if (RtlEqualUnicodeString(DllName, &CurEntry->BaseDllName, TRUE))
+            {
+                /* It matches, return it */
+                *LdrEntry = CurEntry;
+                return TRUE;
+            }
+
+            /* Advance to the next entry */
+            ListEntry = ListEntry->Flink;
+        }
+
+        /* Module was not found, return failure */
+        return FALSE;
+    }
+
+    /* Check if there is a full path in this DLL */
+    wc = DllName->Buffer;
+    while (*wc)
+    {
+        /* Check for a slash in the current position*/
+        if (*wc == L'\\' || *wc == L'/')
+        {
+            /* Found the slash, so dll name contains path */
+            FullPath = TRUE;
+
+            /* Setup full dll name string */
+            FullDllName.Buffer = NameBuf;
+
+            Length = RtlDosSearchPath_U(DllPath ? DllPath : LdrpDefaultPath.Buffer,
+                                        DllName->Buffer,
+                                        NULL,
+                                        sizeof(NameBuf) - sizeof(UNICODE_NULL),
+                                        FullDllName.Buffer,
+                                        NULL);
+
+            /* Check if that was successful */
+            if (!Length || Length > sizeof(NameBuf) - sizeof(UNICODE_NULL))
+            {
+                if (ShowSnaps)
+                {
+                    DPRINT1("LDR: LdrpCheckForLoadedDll - Unable To Locate %ws: 0x%08x\n",
+                        DllName->Buffer, Length);
+                }
+
+                /* Return failure */
+                return FALSE;
+            }
+
+            /* Full dll name is found */
+            FullDllName.Length = Length;
+            FullDllName.MaximumLength = FullDllName.Length + sizeof(UNICODE_NULL);
+            break;
+        }
+
+        wc++;
+    }
+
+    /* Go check the hash table */
+    if (!FullPath)
+    {
+        Flag = TRUE;
+        goto lookinhash;
+    }
+
+    /* Now go through the InLoadOrder module list */
+    ListHead = &NtCurrentPeb()->Ldr->InLoadOrderModuleList;
+    ListEntry = ListHead->Flink;
+
+    while (ListEntry != ListHead)
+    {
+        /* Get the containing record of the current entry and advance to the next one */
+        CurEntry = CONTAINING_RECORD(ListEntry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
+        ListEntry = ListEntry->Flink;
+
+        /* Check if it's already being unloaded */
+        if (!CurEntry->InMemoryOrderModuleList.Flink) continue;
+
+        /* Check if name matches */
+        if (RtlEqualUnicodeString(&FullDllName,
+                                  &CurEntry->FullDllName,
+                                  TRUE))
+        {
+            /* Found it */
+            *LdrEntry = CurEntry;
+
+            /* Find activation context */
+            Status = RtlFindActivationContextSectionString(0, NULL, ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION, DllName, NULL);
+            if (!NT_SUCCESS(Status))
+                return FALSE;
+            else
+                return TRUE;
+        }
+    }
+
+    /* The DLL was not found in the load order modules list. Perform a complex check */
+
+    /* Convert given path to NT path */
+    if (!RtlDosPathNameToNtPathName_U(FullDllName.Buffer,
+                                      &NtPathName,
+                                      NULL,
+                                      NULL))
+    {
+        /* Fail if conversion failed */
+        return FALSE;
+    }
+
+    /* Initialize object attributes and open it */
+    InitializeObjectAttributes(&ObjectAttributes,
+                               &NtPathName,
+                               OBJ_CASE_INSENSITIVE,
+                               NULL,
+                               NULL);
+
+    Status = NtOpenFile(&FileHandle,
+                        SYNCHRONIZE | FILE_EXECUTE,
+                        &ObjectAttributes,
+                        &Iosb,
+                        FILE_SHARE_READ | FILE_SHARE_DELETE,
+                        FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT);
+
+    /* Free NT path name */
+    RtlFreeHeap(RtlGetProcessHeap(), 0, NtPathName.Buffer);
+
+    /* If opening the file failed - return failure */
+    if (!NT_SUCCESS(Status)) return FALSE;
+
+    /* Create a section for this file */
+    Status = NtCreateSection(&SectionHandle,
+                             SECTION_MAP_READ | SECTION_MAP_EXECUTE | SECTION_MAP_WRITE,
+                             NULL,
+                             NULL,
+                             PAGE_EXECUTE,
+                             SEC_COMMIT,
+                             FileHandle);
+
+    /* Close file handle */
+    NtClose(FileHandle);
+
+    /* If creating section failed - return failure */
+    if (!NT_SUCCESS(Status)) return FALSE;
+
+    /* Map view of this section */
+    Status = ZwMapViewOfSection(SectionHandle,
+                                NtCurrentProcess(),
+                                &ViewBase,
+                                0,
+                                0,
+                                NULL,
+                                &ViewSize,
+                                ViewShare,
+                                0,
+                                PAGE_EXECUTE);
+    /* Close section handle */
+    NtClose(SectionHandle);
+
+    /* If section mapping failed - return failure */
+    if (!NT_SUCCESS(Status)) return FALSE;
+
+    /* Get pointer to the NT header of this section */
+    NtHeader = RtlImageNtHeader(ViewBase);
+    if (!NtHeader)
+    {
+        /* Unmap the section and fail */
+        NtUnmapViewOfSection(NtCurrentProcess(), ViewBase);
+        return FALSE;
+    }
+
+    /* Go through the list of modules */
+    ListHead = &NtCurrentPeb()->Ldr->InLoadOrderModuleList;
+    ListEntry = ListHead->Flink;
+
+    while (ListEntry != ListHead)
+    {
+        CurEntry = CONTAINING_RECORD(ListEntry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
+        ListEntry = ListEntry->Flink;
+
+        /* Check if it's already being unloaded */
+        if (!CurEntry->InMemoryOrderModuleList.Flink) continue;
+
+        _SEH2_TRY
+        {
+            /* Check if timedate stamp and sizes match */
+            if (CurEntry->TimeDateStamp == NtHeader->FileHeader.TimeDateStamp &&
+                CurEntry->SizeOfImage == NtHeader->OptionalHeader.SizeOfImage)
+            {
+                /* Time, date and size match. Let's compare their headers */
+                NtHeader2 = RtlImageNtHeader(CurEntry->DllBase);
+
+                if (RtlCompareMemory(NtHeader2, NtHeader, sizeof(IMAGE_NT_HEADERS)))
+                {
+                    /* Headers match too! Finally ask the kernel to compare mapped files */
+                    Status = ZwAreMappedFilesTheSame(CurEntry->DllBase, ViewBase);
+
+                    if (!NT_SUCCESS(Status))
+                    {
+                        _SEH2_YIELD(continue;)
+                    }
+                    else
+                    {
+                        /* This is our entry! */
+                        *LdrEntry = CurEntry;
+
+                        /* Unmap the section */
+                        NtUnmapViewOfSection(NtCurrentProcess(), ViewBase);
+
+                        _SEH2_YIELD(return TRUE;)
+                    }
+                }
+            }
+        }
+        _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER)
+        {
+            _SEH2_YIELD(break;)
+        }
+        _SEH2_END;
+    }
+
+    /* Unmap the section */
+    NtUnmapViewOfSection(NtCurrentProcess(), ViewBase);
+
     return FALSE;
 }
 

Modified: trunk/reactos/dll/ntdll/ldr/startup.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/ntdll/ldr/startup.c?rev=51117&r1=51116&r2=51117&view=diff
==============================================================================
--- trunk/reactos/dll/ntdll/ldr/startup.c [iso-8859-1] (original)
+++ trunk/reactos/dll/ntdll/ldr/startup.c [iso-8859-1] Tue Mar 22 12:41:52 2011
@@ -17,13 +17,15 @@
 VOID RtlInitializeHeapManager(VOID);
 VOID LdrpInitLoader(VOID);
 extern PTEB LdrpTopLevelDllBeingLoadedTeb;
+VOID NTAPI RtlpInitDeferedCriticalSection(VOID);
+VOID RtlpInitializeVectoredExceptionHandling(VOID);
 
 /* GLOBALS *******************************************************************/
 
 extern PLDR_DATA_TABLE_ENTRY LdrpImageEntry;
-static RTL_CRITICAL_SECTION PebLock;
-static RTL_BITMAP TlsBitMap;
-static RTL_BITMAP TlsExpansionBitMap;
+extern RTL_CRITICAL_SECTION FastPebLock;
+extern RTL_BITMAP TlsBitMap;
+extern RTL_BITMAP TlsExpansionBitMap;
 
 #define VALUE_BUFFER_SIZE 256
 
@@ -309,7 +311,7 @@
 
 NTSTATUS
 NTAPI
-LdrpInitializeProcess(PCONTEXT Context,
+LdrpInitializeProcess_(PCONTEXT Context,
                       PVOID SystemArgument1)
 {
     PIMAGE_NT_HEADERS NTHeaders;
@@ -372,6 +374,9 @@
 
     Peb->NumberOfProcessors = SystemInformation.NumberOfProcessors;
 
+    /* Initialize Critical Section Data */
+    RtlpInitDeferedCriticalSection();
+
     /* Load execution options */
     LoadImageFileExecutionOptions(Peb);
 
@@ -430,9 +435,12 @@
         ZwTerminateProcess(NtCurrentProcess(), STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE);
     }
 
+    /* initialized vectored exception handling */
+    RtlpInitializeVectoredExceptionHandling();
+
     /* initalize peb lock support */
-    RtlInitializeCriticalSection(&PebLock);
-    Peb->FastPebLock = &PebLock;
+    RtlInitializeCriticalSection(&FastPebLock);
+    Peb->FastPebLock = &FastPebLock;
 
     /* initialize tls bitmaps */
     RtlInitializeBitMap(&TlsBitMap, Peb->TlsBitmapBits, TLS_MINIMUM_AVAILABLE);

Modified: trunk/reactos/dll/ntdll/ldr/utils.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/ntdll/ldr/utils.c?rev=51117&r1=51116&r2=51117&view=diff
==============================================================================
--- trunk/reactos/dll/ntdll/ldr/utils.c [iso-8859-1] (original)
+++ trunk/reactos/dll/ntdll/ldr/utils.c [iso-8859-1] Tue Mar 22 12:41:52 2011
@@ -32,8 +32,8 @@
 #endif
 
 static BOOLEAN LdrpDllShutdownInProgress = FALSE;
-static HANDLE LdrpKnownDllsDirHandle = NULL;
-static UNICODE_STRING LdrpKnownDllPath = {0, 0, NULL};
+extern HANDLE LdrpKnownDllObjectDirectory;
+extern UNICODE_STRING LdrpKnownDllPath;
 static PLDR_DATA_TABLE_ENTRY LdrpLastModule = NULL;
 extern PLDR_DATA_TABLE_ENTRY LdrpImageEntry;
 
@@ -231,13 +231,13 @@
                                OBJ_CASE_INSENSITIVE,
                                NULL,
                                NULL);
-    Status = NtOpenDirectoryObject(&LdrpKnownDllsDirHandle,
+    Status = NtOpenDirectoryObject(&LdrpKnownDllObjectDirectory,
                                    DIRECTORY_QUERY | DIRECTORY_TRAVERSE,
                                    &ObjectAttributes);
     if (!NT_SUCCESS(Status))
     {
         DPRINT("NtOpenDirectoryObject() failed (Status %lx)\n", Status);
-        LdrpKnownDllsDirHandle = NULL;
+        LdrpKnownDllObjectDirectory = NULL;
         return;
     }
 
@@ -249,8 +249,8 @@
                                         MAX_PATH * sizeof(WCHAR));
     if (LinkTarget.Buffer == NULL)
     {
-        NtClose(LdrpKnownDllsDirHandle);
-        LdrpKnownDllsDirHandle = NULL;
+        NtClose(LdrpKnownDllObjectDirectory);
+        LdrpKnownDllObjectDirectory = NULL;
         return;
     }
 
@@ -259,7 +259,7 @@
     InitializeObjectAttributes(&ObjectAttributes,
                                &Name,
                                OBJ_CASE_INSENSITIVE,
-                               LdrpKnownDllsDirHandle,
+                               LdrpKnownDllObjectDirectory,
                                NULL);
     Status = NtOpenSymbolicLinkObject(&LinkHandle,
                                       SYMBOLIC_LINK_ALL_ACCESS,
@@ -267,8 +267,8 @@
     if (!NT_SUCCESS(Status))
     {
         RtlFreeUnicodeString(&LinkTarget);
-        NtClose(LdrpKnownDllsDirHandle);
-        LdrpKnownDllsDirHandle = NULL;
+        NtClose(LdrpKnownDllObjectDirectory);
+        LdrpKnownDllObjectDirectory = NULL;
         return;
     }
 
@@ -279,8 +279,8 @@
     if (!NT_SUCCESS(Status))
     {
         RtlFreeUnicodeString(&LinkTarget);
-        NtClose(LdrpKnownDllsDirHandle);
-        LdrpKnownDllsDirHandle = NULL;
+        NtClose(LdrpKnownDllObjectDirectory);
+        LdrpKnownDllObjectDirectory = NULL;
     }
 
     RtlCreateUnicodeString(&LdrpKnownDllPath,
@@ -431,7 +431,7 @@
 
     DPRINT("LdrpMapKnownDll() called\n");
 
-    if (LdrpKnownDllsDirHandle == NULL)
+    if (LdrpKnownDllObjectDirectory == NULL)
     {
         DPRINT("Invalid 'KnownDlls' directory\n");
         return STATUS_UNSUCCESSFUL;
@@ -442,7 +442,7 @@
     InitializeObjectAttributes(&ObjectAttributes,
                                DllName,
                                OBJ_CASE_INSENSITIVE,
-                               LdrpKnownDllsDirHandle,
+                               LdrpKnownDllObjectDirectory,
                                NULL);
     Status = NtOpenSection(SectionHandle,
                            SECTION_MAP_READ | SECTION_MAP_WRITE | SECTION_MAP_EXECUTE,
@@ -1189,7 +1189,7 @@
  * NOTE
  *
  */
-static NTSTATUS
+NTSTATUS
 LdrPerformRelocations(PIMAGE_NT_HEADERS NTHeaders,
                       PVOID ImageBase)
 {




More information about the Ros-diffs mailing list