From: Jinoh Kang jinoh.kang.kr@gmail.com
This allows extension of LDR_DEPENDENCY, while trying to maintain compatibility with applications that may depend on native loader internals.
In preparation for a patch that keeps track of all dependency edges between all modules globally, in turn enabling de-duplication of identical edges. --- dlls/ntdll/loader.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index c5d82e8c68c..35cf76d24dc 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -115,6 +115,11 @@ struct ldr_notification
static struct list ldr_notifications = LIST_INIT( ldr_notifications );
+struct dependency_edge +{ + LDR_DEPENDENCY ldr; +}; + static const char * const reason_names[] = { "PROCESS_DETACH", @@ -856,14 +861,14 @@ static void remove_single_list_entry( LDRP_CSLIST *list, SINGLE_LIST_ENTRY *entr static BOOL add_module_dependency_after( LDR_DDAG_NODE *from, LDR_DDAG_NODE *to, SINGLE_LIST_ENTRY *dep_after ) { - LDR_DEPENDENCY *dep; + struct dependency_edge *dep;
if (!(dep = RtlAllocateHeap( GetProcessHeap(), 0, sizeof(*dep) ))) return FALSE;
- dep->dependency_from = from; - insert_single_list_after( &from->Dependencies, dep_after, &dep->dependency_to_entry ); - dep->dependency_to = to; - insert_single_list_after( &to->IncomingDependencies, NULL, &dep->dependency_from_entry ); + dep->ldr.dependency_from = from; + insert_single_list_after( &from->Dependencies, dep_after, &dep->ldr.dependency_to_entry ); + dep->ldr.dependency_to = to; + insert_single_list_after( &to->IncomingDependencies, NULL, &dep->ldr.dependency_from_entry );
return TRUE; } @@ -879,10 +884,10 @@ static BOOL add_module_dependency( LDR_DDAG_NODE *from, LDR_DDAG_NODE *to ) /********************************************************************** * remove_module_dependency */ -static void remove_module_dependency( LDR_DEPENDENCY *dep ) +static void remove_module_dependency( struct dependency_edge *dep ) { - remove_single_list_entry( &dep->dependency_to->IncomingDependencies, &dep->dependency_from_entry ); - remove_single_list_entry( &dep->dependency_from->Dependencies, &dep->dependency_to_entry ); + remove_single_list_entry( &dep->ldr.dependency_to->IncomingDependencies, &dep->ldr.dependency_from_entry ); + remove_single_list_entry( &dep->ldr.dependency_from->Dependencies, &dep->ldr.dependency_to_entry ); RtlFreeHeap( GetProcessHeap(), 0, dep ); }
@@ -3914,7 +3919,7 @@ void WINAPI LdrShutdownThread(void) static void free_modref( WINE_MODREF *wm ) { SINGLE_LIST_ENTRY *entry; - LDR_DEPENDENCY *dep; + struct dependency_edge *dep;
RemoveEntryList(&wm->ldr.InLoadOrderLinks); RemoveEntryList(&wm->ldr.InMemoryOrderLinks); @@ -3923,15 +3928,15 @@ static void free_modref( WINE_MODREF *wm )
while ((entry = wm->ldr.DdagNode->Dependencies.Tail)) { - dep = CONTAINING_RECORD( entry, LDR_DEPENDENCY, dependency_to_entry ); - assert( dep->dependency_from == wm->ldr.DdagNode ); + dep = CONTAINING_RECORD( entry, struct dependency_edge, ldr.dependency_to_entry ); + assert( dep->ldr.dependency_from == wm->ldr.DdagNode ); remove_module_dependency( dep ); }
while ((entry = wm->ldr.DdagNode->IncomingDependencies.Tail)) { - dep = CONTAINING_RECORD( entry, LDR_DEPENDENCY, dependency_from_entry ); - assert( dep->dependency_to == wm->ldr.DdagNode ); + dep = CONTAINING_RECORD( entry, struct dependency_edge, ldr.dependency_from_entry ); + assert( dep->ldr.dependency_to == wm->ldr.DdagNode ); remove_module_dependency( dep ); }