SmProcessCreateRequest

NTSTATUS __stdcall SmProcessCreateRequest(
        _SMKM_STORE_LIST *StoreMgr,
        VOID *UserData,
        INT64 UserDataLength,
        CHAR RequestorMode){
  int v5; 
  __int64 v7; 
  int v8; 
  __int64 v9; 
  NTSTATUS TimeInit; 
  _DWORD *v11; 
  int v12; 
  __int64 v13; 
  int v14; 
  _SMKM_STORE_LIST *v15; 
  _EX_RUNDOWN_REF *v17; 
  int v18[8]; 
  _SMKM_STORE_LIST *StoreMgra; 
  int StoreId; 
  int StoreId_4; 
  PPRIVILEGE_SET Privileges; 
  _SMKM_STORE_LIST *v23; 
  CHAR *EncryptionKeyOut; 
  _SMKM_STORE_ADD_PARAMS AddParams[2]; 
  __int64 v26; 
  _EPROCESS *Process; 
  _SM_CREATE_REQUEST v28; 
  int v29; 
  _SMST_PARAMETERS SmStParams[16]; 
  _SM_CREATE_REQUEST CreateRequest[24]; 

  v5 = UserDataLength;
  StoreMgra = StoreMgr;
  v23 = StoreMgr;
  Process = 0i64;
  v29 = 0;
  v7 = 0i64;
  Privileges = 0i64;
  v8 = -1;
  StoreId = -1;
  EncryptionKeyOut = 0i64;
  memset(CreateRequest, 0i64, 0x58u);
  if( v5 != 88 )
  {
    TimeInit = -1073741306;
LABEL_33:
    v15 = StoreMgra;
    goto LABEL_24;
  }
  if( RequestorMode )
  {
    if( ((unsigned __int8)UserData & 7) != 0 )
      ExRaiseDatatypeMisalignment();
    v9 = (__int64)UserData;
    if( (unsigned __int64)UserData >= 0x7FFFFFFF0000i64 )
      v9 = 0x7FFFFFFF0000i64;
    *(_BYTE *)v9 = *(_BYTE *)v9;
    *(_BYTE *)(v9 + 87) = *(_BYTE *)(v9 + 87);
  }
  *(_OWORD *)CreateRequest = *(_OWORD *)UserData;
  *(_OWORD *)&CreateRequest[4] = *((_OWORD *)UserData + 1);
  *(_OWORD *)&CreateRequest[8] = *((_OWORD *)UserData + 2);
  *(_OWORD *)&CreateRequest[12] = *((_OWORD *)UserData + 3);
  *(_OWORD *)&CreateRequest[16] = *((_OWORD *)UserData + 4);
  *(_QWORD *)&CreateRequest[20] = *((_QWORD *)UserData + 10);
  memset(SmStParams, 0i64, sizeof(SmStParams));
  TimeInit = SmKmStoreCreatePrepare(CreateRequest, RequestorMode, &EncryptionKeyOut, SmStParams);
  if( TimeInit < 0 )
    goto LABEL_33;
  v11 = *(_DWORD **)SmStParams;
  v12 = **(_DWORD **)SmStParams;
  if( (**(_DWORD **)SmStParams & 0x400FF) != 0x40000 || (v12 & 0x300) != 0 )
    goto LABEL_36;
  if( !(_BYTE)v12
    && (v12 & 0x160000) != 0x40000
    && !SeSinglePrivilegeCheck(*(_QWORD *)&SeLockMemoryPrivilege, RequestorMode) )
  {
    TimeInit = -1073741790;
    goto LABEL_33;
  }
  if( (*v11 & 0x400FF) == 0x40000 && v11[2] > 0x20000u )
  {
LABEL_36:
    TimeInit = -1073741637;
    goto LABEL_33;
  }
  LODWORD(v13) = SSHSupportAllocateNonPaged(6736, 0x74536D73u);
  v7 = v13;
  if( !v13 )
  {
    TimeInit = -1073741670;
    goto LABEL_33;
  }
  SMKM_STORE::SmStInitialize(v13);
  TimeInit = SmFirstTimeInit(v11[2], 4 - (unsigned int)((*v11 & 0x10000) != 0));
  if( TimeInit < 0 )
    goto LABEL_33;
  *(_QWORD *)&SmStParams[8] = SmGlobals;
  *(_QWORD *)&SmStParams[10] = Object;
  *(_QWORD *)&SmStParams[12] = MaximumWorkerThreads;
  *v11 |= 0x8000u;
  SMKM_STORE::SmStStart(v7, (int **)SmStParams);
  TimeInit = v14;
  if( v14 < 0 )
    goto LABEL_33;
  Process = 0i64;
  v29 = 0;
  *(_QWORD *)AddParams = &CreateRequest[2];
  v26 = *(_QWORD *)(v7 + 6200);
  v28 = CreateRequest[6];
  if( (CreateRequest[0] & 0x200) != 0 )
    Process = KeGetCurrentThread()->ApcState.Process;
  TimeInit = SmKmStoreAdd(StoreMgra, (VOID *)v7, AddParams, (UINT64 *)(v7 + 6016));
  if( TimeInit < 0 )
    goto LABEL_33;
  StoreId = *(_DWORD *)(v7 + 6016);
  v8 = StoreId;
  _InterlockedOr(v18, 0);
  byte_140D23168 = 5;
  v7 = 0i64;
  Privileges = 0i64;
  StoreId_4 = 1;
  TimeInit = 0;
  *((_DWORD *)UserData + 20) = v8;
  if( (CreateRequest[0] & 0x100) != 0 )
    v8 = -1;
  v15 = StoreMgra;
LABEL_24:
  if( v8 != -1 )
  {
    v17 = (_EX_RUNDOWN_REF *)SmKmStoreRefFromStoreIndex((__int64)v15, v8 & 0x3FF);
    ExReleaseRundownProtection(v17 + 1);
  }
  if( v7 )
  {
    SMKM_STORE::SmStCleanup(v7);
    CmSiFreeMemory((PPRIVILEGE_SET)v7);
  }
  if( EncryptionKeyOut )
    CmSiFreeMemory((PPRIVILEGE_SET)EncryptionKeyOut);
  return TimeInit;
}

Referenced by:

SmSetStoreInformation
SmpDirtyStoreCreate