SmcStoreCreate

__int64 __fastcall SmcStoreCreate(__int64 a1, int a2, _DWORD *a3, unsigned int a4, int *a5){
  struct _PRIVILEGE_SET *v9; 
  __int64 v10; 
  __int64 Count; 
  int v12; 
  ULONG v13; 
  __int64 v14; 
  int v15; 
  __int128 v16; 
  unsigned __int16 v17; 
  int v18; 
  int v19; 
  int v20; 
  int v21; 
  unsigned int v22; 
  struct _PRIVILEGE_SET *NonPaged; 
  __int64 v24; 
  int v25; 
  int v27; 
  SIZE_T NumberOfBytes; 
  __int128 v29; 
  __int128 v30; 
  int v31; 
  int v32; 
  int v33; 
  int v34; 
  struct _PRIVILEGE_SET *v35; 
  unsigned int v36; 
  int v37; 
  INT64 *v38; 
  __int64 v39; 
  __int128 *v40; 
  INT64 result[4]; 
  __int128 v42; 
  __int64 v43; 
  int v44; 
  int v45; 
  char v46; 
  v46 = a4;
  memset((INT64)result, 0i64);
  NumberOfBytes = 0i64;
  v32 = 0;
  v29 = 0i64;
  v34 = 0;
  v9 = 0i64;
  v37 = 0;
  v27 = 0;
  Count = SmcCacheReference(a1, a4).Count;
  if( !Count )
    return(unsigned int)-1073741672;
  v13 = a3[3];
  if( !v13 )
  {
    v12 = -1073741811;
    goto LABEL_23;
  }
  if( *(_DWORD *)(Count + 24) != a3[2] || (unsigned __int8)*a3 != 1 )
  {
    v12 = -1073741637;
    goto LABEL_23;
  }
  v14 = SmcStoreSlotReserve(Count, v10, v13);
  if( v14 )
  {
    v15 = *(_DWORD *)(Count + 8);
    v16 = *(_OWORD *)a3;
    v17 = (unsigned __int16)*(_DWORD *)(Count + 28) << 13;
    v30 = v16;
    HIDWORD(v30) = v15;
    v18 = v16 ^ ((unsigned __int16)v16 ^ v17) & 0x6000;
    v33 = *(_DWORD *)(Count + 4);
    v19 = *(_DWORD *)(Count + 32);
    v45 = 0;
    v31 = v19;
    v42 = 0i64;
    result[0] = *(_QWORD *)(Count + 40);
    result[1] = *(_QWORD *)(Count + 48);
    result[2] = *(_QWORD *)(Count + 56);
    result[3] = *(_QWORD *)(Count + 64);
    v43 = *(_QWORD *)(Count + 88);
    v44 = *(_DWORD *)(Count + 96);
    v38 = result;
    LODWORD(v30) = v18;
    LOBYTE(v20) = SmKmRegParamsLoad((__int64)&NumberOfBytes);
    v12 = v20;
    if( v20 >= 0 )
    {
      if( (*(_DWORD *)(Count + 28) & 1) == 0 )
      {
        v21 = BYTE4(NumberOfBytes) & 3;
        if( v21 == 2 || v21 == 1 && (v18 & 0x800) != 0 )
        {
          v22 = 0;
          goto LABEL_19;
        }
      }
      v22 = NumberOfBytes;
      NonPaged = (struct _PRIVILEGE_SET *)SSHSupportAllocateNonPaged((unsigned int)NumberOfBytes, 0x4B456D73u);
      v9 = NonPaged;
      if( NonPaged )
      {
        v12 = SmKmKeyGenGenerate(a1 + 512, (unsigned __int16 *)(Count + 552), NonPaged, v22);
        if( v12 >= 0 )
        {
LABEL_19:
          v24 = *(_QWORD *)(v14 + 8);
          LODWORD(v29) = *(_DWORD *)(Count + 8);
          v40 = &v29;
          *((_QWORD *)&v29 + 1) = v24;
          v39 = Count + 104;
          v35 = v9;
          v36 = v22;
          v12 = SmStoreCreate(a2, (__int64)&v30, &v27);
          if( v12 >= 0 )
          {
            v25 = v27;
            SmcStoreSlotCommit(Count, v14, v27, a2);
            v14 = 0i64;
            v12 = 0;
            *a5 = v25;
          }
        }
      }
      else
      {
        v12 = -1073741670;
      }
    }
    if( v14 )
      SmcStoreSlotAbort(Count, v14, 0);
    goto LABEL_23;
  }
  v12 = -1073741697;
LABEL_23:
  ExReleaseRundownProtection((PEX_RUNDOWN_REF)(32i64 * (v46 & 0xF) + a1 + 8));
  if( v9 )
    CmSiFreeMemory(v9);
  return(unsigned int)v12;
}

Referenced by:

SmcProcessStoreCreateRequest