NTSTATUS __stdcall PiSwValidateCreateData(_SW_DEVICE_CREATE_IOCTL_DATA *IoctlData){
NTSTATUS v2;
_WORD *v3;
unsigned __int64 v4;
unsigned __int64 v5;
UINT8 v6;
_WORD *v7;
__int64 v8;
__int64 v9;
unsigned __int64 v10;
__int64 v11;
__int64 v12;
unsigned int v13;
__int64 v14;
WCHAR *i;
__int64 v16;
__int64 v17;
unsigned int v18;
__int64 v19;
WCHAR *j;
__int64 v21;
__int64 v22;
__int64 v23;
unsigned __int64 v24;
__int64 v25;
INT64 v26;
UINT64 v27;
_DEVPROPERTY *v28;
UINT64 v29;
v2 = -1073741811;
if( IoctlData )
{
v3 = (_WORD *)*((_QWORD *)IoctlData + 1);
if( v3 )
{
if( *v3 )
{
v4 = -1i64;
v5 = -1i64;
do
++v5;
while( v3[v5] );
if( v5 <= 0xC7 )
{
if( *(_QWORD *)IoctlData )
{
if( **(_WORD **)IoctlData )
{
if( PiSwIsValidPnpId(*(WCHAR **)IoctlData, 0) )
{
v7 = (_WORD *)*((_QWORD *)IoctlData + 2);
if( v7 )
{
if( *v7 )
{
if( PiSwIsValidPnpId(*((WCHAR **)IoctlData + 2), v6) )
{
v11 = -1i64;
do
++v11;
while( *(_WORD *)(v8 + 2 * v11) );
v12 = -1i64;
do
++v12;
while( *(_WORD *)(v9 + 2 * v12) );
if( v11 + v12 + 5 <= v10 && (IoctlData[16] & 0xFFFFFFF0) == 0 )
{
v13 = IoctlData[6];
if( v13 <= 0x3FF && (v13 || !*((_QWORD *)IoctlData + 4)) )
{
v14 = *((_QWORD *)IoctlData + 4);
if( v14 )
{
if( PnpValidateMultiSz(v14, (unsigned int)IoctlData[6]) < 0 )
return v2;
for( i = (WCHAR *)*((_QWORD *)IoctlData + 4); *i; i = (WCHAR *)(v17 + 2 * v16 + 2) )
{
if( !PiSwIsValidPnpId(i, 1u) )
return v2;
v16 = -1i64;
do
++v16;
while( *(_WORD *)(v17 + 2 * v16) );
}
}
else if( v13 )
{
return v2;
}
v18 = IoctlData[10];
if( v18 <= 0x3FF && (v18 || !*((_QWORD *)IoctlData + 6)) )
{
v19 = *((_QWORD *)IoctlData + 6);
if( v19 )
{
if( PnpValidateMultiSz(v19, (unsigned int)IoctlData[10]) < 0 )
return v2;
for( j = (WCHAR *)*((_QWORD *)IoctlData + 6); *j; j = (WCHAR *)(v22 + 2 * v21 + 2) )
{
if( !PiSwIsValidPnpId(j, 1u) )
return v2;
v21 = -1i64;
do
++v21;
while( *(_WORD *)(v22 + 2 * v21) );
}
}
else if( v18 )
{
return v2;
}
v23 = *((_QWORD *)IoctlData + 9);
if( !v23 )
goto LABEL_59;
v24 = -1i64;
do
++v24;
while( *(_WORD *)(v23 + 2 * v24) );
if( v24 <= 0x7FFE )
{
LABEL_59:
v25 = *((_QWORD *)IoctlData + 10);
if( !v25 )
goto LABEL_46;
do
++v4;
while( *(_WORD *)(v25 + 2 * v4) );
if( v4 <= 0x7FFE )
{
LABEL_46:
v26 = *((_QWORD *)IoctlData + 12);
if( v26 || !IoctlData[22] )
{
v27 = (unsigned int)IoctlData[22];
if( ((_DWORD)v27 || !v26)
&& (!v26 || SeValidSecurityDescriptor(v27, v26))
&& ((IoctlData[16] & 8) == 0
|| *((_QWORD *)IoctlData + 4)
|| *((_QWORD *)IoctlData + 6)) )
{
v28 = (_DEVPROPERTY *)*((_QWORD *)IoctlData + 14);
if( v28 || !IoctlData[26] )
{
v29 = (unsigned int)IoctlData[26];
if( (_DWORD)v29 || !v28 )
return PiSwValidatePropertyArray(v28, v29);
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
return v2;
}