PiUEventHandleVetoEvent

NTSTATUS __stdcall PiUEventHandleVetoEvent(
        _FILE_OBJECT *FileObject,
        VOID *Buffer,
        UINT64 InputBufferLength,
        _IO_STATUS_BLOCK *IoStatus,
        _IO_STATUS_BLOCK *IoStatusa){
  char *FsContext2; 
  int AllocatedFullProcessImageName; 
  _EPROCESS *v7; 
  _UNICODE_STRING *v8; 
  char v9; 
  __int64 v10; 
  _FAST_MUTEX *v11; 
  char *v12; 
  __int64 v14; 
  _DWORD *v15; 
  __int64 v16; 
  NTSTATUS v17; 
  UINT8 *ProcessImageFileName; 
  _UNICODE_STRING *ImageName; 
  _STRING DestinationString; 
  _UNICODE_STRING v21; 
  _EPROCESS *Process; 

  FsContext2 = (char *)FileObject->FsContext2;
  Process = 0i64;
  ImageName = 0i64;
  AllocatedFullProcessImageName = 0;
  v7 = 0i64;
  v8 = 0i64;
  v9 = 0;
  v21 = 0i64;
  if( FsContext2 && Buffer && (_DWORD)InputBufferLength == 8 )
  {
    v10 = *(_QWORD *)Buffer;
    v11 = (_FAST_MUTEX *)*((_QWORD *)FsContext2 + 2);
    *(_QWORD *)&DestinationString.Length = *(_QWORD *)Buffer;
    KeAcquireGuardedMutex(v11);
    v12 = (char *)*((_QWORD *)FsContext2 + 12);
    if( v12 == FsContext2 + 96 )
    {
      AllocatedFullProcessImageName = -1073741811;
      KeReleaseGuardedMutex(*((PKGUARDED_MUTEX *)FsContext2 + 2));
      goto LABEL_11;
    }
    if( *(_BYTE *)(*((_QWORD *)v12 + 3) + 69i64) )
    {
      KeAcquireGuardedMutex((PKGUARDED_MUTEX)((char *)&PnpReplaceEvent + 7776));
      v14 = *((_QWORD *)v12 + 3);
      v15 = *(_DWORD **)(v14 + 32);
      if( v15 )
      {
        v16 = *(_QWORD *)(v14 + 40);
        if( v16 )
        {
          if( !*v15 )
          {
            if( (_BYTE)v10 )
            {
              *v15 = *(_DWORD *)(&DestinationString.MaximumLength + 1);
              v17 = PsLookupProcessByProcessId(*((VOID **)FsContext2 + 6), &Process);
              v7 = Process;
              if( v17 < 0
                || (AllocatedFullProcessImageName = PsGetAllocatedFullProcessImageName(Process, &ImageName),
                    AllocatedFullProcessImageName < 0) )
              {
                v8 = &v21;
                RtlInitUnicodeString(&v21, (PCWSTR)&dword_1407CF120);
                AllocatedFullProcessImageName = 0;
              }
              else
              {
                v8 = ImageName;
                if( !ImageName->Length )
                {
                  v9 = 1;
                  DestinationString = 0i64;
                  ExFreePoolWithTag(ImageName, 0);
                  v8 = &v21;
                  ProcessImageFileName = PsGetProcessImageFileName(v7);
                  RtlInitAnsiString(&DestinationString, (PCSZ)ProcessImageFileName);
                  RtlAnsiStringToUnicodeString(&v21, &DestinationString, 1u);
                }
              }
              if( v8->Length > 0x400u )
              {
                AllocatedFullProcessImageName = RtlStringCchCopyNW(
                                                  *(WCHAR **)(*(_QWORD *)(*((_QWORD *)v12 + 3) + 40i64) + 8i64),
                                                  0x200ui64,
                                                  v8->Buffer,
                                                  0x1FFui64);
                *(_WORD *)(*(_QWORD *)(*(_QWORD *)(*((_QWORD *)v12 + 3) + 40i64) + 8i64) + 1022i64) = 0;
                **(_WORD **)(*((_QWORD *)v12 + 3) + 40i64) = 1024;
              }
              else
              {
                RtlCopyUnicodeString(*(PUNICODE_STRING *)(*((_QWORD *)v12 + 3) + 40i64), v8);
              }
              KeSetEvent(*(PRKEVENT *)(*((_QWORD *)v12 + 3) + 24i64), 0, 0);
            }
            else
            {
              **(_WORD **)(v16 + 8) = 0;
              **(_WORD **)(v14 + 40) = 0;
              **(_DWORD **)(v14 + 32) = 0;
            }
          }
        }
      }
      KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&PnpReplaceEvent + 7776));
    }
    PiUEventDequeuePendingEventWorker((__int64)FsContext2, v12, 1);
    KeReleaseGuardedMutex(*((PKGUARDED_MUTEX *)FsContext2 + 2));
  }
  else
  {
    AllocatedFullProcessImageName = -1073741811;
  }
  if( v9 )
  {
    RtlFreeAnsiString(v8);
  }
  else if( v8 && v8 != &v21 )
  {
    ExFreePoolWithTag(v8, 0);
  }
  if( v7 )
    ObfDereferenceObjectWithTag(v7, 0x746C6644ui64);
LABEL_11:
  IoStatusa->Information = 0i64;
  return AllocatedFullProcessImageName;
}

Referenced by:

PiUEventHandleIoctl