IopSendMessageToTrackService

NTSTATUS __stdcall IopSendMessageToTrackService(
        _LINK_TRACKING_INFORMATION *SourceVolumeId,
        _FILE_OBJECTID_BUFFER *SourceObjectId,
        _FILE_TRACKING_INFORMATION *TargetObjectInformation){
  int v6; 
  KPROCESSOR_MODE v7; 
  NTSTATUS result; 
  UINT64 v9; 
  UINT8 v10; 
  UINT8 v11; 
  NTSTATUS v12; 
  int v13; 
  CHAR *Pool_1; 
  CHAR *v15; 
  ULONG ObjectInformationLength; 
  unsigned int v17; 
  UINT64 v18; 
  int v19; 
  IRP *Timeout; 
  INT64 v21[2]; 
  UINT64 v22[5]; 
  NTSTATUS v23; 
  v6 = 0;
  v7 = *((_BYTE *)KeGetCurrentThread() + 562);
  while( 1 )
  {
    if( !IopLinkTrackingServiceObject )
    {
      if( !*(_DWORD *)(IopLinkTrackingServiceEvent + 4) )
        return -1073741153;
      result = KeWaitForSingleObject(&IopLinkTrackingPortObject, Executive, v7, 0, 0i64);
      if( result == 192 || result == 257 )
        return result;
      if( IopLinkTrackingServiceObject )
      {
        KeSetEvent(&IopLinkTrackingPortObject, 0);
      }
      else
      {
        IopLinkTrackingPacket.List.Flink = 0i64;
        IopLinkTrackingPacket.WorkerRoutine = (void(__fastcall *)(void *))IopConnectLinkTrackingPort;
        IopLinkTrackingPacket.Parameter = &IopLinkTrackingPacket;
        KeResetEvent(&stru_140C45CE0, v9, v10, v11, Timeout);
        ExQueueWorkItem(&IopLinkTrackingPacket, DelayedWorkQueue);
        v12 = KeWaitForSingleObject(&stru_140C45CE0, Executive, v7, 0, 0i64);
        v13 = v12;
        if( v12 != 192 && v12 != 257 && dword_140C45CF8 < 0 )
          v13 = dword_140C45CF8;
        KeSetEvent(&IopLinkTrackingPortObject, 0);
        if( v13 )
          return v13;
      }
    }
    Pool_1 = IopVerifierExAllocatePool_1(PagedPool, 0xB8ui64);
    v15 = Pool_1;
    if( !Pool_1 )
      break;
    memset((INT64)(Pool_1 + 44), 0i64);
    *((_QWORD *)v15 + 5) = 0i64;
    *((_OWORD *)v15 + 3) = *(_OWORD *)&SourceVolumeId->Type;
    *((_DWORD *)v15 + 16) = *(_DWORD *)&SourceVolumeId->VolumeId[12];
    *(_OWORD *)(v15 + 68) = *(_OWORD *)SourceObjectId->ObjectId;
    *(_OWORD *)(v15 + 84) = *(_OWORD *)SourceObjectId->BirthVolumeId;
    *(_OWORD *)(v15 + 100) = *(_OWORD *)&SourceObjectId->ExtendedInfo[16];
    *(_OWORD *)(v15 + 116) = *(_OWORD *)&SourceObjectId->ExtendedInfo[32];
    if( TargetObjectInformation->ObjectInformationLength < 0x24 )
    {
      ExFreePoolWithTag(v15, 0);
      return -2147483643;
    }
    *((_DWORD *)v15 + 33) = *(_DWORD *)TargetObjectInformation->ObjectInformation;
    *(_FILE_TRACKING_INFORMATION *)(v15 + 136) = TargetObjectInformation[1];
    *(_FILE_TRACKING_INFORMATION *)(v15 + 152) = TargetObjectInformation[2];
    ObjectInformationLength = TargetObjectInformation->ObjectInformationLength;
    if( ObjectInformationLength > 0x24 )
    {
      v17 = ObjectInformationLength - 36;
      v18 = 16i64;
      if( v17 <= 0x10 )
        v18 = v17;
      memmove((UINT8 *)v15 + 168, (UINT8 *)&TargetObjectInformation[3], v18);
    }
    *(_QWORD *)v15 = 12058768i64;
    v21[0] = 256i64;
    v19 = LpcSendWaitReceivePort(
            (INT64)IopLinkTrackingServiceObject,
            0x20000i64,
            (__m256i *)v15,
            (UINT64)v22,
            v21,
            0i64);
    v13 = v19;
    if( v19 != -1073741769 && v19 != -1073740029
      || (v13 = KeWaitForSingleObject(&IopLinkTrackingPortObject, Executive, v7, 0, 0i64),
          HalPutDmaAdapter(IopLinkTrackingServiceObject),
          IopLinkTrackingServiceObject = 0i64,
          KeSetEvent(&IopLinkTrackingPortObject, 0),
          v6) )
    {
      if( v13 >= 0 )
        return v23;
      return v13;
    }
    v6 = 1;
  }
  return -1073741670;
}

Referenced by:

IopTrackLink