/* GLOBALS *******************************************************************/
LIST_ENTRY LdrpUnloadHead;
-LONG LdrpLoaderLockAcquisitonCount;
+LONG LdrpLoaderLockAcquisitionCount;
BOOLEAN LdrpShowRecursiveLoads, LdrpBreakOnRecursiveDllLoads;
UNICODE_STRING LdrApiDefaultExtension = RTL_CONSTANT_STRING(L".DLL");
ULONG AlternateResourceModuleCount;
+extern PLDR_MANIFEST_PROBER_ROUTINE LdrpManifestProberRoutine;
/* FUNCTIONS *****************************************************************/
VOID
NTAPI
-LdrSetDllManifestProber(IN PVOID ProberFunction)
+LdrSetDllManifestProber(
+ _In_ PLDR_MANIFEST_PROBER_ROUTINE Routine)
{
- UNIMPLEMENTED;
+ LdrpManifestProberRoutine = Routine;
}
BOOLEAN
{
/* Generate a cookie */
return (((ULONG_PTR)NtCurrentTeb()->RealClientId.UniqueThread & 0xFFF) << 16) |
- (_InterlockedIncrement(&LdrpLoaderLockAcquisitonCount) & 0xFFFF);
+ (_InterlockedIncrement(&LdrpLoaderLockAcquisitionCount) & 0xFFFF);
}
/*
/* Validate the cookie */
if ((Cookie & 0xF0000000) ||
- ((Cookie >> 16) ^ ((ULONG)(NtCurrentTeb()->RealClientId.UniqueThread) & 0xFFF)))
+ ((Cookie >> 16) ^ (HandleToUlong(NtCurrentTeb()->RealClientId.UniqueThread) & 0xFFF)))
{
DPRINT1("LdrUnlockLoaderLock() called with an invalid cookie!\n");
UNICODE_STRING DllString1, DllString2;
BOOLEAN RedirectedDll = FALSE;
NTSTATUS Status;
- ULONG Cookie;
+ ULONG_PTR Cookie;
PUNICODE_STRING OldTldDll;
PTEB Teb = NtCurrentTeb();
/* Check if there's a TLD DLL being loaded */
OldTldDll = LdrpTopLevelDllBeingLoaded;
- if (OldTldDll)
+ _SEH2_TRY
{
- /* This is a recursive load, do something about it? */
- if ((ShowSnaps) || (LdrpShowRecursiveLoads) || (LdrpBreakOnRecursiveDllLoads))
+
+ if (OldTldDll)
{
- /* Print out debug messages */
- DPRINT1("[%p, %p] LDR: Recursive DLL Load\n",
- Teb->RealClientId.UniqueProcess,
- Teb->RealClientId.UniqueThread);
- DPRINT1("[%p, %p] Previous DLL being loaded \"%wZ\"\n",
- Teb->RealClientId.UniqueProcess,
- Teb->RealClientId.UniqueThread,
- OldTldDll);
- DPRINT1("[%p, %p] DLL being requested \"%wZ\"\n",
- Teb->RealClientId.UniqueProcess,
- Teb->RealClientId.UniqueThread,
- DllName);
-
- /* Was it initializing too? */
- if (!LdrpCurrentDllInitializer)
+ /* This is a recursive load, do something about it? */
+ if ((ShowSnaps) || (LdrpShowRecursiveLoads) || (LdrpBreakOnRecursiveDllLoads))
{
- DPRINT1("[%p, %p] LDR: No DLL Initializer was running\n",
+ /* Print out debug messages */
+ DPRINT1("[%p, %p] LDR: Recursive DLL Load\n",
Teb->RealClientId.UniqueProcess,
Teb->RealClientId.UniqueThread);
- }
- else
- {
- DPRINT1("[%p, %p] DLL whose initializer was currently running \"%wZ\"\n",
- Teb->ClientId.UniqueProcess,
- Teb->ClientId.UniqueThread,
- &LdrpCurrentDllInitializer->BaseDllName);
+ DPRINT1("[%p, %p] Previous DLL being loaded \"%wZ\"\n",
+ Teb->RealClientId.UniqueProcess,
+ Teb->RealClientId.UniqueThread,
+ OldTldDll);
+ DPRINT1("[%p, %p] DLL being requested \"%wZ\"\n",
+ Teb->RealClientId.UniqueProcess,
+ Teb->RealClientId.UniqueThread,
+ DllName);
+
+ /* Was it initializing too? */
+ if (!LdrpCurrentDllInitializer)
+ {
+ DPRINT1("[%p, %p] LDR: No DLL Initializer was running\n",
+ Teb->RealClientId.UniqueProcess,
+ Teb->RealClientId.UniqueThread);
+ }
+ else
+ {
+ DPRINT1("[%p, %p] DLL whose initializer was currently running \"%wZ\"\n",
+ Teb->ClientId.UniqueProcess,
+ Teb->ClientId.UniqueThread,
+ &LdrpCurrentDllInitializer->BaseDllName);
+ }
}
}
- }
- /* Set this one as the TLD DLL being loaded*/
- LdrpTopLevelDllBeingLoaded = DllName;
+ /* Set this one as the TLD DLL being loaded*/
+ LdrpTopLevelDllBeingLoaded = DllName;
- /* Load the DLL */
- Status = LdrpLoadDll(RedirectedDll,
- SearchPath,
- DllCharacteristics,
- DllName,
- BaseAddress,
- TRUE);
- if (NT_SUCCESS(Status))
- {
- Status = STATUS_SUCCESS;
+ /* Load the DLL */
+ Status = LdrpLoadDll(RedirectedDll,
+ SearchPath,
+ DllCharacteristics,
+ DllName,
+ BaseAddress,
+ TRUE);
+ if (NT_SUCCESS(Status))
+ {
+ Status = STATUS_SUCCESS;
+ }
+ else if ((Status != STATUS_NO_SUCH_FILE) &&
+ (Status != STATUS_DLL_NOT_FOUND) &&
+ (Status != STATUS_OBJECT_NAME_NOT_FOUND) &&
+ (Status != STATUS_DLL_INIT_FAILED))
+ {
+ DbgPrintEx(DPFLTR_LDR_ID,
+ DPFLTR_WARNING_LEVEL,
+ "LDR: %s - failing because LdrpLoadDll(%wZ) returned status %x\n",
+ __FUNCTION__,
+ DllName,
+ Status);
+ }
}
- else if ((Status != STATUS_NO_SUCH_FILE) &&
- (Status != STATUS_DLL_NOT_FOUND) &&
- (Status != STATUS_OBJECT_NAME_NOT_FOUND) &&
- (Status != STATUS_DLL_INIT_FAILED))
+ _SEH2_FINALLY
{
- DbgPrintEx(DPFLTR_LDR_ID,
- DPFLTR_WARNING_LEVEL,
- "LDR: %s - failing because LdrpLoadDll(%wZ) returned status %x\n",
- __FUNCTION__,
- DllName,
- Status);
- }
-
- /* Restore the old TLD DLL */
- LdrpTopLevelDllBeingLoaded = OldTldDll;
+ /* Restore the old TLD DLL */
+ LdrpTopLevelDllBeingLoaded = OldTldDll;
- /* Release the lock */
- LdrUnlockLoaderLock(LDR_LOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS, Cookie);
+ /* Release the lock */
+ LdrUnlockLoaderLock(LDR_LOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS, Cookie);
+ }
+ _SEH2_END;
/* Do we have a redirect string? */
if (DllString2.Buffer) RtlFreeUnicodeString(&DllString2);
while (NextEntry != ListHead)
{
/* Get the entry and NT Headers */
- LdrEntry = CONTAINING_RECORD(NextEntry, LDR_DATA_TABLE_ENTRY, InMemoryOrderModuleList);
+ LdrEntry = CONTAINING_RECORD(NextEntry, LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks);
NtHeader = RtlImageNtHeader(LdrEntry->DllBase);
if (NtHeader)
{
}
else if (Status != STATUS_SXS_KEY_NOT_FOUND)
{
- /* Unrecoverable SxS failure; */
+ /* Unrecoverable SxS failure */
goto Quickie;
}
else
while (InitEntry != InitListHead)
{
- InitModule = CONTAINING_RECORD(InitEntry, LDR_DATA_TABLE_ENTRY, InInitializationOrderModuleList);
+ InitModule = CONTAINING_RECORD(InitEntry, LDR_DATA_TABLE_ENTRY, InInitializationOrderLinks);
/* Increase the index */
ModulePtr->InitOrderIndex++;
PLIST_ENTRY ListHead, ListEntry;
PLDR_DATA_TABLE_ENTRY LdrEntry;
NTSTATUS Status;
- ULONG Cookie;
+ ULONG_PTR Cookie;
BOOLEAN Stop = FALSE;
/* Check parameters */
{
PLDR_DATA_TABLE_ENTRY LdrEntry;
NTSTATUS Status = STATUS_SUCCESS;
- ULONG Cookie;
+ ULONG_PTR Cookie;
BOOLEAN Locked = FALSE;
/* Check for invalid flags */
/* Get the entry */
LdrEntry = CONTAINING_RECORD(NextEntry,
LDR_DATA_TABLE_ENTRY,
- InInitializationOrderModuleList);
+ InInitializationOrderLinks);
NextEntry = NextEntry->Blink;
/* Remove flag */
LdrEntry->EntryPoint);
}
- /* FIXME: Call Shim Engine and notify */
+ /* Call Shim Engine and notify */
+ if (g_ShimsEnabled)
+ {
+ VOID (NTAPI* SE_DllUnloaded)(PVOID) = RtlDecodeSystemPointer(g_pfnSE_DllUnloaded);
+ SE_DllUnloaded(LdrEntry);
+ }
/* Unlink it */
CurrentEntry = LdrEntry;
- RemoveEntryList(&CurrentEntry->InInitializationOrderModuleList);
- RemoveEntryList(&CurrentEntry->InMemoryOrderModuleList);
+ RemoveEntryList(&CurrentEntry->InInitializationOrderLinks);
+ RemoveEntryList(&CurrentEntry->InMemoryOrderLinks);
RemoveEntryList(&CurrentEntry->HashLinks);
/* If there's more then one active unload */
{
/* Flush the cached DLL handle and clear the list */
LdrpLoadedDllHandleCache = NULL;
- CurrentEntry->InMemoryOrderModuleList.Flink = NULL;
+ CurrentEntry->InMemoryOrderLinks.Flink = NULL;
}
/* Add the entry on the unload list */
/* Set the entry and clear it from the list */
CurrentEntry = LdrEntry;
LdrpLoadedDllHandleCache = NULL;
- CurrentEntry->InMemoryOrderModuleList.Flink = NULL;
+ CurrentEntry->InMemoryOrderLinks.Flink = NULL;
/* Move it from the global to the local list */
RemoveEntryList(&CurrentEntry->HashLinks);
LdrEntry->EntryPointActivationContext);
/* Call the entrypoint */
- LdrpCallInitRoutine(LdrEntry->EntryPoint,
- LdrEntry->DllBase,
- DLL_PROCESS_DETACH,
- NULL);
+ _SEH2_TRY
+ {
+ LdrpCallInitRoutine(LdrEntry->EntryPoint,
+ LdrEntry->DllBase,
+ DLL_PROCESS_DETACH,
+ NULL);
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ DPRINT1("WARNING: Exception 0x%x during LdrpCallInitRoutine(DLL_PROCESS_DETACH) for %wZ\n",
+ _SEH2_GetExceptionCode(), &LdrEntry->BaseDllName);
+ }
+ _SEH2_END;
/* Release the context */
RtlDeactivateActivationContextUnsafeFast(&ActCtx);
/* Notify Application Verifier */
if (Peb->NtGlobalFlag & FLG_HEAP_ENABLE_TAIL_CHECK)
{
- DPRINT1("We don't support Application Verifier yet\n");
+ AVrfDllUnloadNotification(LdrEntry);
}
/* Show message */