PiSwValidateCreateData

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;
}

Referenced by:

PiSwIrpStartCreateWorker