解读 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);
