CmpDoAccessCheckOnKCB
INT64 __fastcall CmpDoAccessCheckOnKCB(
_CM_KEY_CONTROL_BLOCK *KeyControlBlock,
_CM_TRANS *CmTrans,
UINT64 AccessMask,
CHAR AccessMode,
VOID *a5){
UINT8 v8;
UINT64 v9;
UINT64 v10;
INT64 result;
PADAPTER_OBJECT v12;
_ETHREAD *CurrentThread;
_GENERIC_MAPPING *v14;
_KPROCESS *CurrentThreadProcess;
CM_KEY_BODY *v16;
UINT8 v17;
VOID *DesiredAccess;
UINT64 ObjectBodySize;
UINT64 PagedPoolCharge;
UINT64 NonPagedPoolCharge;
PADAPTER_OBJECT DmaAdapter;
_ACCESS_MASK v23;
NTSTATUS v24;
_SECURITY_SUBJECT_CONTEXT v25[5];
_AUX_ACCESS_DATA AuxData;
v23 = AccessMask;
memset(v25, 0i64, sizeof(v25));
memset(&AuxData, 0i64, sizeof(AuxData));
v8 = 0;
LOBYTE(v9) = AccessMode;
LOBYTE(v10) = AccessMode;
LODWORD(NonPagedPoolCharge) = 0;
LODWORD(PagedPoolCharge) = 0;
LODWORD(ObjectBodySize) = 104;
DmaAdapter = 0i64;
LODWORD(result) = ObCreateObjectEx(
v10,
(_OBJECT_TYPE *)CmKeyObjectType,
0i64,
v9,
DesiredAccess,
ObjectBodySize,
PagedPoolCharge,
NonPagedPoolCharge,
(VOID **)&DmaAdapter,
0i64);
if( (int)result >= 0 )
{
v12 = DmaAdapter;
DmaAdapter->AdapterObject.ContiguousTranslationEnd.Buffer = 0i64;
*(_QWORD *)&v12->AdapterObject.ContiguousTranslationEnd.Offset = 0i64;
*(_DWORD *)&v12->AdapterObject.DmaHeader.Version = 1803104306;
v12->AdapterObject.DmaHeader.DmaOperations = 0i64;
LODWORD(v12->AdapterObject.ScatterTranslations) = 0;
*(_QWORD *)&v12->AdapterObject.ScatterTranslationEnd.Offset = &v12->AdapterObject.ScatterTranslationEnd;
v12->AdapterObject.ScatterTranslationEnd.Buffer = (_HALP_DMA_TRANSLATION_BUFFER *)&v12->AdapterObject.ScatterTranslationEnd;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v14 = (_GENERIC_MAPPING *)((char *)CmKeyObjectType + 76);
CurrentThreadProcess = (_EPROCESS *)PsGetCurrentThreadProcess();
v24 = SeCreateAccessStateEx(
&CurrentThread->Tcb,
&CurrentThreadProcess->Pcb,
(_ACCESS_STATE *)v25,
&AuxData,
v23,
v14);
if( v24 >= 0 )
{
v16 = (CM_KEY_BODY *)DmaAdapter;
v12->AdapterObject.DmaHeader.DmaOperations = (_DMA_OPERATIONS *)KeyControlBlock;
v17 = CmpCheckKeyBodyAccess(v16, CmTrans, (ACCESS_STATE *)v25, AccessMode, (INT64 *)&v24);
SepDeleteAccessState((_ACCESS_STATE *)v25);
SeReleaseSubjectContext(&v25[1]);
v12->AdapterObject.DmaHeader.DmaOperations = 0i64;
v8 = v17;
}
HalPutDmaAdapter(DmaAdapter);
LOBYTE(result) = v8;
}
else
{
LOBYTE(result) = 0;
}
return result;
}Referenced by:
CmpVEExecuteCreateLogic