解读 DetermineServicingStackVersion

179 篇文章 0 订阅
86 篇文章 0 订阅

解读 DetermineServicingStackVersion

 

 

这里也没有涉及到 hFile 的值修改。

 

//----- (10086424)--------------------------------------------------------
int __fastcall DetermineServicingStackVersion(LPCWSTR lpwstrFilename, const WCHAR *a2)
{

  v2 =lpwstrFilename;
  v7 =0;
  v8 =0;
  v9 =0;
  v10 =0;
  v11 =0;
  v12 =0i64;
  v3 =FindServicingStackDirectoryVersion(a2, (_DWORD *)&v12+ 1, &v12);
  v4 =v3;
  if (v3 >= 0)
    goto LABEL_10;
  CBSWdsLog(0x4000000, v3, 1, "Failed to find servicing stack directory in onlinestore.");
  if (hFile )
    CBSWdsLog(0x4000000, 0, 0, "Offline servicing,using stack version from: %S", v2);
  v6 =FileVersion(v2, (_DWORD*)&v12 +1, (int)&v12);
  v4 =v6;
  if (v6 >= 0)
  {
LABEL_10:
    vServicingStackVersion = v12;
    CBSWdsLog(
      0x4000000,
      0,
      0,
      "LoadedServicing Stack v%d.%d.%d.%d with Core: %S",
      HIDWORD(v12) >>16,
      WORD2(v12),
      (unsignedint)v12 >>16,
      (unsigned__int16)v12,
      v2);
  }
  else
  {

    CBSWdsLog(0x4000000, v6, 1, "Failed to get servicing stack version from file:%S", v2);
  }
  CCbsStoreObject::~CCbsStoreObject((CCbsStoreObject*)&v7);
  return v4;
}
// 1019AA88: using guessed type unsigned __int64vServicingStackVersion;

 

//----- (10087D1F) --------------------------------------------------------
int __thiscall CoreResourcesLoad(constunsigned __int16 *this)
{

  v1 =hFile;
  v2 =0;
  v12 =this;
  v3 =0;
  lpLibFileName = 0;
  memset(Dst,0, 0x208u);
  CBS_EnterCriticalSection(&vCoreResourcesLock);
  if (vhCoreResourcesDll )
  {
    v3 =-2146498558;
    CBSWdsLog(0x4000000, -2146498558, 1, "CoreResources have been already beeninitialized.");
    goto LABEL_11;
  }
  if
(GetWindowsDirectoryW(Dst, 0x104u) )
  {
    if
(!v1 )
    {
      v3 =SczAllocFromSz((int *)&lpLibFileName, Dst);
      if (v3 < 0)
      {
        v2 =lpLibFileName;
        v11 =lpLibFileName;
        v10 ="Failed to allocate core resources path fromwindows directory: %S";
      }
      else
      {

        v3 =SczEnsureBackslashTerminated((const void**)&lpLibFileName);
        if ( v3 >= 0 )
        {
          v3 =SczAllocConcat2Sz((const void **)&lpLibFileName, L"servicing\\",L"CbsMsg.dll");
          if ( v3 <0 )
          {
            CBSWdsLog(0x4000000, v3, 1, "Failed to allocatefull path to core resources DLL.");
            goto LABEL_24;
          }
          v2 =lpLibFileName;
          v4 =LoadLibraryExW(lpLibFileName, 0, 2u);
          vhCoreResourcesDll = v4;
LABEL_8:
          if ( v4 )
            goto LABEL_9;
          if ( v2 )
          {
            operator delete
((void *)(v2 - 2));
            lpLibFileName = 0;
          }
          v3 =SczAllocConcat2Sz((const void **)&lpLibFileName, v12, L"CbsMsg.dll");
          if ( v3 >=0 )
          {
            v2 = lpLibFileName;
            vhCoreResourcesDll = LoadLibraryExW(lpLibFileName,0, 2u);
            if ( vhCoreResourcesDll )
              goto LABEL_9;
            v3 = 0;
            v8 = GetLastError();
            if ( v8 >0 )
              v8 = (unsigned__int16)v8 |0x80070000;
            v11 = v2;
            v10 = "Failed toload cbsmsg DLL: %S (possibly expected)";
            v9 = v8;
LABEL_33:
            CBSWdsLog(0x4000000, v9, 1, v10, v11);
LABEL_9:
            if ( v2 )
              operator delete((void *)(v2 - 2));
            goto LABEL_11;
          }
          CBSWdsLog(0x4000000, v3, 1, "Failed to allocatefull path to DrUpdate DLL.");
LABEL_24:
          v2 =lpLibFileName;
          goto LABEL_9;
        }
        v2 =lpLibFileName;
        v11 =lpLibFileName;
        v10 ="Failed to ensure core resources path ended witha backslash: %S";
      }
      v9 =v3;
      goto LABEL_33;
    }
    v4 =vhCoreResourcesDll;
    goto LABEL_8;
  }
  v6 =GetLastError();
  v3 =v6;
  v7 =v6 < 0;
  if (v6 > 0)
  {
    v3 =(unsigned __int16)v6 | 0x80070000;
    v7 =v3 < 0;
  }
  if
(!v7 )
    v3 =-2147467259;
  CBSWdsLog(0x4000000, v3, 1, "Failed to get windows directory for CoreResourcespath.");
LABEL_11:
  CBS_LeaveCriticalSection(&vCoreResourcesLock);
  return v3;
}

 

