PoGetRequester

void __fastcall PoGetRequester(int PreviousMode, _DEVICE_OBJECT *DeviceObject, _DIAGNOSTIC_CONTEXT *Requester){
  _ETHREAD *CurrentThread; 
  __int64 v4; 
  __int64 v5; 
  __int64 v6; 
  __int16 v7; 
  __int64 v8; 
  if( (_BYTE)PreviousMode )
  {
    v8 = 0i64;
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    if( (*((_DWORD *)CurrentThread + 29) & 0x400) != 0 || *((_BYTE *)CurrentThread + 586) == 1 )
      v4 = 0i64;
    else
      v4 = *((_QWORD *)CurrentThread + 30);
    if( v4 )
    {
      if( *(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1408i64)
        && (v6 = *(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1408i64)) != 0
        && ((v7 = *(_WORD *)(v6 + 8), v7 == 332) || v7 == 452) )
      {
        v5 = *(unsigned int *)(v4 + 12128);
      }
      else
      {
        v5 = *(_QWORD *)(v4 + 5920);
      }
      v8 = v5;
    }
    Requester->CallerType = (v8 != 0) + 1;
    Requester->Process = (_EPROCESS *)*((_QWORD *)KeGetCurrentThread() + 23);
    Requester->ServiceTag = v8;
  }
  else
  {
    Requester->CallerType = KernelRequester;
    Requester->Process = (_EPROCESS *)DeviceObject;
    if( DeviceObject )
      ObfReferenceObjectWithTag(DeviceObject, 0x67446F50u);
  }
}

Referenced by:

PoCaptureReasonContext