Moved WINE_MODREF.flags to WINE_MODREF.ldr.Flags, and make use of the
same flags values as Win2000.
This commit is contained in:
parent
108a69bd2f
commit
19e050eb6f
|
@ -134,6 +134,7 @@ WINE_MODREF *MODULE_AllocModRef( HMODULE hModule, LPCSTR filename )
|
||||||
if (!exe_modref) exe_modref = wm;
|
if (!exe_modref) exe_modref = wm;
|
||||||
else FIXME( "Trying to load second .EXE file: %s\n", filename );
|
else FIXME( "Trying to load second .EXE file: %s\n", filename );
|
||||||
}
|
}
|
||||||
|
else wm->ldr.Flags |= LDR_IMAGE_IS_DLL;
|
||||||
}
|
}
|
||||||
return wm;
|
return wm;
|
||||||
}
|
}
|
||||||
|
@ -149,7 +150,7 @@ static BOOL MODULE_InitDLL( WINE_MODREF *wm, DWORD type, LPVOID lpReserved )
|
||||||
|
|
||||||
/* Skip calls for modules loaded with special load flags */
|
/* Skip calls for modules loaded with special load flags */
|
||||||
|
|
||||||
if (wm->flags & WINE_MODREF_DONT_RESOLVE_REFS) return TRUE;
|
if (wm->ldr.Flags & LDR_DONT_RESOLVE_REFS) return TRUE;
|
||||||
|
|
||||||
TRACE("(%s,%s,%p) - CALL\n", wm->modname, typeName[type], lpReserved );
|
TRACE("(%s,%s,%p) - CALL\n", wm->modname, typeName[type], lpReserved );
|
||||||
|
|
||||||
|
@ -209,14 +210,14 @@ BOOL MODULE_DllProcessAttach( WINE_MODREF *wm, LPVOID lpReserved )
|
||||||
assert( wm );
|
assert( wm );
|
||||||
|
|
||||||
/* prevent infinite recursion in case of cyclical dependencies */
|
/* prevent infinite recursion in case of cyclical dependencies */
|
||||||
if ( ( wm->flags & WINE_MODREF_MARKER )
|
if ( ( wm->ldr.Flags & LDR_LOAD_IN_PROGRESS )
|
||||||
|| ( wm->flags & WINE_MODREF_PROCESS_ATTACHED ) )
|
|| ( wm->ldr.Flags & LDR_PROCESS_ATTACHED ) )
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
TRACE("(%s,%p) - START\n", wm->modname, lpReserved );
|
TRACE("(%s,%p) - START\n", wm->modname, lpReserved );
|
||||||
|
|
||||||
/* Tag current MODREF to prevent recursive loop */
|
/* Tag current MODREF to prevent recursive loop */
|
||||||
wm->flags |= WINE_MODREF_MARKER;
|
wm->ldr.Flags |= LDR_LOAD_IN_PROGRESS;
|
||||||
|
|
||||||
/* Recursively attach all DLLs this one depends on */
|
/* Recursively attach all DLLs this one depends on */
|
||||||
for ( i = 0; retv && i < wm->nDeps; i++ )
|
for ( i = 0; retv && i < wm->nDeps; i++ )
|
||||||
|
@ -228,7 +229,7 @@ BOOL MODULE_DllProcessAttach( WINE_MODREF *wm, LPVOID lpReserved )
|
||||||
{
|
{
|
||||||
retv = MODULE_InitDLL( wm, DLL_PROCESS_ATTACH, lpReserved );
|
retv = MODULE_InitDLL( wm, DLL_PROCESS_ATTACH, lpReserved );
|
||||||
if ( retv )
|
if ( retv )
|
||||||
wm->flags |= WINE_MODREF_PROCESS_ATTACHED;
|
wm->ldr.Flags |= LDR_PROCESS_ATTACHED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Re-insert MODREF at head of list */
|
/* Re-insert MODREF at head of list */
|
||||||
|
@ -243,10 +244,11 @@ BOOL MODULE_DllProcessAttach( WINE_MODREF *wm, LPVOID lpReserved )
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Remove recursion flag */
|
/* Remove recursion flag */
|
||||||
wm->flags &= ~WINE_MODREF_MARKER;
|
wm->ldr.Flags &= ~LDR_LOAD_IN_PROGRESS;
|
||||||
|
|
||||||
TRACE("(%s,%p) - END\n", wm->modname, lpReserved );
|
TRACE("(%s,%p) - END\n", wm->modname, lpReserved );
|
||||||
|
|
||||||
|
|
||||||
done:
|
done:
|
||||||
RtlLeaveCriticalSection( &loader_section );
|
RtlLeaveCriticalSection( &loader_section );
|
||||||
return retv;
|
return retv;
|
||||||
|
@ -270,13 +272,13 @@ void MODULE_DllProcessDetach( BOOL bForceDetach, LPVOID lpReserved )
|
||||||
for ( wm = MODULE_modref_list; wm; wm = wm->next )
|
for ( wm = MODULE_modref_list; wm; wm = wm->next )
|
||||||
{
|
{
|
||||||
/* Check whether to detach this DLL */
|
/* Check whether to detach this DLL */
|
||||||
if ( !(wm->flags & WINE_MODREF_PROCESS_ATTACHED) )
|
if ( !(wm->ldr.Flags & LDR_PROCESS_ATTACHED) )
|
||||||
continue;
|
continue;
|
||||||
if ( wm->ldr.LoadCount > 0 && !bForceDetach )
|
if ( wm->ldr.LoadCount > 0 && !bForceDetach )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Call detach notification */
|
/* Call detach notification */
|
||||||
wm->flags &= ~WINE_MODREF_PROCESS_ATTACHED;
|
wm->ldr.Flags &= ~LDR_PROCESS_ATTACHED;
|
||||||
MODULE_InitDLL( wm, DLL_PROCESS_DETACH, lpReserved );
|
MODULE_InitDLL( wm, DLL_PROCESS_DETACH, lpReserved );
|
||||||
|
|
||||||
/* Restart at head of WINE_MODREF list, as entries might have
|
/* Restart at head of WINE_MODREF list, as entries might have
|
||||||
|
@ -313,9 +315,9 @@ void MODULE_DllThreadAttach( LPVOID lpReserved )
|
||||||
|
|
||||||
for ( ; wm; wm = wm->prev )
|
for ( ; wm; wm = wm->prev )
|
||||||
{
|
{
|
||||||
if ( !(wm->flags & WINE_MODREF_PROCESS_ATTACHED) )
|
if ( !(wm->ldr.Flags & LDR_PROCESS_ATTACHED) )
|
||||||
continue;
|
continue;
|
||||||
if ( wm->flags & WINE_MODREF_NO_DLL_CALLS )
|
if ( wm->ldr.Flags & LDR_NO_DLL_CALLS )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
MODULE_InitDLL( wm, DLL_THREAD_ATTACH, lpReserved );
|
MODULE_InitDLL( wm, DLL_THREAD_ATTACH, lpReserved );
|
||||||
|
@ -339,7 +341,7 @@ NTSTATUS WINAPI LdrDisableThreadCalloutsForDll(HMODULE hModule)
|
||||||
if ( !wm )
|
if ( !wm )
|
||||||
ret = STATUS_DLL_NOT_FOUND;
|
ret = STATUS_DLL_NOT_FOUND;
|
||||||
else
|
else
|
||||||
wm->flags |= WINE_MODREF_NO_DLL_CALLS;
|
wm->ldr.Flags |= LDR_NO_DLL_CALLS;
|
||||||
|
|
||||||
RtlLeaveCriticalSection( &loader_section );
|
RtlLeaveCriticalSection( &loader_section );
|
||||||
|
|
||||||
|
@ -634,10 +636,10 @@ NTSTATUS MODULE_LoadLibraryExA( LPCSTR libname, DWORD flags, WINE_MODREF** pwm)
|
||||||
{
|
{
|
||||||
(*pwm)->ldr.LoadCount++;
|
(*pwm)->ldr.LoadCount++;
|
||||||
|
|
||||||
if (((*pwm)->flags & WINE_MODREF_DONT_RESOLVE_REFS) &&
|
if (((*pwm)->ldr.Flags & LDR_DONT_RESOLVE_REFS) &&
|
||||||
!(flags & DONT_RESOLVE_DLL_REFERENCES))
|
!(flags & DONT_RESOLVE_DLL_REFERENCES))
|
||||||
{
|
{
|
||||||
(*pwm)->flags &= ~WINE_MODREF_DONT_RESOLVE_REFS;
|
(*pwm)->ldr.Flags &= ~LDR_DONT_RESOLVE_REFS;
|
||||||
PE_fixup_imports( *pwm );
|
PE_fixup_imports( *pwm );
|
||||||
}
|
}
|
||||||
TRACE("Already loaded module '%s' at %p, count=%d\n", filename, (*pwm)->ldr.BaseAddress, (*pwm)->ldr.LoadCount);
|
TRACE("Already loaded module '%s' at %p, count=%d\n", filename, (*pwm)->ldr.BaseAddress, (*pwm)->ldr.LoadCount);
|
||||||
|
@ -784,9 +786,9 @@ NTSTATUS WINAPI LdrShutdownThread(void)
|
||||||
|
|
||||||
for ( wm = MODULE_modref_list; wm; wm = wm->next )
|
for ( wm = MODULE_modref_list; wm; wm = wm->next )
|
||||||
{
|
{
|
||||||
if ( !(wm->flags & WINE_MODREF_PROCESS_ATTACHED) )
|
if ( !(wm->ldr.Flags & LDR_PROCESS_ATTACHED) )
|
||||||
continue;
|
continue;
|
||||||
if ( wm->flags & WINE_MODREF_NO_DLL_CALLS )
|
if ( wm->ldr.Flags & LDR_NO_DLL_CALLS )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
MODULE_InitDLL( wm, DLL_THREAD_DETACH, NULL );
|
MODULE_InitDLL( wm, DLL_THREAD_DETACH, NULL );
|
||||||
|
@ -852,7 +854,7 @@ static void MODULE_DecRefCount( WINE_MODREF *wm )
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if ( wm->flags & WINE_MODREF_MARKER )
|
if ( wm->ldr.Flags & LDR_UNLOAD_IN_PROGRESS )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ( wm->ldr.LoadCount <= 0 )
|
if ( wm->ldr.LoadCount <= 0 )
|
||||||
|
@ -863,13 +865,13 @@ static void MODULE_DecRefCount( WINE_MODREF *wm )
|
||||||
|
|
||||||
if ( wm->ldr.LoadCount == 0 )
|
if ( wm->ldr.LoadCount == 0 )
|
||||||
{
|
{
|
||||||
wm->flags |= WINE_MODREF_MARKER;
|
wm->ldr.Flags |= LDR_UNLOAD_IN_PROGRESS;
|
||||||
|
|
||||||
for ( i = 0; i < wm->nDeps; i++ )
|
for ( i = 0; i < wm->nDeps; i++ )
|
||||||
if ( wm->deps[i] )
|
if ( wm->deps[i] )
|
||||||
MODULE_DecRefCount( wm->deps[i] );
|
MODULE_DecRefCount( wm->deps[i] );
|
||||||
|
|
||||||
wm->flags &= ~WINE_MODREF_MARKER;
|
wm->ldr.Flags &= ~LDR_UNLOAD_IN_PROGRESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -139,8 +139,6 @@ typedef struct _wine_modref
|
||||||
int nDeps;
|
int nDeps;
|
||||||
struct _wine_modref **deps;
|
struct _wine_modref **deps;
|
||||||
|
|
||||||
int flags;
|
|
||||||
|
|
||||||
char *filename;
|
char *filename;
|
||||||
char *modname;
|
char *modname;
|
||||||
char *short_filename;
|
char *short_filename;
|
||||||
|
@ -149,12 +147,6 @@ typedef struct _wine_modref
|
||||||
char data[1]; /* space for storing filename and short_filename */
|
char data[1]; /* space for storing filename and short_filename */
|
||||||
} WINE_MODREF;
|
} WINE_MODREF;
|
||||||
|
|
||||||
#define WINE_MODREF_INTERNAL 0x00000001
|
|
||||||
#define WINE_MODREF_NO_DLL_CALLS 0x00000002
|
|
||||||
#define WINE_MODREF_PROCESS_ATTACHED 0x00000004
|
|
||||||
#define WINE_MODREF_DONT_RESOLVE_REFS 0x00000020
|
|
||||||
#define WINE_MODREF_MARKER 0x80000000
|
|
||||||
|
|
||||||
extern WINE_MODREF *MODULE_modref_list;
|
extern WINE_MODREF *MODULE_modref_list;
|
||||||
|
|
||||||
/* Resource types */
|
/* Resource types */
|
||||||
|
|
|
@ -1174,6 +1174,18 @@ typedef struct _LDR_MODULE
|
||||||
ULONG TimeDateStamp;
|
ULONG TimeDateStamp;
|
||||||
} LDR_MODULE, *PLDR_MODULE;
|
} LDR_MODULE, *PLDR_MODULE;
|
||||||
|
|
||||||
|
/* those defines are (some of the) regular LDR_MODULE.Flags values */
|
||||||
|
#define LDR_IMAGE_IS_DLL 0x00000004
|
||||||
|
#define LDR_LOAD_IN_PROGRESS 0x00001000
|
||||||
|
#define LDR_UNLOAD_IN_PROGRESS 0x00002000
|
||||||
|
#define LDR_NO_DLL_CALLS 0x00040000
|
||||||
|
#define LDR_PROCESS_ATTACHED 0x00080000
|
||||||
|
#define LDR_MODULE_REBASED 0x00200000
|
||||||
|
|
||||||
|
/* these ones is Wine specific */
|
||||||
|
#define LDR_DONT_RESOLVE_REFS 0x40000000
|
||||||
|
#define LDR_WINE_INTERNAL 0x80000000
|
||||||
|
|
||||||
/* FIXME: to be checked */
|
/* FIXME: to be checked */
|
||||||
#define MAXIMUM_FILENAME_LENGTH 256
|
#define MAXIMUM_FILENAME_LENGTH 256
|
||||||
|
|
||||||
|
|
|
@ -508,10 +508,10 @@ WINE_MODREF *PE_CreateModule( HMODULE hModule, LPCSTR filename, DWORD flags,
|
||||||
{
|
{
|
||||||
NE_MODULE *pModule = (NE_MODULE *)GlobalLock16( hModule16 );
|
NE_MODULE *pModule = (NE_MODULE *)GlobalLock16( hModule16 );
|
||||||
pModule->flags |= NE_FFLAGS_BUILTIN;
|
pModule->flags |= NE_FFLAGS_BUILTIN;
|
||||||
wm->flags |= WINE_MODREF_INTERNAL;
|
wm->ldr.Flags |= LDR_WINE_INTERNAL;
|
||||||
}
|
}
|
||||||
else if ( flags & DONT_RESOLVE_DLL_REFERENCES )
|
else if ( flags & DONT_RESOLVE_DLL_REFERENCES )
|
||||||
wm->flags |= WINE_MODREF_DONT_RESOLVE_REFS;
|
wm->ldr.Flags |= LDR_DONT_RESOLVE_REFS;
|
||||||
|
|
||||||
wm->find_export = PE_FindExportedFunction;
|
wm->find_export = PE_FindExportedFunction;
|
||||||
|
|
||||||
|
@ -522,7 +522,7 @@ WINE_MODREF *PE_CreateModule( HMODULE hModule, LPCSTR filename, DWORD flags,
|
||||||
|
|
||||||
/* Fixup Imports */
|
/* Fixup Imports */
|
||||||
|
|
||||||
if (!(wm->flags & WINE_MODREF_DONT_RESOLVE_REFS) &&
|
if (!(wm->ldr.Flags & LDR_DONT_RESOLVE_REFS) &&
|
||||||
PE_fixup_imports( wm ))
|
PE_fixup_imports( wm ))
|
||||||
{
|
{
|
||||||
/* remove entry from modref chain */
|
/* remove entry from modref chain */
|
||||||
|
|
|
@ -464,7 +464,7 @@ static DWORD VERSION_GetLinkedDllVersion(void)
|
||||||
ophd->MajorSubsystemVersion, ophd->MinorSubsystemVersion);
|
ophd->MajorSubsystemVersion, ophd->MinorSubsystemVersion);
|
||||||
|
|
||||||
/* test if it is an external (native) dll */
|
/* test if it is an external (native) dll */
|
||||||
if (!(wm->flags & WINE_MODREF_INTERNAL))
|
if (!(wm->ldr.Flags & LDR_WINE_INTERNAL))
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; special_dlls[i]; i++)
|
for (i = 0; special_dlls[i]; i++)
|
||||||
|
|
|
@ -238,7 +238,7 @@ static void get_entry_point( char *buffer, DEBUG_ENTRY_POINT *relay )
|
||||||
|
|
||||||
for (wm = MODULE_modref_list; wm; wm = wm->next)
|
for (wm = MODULE_modref_list; wm; wm = wm->next)
|
||||||
{
|
{
|
||||||
if (!(wm->flags & WINE_MODREF_INTERNAL)) continue;
|
if (!(wm->ldr.Flags & LDR_WINE_INTERNAL)) continue;
|
||||||
exp = RtlImageDirectoryEntryToData( wm->ldr.BaseAddress, TRUE, IMAGE_DIRECTORY_ENTRY_EXPORT, &size );
|
exp = RtlImageDirectoryEntryToData( wm->ldr.BaseAddress, TRUE, IMAGE_DIRECTORY_ENTRY_EXPORT, &size );
|
||||||
if (!exp) continue;
|
if (!exp) continue;
|
||||||
debug = (DEBUG_ENTRY_POINT *)((char *)exp + size);
|
debug = (DEBUG_ENTRY_POINT *)((char *)exp + size);
|
||||||
|
|
Loading…
Reference in New Issue