IopGetSetObjectId

INT64 __stdcall IopGetSetObjectId(FILE_OBJECT *FileObject, VOID *Buffer, UINT64 Length, UINT64 Function){
  int v4; 
  ULONG v7; 
  _DEVICE_OBJECT *RelatedDeviceObject; 
  PIRP v9; 
  IRP *v10; 
  __int64 v11; 
  INT64 result; 
  struct _IO_STATUS_BLOCK IoStatusBlock; 
  struct _KEVENT Object; 
  v4 = Length;
  memset(&Object, 0, sizeof(Object));
  v7 = Function;
  IoStatusBlock = 0i64;
  KeInitializeEvent(&Object, NotificationEvent, 0);
  RelatedDeviceObject = IoGetRelatedDeviceObject(FileObject);
  v9 = IoBuildDeviceIoControlRequest(v7, RelatedDeviceObject, 0i64, 0, 0i64, 0, 0, &Object, &IoStatusBlock);
  v10 = v9;
  if( !v9 )
    return 3221225626i64;
  *((_DWORD *)v9 + 4) |= 4u;
  *((_QWORD *)v9 + 14) = Buffer;
  *((_QWORD *)v9 + 3) = Buffer;
  *((_QWORD *)v9 + 24) = FileObject;
  v11 = *((_QWORD *)v9 + 23);
  *(_QWORD *)(v11 - 24) = FileObject;
  *(_WORD *)(v11 - 72) = 1037;
  if( v7 == 589980 || v7 == 1310952 || v7 == 590016 )
    *(_DWORD *)(v11 - 64) = v4;
  else
    *(_DWORD *)(v11 - 56) = v4;
  ObfReferenceObject(FileObject);
  LODWORD(result) = IofCallDriver(RelatedDeviceObject, v10);
  if( (_DWORD)result == 259 )
  {
    KeWaitForSingleObject(&Object, Executive, 0, 0, 0i64);
    return(unsigned int)IoStatusBlock.Status;
  }
  return result;
}

Referenced by:

IopTrackLink