Reputation: 1183
Looking at the IMAGE_LOAD_CONFIG_DIRECTORY32 structure for the kernelbase.dll I see the following:
0:000> dt IMAGE_LOAD_CONFIG_DIRECTORY32 761dc810
DebugMe!IMAGE_LOAD_CONFIG_DIRECTORY32
+0x000 Size : 0x80
+0x004 TimeDateStamp : 0
+0x008 MajorVersion : 0
+0x00a MinorVersion : 0
+0x00c GlobalFlagsClear : 0
+0x010 GlobalFlagsSet : 0
+0x014 CriticalSectionDefaultTimeout : 0
+0x018 DeCommitFreeBlockThreshold : 0
+0x01c DeCommitTotalFreeThreshold : 0
+0x020 LockPrefixTable : 0
+0x024 MaximumAllocationSize : 0
+0x028 VirtualMemoryThreshold : 0
+0x02c ProcessHeapFlags : 0
+0x030 ProcessAffinityMask : 0
+0x034 CSDVersion : 0
+0x036 Reserved1 : 0x800
+0x038 EditList : 0
+0x03c SecurityCookie : 0x76334b94
+0x040 SEHandlerTable : 0x7626db60
+0x044 SEHandlerCount : 3
`It looks like the Reserved1 field is set to 0x800 for most system DLLs. It also looks like the presence of this field changes the Ldrp behavior. Does anybody know what is this field about and what are the possible flag values in it?
Upvotes: 0
Views: 549
Reputation: 1183
OK. I have figured it out. The Reserved1 field in the IMAGE_LOAD_CONFIG_DIRECTORY32 now is used to control how the dependent modules are loaded. So far the only value I found in the system dlls was 0x0800. When this flag is present, dependent modules are searched only in the system directories.
If you are interested in the details - read on.
ModLoad: 4ef80000 4f041000 C:\vlh\pplus\builds\2016.09.23\OciVOB\DevInstall_debug\x86\cache\$Pcrt4.dll
eax=00000000 ebx=00800000 ecx=01b6f6c1 edx=0000008c esi=00000000 edi=002e8000
eip=77e6de8c esp=01b6f9c4 ebp=01b6fa20 iopl=0 nv up ei pl nz na po nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000202
ntdll!NtMapViewOfSection+0xc:
// Module $Pcrt4 being mapped
0:003> kbn
# ChildEBP RetAddr Args to Child
00 01b6f9c0 77e324c9 000000d8 ffffffff 0174d040 ntdll!NtMapViewOfSection+0xc // Arg3 - Pointer to DllBase in _LDR_DATA_TABLE_ENTRY (offset 18)
01 01b6fa20 77e3209a 01748590 00000000 0174d040 ntdll!LdrpMapViewOfSection+0x76
02 01b6fa70 77e31fc7 00008020 01b6fa8c 0174bf10 ntdll!LdrpMapImage+0x40
03 01b6fa90 77e2ef85 c0000135 0174d028 0174bf10 ntdll!LdrpMapDllWithSectionHandle+0x20
04 01b6fae8 77e2f21d 77f0eb60 0174bf10 00000000 ntdll!LdrpMapDllNtFileName+0xde
05 01b6fc94 77e31ebf 4a35c2d6 77f0eb60 0174bf30 ntdll!LdrpMapDllSearchPath+0x1e1
06 01b6fce4 77e34d09 01b6feac 01744d78 01746878 ntdll!LdrpProcessWork+0x84
07 01b6fcf4 77e37538 01b6feac 00000000 01744d78 ntdll!LdrpWorkCallback+0x59
08 01b6fde4 77e363b6 01b6feac 01744df0 4a35c1b2 ntdll!TppWorkpExecuteCallback+0x1e8
09 01b6ff80 75ca62c4 01745940 75ca62a0 48108a65 ntdll!TppWorkerThread+0x396
0a 01b6ff94 77e60609 01745940 4a35c1ee 00000000 KERNEL32!BaseThreadInitThunk+0x24
0b 01b6ffdc 77e605d4 ffffffff 77e82516 00000000 ntdll!__RtlUserThreadStart+0x2f
0c 01b6ffec 00000000 77e36020 01745940 00000000 ntdll!_RtlUserThreadStart+0x1b
0:003> !dlls 0x0174d028
0x0174d028: C:\vlh\pplus\builds\2016.09.23\OciVOB\DevInstall_debug\x86\cache\$Pcrt4.dll
Base 0x00000000 EntryPoint 0x00000000 Size 0x00000000 DdagNode 0x0174bfa8
Flags 0x00000064 TlsIndex 0x00000000 LoadCount 0x00000001 NodeRefCount 0x00000000
// ldrDataTableEntry before loadConfig was processed
0:003> dt _LDR_DATA_TABLE_ENTRY 0x0174d028
ntdll!_LDR_DATA_TABLE_ENTRY
+0x000 InLoadOrderLinks : _LIST_ENTRY [ 0x77f0ebec - 0x174cda0 ]
+0x008 InMemoryOrderLinks : _LIST_ENTRY [ 0x77f0ebf4 - 0x174cda8 ]
+0x010 InInitializationOrderLinks : _LIST_ENTRY [ 0x0 - 0x0 ]
+0x018 DllBase : (null)
+0x01c EntryPoint : (null)
+0x020 SizeOfImage : 0
+0x024 FullDllName : _UNICODE_STRING "C:\vlh\pplus\builds\2016.09.23\OciVOB\DevInstall_debug\x86\cache\$Pcrt4.dll"
+0x02c BaseDllName : _UNICODE_STRING "$Pcrt4.dll"
+0x034 FlagGroup : [4] "d"
+0x034 Flags : 0x64
+0x034 PackagedBinary : 0y0
+0x034 MarkedForRemoval : 0y0
+0x034 ImageDll : 0y1
+0x034 LoadNotificationsSent : 0y0
+0x034 TelemetryEntryProcessed : 0y0
+0x034 ProcessStaticImport : 0y1
+0x034 InLegacyLists : 0y1
+0x034 InIndexes : 0y0
+0x034 ShimDll : 0y0
+0x034 InExceptionTable : 0y0
+0x034 ReservedFlags1 : 0y00
+0x034 LoadInProgress : 0y0
+0x034 LoadConfigProcessed : 0y0
+0x034 EntryProcessed : 0y0
+0x034 ProtectDelayLoad : 0y0
+0x034 ReservedFlags3 : 0y00
+0x034 DontCallForThreads : 0y0
+0x034 ProcessAttachCalled : 0y0
+0x034 ProcessAttachFailed : 0y0
+0x034 CorDeferredValidate : 0y0
+0x034 CorImage : 0y0
+0x034 DontRelocate : 0y0
+0x034 CorILOnly : 0y0
+0x034 ReservedFlags5 : 0y000
+0x034 Redirected : 0y0
+0x034 ReservedFlags6 : 0y00
+0x034 CompatDatabaseProcessed : 0y0
+0x038 ObsoleteLoadCount : 6
+0x03a TlsIndex : 0
+0x03c HashLinks : _LIST_ENTRY [ 0x77f0ea68 - 0x77f0ea68 ]
+0x044 TimeDateStamp : 0
+0x048 EntryPointActivationContext : (null)
+0x04c Lock : (null)
+0x050 DdagNode : 0x0174bfa8 _LDR_DDAG_NODE
+0x054 NodeModuleLink : _LIST_ENTRY [ 0x174bfa8 - 0x174bfa8 ]
+0x05c LoadContext : 0x0174bf10 _LDRP_LOAD_CONTEXT
+0x060 ParentDllBase : (null)
+0x064 SwitchBackContext : (null)
+0x068 BaseAddressIndexNode : _RTL_BALANCED_NODE
+0x074 MappingInfoIndexNode : _RTL_BALANCED_NODE
+0x080 OriginalBase : 0
+0x088 LoadTime : _LARGE_INTEGER 0x0
+0x090 BaseNameHashValue : 0xc03583f1
+0x094 LoadReason : 0 ( LoadReasonStaticDependency )
+0x098 ImplicitPathOptions : 0
+0x09c ReferenceCount : 2
+0x0a0 DependentLoadFlags : 0
// loadConfig Processing:
0:003> k
# ChildEBP RetAddr
00 01b6fa4c 77e3260f ntdll!LdrpCfgProcessLoadConfig+0x37
01 01b6fa78 77e31fe3 ntdll!LdrpProcessMappedModule+0x110
02 01b6fa90 77e2ef85 ntdll!LdrpMapDllWithSectionHandle+0x3c
03 01b6fae8 77e2f21d ntdll!LdrpMapDllNtFileName+0xde
04 01b6fc94 77e31ebf ntdll!LdrpMapDllSearchPath+0x1e1
05 01b6fce4 77e34d09 ntdll!LdrpProcessWork+0x84
06 01b6fcf4 77e37538 ntdll!LdrpWorkCallback+0x59
07 01b6fde4 77e363b6 ntdll!TppWorkpExecuteCallback+0x1e8
08 01b6ff80 75ca62c4 ntdll!TppWorkerThread+0x396
09 01b6ff94 77e60609 KERNEL32!BaseThreadInitThunk+0x24
0a 01b6ffdc 77e605d4 ntdll!__RtlUserThreadStart+0x2f
0b 01b6ffec 00000000 ntdll!_RtlUserThreadStart+0x1b
ldrDataTableEntry.DependentLoadFlags = loadConfig.Reserved1;
// LdrpMapDllSearchPath looking at the ldrDataTableEntry.DependentLoadFlags
0:003> k
# ChildEBP RetAddr
00 01b6fc94 77e31ebf ntdll!LdrpMapDllSearchPath+0x259
01 01b6fce4 77e34d09 ntdll!LdrpProcessWork+0x84
02 01b6fcf4 77e37538 ntdll!LdrpWorkCallback+0x59
03 01b6fde4 77e363b6 ntdll!TppWorkpExecuteCallback+0x1e8
04 01b6ff80 75ca62c4 ntdll!TppWorkerThread+0x396
05 01b6ff94 77e60609 KERNEL32!BaseThreadInitThunk+0x24
06 01b6ffdc 77e605d4 ntdll!__RtlUserThreadStart+0x2f
07 01b6ffec 00000000 ntdll!_RtlUserThreadStart+0x1b
LdrpMapDllSearchPath()
{
77e2f28f 8b91a0000000 mov edx,dword ptr [ecx+0A0h] // edx = ldrDataTableEntry.DependentLoadFlags;
77e2f295 85d2 test edx,edx // if(edx == 0) {
77e2f297 7520 jne ntdll!LdrpMapDllSearchPath+0x27d (77e2f2b9)
77e2f299 e90afeffff jmp ntdll!LdrpMapDllSearchPath+0x6c (77e2f0a8)
-----------------------------------------------------------------------------------------------------------------------------------
77e2f0a8 6a50 push 50h // memset(pathConfig, 0, sizeof(pathConfig);
77e2f0aa 52 push edx
77e2f0ab 8d842450010000 lea eax,[esp+150h]
77e2f0b2 50 push eax
77e2f0b3 e8d84e0400 call ntdll!memset (77e73f90)
77e2f0b8 83a4246001000000 and dword ptr [esp+160h],0
77e2f0c0 83c40c add esp,0Ch
77e2f0c3 83a4245801000000 and dword ptr [esp+158h],0
77e2f0cb 8b4b08 mov ecx,dword ptr [ebx+8]
// L1:
77e2f0ce 894c2424 mov dword ptr [esp+24h],ecx //
77e2f0d2 0fb6430c movzx eax,byte ptr [ebx+0Ch]
77e2f0d6 8d54241c lea edx,[esp+1Ch]
77e2f0da 52 push edx
77e2f0db 8d542413 lea edx,[esp+13h]
77e2f0df c1e803 shr eax,3
77e2f0e2 52 push edx
77e2f0e3 8d542418 lea edx,[esp+18h]
77e2f0e7 83e001 and eax,1
77e2f0ea 52 push edx
77e2f0eb 8d542434 lea edx,[esp+34h]
77e2f0ef 52 push edx
77e2f0f0 8d542450 lea edx,[esp+50h]
77e2f0f4 52 push edx
77e2f0f5 8d54244c lea edx,[esp+4Ch]
77e2f0f9 52 push edx
77e2f0fa 8bd1 mov edx,ecx
77e2f0fc 8bcb mov ecx,ebx
77e2f0fe 50 push eax
77e2f0ff e818100000 call ntdll!LdrpSearchPath (77e3011c) // LdrpSearchPath(...);
77e2f104 807c240f00 cmp byte ptr [esp+0Fh],0
77e2f109 8bf8 mov edi,eax
77e2f10b 0f85b9ae0500 jne ntdll!LdrpMapDllSearchPath+0x5af8e (77e89fca)
// ...
// }
-----------------------------------------------------------------------------------------------------------------------------------
// else {
77e2f2b9 8b4928 mov ecx,dword ptr [ecx+28h]
77e2f2bc 8d842448010000 lea eax,[esp+148h]
77e2f2c3 50 push eax
77e2f2c4 83ca01 or edx,1 // dependentLoadFlags |= 1;
77e2f2c7 e895090100 call ntdll!LdrpInitializeDllPath (77e3fc61) // LdrpInitializePath(...);
77e2f2cc 8d8c2448010000 lea ecx,[esp+148h]
77e2f2d3 e9f6fdffff jmp ntdll!LdrpMapDllSearchPath+0x92 (77e2f0ce) // goto L1;
// }
------------------------------------------------------------------------------------------------------------------------------------
}
Upvotes: 1