SmcCacheStart
NTSTATUS __stdcall SmcCacheStart(
_SMC_CACHE *Cache,
_SMC_CACHE_PARAMETERS *CacheParams,
VOID *StartParam,
INT64 a4,
INT64 a5,
INT64 *a6,
VOID *a7,
VOID *a8){
_FILE_OBJECT *v8;
unsigned int StoreAlignment;
NTSTATUS UniqueId;
__int64 v14;
UINT64 v15;
_KEY_VALUE_FULL_INFORMATION **v16;
_DEVICE_OBJECT *v17;
NTSTATUS v18;
_LARGE_INTEGER *FileSizeInOut;
UINT64 *v21;
_FILE_OBJECT *VolumeFileObjectOut;
_LARGE_INTEGER CacheFileSize;
_DEVICE_OBJECT *VolumeDeviceObjectOut;
_SMKM_FILE_INFO FileInfo;
LODWORD(VolumeDeviceObjectOut) = 0;
v8 = 0i64;
VolumeFileObjectOut = 0i64;
StoreAlignment = CacheParams->StoreAlignment;
if( !StoreAlignment || ((StoreAlignment - 1) & StoreAlignment) != 0 )
{
UniqueId = -1073741811;
}
else
{
if( !CacheParams->CacheFileSize )
return -1073741811;
if( CacheParams->CacheFileSize > 0x800000000i64 )
return -1073739516;
*(_SMC_CACHE_PARAMETERS *)(Cache + 4) = *CacheParams;
v14 = (unsigned __int8)StartParam & 1;
v15 = (unsigned int)Cache[6];
FileInfo = CacheParams->_bf_0 & 1;
CacheFileSize = (_LARGE_INTEGER)CacheParams->CacheFileSize;
UniqueId = SmKmStoreFileCreate(
(_DRIVER_OBJECT *)(Cache + 1),
StartParam,
v15,
(unsigned int)v15,
&CacheFileSize,
v21,
&FileInfo,
(UINT64 *)Cache + 5,
(UINT64 *)(Cache + 1),
(UINT64 *)Cache + 1);
if( UniqueId < 0 )
return UniqueId;
if( (-(__int64)(v14 != 0) & (unsigned __int64)StartParam & 0xFFFFFFFFFFFFFFFEui64) != 0
&& CacheFileSize.QuadPart != CacheParams->CacheFileSize )
{
return -1073741792;
}
Cache[7] = FileInfo & 1 | Cache[7] & 0xFFFFFFFC | (2 * ((unsigned __int8)VolumeDeviceObjectOut & 1));
v17 = (_DEVICE_OBJECT *)*((_QWORD *)Cache + 8);
VolumeDeviceObjectOut = v17;
if( v17 )
goto LABEL_14;
v18 = SmKmStoreFileOpenVolume(*((_FILE_OBJECT **)Cache + 6), &VolumeFileObjectOut, &VolumeDeviceObjectOut);
v8 = VolumeFileObjectOut;
UniqueId = v18;
if( v18 >= 0 )
{
v17 = VolumeDeviceObjectOut;
LABEL_14:
UniqueId = SmKmVolumeQueryUniqueId(
(_UNICODE_STRING *)v17,
(_UNICODE_STRING *)(Cache + 138),
(UINT64 *)0x200,
v16,
(UINT8 *)FileSizeInOut);
if( UniqueId >= 0 )
{
UniqueId = StEtaHelper::StartHelper((__int64)(Cache + 26), Cache[6]);
if( UniqueId >= 0 )
UniqueId = 0;
}
}
}
if( v8 )
HalPutDmaAdapter((PADAPTER_OBJECT)v8);
return UniqueId;
}Referenced by:
SmcProcessCreateRequest