PiUEventHandleRegistration
INT64 __stdcall PiUEventHandleRegistration(
FILE_OBJECT *FileObject,
PVOID Buffer,
UINT64 InputBufferLength,
UINT64 OutputBufferLength,
IO_STATUS_BLOCK *IoStatus){
__int64 **v5;
char v6;
__int64 **v9;
int v10;
int v11;
int v12;
PVOID *v13;
SIZE_T v14;
int v15;
int v16;
unsigned int v17;
__int64 *v18;
__int64 **v19;
int v21;
int v22;
int v23;
__int64 *v24;
__int64 **v25;
int v26;
int v27;
unsigned int v28;
__int64 *v29;
__int64 **v30;
int Object;
unsigned int v32;
__int64 *v33;
__int64 **v34;
_UNICODE_STRING *DeviceId;
void *RevocationDeviceObject[6];
size_t pcchLength;
DeviceId = 0i64;
v5 = 0i64;
RevocationDeviceObject[0] = 0i64;
v6 = 0;
if( !Buffer || (_DWORD)InputBufferLength != 936 || (_DWORD)OutputBufferLength != 8 )
{
v10 = -1073741811;
goto LABEL_25;
}
PiUEventInitClientRegistrationContext();
v5 = v9;
if( !v9 )
{
v10 = -1073741670;
LABEL_55:
FileObject->FsContext2 = 0i64;
return(unsigned int)v10;
}
v9[6] = (__int64 *)PsGetCurrentThreadProcessId();
SeCaptureSubjectContext((_SECURITY_SUBJECT_CONTEXT *)(v5 + 7));
v10 = RtlStringCchLengthW((STRSAFE_PCNZWCH)Buffer, 0x104ui64, &pcchLength);
if( v10 < 0 )
goto LABEL_52;
if( *((_DWORD *)Buffer + 130) != 416 )
goto LABEL_52;
v11 = *((_DWORD *)Buffer + 132);
if( v11 >= 4 )
goto LABEL_52;
v12 = *((_DWORD *)Buffer + 131);
if( (v12 & 0xFFFFFFFC) != 0 || (v12 & 1) != 0 && v11 )
goto LABEL_52;
if( (v12 & 2) != 0 && (unsigned int)(v11 - 2) > 1 )
goto LABEL_52;
v13 = (PVOID *)((char *)Buffer + 536);
if( v11 == 1 && (((unsigned __int64)*v13 + 1) & 0xFFFFFFFFFFFFFFFEui64) == 0 )
goto LABEL_52;
v14 = 200i64;
if( v11 == 2 )
{
v10 = RtlStringCchLengthW((STRSAFE_PCNZWCH)Buffer + 268, 0xC8ui64, &pcchLength);
if( v10 < 0 )
goto LABEL_52;
}
if( *((_DWORD *)Buffer + 132) == 3 )
{
v10 = RtlStringCchLengthW((STRSAFE_PCNZWCH)Buffer + 268, v14, &pcchLength);
if( v10 < 0 )
goto LABEL_52;
}
*((_DWORD *)v5 + 33) = *((_DWORD *)Buffer + 132);
v15 = *((_DWORD *)Buffer + 132);
if( v15 )
{
v21 = v15 - 1;
if( v21 )
{
v26 = v21 - 1;
if( !v26 || v26 == 1 )
{
if( (*((_DWORD *)Buffer + 131) & 2) != 0 )
goto LABEL_17;
Object = PiDmGetObject(1i64, (WCHAR *)Buffer + 268, (INT64 *)v5 + 3);
v10 = Object;
if( Object >= 0 )
goto LABEL_17;
LABEL_53:
if( v5 )
PiUEventFreeClientRegistrationContext(v5, v6);
goto LABEL_55;
}
}
else
{
PiUEventGetDeviceInstanceIdFromUserHandle(*v13, &DeviceId, (_DEVICE_OBJECT **)RevocationDeviceObject);
if( v22 >= 0 )
{
v10 = PiDmGetObject(1i64, DeviceId->Buffer, (INT64 *)v5 + 3);
if( v10 >= 0 )
{
v5[4] = (__int64 *)RevocationDeviceObject[0];
*((_BYTE *)v5 + 40) = 0;
goto LABEL_17;
}
goto LABEL_53;
}
}
LABEL_52:
v10 = -1073741811;
goto LABEL_53;
}
if( (*((_DWORD *)Buffer + 131) & 1) == 0 )
*(_OWORD *)(v5 + 3) = *(_OWORD *)v13;
LABEL_17:
*(_QWORD *)Buffer = v5[11];
IoStatus->Information = 8i64;
ExAcquireFastMutex(&PiUEventClientRegistrationListLock);
v16 = *((_DWORD *)Buffer + 132);
if( v16 )
{
v23 = v16 - 1;
if( v23 )
{
v27 = v23 - 1;
if( v27 )
{
if( v27 != 1 )
{
v10 = -1073741811;
goto LABEL_23;
}
if( (*((_DWORD *)Buffer + 131) & 2) != 0 )
v32 = 13;
else
v32 = PiUEventHashStringIntoBucket((PWCHAR)Buffer + 268);
v33 = &PiUEventDevInstancePropertyClientList[2 * v32];
v34 = (__int64 **)v33[1];
if( *v34 == v33 )
{
++PiUEventDevInstancePropertyClientCount;
*v5 = v33;
v5[1] = (__int64 *)v34;
*v34 = (__int64 *)v5;
v33[1] = (__int64)v5;
goto LABEL_22;
}
}
else
{
if( (*((_DWORD *)Buffer + 131) & 2) != 0 )
v28 = 13;
else
v28 = PiUEventHashStringIntoBucket((PWCHAR)Buffer + 268);
v29 = &PiUEventDevInstanceClientList[2 * v28];
v30 = (__int64 **)v29[1];
if( *v30 == v29 )
{
++PiUEventDevInstanceClientCount;
*v5 = v29;
v5[1] = (__int64 *)v30;
*v30 = (__int64 *)v5;
v29[1] = (__int64)v5;
goto LABEL_22;
}
}
}
else
{
v24 = &PiUEventDevHandleClientList[2 * (unsigned int)PiUEventHashStringIntoBucket((PWCHAR)v5[3][2])];
v25 = (__int64 **)v24[1];
if( *v25 == v24 )
{
++PiUEventDevHandleClientCount;
*v5 = v24;
v5[1] = (__int64 *)v25;
*v25 = (__int64 *)v5;
v24[1] = (__int64)v5;
goto LABEL_22;
}
}
LABEL_70:
__fastfail(3u);
}
if( (*((_DWORD *)Buffer + 131) & 1) != 0 )
v17 = 13;
else
v17 = PiUEventHashGuidIntoBucket((_GUID *)((char *)Buffer + 536));
v18 = &PiUEventDevInterfaceClientList[2 * v17];
v19 = (__int64 **)v18[1];
if( *v19 != v18 )
goto LABEL_70;
++PiUEventDevInterfaceClientCount;
*v5 = v18;
v5[1] = (__int64 *)v19;
*v19 = (__int64 *)v5;
v18[1] = (__int64)v5;
LABEL_22:
v6 = 1;
LABEL_23:
KeReleaseGuardedMutex(&PiUEventClientRegistrationListLock);
if( v10 < 0 )
goto LABEL_53;
FileObject->FsContext2 = v5;
LABEL_25:
if( v10 < 0 )
goto LABEL_53;
return(unsigned int)v10;
}Referenced by:
PiUEventHandleIoctl