OpenStore是值得看一下的

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

OpenStore是值得看一下的

 

CreateNewOfflineStore 和 OpenExistingOfflineStore 中调用。

调用

  `anonymous namespace'::CNtStoreCreationParameters::CNtStoreCreationParameters((int)&v20);
  v9 =((int (__stdcall*)(int))`anonymous namespace'::CNtStoreCreationParameters::Initialize)(a2);
  v10 =&v20;
  v19 =0;
  v21 =a1 & 1;
  v11 =(int *)GetRerootedSIL((int)&v20,(int *)&v19);
  if ((signed int)v11 <0
    ||(v11 =`anonymous namespace'::SetupOfflineStoreEnvironment((int)&v20,v19), (signed int)v11 < 0)
    ||(v11 =(int *)`anonymous namespace'::OpenStore((_DWORD **)&v20, v19,a3, (int)a4), (signed int)v11 < 0) )

 

`anonymousnamespace'::OpenStore(

classA0x4bc90b42::CNtStoreCreationParameters const *,

structWindows::Rtl::IRtlSystemIsolationLayer *,

struct_GUID const &,

structIUnknown * *)

 

//----- (10120AB0)--------------------------------------------------------
int __fastcall `anonymous namespace'::OpenStore(

_DWORD **a1,

int *a2,

int a3,

int a4)
{
  struct
IStore2 *v46; //ST10_4@47
  int (__stdcall*v47)(structIStore2 *, int, int); // esi@47
  structWindows::Rtl::IRtlSystemIsolationLayer *v51;// [sp+0h] [bp-88h]@0
  struct ICSIStore **v53; // [sp+0h][bp-88h]@35
  struct Windows::Rtl::IRtlKey *v54; // [sp+4h][bp-84h]@0
  const struct _GUID *v55; // [sp+4h][bp-84h]@8
  struct ICSIStore **v56; // [sp+4h][bp-84h]@35
  struct IStore2 *v69; // [sp+3Ch][bp-4Ch]@35
  struct Windows::ComponentStore::Rtl::IRtlComponentStore*v71; //[sp+44h] [bp-44h]@1

  v77 =a1;
  v59 =a2;
 Windows::ErrorHandling::COM::CSimpleHResultCarryingFrame::CSimpleHResultCarryingFrame((Windows::ErrorHandling::COM::CSimpleHResultCarryingFrame*)&v76);
  v5 =*(_DWORD*)(v4+ 36);
  v78[0] = *(_DWORD *)(v4 + 28);
  v71 =(structWindows::ComponentStore::Rtl::IRtlComponentStore *)1;
  v79 =*(_DWORD*)(v4+ 32);
  v6 =*(_WORD*)(v5+ 2 * ((unsignedint)v78[0] >> 1) - 2) == 92;
  v7 =2;
  v80 =*(_DWORD*)(v4+ 36);
  if (v6 )
  {
    v8 =(signed int)v71;
  }
  else
  {

    v8 =2;
    v81 =g_LUNICODE_STRING__bslash_;
    v82 =*((_DWORD*)&g_LUNICODE_STRING__bslash_ + 1);
    v83 =*((_DWORD*)&g_LUNICODE_STRING__bslash_ + 2);
  }
  v9 =&v78[3 * v8];
  *v9= g_LUNICODE_STRING_WinSxS[0];
  v9[1] =g_LUNICODE_STRING_WinSxS[1];
  v9[2] = g_LUNICODE_STRING_WinSxS[2];
  v66 =0;
  v67 =0;
  v68 =0;
  v10 =RtlConcatenateLUnicodeStrings(0, v8 + 1, v78, (int)&v66);
  if (v10 < 0)
  {
   Windows::ErrorHandling::COM::CBaseFrame<Windows::ErrorHandling::COM::CSimpleHResultCarryingFrame>::SetNtStatus(
      &v76,
      v10);
LABEL_56:
    Windows::Auto<_LUTF8_STRING>::~Auto<_LUTF8_STRING>(&v66);
   Windows::ErrorHandling::COM::CBaseFrame<Windows::ErrorHandling::COM::CVoidRaiseFrame>::ReportErrorPropagation(
      &v76,
      v48);
    return v76;
  }
  v75 =0;
  v11 =*v59;
//  OpenRegistryKey

  v12 = (*(int(__thiscall **)(int *,_DWORD, signed int, int *,int *, _DWORD))(v11 + 20))(
          v59,
          0,
          131097,
         g_LUNICODE_STRING__bslash_Registry_bslash_Machine_bslash_COMPONENTS_bslash_,
          &v75,
          0);
  if (v12 < 0
    ||(v12 =Windows::COM::VerifyStoreVersionNumber(v75,v59, (Windows::COM *)*((_WORD *)v77 + 92), v51, v54, v57),
        v12 <0) )
  {
   Windows::ErrorHandling::COM::CBaseFrame<Windows::ErrorHandling::COM::CSimpleHResultCarryingFrame>::SetNtStatus(
      &v76,
      v12);
LABEL_55:
    Windows::Auto<Windows::Rtl::IRtlSystemIsolationLayer *>::~Auto<Windows::Rtl::IRtlSystemIsolationLayer *>(&v75);
    goto LABEL_56;
  }
  v13 =*v59;
  v74 =0;
//  OpenRegistryKey

  v14 = (*(int(__thiscall **)(int *,_DWORD, signed int, int *,int *, _DWORD))(v13 + 20))(
          v59,
          0,
          131097,
         g_LUNICODE_STRING__bslash_Registry_bslash_Machine_bslash_SOFTWARE_bslash_Microsoft_bslash_Windows_bslash_CurrentVersion_bslash_SideBySide_bslash_,
          &v74,
          0);
  if (v14 < 0)
  {
    Windows::ErrorHandling::COM::CBaseFrame<Windows::ErrorHandling::COM::CSimpleHResultCarryingFrame>::SetNtStatus(
      &v76,
      v14);
LABEL_54:
    Windows::Auto<Windows::Rtl::IRtlSystemIsolationLayer *>::~Auto<Windows::Rtl::IRtlSystemIsolationLayer *>(&v74);
    goto LABEL_55;
  }
  v15 =*v59;
  v73 =0;
//  OpenFileSystemDirectory

  v16 = (*(int(__thiscall **)(int *,_DWORD, signed int, int *,signed int, signed int, int *, _DWORD))(v15+ 8))(
          v59,
          0,
          1179785,
          (int*)&v66,
          7,
          33,
          &v73,
          0);
  if (v16 < 0)
  {
   Windows::ErrorHandling::COM::CBaseFrame<Windows::ErrorHandling::COM::CSimpleHResultCarryingFrame>::SetNtStatus(
      &v76,
      v16);
LABEL_53:
    Windows::Auto<Windows::Rtl::IRtlSystemIsolationLayer *>::~Auto<Windows::Rtl::IRtlSystemIsolationLayer *>(&v73);
    goto LABEL_54;
  }
  v17 =v77;
  v72 =0;
  if (v77[43] )
  {
    v18 =*v59;
//  OpenRegistryKey

    v19 = (*(int(__thiscall **)(int *,_DWORD, signed int, int *,int *, _DWORD))(v18 + 20))(
            v59,
            0,
            131097,
            dword_10012014, // \Registry\Machine\ExtStorage
            (int *)&v72,
            0);
    if (v19 < 0)
    {
     Windows::ErrorHandling::COM::CBaseFrame<Windows::ErrorHandling::COM::CSimpleHResultCarryingFrame>::SetNtStatus(
        &v76,
        v19);
LABEL_52:
      Windows::Auto<Windows::Rtl::IRtlSystemIsolationLayer *>::~Auto<Windows::Rtl::IRtlSystemIsolationLayer *>(&v72);
      goto LABEL_53;
    }
    v17 =v77;
  }
  v20 =*((_WORD*)v17+ 92);
  if ((_WORD)v20 )
  {
    if
(v20 == 6)
    {
      v50 =4;
    }
    else
    {
      if
(v20 == 9)
        goto LABEL_27;
      if (v20 == 12)
      {
        v50 =16;
      }
      else
      {
        if
( v20 != 5 )
        {
         Windows::ErrorHandling::COM::CBaseFrame<Windows::ErrorHandling::COM::CSimpleHResultCarryingFrame>::SetInvalidParameter(&v76);
          Windows::Auto<Windows::Rtl::IRtlSystemIsolationLayer *>::~Auto<Windows::Rtl::IRtlSystemIsolationLayer *>(&v72);
          Windows::Auto<Windows::Rtl::IRtlSystemIsolationLayer *>::~Auto<Windows::Rtl::IRtlSystemIsolationLayer *>(&v73);
          Windows::Auto<Windows::Rtl::IRtlSystemIsolationLayer *>::~Auto<Windows::Rtl::IRtlSystemIsolationLayer *>(&v74);
          Windows::Auto<Windows::Rtl::IRtlSystemIsolationLayer *>::~Auto<Windows::Rtl::IRtlSystemIsolationLayer *>(&v75);
          Windows::Auto<_LUTF8_STRING>::~Auto<_LUTF8_STRING>(&v66);
          v65 ="base\\wcp\\dll\\offline.cpp";
          v66 ="`anonymous-namespace'::OpenStore";
          v67 =478;
          v68 ="false";
         Windows::ErrorHandling::COM::CBaseFrame<Windows::ErrorHandling::COM::CSimpleHResultCarryingFrame>::ReportErrorOrigination(
            (int*)&v76,
            (int)&v65);
          return v76;
        }
        v50 =8;
      }
    }

    v7 =v50;
    goto LABEL_27;
  }
  v7 =1;
LABEL_27:
  if (*((_BYTE*)v17+ 186) )
    v7 |=0x20u;
  v60 =20;
  v61 =g_LUNICODE_STRING_Winners;
  v62 =64;
  v63 =0;
  v64 =0;
  v70 =0;
  v21 =v74;
  v22 =*(_DWORD*)v74;
// IRtlKey SideBySide, OpenExistingKey

  v23 = (*(int(__thiscall **)(int, _DWORD, signed int, int*, int *, _DWORD))(v22+ 40))(v21, 0, 131097, &v60,&v70, 0);
  if (v23 < 0)
  {
   Windows::ErrorHandling::COM::CBaseFrame<Windows::ErrorHandling::COM::CSimpleHResultCarryingFrame>::SetNtStatus(
      &v76,
      v23);
LABEL_51:
    Windows::Auto<Windows::Rtl::IRtlSystemIsolationLayer *>::~Auto<Windows::Rtl::IRtlSystemIsolationLayer *>(&v70);
    goto LABEL_52;
  }
  v24 =(unsigned int *)v77;
  v71 =0;
  v25 =Windows::Rtl::AutoString<_LUNICODE_STRING,Windows::Auto<_LUNICODE_STRING>>::IsEmpty((int)(v77 + 40));
  v77 =0;
  if (!v25 )
    v77 =v26;
  v27 =`anonymous namespace'::CreateRtlStore(
          v7,
          (int)v59,
          v75,
          v74,
          v70,
          (int*)&v66,
          (volatilesigned __int32 *)&v71,
          (int)v77,
          v72);
  if (v27 < 0)
  {
   Windows::ErrorHandling::COM::CBaseFrame<Windows::ErrorHandling::COM::CSimpleHResultCarryingFrame>::SetNtStatus(
      &v76,
      v27);
LABEL_50:
    Windows::Auto<Windows::Rtl::IRtlSystemIsolationLayer *>::~Auto<Windows::Rtl::IRtlSystemIsolationLayer *>(&v71);
    goto LABEL_51;
  }
  v6 =(*v24& 4) == 0;
  v28 =*v24;
  v29 =v28 & 0x10;
  v30 =!v6 ?0 : 1;
  v69 =0;
  v59 =(int *)&v69;
  v31 =BUCL::Com::CFunkyOperatorAmpersandReturnType<BUCL::Com::CSmartRef<IStorePendingTransaction>>::operatorIStorePendingTransaction * *(&v59);
  v34 =Windows::COM::CopyOut(
          v30,
          v71,
          v32,
          (structWindows::ComponentStore::Rtl::IRtlComponentStore *)*((_WORD *)v24 + 92),
          v29,
          v33,
          v31,
          v52,
          v55,
          v58);
  if (v34 < 0)
    goto LABEL_61;
  if (!(unsigned__int8)operator==(a3, (int)&_GUID_a5c62f6d_5e3e_4cd9_b345_6b281d7a1d1e)
    &&!(unsigned__int8)operator==(v35, (int)&_GUID_a817521b_2b43_489f_8b84_67aceeab24a8) )
  {
    v77 =0;
    v38 =(volatile signed __int32*)Windows::ServicingAPI::Initialize(v37, v36);
    if ((signed int)v38 <0
      ||(v38 =Windows::ServicingAPI::CCSIStore::CreateOrGet(v69,v30 == 0,0, (structIStore2 *)&v77, v53, v56),
          (signedint)v38 <0) )
    {
      v39 =v77;
    }
    else
    {

      v42 =v77;
      v43 =(int (__stdcall*)(_DWORD**, int, int))**v77;
      __guard_check_icall_fptr(**v77);
      v38 =(volatile signed __int32*)v43(v42, a3, a4);
      v39 =v77;
      if ((signed int)v38 >=0 )
      {
        if
( v77 )
        {
          v77 =0;
          v44 =v39;
          v45 =(void (__stdcall*)(_DWORD))(*v39)[2];
          __guard_check_icall_fptr((*v39)[2]);
          v45(v44);
        }
        goto
LABEL_46;
      }
    }

    v76 =(__int32)v38;
    if (v39 )
    {
      v77 =0;
      v40 =v39;
      v41 =(void (__stdcall*)(_DWORD))(*v39)[2];
      __guard_check_icall_fptr((*v39)[2]);
      v41(v40);
    }
LABEL_49:
    BUCL::Com::CSmartRef<IStore2>::~CSmartRef<IStore2>(&v69);
    goto LABEL_50;
  }
  v46 =v69;
  v47 =**(int(__stdcall ***)(struct IStore2 *,int, int))v69;
  __guard_check_icall_fptr(**(_DWORD **)v69);
  v34 =v47(v46, a3, a4);
  if (v34 < 0)
  {
LABEL_61:
    v76 =v34;
    goto LABEL_49;
  }
LABEL_46:
  Windows::ErrorHandling::Rtl::CBaseFrame<Windows::ErrorHandling::Rtl::CVoidRaiseFrame>::SetCanonicalSuccess(&v76);
  BUCL::Com::CSmartRef<IStore2>::~CSmartRef<IStore2>(&v69);
  Windows::Auto<Windows::Rtl::IRtlSystemIsolationLayer *>::~Auto<Windows::Rtl::IRtlSystemIsolationLayer *>(&v71);
  Windows::Auto<Windows::Rtl::IRtlSystemIsolationLayer *>::~Auto<Windows::Rtl::IRtlSystemIsolationLayer *>(&v70);
  Windows::Auto<Windows::Rtl::IRtlSystemIsolationLayer *>::~Auto<Windows::Rtl::IRtlSystemIsolationLayer *>(&v72);
  Windows::Auto<Windows::Rtl::IRtlSystemIsolationLayer *>::~Auto<Windows::Rtl::IRtlSystemIsolationLayer *>(&v73);
  Windows::Auto<Windows::Rtl::IRtlSystemIsolationLayer *>::~Auto<Windows::Rtl::IRtlSystemIsolationLayer *>(&v74);
  Windows::Auto<Windows::Rtl::IRtlSystemIsolationLayer *>::~Auto<Windows::Rtl::IRtlSystemIsolationLayer *>(&v75);
  Windows::Auto<_LUTF8_STRING>::~Auto<_LUTF8_STRING>(&v66);
  return v76;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值