SmCrEncStart

NTSTATUS __stdcall SmCrEncStart(_SMCR_ENCRYPT_CONTEXT *EncryptCtx, INT8 *KeyPtr, UINT64 KeySize, UINT64 Flags){
  unsigned int v5; 
  NTSTATUS result; 
  UINT32 v8; 
  size_t *v9; 
  VOID *v10; 
  _SIZE_T v11; 
  VOID *v12; 
  UINT32 v13; 
  VOID *v14; 
  UINT32 pcbResult; 
  UINT32 cbSecret; 
  UINT32 cbSecreta; 
  UINT32 v18; 
  UINT32 dwFlags; 
  size_t pbOutput; 

  dwFlags = 0;
  pbOutput = 0;
  v5 = KeySize;
  result = (unsigned int)BCryptOpenAlgorithmProvider(EncryptCtx, (_LPCWSTR)&stru_1407D7500._MxCsr, 0, 1u);
  if( result >= 0 )
  {
    v9 = (size_t *)(EncryptCtx + 2);
    result = (unsigned int)BCryptGetProperty(
                             *(BCRYPT_HANDLE *)EncryptCtx,
                             (_LPCWSTR)&stru_1407D7500._R13,
                             (PUCHAR)EncryptCtx + 8,
                             v8,
                             &dwFlags,
                             cbSecret);
    if( result >= 0 )
    {
      if( !*v9 || ((*v9 - 1) & *v9) != 0 )
      {
        return -1073741453;
      }
      else
      {
        LODWORD(v10) = SSHSupportAllocateNonPaged(v5, 0x52436D73u);
        *((_QWORD *)EncryptCtx + 2) = v10;
        if( !v10 )
          return -1073741670;
        if( KeyPtr )
        {
          memmove(v10, KeyPtr, v5);
        }
        else
        {
          result = SmCrGenRandom((INT8 *)v10, v5);
          if( result < 0 )
            return result;
        }
        v11 = *v9;
        EncryptCtx[6] = v5;
        LODWORD(v12) = SSHSupportAllocateNonPaged(v11, 0x52436D73u);
        *((_QWORD *)EncryptCtx + 6) = v12;
        if( !v12 )
          return -1073741670;
        memset(v12, 0i64, *v9);
        result = (unsigned int)BCryptGetProperty(
                                 *(BCRYPT_HANDLE *)EncryptCtx,
                                 (_LPCWSTR)L"ObjectLength",
                                 (PUCHAR)&pbOutput,
                                 v13,
                                 &dwFlags,
                                 cbSecreta);
        if( result >= 0 )
        {
          LODWORD(v14) = SSHSupportAllocateNonPaged(pbOutput, 0x52436D73u);
          *((_QWORD *)EncryptCtx + 5) = v14;
          if( !v14 )
            return -1073741670;
          memset(v14, 0i64, pbOutput);
          result = (unsigned int)BCryptSetProperty(
                                   *(BCRYPT_HANDLE *)EncryptCtx,
                                   (_LPCWSTR)&stru_1407D7500._Rbx,
                                   (PUCHAR)&stru_1407D7500.TrapFrame,
                                   0x20u,
                                   pcbResult);
          if( result >= 0 )
          {
            result = (unsigned int)BCryptGenerateSymmetricKey(
                                     *(_QWORD *)EncryptCtx,
                                     EncryptCtx + 8,
                                     *((PUCHAR *)EncryptCtx + 5),
                                     pbOutput,
                                     *((PUCHAR *)EncryptCtx + 2),
                                     EncryptCtx[6],
                                     v18);
            if( result >= 0 )
              return 0;
          }
        }
      }
    }
  }
  return result;
}

Referenced by:

ST_STORE::StStart