CbsHashBuffer

CbsHashBuffer

__int64 __fastcall CbsHashBuffer(BYTE *pbData, DWORD dwDataLen, __int64 a3, BYTE **a4, _DWORD *a5)
{
  BYTE **v5; // rsi@1
  DWORD v6; // er15@1
  BYTE *v7; // rdi@1
  int v8; // ebx@5
  DWORD v9; // eax@6
  const char *v10; // r9@8
  DWORD v11; // eax@13
  DWORD v12; // eax@17
  DWORD v13; // eax@21
  BYTE *v14; // rdi@24
  DWORD v15; // eax@27
  int v16; // eax@32
  BYTE pbDataa[4]; // [sp+30h] [bp-20h]@20
  DWORD pdwDataLen; // [sp+34h] [bp-1Ch]@20
  HCRYPTHASH phHash; // [sp+38h] [bp-18h]@5
  HCRYPTPROV phProv; // [sp+40h] [bp-10h]@5

  v5 = a4;
  v6 = dwDataLen;
  v7 = pbData;
  if ( !pbData )
    CbsUtil_Assert((__int64)"base\\cbs\\util\\cbscat.cpp", 35i64, (__int64)"pbBuffer");
  if ( !v5 )
    CbsUtil_Assert((__int64)"base\\cbs\\util\\cbscat.cpp", 36i64, (__int64)"ppbHash");
  v8 = 0;
  phProv = 0i64;
  phHash = 0i64;
  if ( !CryptAcquireContextW(&phProv, 0i64, 0i64, 1u, 0xF0000040) )
  {
    phProv = 0i64;
    v9 = GetLastError();
    v8 = v9;
    if ( (signed int)v9 > 0 )
      v8 = (unsigned __int16)v9 | 0x80070000;
    v10 = "Failed to acquire crypt provider context.";
LABEL_9:
    if ( v8 >= 0 )
      v8 = -2147467259;
    goto LABEL_11;
  }
  if ( !CryptCreateHash(phProv, 0x8004u, 0i64, 0, &phHash) )
  {
    phHash = 0i64;
    v11 = GetLastError();
    v8 = v11;
    if ( (signed int)v11 > 0 )
      v8 = (unsigned __int16)v11 | 0x80070000;
    v10 = "Failed to create hash.";
    goto LABEL_9;
  }
  if ( !CryptHashData(phHash, v7, v6, 0) )
  {
    v12 = GetLastError();
    v8 = v12;
    if ( (signed int)v12 > 0 )
      v8 = (unsigned __int16)v12 | 0x80070000;
    v10 = "Failed to hash data.";
    goto LABEL_9;
  }
  pdwDataLen = 4;
  if ( !CryptGetHashParam(phHash, 4u, pbDataa, &pdwDataLen, 0) )
  {
    v13 = GetLastError();
    v8 = v13;
    if ( (signed int)v13 > 0 )
      v8 = (unsigned __int16)v13 | 0x80070000;
    v10 = "Failed to get hash size.";
    goto LABEL_9;
  }
  v14 = (BYTE *)operator new(*(unsigned int *)pbDataa);
  if ( !v14 )
  {
    v8 = -2147024882;
    v10 = "Failed to allocate memory for hash.";
LABEL_11:
    CBSWdsLog(0x4000000u, v8, 1i64, v10);
    goto LABEL_35;
  }
  pdwDataLen = *(_DWORD *)pbDataa;
  if ( CryptGetHashParam(phHash, 2u, v14, &pdwDataLen, 0) )
  {
    v16 = *(_DWORD *)pbDataa;
    *v5 = v14;
    v14 = 0i64;
    *a5 = v16;
  }
  else
  {
    v15 = GetLastError();
    v8 = v15;
    if ( (signed int)v15 > 0 )
      v8 = (unsigned __int16)v15 | 0x80070000;
    if ( v8 >= 0 )
      v8 = -2147467259;
    CBSWdsLog(0x4000000u, v8, 1i64, "Failed to get hash value.");
  }
  if ( v14 )
    operator delete(v14);
LABEL_35:
  if ( phHash )
    CryptDestroyHash(phHash);
  if ( phProv )
    CryptReleaseContext(phProv, 0);
  return (unsigned int)v8;
}

你可能感兴趣的:(操作系统相关,编程语言,系统维护)