//----- (100864B9)--------------------------------------------------------
signed int __fastcall FindServicingStackDirectoryVersion(const WCHAR *a1,_DWORD *a2, _DWORD *a3)
{

  phkResult =0;
  v3 =0;
  v15 =a2;
  v17 =0;
  v4 =0;
  v19 =0i64;
  lpString1 =a1;
  lpSrc =0;
  lpString2 =0;
  v5 =RegOpenKeyExW(
         HKEY_LOCAL_MACHINE,
         L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ComponentBased Servicing\\Version",
         0,
         0x20019u,
         &phkResult);
  v6 =v5 < 0;
  if (v5 > 0)
    v6 =(((unsigned __int16)v5 | 0x80070000) & 0x80000000) != 0;
  if (v6 )
  {
LABEL_28:
    v10 =-2147023728;
    CBSWdsLog(0x4000000, -2147023728, 1, "Failed to find a matching version for servicing stack:%S", lpString1);
  }
  else
  {
    for
(i = 0;; i = v18 +1 )
    {
      v18 =i;
      memset(&Dst, 0,0x208u);
      v9 =CbsRegEnumStringValue(i, phkResult, (HKEY)&Dst, v8, (unsigned__int16 *)&lpSrc,v13, v14);
      v10 =v9;
      if (v9 == -2147024637 )
        break;
      if (v9 < 0)
      {
        CBSWdsLog(0x4000000, v9, 1, "Failed to enumerate all servicing stackversions.");
        v4 =lpSrc;
        goto LABEL_18;
      }
      v4 =lpSrc;
      v10 =FileExpandPath(lpSrc, (LPWSTR *)&lpString2);
      if (v10 < 0)
      {
        v3 =lpString2;
        CBSWdsLog(0x4000000, v10, 1, "Failed to expand path from onine store: %S",lpString2);
        goto LABEL_18;
      }
      v11 =SczEnsureBackslashTerminated((const void**)&lpString2);
      v3 =lpString2;
      v10 =v11;
      if (v11 < 0)
      {
        CBSWdsLog(0x4000000, v11, 1, "Failed to ensure path to online store is backslashterminated: %S", lpString2);
        goto LABEL_18;
      }
      if
(CompareStringW(0x7Fu, 1u, lpString1, -1, lpString2,-1) == 2 )
      {
        v20 =0i64;
        if ( FileVersionFromString((wchar_t*)&Dst, (_DWORD*)&v20 +1, &v20) >= 0 &&v20 > v19 )
        {
          v17 =1;
          v19 =v20;
        }
      }
      if
(v4 )
      {
        operator delete
((void *)(v4 - 2));
        lpSrc =0;
      }
    }

    v10 =0;
    v4 =lpSrc;
    if (!v17 )
      goto LABEL_28;
    *v15= HIDWORD(v19);
    *a3= v19;
  }
LABEL_18:
  if (v3 )
    operator delete((void *)(v3 - 2));
  if (v4 )
    operator delete((void *)(v4 - 2));
  if (phkResult )
    RegCloseKey(phkResult);
  return v10;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值