VfCheckUserHandle
VOID __stdcall VfCheckUserHandle(VOID *Handle){
_EPROCESS *Process;
UINT16 v3;
unsigned int v4;
__int64 v5;
VOID **v6;
VOID *v7;
VOID *v8;
NTSTATUS v9;
_ADAPTER_OBJECT *v10;
char v11;
UINT64 v12;
PVOID Object;
UINT64 ReturnLength;
VOID *BackTrace[8];
_UNICODE_STRING ObjectTypeName[4];
memset(BackTrace, 0i64, sizeof(BackTrace));
if( (MmVerifierData & 0x100) != 0 )
{
Process = KeGetCurrentThread()->ApcState.Process;
if( PsInitialSystemProcess )
{
if( Process != PsInitialSystemProcess && Process != *(_EPROCESS **)&PsIdleProcess )
{
if( Handle )
{
v3 = RtlCaptureStackBackTrace(2ui64, 8ui64, BackTrace, 0i64);
v4 = v3;
v5 = 0i64;
if( v3 )
{
v6 = BackTrace;
do
{
v7 = *v6;
if( VfDriverIsKernelImageAddress(*v6) )
{
if( (_DWORD)KernelVerifier )
break;
}
else
{
if( (unsigned int)VfTargetDriversIsEnabled(v8) )
break;
if( !ViDriverXDVBase
|| !ViDriverXDVImageSize
|| (unsigned __int64)v7 < ViDriverXDVBase
|| (unsigned __int64)v7 >= ViDriverXDVBase + (unsigned __int64)(unsigned int)ViDriverXDVImageSize )
{
return;
}
}
v5 = (unsigned int)(v5 + 1);
++v6;
}
while( (unsigned int)v5 < v4 );
if( (unsigned int)v5 < v4 && !(unsigned int)VfUtilIsLocalSystem(Process) )
{
Object = 0i64;
v9 = ObReferenceObjectByHandle(Handle, 0i64, 0i64, 1, &Object, 0i64);
v10 = (_ADAPTER_OBJECT *)Object;
if( v9 < 0 )
goto LABEL_25;
v11 = 0;
if( ObQueryTypeName(Object, ObjectTypeName, 0x40ui64, &ReturnLength) >= 0
&& ((unsigned __int8)RtlEqualUnicodeString(ObjectTypeName, &ViDesktopTypeName, 0)
|| (unsigned __int8)RtlEqualUnicodeString(ObjectTypeName, &ViWindowStationTypeName, 0)) )
{
v11 = 1;
}
HalPutDmaAdapter(v10);
if( !v11 )
{
LABEL_25:
if( ViHandleBreaksEnabled )
VerifierBugCheckIfAppropriate(
0xC4ui64,
0xF6u,
(ULONG_PTR)Handle,
(ULONG_PTR)Process,
(ULONG_PTR)BackTrace[v5],
v12);
}
}
}
}
}
}
}
}Referenced by:
NtClose
ObCloseHandle
ObpReferenceObjectByHandleWithTag