PiSwIrpInterfaceRegister
NTSTATUS __stdcall PiSwIrpInterfaceRegister(_IRP *Irp){
UINT64 v1;
INT64 v2;
_IO_STACK_LOCATION *CurrentStackLocation;
INT64 FsContext2;
_PI_SWD_INTERFACE *v6;
char v7;
union {_IRP *MasterIrp;int IrpCount;void *SystemBuffer;} v8;
int updated;
__int64 v10;
_PI_SWD_INTERFACE *InterfaceEntry;
_PI_SWD_INTERFACE **v12;
WCHAR *v13;
__int64 v14;
__int64 v16;
_PI_SWD_INTERFACE **v17;
_PI_SWD_INTERFACE *Interface;
WCHAR *InterfaceId;
__int64 v20[11];
UINT64 PdoFlags;
VOID *pMemory;
CurrentStackLocation = Irp->Tail.CurrentStackLocation;
v20[1] = (__int64)CurrentStackLocation;
FsContext2 = (INT64)CurrentStackLocation->FileObject->FsContext2;
v20[2] = FsContext2;
v20[0] = 0i64;
pMemory = 0i64;
v6 = 0i64;
Interface = 0i64;
InterfaceId = 0i64;
LODWORD(PdoFlags) = 0;
v7 = 0;
v8.MasterIrp = (_IRP *)Irp->AssociatedIrp;
if( !v8.MasterIrp )
{
updated = -1073741811;
goto LABEL_36;
}
updated = MesDecodeBufferHandleCreate(v8.MasterIrp, CurrentStackLocation->Parameters.Options, v20);
if( updated >= 0 )
{
NdrMesTypeDecode3(v20[0], "TP 3\a", &off_140983A98, (char *)&stru_140C00F40 + 2848, 2, &pMemory);
if( pMemory
&& *(_QWORD *)pMemory
&& ((v2 = *((_QWORD *)pMemory + 3)) != 0 || !*((_DWORD *)pMemory + 4))
&& ((v1 = *((unsigned int *)pMemory + 4), (_DWORD)v1) || !v2) )
{
updated = PiSwValidatePropertyArray(*((_DEVPROPERTY **)pMemory + 3), v1);
if( updated >= 0 )
{
PiSwLock();
if( !PiSwDeviceOperationsAllowed(FsContext2) || (*(_DWORD *)(FsContext2 + 64) & 8) != 0 )
{
updated = -1073741637;
}
else
{
updated = IopRegisterDeviceInterface(
*(WCHAR **)(FsContext2 + 80),
*(_GUID **)pMemory,
*((WCHAR **)pMemory + 1),
1u,
&InterfaceId,
&PdoFlags);
if( updated >= 0 )
{
v10 = *(_QWORD *)(FsContext2 + 120);
if( v10 )
*(_DWORD *)(v10 + 48) |= PdoFlags;
InterfaceEntry = PiSwDeviceFindInterfaceEntry((_PI_SWD_OBJECT *)FsContext2, InterfaceId);
v6 = InterfaceEntry;
Interface = InterfaceEntry;
if( InterfaceEntry )
{
updated = PiSwUpdateArrayProperties(
*((_DEVPROPERTY **)InterfaceEntry + 3),
(unsigned int)InterfaceEntry[8],
*((_DEVPROPERTY **)pMemory + 3),
*((unsigned int *)pMemory + 4));
LABEL_17:
PiSwUnlock();
if( updated < 0 )
goto LABEL_36;
v2 = *((_QWORD *)pMemory + 3);
if( v2 )
updated = PiSwPropertySet(
*((WCHAR **)v6 + 2),
(VOID *)3,
v2,
(_DEVPROPERTY *)*((unsigned int *)pMemory + 4));
if( updated < 0 )
goto LABEL_36;
PiSwLock();
updated = PiSwDeviceInterfaceSetState((PI_SWD_OBJECT *)FsContext2, v6, *((_BYTE *)pMemory + 32));
goto LABEL_22;
}
updated = PiSwInterfaceCreate(
InterfaceId,
*((_DEVPROPERTY **)pMemory + 3),
*((unsigned int *)pMemory + 4),
(VOID **)&Interface);
if( updated >= 0 )
{
v7 = 1;
v12 = *(_PI_SWD_INTERFACE ***)(FsContext2 + 192);
if( *v12 != (_PI_SWD_INTERFACE *)(FsContext2 + 184) )
goto LABEL_48;
v6 = Interface;
*(_QWORD *)Interface = FsContext2 + 184;
*((_QWORD *)v6 + 1) = v12;
*v12 = v6;
*(_QWORD *)(FsContext2 + 192) = v6;
goto LABEL_17;
}
v6 = Interface;
}
}
LABEL_22:
PiSwUnlock();
if( updated < 0 )
goto LABEL_36;
v13 = InterfaceId;
updated = RtlStringCbCopyW(
(WCHAR *)Irp->AssociatedIrp.MasterIrp,
LODWORD(CurrentStackLocation->Parameters.SecurityContext),
InterfaceId);
if( updated >= 0 )
{
v14 = -1i64;
do
++v14;
while( v13[v14] );
Irp->IoStatus.Information = 2 * v14 + 2;
}
}
}
else
{
updated = -1073741811;
}
}
if( updated >= 0 )
goto LABEL_28;
LABEL_36:
if( v6 && v7 )
{
PiSwLock();
v16 = *(_QWORD *)v6;
v17 = (_PI_SWD_INTERFACE **)*((_QWORD *)v6 + 1);
if( *(_PI_SWD_INTERFACE **)(*(_QWORD *)v6 + 8i64) == v6 && *v17 == v6 )
{
*v17 = (_PI_SWD_INTERFACE *)v16;
*(_QWORD *)(v16 + 8) = v17;
PiSwUnlock();
PiSwInterfaceFree(v6);
goto LABEL_28;
}
LABEL_48:
__fastfail(3u);
}
LABEL_28:
if( pMemory )
MIDL_user_free(pMemory);
if( InterfaceId )
ExFreePoolWithTag(InterfaceId, 0);
if( v20[0] )
MesHandleFree(v20[0], v1, v2);
Irp->IoStatus.Status = updated;
IofCompleteRequest(Irp, 0);
return updated;
}Referenced by:
PiSwDispatch