复杂的moniker被解析的CCompositeMoniker::BindToObject结果正确逆向

和reactos里面的伪代码出入比较大,这是最新版ole32里面逆向结果
HRESULT __userpurge CCompositeMoniker::BindToObject@<eax>(int a1@<edi>, CCompositeMoniker *this, IBindCtx *pbc, IMoniker *pmkToLeft, _GUID *riidResult, void **ppvResult)
{
  int v6; // esi
  HRESULT v7; // esi
  IMoniker *_lastMoniker; // ebx
  IMoniker *v9; // edi
  IUnknown *_pmkNewRef; // eax
  int v12; // eax
  int v13; // [esp-4h] [ebp-18h]
  IUnknown *pUnk; // [esp+8h] [ebp-Ch]
  IRunningObjectTable *prot; // [esp+Ch] [ebp-8h]
  IMoniker *pmkNewLeft; // [esp+10h] [ebp-4h]

  if ( !IsValidPtrOut(ppvResult, 4u) )
    return -2147024809;
  v13 = a1;
  *ppvResult = 0;
  if ( IsValidInterface(pbc) && (!pmkToLeft || IsValidInterface(pmkToLeft)) )
  {
    *ppvResult = 0;
    pmkNewLeft = 0;
    if ( !pmkToLeft )
    {
      v6 = pbc->IUnknownVtbl->GetRunningObjectTable(pbc, &prot);
      if ( v6 )
        return v6;
      v7 = prot->ISelfUnknownVtbl->GetObjectW(prot, (IMoniker *)this, &pUnk);
      prot->ISelfUnknownVtbl->Release(prot);
      if ( !v7 && pUnk )
      {
        v6 = ((int (__stdcall *)(IUnknown *, _GUID *, void **))pUnk->vfptr->QueryInterface)(pUnk, riidResult, ppvResult);
        _pmkNewRef = pUnk;
        goto LABEL_14;
      }
    }
    _lastMoniker = CCompositeMoniker::AllButLast(this);
    if ( !_lastMoniker )
      return -2147024882;
    v9 = CCompositeMoniker::Last(this);
    if ( !v9 )
    {
      v6 = -2147024882;
errRet1:
      _lastMoniker->ISelfUnknownVtbl->Release(_lastMoniker);
      _pmkNewRef = (IUnknown *)pmkNewLeft;
      if ( pmkNewLeft )
LABEL_14:
        ((void (__stdcall *)(IUnknown *))_pmkNewRef->vfptr->Release)(_pmkNewRef);
      return v6;
    }
    if ( pmkToLeft )
    {
      v12 = ((int (__stdcall *)(IMoniker *, IMoniker *, _DWORD, IMoniker **, int))pmkToLeft->ISelfUnknownVtbl->ComposeWith)(
              pmkToLeft,
              _lastMoniker,
              0,
              &pmkNewLeft,
              v13);
      v6 = v12;
      if ( v12 < 0 )
        goto errRet2;
    }
    else
    {
      pmkNewLeft = _lastMoniker;
      ((void (__stdcall *)(IMoniker *, int))_lastMoniker->ISelfUnknownVtbl->AddRef)(_lastMoniker, v13);
    }
    v6 = v9->ISelfUnknownVtbl->BindToObject(v9, pbc, pmkNewLeft, riidResult, ppvResult);
errRet2:
    ((void (*)(void))v9->ISelfUnknownVtbl->Release)();
    goto errRet1;
  }
  return -2147024809;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值