IopSendMessageToTrackService

NTSTATUS __stdcall IopSendMessageToTrackService(
        _LINK_TRACKING_INFORMATION *SourceVolumeId,
        _FILE_OBJECTID_BUFFER *SourceObjectId,
        _FILE_TRACKING_INFORMATION *TargetObjectInformation){
  int v6; 
  char PreviousMode; 
  NTSTATUS result; 
  NTSTATUS v9; 
  int v10; 
  VOID **Pool_1; 
  VOID **v12; 
  unsigned int ObjectInformationLength; 
  unsigned int v14; 
  size_t v15; 
  NTSTATUS v16; 
  __int64 WaitMode[2]; 
  __int64 BufferLength[5]; 
  NTSTATUS v19; 

  v6 = 0;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  while( 1 )
  {
    if( !IopLinkTrackingServiceObject )
    {
      if( !*(_DWORD *)(IopLinkTrackingServiceEvent + 4) )
        return -1073741153;
      result = KeWaitForSingleObject((UINT64)&stru_140C452E0 + 2592, 0, PreviousMode, 0, 0i64);
      if( result == 192 || result == 257 )
        return result;
      if( IopLinkTrackingServiceObject )
      {
        KeSetEvent((PRKEVENT)((char *)&stru_140C452E0 + 2592), 0, 0);
      }
      else
      {
        *(&stru_140C452E0 + 316) = 0i64;
        *(&stru_140C452E0 + 318) = IopConnectLinkTrackingPort;
        *(&stru_140C452E0 + 319) = (char *)&stru_140C452E0 + 2528;
        KeResetEvent((_KEVENT *)((char *)&stru_140C452E0 + 2560));
        ExQueueWorkItem((PWORK_QUEUE_ITEM)&stru_140C452E0 + 79, DelayedWorkQueue);
        v9 = KeWaitForSingleObject((UINT64)&stru_140C452E0 + 2560, 0, PreviousMode, 0, 0i64);
        v10 = v9;
        if( v9 != 192 && v9 != 257 && *(&stru_140C452E0 + 646) < 0 )
          v10 = *(&stru_140C452E0 + 646);
        KeSetEvent((PRKEVENT)((char *)&stru_140C452E0 + 2592), 0, 0);
        if( v10 )
          return v10;
      }
    }
    Pool_1 = IopVerifierExAllocatePool_1(1ui64, 0xB8ui64);
    v12 = Pool_1;
    if( !Pool_1 )
      break;
    memset((char *)Pool_1 + 44, 0i64, 0x8Cu);
    v12[5] = 0i64;
    *((_OWORD *)v12 + 3) = *(_OWORD *)&SourceVolumeId->Type;
    *((_DWORD *)v12 + 16) = *(_DWORD *)&SourceVolumeId->VolumeId[12];
    *(_OWORD *)((char *)v12 + 68) = *(_OWORD *)SourceObjectId->ObjectId;
    *(_OWORD *)((char *)v12 + 84) = *(_OWORD *)SourceObjectId->BirthVolumeId;
    *(_OWORD *)((char *)v12 + 100) = *(_OWORD *)&SourceObjectId->ExtendedInfo[16];
    *(_OWORD *)((char *)v12 + 116) = *(_OWORD *)&SourceObjectId->ExtendedInfo[32];
    if( TargetObjectInformation->ObjectInformationLength < 0x24 )
    {
      ExFreePoolWithTag(v12, 0);
      return -2147483643;
    }
    *((_DWORD *)v12 + 33) = *(_DWORD *)TargetObjectInformation->ObjectInformation;
    *(_FILE_TRACKING_INFORMATION *)(v12 + 17) = TargetObjectInformation[1];
    *(_FILE_TRACKING_INFORMATION *)(v12 + 19) = TargetObjectInformation[2];
    ObjectInformationLength = TargetObjectInformation->ObjectInformationLength;
    if( ObjectInformationLength > 0x24 )
    {
      v14 = ObjectInformationLength - 36;
      v15 = 16;
      if( v14 <= 0x10 )
        v15 = v14;
      memmove(v12 + 21, &TargetObjectInformation[3], v15);
    }
    *v12 = (VOID *)12058768;
    WaitMode[0] = 256i64;
    v16 = LpcSendWaitReceivePort(
            (INT64)IopLinkTrackingServiceObject,
            0x20000i64,
            (__m256i *)v12,
            (UINT64)BufferLength,
            WaitMode,
            0i64);
    v10 = v16;
    if( v16 != -1073741769 && v16 != -1073740029
      || (v10 = KeWaitForSingleObject((UINT64)&stru_140C452E0 + 2592, 0, PreviousMode, 0, 0i64),
          HalPutDmaAdapter(IopLinkTrackingServiceObject),
          IopLinkTrackingServiceObject = 0i64,
          KeSetEvent((PRKEVENT)((char *)&stru_140C452E0 + 2592), 0, 0),
          v6) )
    {
      if( v10 >= 0 )
        return v19;
      return v10;
    }
    v6 = 1;
  }
  return -1073741670;
}

Referenced by:

IopTrackLink