NtSetInformationDebugObject
NTSTATUS __stdcall NtSetInformationDebugObject(
VOID *DebugObjectHandle,
_DEBUGOBJECTINFOCLASS DebugObjectInformationClass,
VOID *DebugInformation,
UINT64 DebugInformationLength,
UINT64 *ReturnLength){
char PreviousMode;
char *v8;
__int64 v9;
UINT64 *v10;
NTSTATUS result;
int v12;
char *v13;
unsigned int v14;
PVOID Object;
PreviousMode = KeGetCurrentThread()->PreviousMode;
if( !PreviousMode )
{
v10 = ReturnLength;
LABEL_14:
if( v10 )
*(_DWORD *)v10 = 0;
goto LABEL_16;
}
if( (_DWORD)DebugInformationLength )
{
if( ((unsigned __int8)DebugInformation & 3) != 0 )
ExRaiseDatatypeMisalignment();
v8 = (char *)DebugInformation + (unsigned int)DebugInformationLength;
v9 = 0x7FFFFFFF0000i64;
if( (unsigned __int64)v8 > 0x7FFFFFFF0000i64 || v8 < DebugInformation )
MEMORY[0x7FFFFFFF0000] = 0;
}
else
{
v9 = 0x7FFFFFFF0000i64;
}
v10 = ReturnLength;
if( ReturnLength )
{
if( (unsigned __int64)ReturnLength < 0x7FFFFFFF0000i64 )
v9 = (__int64)ReturnLength;
*(_DWORD *)v9 = *(_DWORD *)v9;
goto LABEL_14;
}
LABEL_16:
if( DebugObjectInformationClass != DebugObjectFlags )
return -1073741811;
if( (_DWORD)DebugInformationLength == 4 )
{
v12 = *(_DWORD *)DebugInformation;
if( (*(_DWORD *)DebugInformation & 0xFFFFFFFE) != 0 )
{
return -1073741811;
}
else
{
Object = 0i64;
result = ObReferenceObjectByHandle(DebugObjectHandle, 4ui64, DbgkDebugObjectType, PreviousMode, &Object, 0i64);
if( result >= 0 )
{
v13 = (char *)Object;
ExAcquireFastMutex((PFAST_MUTEX)((char *)Object + 24));
v14 = *((_DWORD *)v13 + 24) | 2;
if( (v12 & 1) == 0 )
v14 = *((_DWORD *)v13 + 24) & 0xFFFFFFFD;
*((_DWORD *)v13 + 24) = v14;
KeReleaseGuardedMutex((PKGUARDED_MUTEX)(v13 + 24));
HalPutDmaAdapter((PADAPTER_OBJECT)v13);
return 0;
}
}
}
else
{
if( v10 )
*(_DWORD *)v10 = 4;
return -1073741820;
}
return result;
}Referenced by:
No references.