PiSwIrpInterfaceRegister
NTSTATUS __stdcall PiSwIrpInterfaceRegister(IRP *Irp){
__int64 v2;
__int64 v3;
WCHAR **v4;
char v5;
__int64 v6;
NTSTATUS updated;
__int64 v8;
UINT64 v9;
__int64 v10;
__int64 *InterfaceEntry;
WCHAR ***v12;
INT64 v13;
NTSTRSAFE_PCWSTR v14;
__int64 v15;
WCHAR *v17;
void **v18;
INT64 v19;
NTSTRSAFE_PCWSTR pszSrc;
__int64 v21[11];
UINT64 PdoFlags;
VOID *v23;
v2 = *((_QWORD *)Irp + 23);
v21[1] = v2;
v3 = *(_QWORD *)(*(_QWORD *)(v2 + 48) + 32i64);
v21[2] = v3;
v21[0] = 0i64;
v23 = 0i64;
v4 = 0i64;
v19 = 0i64;
pszSrc = 0i64;
LODWORD(PdoFlags) = 0;
v5 = 0;
v6 = *((_QWORD *)Irp + 3);
if( !v6 )
{
updated = -1073741811;
goto LABEL_36;
}
updated = MesDecodeBufferHandleCreate(v6, *(unsigned int *)(v2 + 16), v21);
if( updated >= 0 )
{
NdrMesTypeDecode3(v21[0], "TP 3\a", &off_140983A98, &off_140C01A60, 2, &v23);
if( v23
&& *(_QWORD *)v23
&& ((v8 = *((_QWORD *)v23 + 3)) != 0 || !*((_DWORD *)v23 + 4))
&& ((v9 = *((unsigned int *)v23 + 4), (_DWORD)v9) || !v8) )
{
updated = PiSwValidatePropertyArray(*((DEVPROPERTY **)v23 + 3), v9);
if( updated >= 0 )
{
PiSwLock();
if( !PiSwDeviceOperationsAllowed(v3) || (*(_DWORD *)(v3 + 64) & 8) != 0 )
{
updated = -1073741637;
}
else
{
updated = IopRegisterDeviceInterface(
*(WCHAR **)(v3 + 80),
*(GUID **)v23,
*((WCHAR **)v23 + 1),
1u,
(WCHAR **)&pszSrc,
&PdoFlags);
if( updated >= 0 )
{
v10 = *(_QWORD *)(v3 + 120);
if( v10 )
*(_DWORD *)(v10 + 48) |= PdoFlags;
InterfaceEntry = PiSwDeviceFindInterfaceEntry(v3, pszSrc);
v4 = (WCHAR **)InterfaceEntry;
v19 = (INT64)InterfaceEntry;
if( InterfaceEntry )
{
updated = PiSwUpdateArrayProperties(
(DEVPROPERTY *)InterfaceEntry[3],
*((unsigned int *)InterfaceEntry + 8),
*((DEVPROPERTY **)v23 + 3),
*((unsigned int *)v23 + 4));
LABEL_17:
PiSwUnlock();
if( updated < 0 )
goto LABEL_36;
v13 = *((_QWORD *)v23 + 3);
if( v13 )
updated = PiSwPropertySet(v4[2], (PVOID)3, v13, (DEVPROPERTY *)*((unsigned int *)v23 + 4));
if( updated < 0 )
goto LABEL_36;
PiSwLock();
updated = PiSwDeviceInterfaceSetState(v3, (INT64)v4, *((_BYTE *)v23 + 32));
goto LABEL_22;
}
updated = PiSwInterfaceCreate(
(WCHAR *)pszSrc,
*((DEVPROPERTY **)v23 + 3),
*((unsigned int *)v23 + 4),
(CHAR **)&v19);
if( updated >= 0 )
{
v5 = 1;
v12 = *(WCHAR ****)(v3 + 192);
if( *v12 != (WCHAR **)(v3 + 184) )
goto LABEL_48;
v4 = (WCHAR **)v19;
*(_QWORD *)v19 = v3 + 184;
v4[1] = (WCHAR *)v12;
*v12 = v4;
*(_QWORD *)(v3 + 192) = v4;
goto LABEL_17;
}
v4 = (WCHAR **)v19;
}
}
LABEL_22:
PiSwUnlock();
if( updated < 0 )
goto LABEL_36;
v14 = pszSrc;
updated = RtlStringCbCopyW(*((PWCHAR *)Irp + 3), *(unsigned int *)(v2 + 8), (PWCHAR)pszSrc);
if( updated >= 0 )
{
v15 = -1i64;
do
++v15;
while( v14[v15] );
*((_QWORD *)Irp + 7) = 2 * v15 + 2;
}
}
}
else
{
updated = -1073741811;
}
}
if( updated >= 0 )
goto LABEL_28;
LABEL_36:
if( v4 && v5 )
{
PiSwLock();
v17 = *v4;
v18 = (void **)v4[1];
if( *((WCHAR ***)*v4 + 1) == v4 && *v18 == v4 )
{
*v18 = v17;
*((_QWORD *)v17 + 1) = v18;
PiSwUnlock();
PiSwInterfaceFree(v4);
goto LABEL_28;
}
LABEL_48:
__fastfail(3u);
}
LABEL_28:
if( v23 )
MIDL_user_free(v23);
if( pszSrc )
ExFreePoolWithTag((PVOID)pszSrc, 0);
if( v21[0] )
MesHandleFree();
*((_DWORD *)Irp + 12) = updated;
IofCompleteRequest(Irp, 0);
return updated;
}Referenced by:
PiSwDispatch