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