SmcProcessCreateRequest
NTSTATUS __stdcall SmcProcessCreateRequest(
_SMC_CACHE_MANAGER *CacheMgr,
VOID *UserData,
UINT64 UserDataLength,
INT8 RequestorMode){
int v5;
_PRIVILEGE_SET *v8;
UINT64 v9;
int Prepare;
__int64 v11;
_OWORD *v12;
_OWORD *v13;
_SMC_CACHE *v14;
INT64 v15;
UINT64 CacheIdOut[2];
VOID *v18;
VOID *v19;
_QWORD v20[132];
v5 = UserDataLength;
v18 = CacheMgr;
v8 = 0i64;
LODWORD(CacheIdOut[0]) = -1;
memset(v20, 0i64, sizeof(v20));
if( v5 == 1056 )
{
if( RequestorMode )
{
if( ((unsigned __int8)UserData & 7) != 0 )
ExRaiseDatatypeMisalignment();
v11 = (__int64)UserData;
if( (unsigned __int64)UserData >= 0x7FFFFFFF0000i64 )
v11 = 0x7FFFFFFF0000i64;
*(_BYTE *)v11 = *(_BYTE *)v11;
*(_BYTE *)(v11 + 1055) = *(_BYTE *)(v11 + 1055);
}
v12 = UserData;
v13 = v20;
v9 = 8i64;
do
{
*v13 = *v12;
v13[1] = v12[1];
v13[2] = v12[2];
v13[3] = v12[3];
v13[4] = v12[4];
v13[5] = v12[5];
v13[6] = v12[6];
v13 += 8;
*(v13 - 1) = v12[7];
v12 += 8;
--v9;
}
while( v9 );
*v13 = *v12;
v13[1] = v12[1];
if( LOBYTE(v20[0]) != 3 || (v20[0] & 0xFFFFFF00) != 0 || HIDWORD(v20[2]) )
{
Prepare = -1073741811;
}
else
{
Prepare = SmcCacheCreatePrepare(CacheMgr);
if( Prepare >= 0 )
{
LODWORD(v14) = SSHSupportAllocateNonPaged(1064, 0x61436D73u);
v8 = (_PRIVILEGE_SET *)v14;
if( v14 )
{
SmcCacheInitialize(v14);
HIWORD(v20[131]) = 0;
Prepare = SmcCacheStart(
(_SMC_CACHE *)v8,
(_SMC_CACHE_PARAMETERS *)&v20[1],
&v20[4],
v15,
CacheIdOut[0],
(INT64 *)CacheIdOut[1],
v18,
v19);
if( Prepare >= 0 )
{
Prepare = SmcCacheAdd(CacheMgr, (_SMC_CACHE *)v8, CacheIdOut);
if( Prepare >= 0 )
{
v8 = 0i64;
HIDWORD(CacheIdOut[0]) = 1;
Prepare = 0;
*((_DWORD *)UserData + 1) = CacheIdOut[0];
}
}
}
else
{
Prepare = -1073741670;
}
}
}
}
else
{
Prepare = -1073741306;
}
if( LODWORD(CacheIdOut[0]) != -1 )
ExReleaseRundownProtection((_EX_RUNDOWN_REF *)&CacheMgr[8 * (CacheIdOut[0] & 0xF) + 2]);
if( v8 )
{
SmcCacheCleanup((_SMC_CACHE *)v8, v9);
CmSiFreeMemory(v8);
}
return Prepare;
}Referenced by:
SmSetStoreInformation