@@ -447,7 +447,7 @@ __forceinline NTSTATUS LoadModule(MANUAL_MAPPING_DATA * pData, MANUAL_MAPPING_FU
447447 DeleteObject (f, pModPathW);
448448 DeleteObject (f, ModNameW->szBuffer );
449449 DeleteObject (f, ModNameW);
450-
450+
451451 return ntRet;
452452 }
453453
@@ -470,16 +470,14 @@ __forceinline NTSTATUS LoadModule(MANUAL_MAPPING_DATA * pData, MANUAL_MAPPING_FU
470470 ctx->OriginalFullDllName = ModNameW->szBuffer ;
471471 }
472472
473- ULONG_PTR unknown3 = 0 ;
474-
475473 if (pData->OSBuildNumber >= g_Win11_21H2)
476474 {
477475 auto _LdrpLoadDllInternal = ReCa<f_LdrpLoadDllInternal_WIN11>(f->LdrpLoadDllInternal );
478- ntRet = _LdrpLoadDllInternal (&pModPathW->String , ctx, ctx_flags, 4 , nullptr , nullptr , ReCa<LDR_DATA_TABLE_ENTRY_WIN11 **>(&entry_out), &unknown3 , 0 );
476+ _LdrpLoadDllInternal (&pModPathW->String , ctx, ctx_flags, 4 , nullptr , nullptr , ReCa<LDR_DATA_TABLE_ENTRY_WIN11 **>(&entry_out), &ntRet , 0 );
479477 }
480478 else
481479 {
482- ntRet = f->LdrpLoadDllInternal (&pModPathW->String , ctx, ctx_flags, 4 , nullptr , nullptr , ReCa<LDR_DATA_TABLE_ENTRY_WIN10 **>(&entry_out), &unknown3 );
480+ f->LdrpLoadDllInternal (&pModPathW->String , ctx, ctx_flags, 4 , nullptr , nullptr , ReCa<LDR_DATA_TABLE_ENTRY_WIN10 **>(&entry_out), &ntRet );
483481 }
484482
485483 DeleteObject (f, ctx);
@@ -817,6 +815,7 @@ DWORD __declspec(code_seg(".mmap_sec$1")) __stdcall ManualMapping_Shell(MANUAL_M
817815 veh_shell_data->ImgBase = ReCa<ULONG_PTR>(pBase);
818816 veh_shell_data->ImgSize = pOptionalHeader->SizeOfImage ;
819817 veh_shell_data->OSVersion = pData->OSVersion ;
818+
820819 veh_shell_data->_LdrpInvertedFunctionTable = f->LdrpInvertedFunctionTable ;
821820 veh_shell_data->_LdrProtectMrdata = f->LdrProtectMrdata ;
822821
@@ -945,6 +944,18 @@ DWORD __declspec(code_seg(".mmap_sec$1")) __stdcall ManualMapping_Shell(MANUAL_M
945944
946945 if (NT_FAIL (ntRet))
947946 {
947+ if (ntRet == STATUS_APISET_NOT_HOSTED)
948+ {
949+ ++pImportDescr;
950+
951+ if (pImportDescr >= ReCa<IMAGE_IMPORT_DESCRIPTOR *>(pBase + pImportDir->VirtualAddress + pImportDir->Size ))
952+ {
953+ break ;
954+ }
955+
956+ continue ;
957+ }
958+
948959 // unable to load required library
949960 ErrorBreak = true ;
950961 break ;
@@ -1046,12 +1057,23 @@ DWORD __declspec(code_seg(".mmap_sec$1")) __stdcall ManualMapping_Shell(MANUAL_M
10461057 while (pDelayImportDescr && pDelayImportDescr->DllNameRVA )
10471058 {
10481059 char * szMod = ReCa<char *>(pBase + pDelayImportDescr->DllNameRVA );
1049-
10501060 HINSTANCE hDll = NULL ;
10511061 ntRet = LoadModule (pData, f, szMod, &hDll, &delay_imports);
10521062
10531063 if (NT_FAIL (ntRet))
10541064 {
1065+ if (ntRet == STATUS_APISET_NOT_HOSTED)
1066+ {
1067+ ++pDelayImportDescr;
1068+
1069+ if (pDelayImportDescr >= ReCa<IMAGE_DELAYLOAD_DESCRIPTOR *>(pBase + pDelayImportDir->VirtualAddress + pDelayImportDir->Size ))
1070+ {
1071+ break ;
1072+ }
1073+
1074+ continue ;
1075+ }
1076+
10551077 ErrorBreak = true ;
10561078 break ;
10571079 }
@@ -1217,9 +1239,9 @@ DWORD __declspec(code_seg(".mmap_sec$1")) __stdcall ManualMapping_Shell(MANUAL_M
12171239 bool partial = true ;
12181240
12191241#ifdef _WIN64
1220- if (veh_shell_fixed)
1242+ if (veh_shell_fixed) // really needed for x64?
12211243 {
1222- // register VEH shell to fill handler list
1244+ // register VEH shell to fill SEH handler list
12231245 pData->hVEH = f->RtlAddVectoredExceptionHandler (0 , ReCa<PVECTORED_EXCEPTION_HANDLER>(pVEHShell));
12241246 }
12251247#endif
0 commit comments