解读 TiWorkerCoreInitialize
调用 CbsCoreInitialize,传递进去的函数地址就是在这里确定的。
//----- (0041BDC2)--------------------------------------------------------
int __thiscall TiWorkerCoreInitialize(void*this)
{
v1 =0;
v32 =this;
v33 =0;
v35 =0;
lpLibFileName = 0;
ppMalloc =0;
if (vhCoreModule )
{
v2 =-2147023649;
CBSWdsLog(0x4000000, -2147023649, 1, "Trusted Installer core already initialized.");
goto LABEL_102;
}
if (vpfnCbsCoreInitialize )
CbsUtil_Assert((int)"onecore\\base\\cbs\\tiworker\\tiworkercore.cpp",573, (int)"!vpfnCbsCoreInitialize");
if (vpfnCbsCoreStartupProcessing )
CbsUtil_Assert((int)"onecore\\base\\cbs\\tiworker\\tiworkercore.cpp",574, (int)"!vpfnCbsCoreStartupProcessing");
if (vpfnCbsCoreEnsureNoStartupProcessing )
CbsUtil_Assert(
(int)"onecore\\base\\cbs\\tiworker\\tiworkercore.cpp",
575,
(int)"!vpfnCbsCoreEnsureNoStartupProcessing");
if (vpfnCbsCoreShutdownProcessing )
CbsUtil_Assert((int)"onecore\\base\\cbs\\tiworker\\tiworkercore.cpp",576, (int)"!vpfnCbsCoreShutdownProcessing");
if (vpfnCbsCoreFinalize )
CbsUtil_Assert((int)"onecore\\base\\cbs\\tiworker\\tiworkercore.cpp",577, (int)"!vpfnCbsCoreFinalize");
v2 =PathGetModulePath(&v33);
if (v2 < 0)
{
CBSWdsLog(0x4000000, v2, 1, "Failed to find servicing stack directory.");
goto LABEL_102;
}
v3 =SczAllocConcat2Sz((int *)&lpLibFileName, (size_t)v33, (size_t)L"\\cbscore.dll");
v2 =v3;
if (v3 < 0)
{
CBSWdsLog(0x4000000, v3, 1, "Failed to allocate full path to Core DLL.");
v1 =(char *)lpLibFileName;
goto LABEL_102;
}
v1 =(char *)lpLibFileName;
v4 =LoadLibraryW(lpLibFileName);
vhCoreModule = v4;
if (!v4 )
{
v5 =GetLastError();
if (v5 > 0)
v5 =(unsigned __int16)v5 | 0x80070000;
v2 =v5;
if (v5 >= 0)
{
v2 =0x80004005;
v5 =0x80004005;
}
v31 =v1;
v30 ="Failed to load Core DLL from path: %S";
LABEL_24:
v29 =v5;
LABEL_25:
CBSWdsLog(0x4000000, v29, 1,v30, v31);
goto LABEL_102;
}
vpfnCbsCoreInitialize = GetProcAddress(v4,"CbsCoreInitialize");
if (!vpfnCbsCoreInitialize )
{
v5 =GetLastError();
if (v5 > 0)
v5 =(unsigned __int16)v5 | 0x80070000;
v2 =v5;
if (v5 >= 0)
{
v2 =0x80004005;
v5 =0x80004005;
}
v31 =v1;
v30 ="Failed to locate 'CbsCoreInitialize' method inCore DLL: %S";
goto LABEL_24;
}
vpfnCbsCoreLoadComponentStore = GetProcAddress(vhCoreModule,"CbsCoreLoadComponentStore");
if (!vpfnCbsCoreLoadComponentStore )
{
v5 =GetLastError();
if (v5 > 0)
v5 =(unsigned __int16)v5 | 0x80070000;
v2 =v5;
if (v5 >= 0)
{
v2 =0x80004005;
v5 =0x80004005;
}
v31 =v1;
v30 ="Failed to locate 'CbsCoreLoadComponentStore'method in Core DLL: %S";
goto LABEL_24;
}
vpfnCbsCoreStartupProcessing = GetProcAddress(vhCoreModule,"CbsCoreStartupProcessing");
if (!vpfnCbsCoreStartupProcessing )
{
v5 =GetLastError();
if (v5 > 0)
v5 =(unsigned __int16)v5 | 0x80070000;
v2 =v5;
if (v5 >= 0)
{
v2 =0x80004005;
v5 =0x80004005;
}
v31 =v1;
v30 ="Failed to locate 'CbsCoreStartupProcessing'method in Core DLL: %S";
goto LABEL_24;
}
vpfnCbsCoreEnsureNoStartupProcessing = GetProcAddress(vhCoreModule,"CbsCoreEnsureNoStartupProcessing");
if (!vpfnCbsCoreEnsureNoStartupProcessing)
{
v5 =GetLastError();
if (v5 > 0)
v5 =(unsigned __int16)v5 | 0x80070000;
v2 =v5;
if (v5 >= 0)
{
v2 =0x80004005;
v5 =0x80004005;
}
v31 =v1;
v30 ="Failed to locate'CbsCoreEnsureNoStartupProcessing' method in Core DLL: %S";
goto LABEL_24;
}
vpfnCbsCoreShutdownProcessing = GetProcAddress(vhCoreModule,"CbsCoreShutdownProcessing");
if (!vpfnCbsCoreShutdownProcessing )
{
v5 =GetLastError();
if (v5 > 0)
v5 =(unsigned __int16)v5 | 0x80070000;
v2 =v5;
if (v5 >= 0)
{
v2 =0x80004005;
v5 =0x80004005;
}
v31 =v1;
v30 ="Failed to locate 'CbsCoreShutdownProcessing'method in Core DLL: %S";
goto LABEL_24;
}
vpfnCbsCoreFinalize = GetProcAddress(vhCoreModule,"CbsCoreFinalize");
if (!vpfnCbsCoreFinalize )
{
v5 =GetLastError();
if (v5 > 0)
v5 =(unsigned __int16)v5 | 0x80070000;
v2 =v5;
if (v5 >= 0)
{
v2 =0x80004005;
v5 =0x80004005;
}
v31 =v1;
v30 ="Failed to locate 'CbsCoreFinalize' method inCore DLL: %S";
goto LABEL_24;
}
vpfnCbsCoreServiceIdleProcessing = GetProcAddress(vhCoreModule,"CbsCoreServiceIdleProcessing");
if (!vpfnCbsCoreServiceIdleProcessing )
CBSWdsLog(0x4000000, 0, 0, "Warning: Failed tolocate 'CbsCoreServiceIdleProcessing' method in Core DLL: %S", v1);
vpfnCbsCoreSetState = GetProcAddress(vhCoreModule,"CbsCoreSetState");
if (!vpfnCbsCoreSetState )
{
v31 =v1;
v2 =0x800F0800;
v30 ="Warning: Failed to locate 'CbsCoreSetState'method in Core DLL: %S";
LABEL_66:
v29 =v2;
goto LABEL_25;
}
vpfnCbsCorePrepareShutdownProcessing = GetProcAddress(vhCoreModule,"CbsCorePrepareShutdownProcessing");
if (!vpfnCbsCorePrepareShutdownProcessing)
CBSWdsLog(
0x4000000,
0,
0,
"Warning:Failed to locate 'CbsCorePrepareShutdownProcessing' method in Core DLL:%S",
v1);
vpfnCbsCoreFinalizeShutdownProcessing = GetProcAddress(vhCoreModule,"CbsCoreFinalizeShutdownProcessing");
if (!vpfnCbsCoreFinalizeShutdownProcessing)
CBSWdsLog(
0x4000000,
0,
0,
"Warning:Failed to locate 'CbsCoreFinalizeShutdownProcessing' method in Core DLL:%S",
v1);
vpfnCbsCoreSetRebootInProgressFlag = GetProcAddress(vhCoreModule,"SetRebootInProgressFlag");
if (!vpfnCbsCoreSetRebootInProgressFlag )
CBSWdsLog(0x4000000, 0, 0, "Warning: Failed tolocate 'SetRebootInProgressFlag' method in Core DLL: %S", v1);
vpfnCbsCreateSessionNotifyInitialize = GetProcAddress(vhCoreModule,"CbsCreateSessionNotifyInitialize");
if (!vpfnCbsCreateSessionNotifyInitialize)
CBSWdsLog(
0x4000000,
0,
0,
"Warning:Failed to locate 'CbsCreateSessionNotifyInitialize' method in Core DLL:%S",
v1);
vpfnCbsCreateSessionNotify = GetProcAddress(vhCoreModule,"CbsCreateSessionNotify");
if (!vpfnCbsCreateSessionNotify )
CBSWdsLog(0x4000000, 0, 0, "Warning: Failed tolocate 'CbsCreateSessionNotify' method in Core DLL: %S", v1);
vpfnCbsCreateSessionNotifyFinalize = GetProcAddress(vhCoreModule,"CbsCreateSessionNotifyFinalize");
if (!vpfnCbsCreateSessionNotifyFinalize )
CBSWdsLog(0x4000000, 0, 0, "Warning: Failed tolocate 'CbsCreateSessionNotifyFinalize' method in Core DLL: %S", v1);
vpfnCbsCoreStopIdleProcessing = GetProcAddress(vhCoreModule,"CbsCoreStopIdleProcessing");
if (!vpfnCbsCoreStopIdleProcessing )
CBSWdsLog(0x4000000, 0, 0, "Warning: Failed tolocate 'CbsCoreStopIdleProcessing' method in Core DLL: %S", v1);
v2 =CoGetMalloc(1u, &ppMalloc);
if (v2 >= 0)
{
v6 =(int (__stdcall*)(signedint, _DWORD))vpfnCbsCoreSetState;
__guard_check_icall_fptr(vpfnCbsCoreSetState);
v2 =v6(8, 0);
if (v2 >= 0)
{
v7 =(int (__stdcall*)(LPMALLOC,signed int (__stdcall *)(int), void (__stdcall*)(),int (__stdcall *)(), int(__stdcall *)(), BOOL (__stdcall*)(),int (__stdcall *)(), structIClassFactory **))vpfnCbsCoreInitialize;
v8 =ppMalloc;
__guard_check_icall_fptr(vpfnCbsCoreInitialize);
v2 =v7(
v8,
TiWorkerCoreLockProcess,
TiWorkerCoreUnlockProcess,
TiWorkerCoreInstanceCreated,
TiWorkerCoreInstanceDestroyed,
TiWorkerCoreRequireShutdownNow,
TiWorkerCoreRequireShutdownProcessing,
&v35);
if (v2 < 0)
{
v31 =v1;
v30 ="Failed to initialize the Core DLL: %S";
goto LABEL_66;
}
if (v32 )
{
lpLibFileName = 0;
GetOsSafeBootMode(&lpLibFileName);
v9 =(void (__stdcall*)(int))vpfnCbsCoreEnsureNoStartupProcessing;
v10 =(unsigned int)lpLibFileName >0;
__guard_check_icall_fptr(vpfnCbsCoreEnsureNoStartupProcessing);
v9(v10);
}
v11 =(int (__stdcall*)(signedint, int (__stdcall *)()))vpfnCbsCoreSetState;
__guard_check_icall_fptr(vpfnCbsCoreSetState);
v12 =v11(1,TiWorkerCoreRevokeShutdownProcessing);
if (v12 < 0)
CBSWdsLog(
0x4000000,
v12,
1,
"Failedto supply callback for revoking shutdown processing; assuming it is notsupported.");
v13 =(int (__stdcall*)(_DWORD,int (__stdcall *)()))vpfnCbsCoreSetState;
__guard_check_icall_fptr(vpfnCbsCoreSetState);
v14 =v13(0,TiWorkerCoreRequireReboot);
if (v14 < 0)
CBSWdsLog(
0x4000000,
v14,
1,
"Ignoringfailure to set reboot callback; assuming reboot indication is notsupported.");
v15 =(int (__stdcall*)(signedint, int (__stdcall *)()))vpfnCbsCoreSetState;
__guard_check_icall_fptr(vpfnCbsCoreSetState);
v16 =v15(3,TiWorkerCoreIsRebootRequired);
if (v16 < 0)
CBSWdsLog(
0x4000000,
v16,
1,
"Ignoringfailure to set is reboot required callback; assuming it is not supported.");
v17 =(int (__stdcall*)(signedint, int (__stdcall *)()))vpfnCbsCoreSetState;
__guard_check_icall_fptr(vpfnCbsCoreSetState);
v18 =v17(4,TiWorkerCoreAnticipateShutdownProcessingNeeded);
if (v18 < 0)
CBSWdsLog(
0x4000000,
v18,
1,
"Ignoringfailure to set is anticipate shutdown processing needed callback; assuming itis not supported.");
v19 =(int (__stdcall*)(signedint, int (__stdcall *)()))vpfnCbsCoreSetState;
__guard_check_icall_fptr(vpfnCbsCoreSetState);
v20 =v19(5,TiWorkerCoreRegisterWinlogonNotification);
if (v20 < 0)
CBSWdsLog(
0x4000000,
v20,
1,
"Failedto supply callback for registering winlogon notifications; assuming it is notsupported.");
v21 =(int (__stdcall*)(signedint, int (__stdcall *)(int)))vpfnCbsCoreSetState;
__guard_check_icall_fptr(vpfnCbsCoreSetState);
v22 =v21(6,TiWorkerCoreUnregisterWinlogonNotification);
if (v22 < 0)
CBSWdsLog(
0x4000000,
v22,
1,
"Failedto supply callback for unregistering winlogon notifications; assuming it is notsupported.");
v23 =v35;
v2 =0;
v35 =0;
vpCbsSessionClassFactory = v23;
}
else
{
CBSWdsLog(0x4000000, v2, 1, "Failed to set online servicing state.");
}
}
else
{
CBSWdsLog(0x4000000, v2, 1, "Failed to get task allocator for TrustedInstaller.");
}
LABEL_102:
if (v35 )
{
v24 =(int)v35;
v25 =v35->lpVtbl->Release;
__guard_check_icall_fptr(v35->lpVtbl->Release);
v25((IClassFactory*)v24);
}
if (ppMalloc )
{
v26 =ppMalloc;
v27 =ppMalloc->lpVtbl->Release;
__guard_check_icall_fptr(ppMalloc->lpVtbl->Release);
v27(v26);
}
if (v2 < 0&& vhCoreModule )
{
vhCoreModule = 0;
vpfnCbsCoreInitialize = 0;
vpfnCbsCoreStartupProcessing = 0;
vpfnCbsCoreEnsureNoStartupProcessing = 0;
vpfnCbsCoreShutdownProcessing = 0;
vpfnCbsCoreFinalize = 0;
vpfnCbsCorePrepareShutdownProcessing = 0;
vpfnCbsCoreFinalizeShutdownProcessing= 0;
}
if (v1 )
SczFree(v1);
if (v33 )
SczFree(v33);
return v2;
}
// 401CC4: using guessed type wchar_taCbscore_dll[13];
// 41B700: using guessed type int __stdcallTiWorkerCoreUnregisterWinlogonNotification(int);
// 41E97B: using guessed type intCBSWdsLog(_DWORD, _DWORD, _DWORD, const char *, ...);
// 42C440: using guessed type struct IClassFactory*vpCbsSessionClassFactory;
// 42D148: using guessed type _DWORD __stdcallGetOsSafeBootMode(_DWORD);
// 42D1DC: using guessed type int (__thiscall*__guard_check_icall_fptr)(_DWORD);