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