PiSwPdoPnPDispatch

INT64 __stdcall PiSwPdoPnPDispatch(_DEVICE_OBJECT *DeviceObject, _IRP *Irp){
  _DWORD *v2; 
  signed int updated; 
  __int64 v6; 
  unsigned int v7; 
  _ETHREAD *v8; 
  __int64 v9; 
  __m128i si128; 
  int v11; 
  int v12; 
  int v13; 
  int v14; 
  unsigned int v15; 
  unsigned int v16; 
  unsigned int v17; 
  unsigned int v18; 
  unsigned int v19; 
  WCHAR *v20; 
  UINT64 v21; 
  signed int MultiSZ; 
  _ETHREAD *v24; 
  WCHAR **v25; 
  _QWORD *v26; 
  int v27; 
  int v28; 
  int v29; 
  int v30; 
  wchar_t *v31; 
  _ETHREAD *v32; 
  INT64 v33; 
  int v34; 
  _ETHREAD *v35; 
  GUID *PoolWithTag; 
  _ETHREAD *CurrentThread; 
  __int64 v38; 
  __int64 v39; 
  unsigned __int64 v40; 
  WCHAR *v41; 
  _ETHREAD *v42; 
  int v43; 
  _ETHREAD *v44; 
  int v45; 
  _QWORD *v46; 
  _QWORD *v47; 
  v2 = (_DWORD *)*((_QWORD *)DeviceObject + 8);
  updated = *((_DWORD *)Irp + 12);
  v6 = *((_QWORD *)Irp + 23);
  if( (v2[2] & 0x10) != 0 )
  {
    updated = -1073741810;
    goto LABEL_26;
  }
  v7 = *(unsigned __int8 *)(v6 + 1);
  if( v7 > 0xC )
  {
    v15 = v7 - 19;
    if( v15 )
    {
      v16 = v15 - 1;
      if( !v16 )
      {
        CurrentThread = (_ETHREAD *)KeGetCurrentThread();
        --*((_WORD *)CurrentThread + 242);
        ExAcquireResourceExclusiveLite((ERESOURCE *)PiSwLockObj, 1u);
        if( *(_QWORD *)v2 )
        {
          v38 = *((_QWORD *)Irp + 7);
          v39 = v38 | 2;
          v40 = v38 & 0xFFFFFFFFFFFFFFFDui64;
          if( (*(_DWORD *)(*(_QWORD *)v2 + 64i64) & 4) == 0 )
            v39 = v40;
          *((_QWORD *)Irp + 7) = v39;
          goto LABEL_12;
        }
LABEL_69:
        updated = -1073741810;
        goto LABEL_25;
      }
      v17 = v16 - 1;
      if( v17 )
      {
        v18 = v17 - 1;
        if( !v18 )
        {
          updated = *(_BYTE *)(v6 + 8) != 0 ? 0xC00000BB : 0;
          goto LABEL_26;
        }
        v19 = v18 - 1;
        if( !v19 )
        {
          v42 = (_ETHREAD *)KeGetCurrentThread();
          --*((_WORD *)v42 + 242);
          ExAcquireResourceExclusiveLite((ERESOURCE *)PiSwLockObj, 1u);
          v43 = v2[2] | 4;
          v2[2] = v43;
          PiSwProcessRemove(DeviceObject, (v43 & 8) != 0);
LABEL_59:
          ExReleaseResourceLite((PERESOURCE)PiSwLockObj);
          KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
          goto LABEL_20;
        }
        if( v19 != 2 )
          goto LABEL_26;
        PiSwCompleteCreate(DeviceObject);
      }
      else
      {
        PoolWithTag = (GUID *)ExAllocatePoolWithTag(PagedPool, 0x18ui64, 0x57706E50ui64);
        if( !PoolWithTag )
          goto LABEL_67;
        *(_DWORD *)&PoolWithTag[1].Data2 = 0;
        PoolWithTag[1].Data1 = 15;
        *PoolWithTag = GUID_BUS_TYPE_SW_DEVICE;
        *((_QWORD *)Irp + 7) = PoolWithTag;
      }
LABEL_20:
      updated = 0;
      goto LABEL_26;
    }
    v24 = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)v24 + 242);
    ExAcquireResourceExclusiveLite((ERESOURCE *)PiSwLockObj, 1u);
    v26 = *(_QWORD **)v2;
    if( !*(_QWORD *)v2 )
      goto LABEL_69;
    v27 = *(_DWORD *)(v6 + 8);
    if( v27 )
    {
      v28 = v27 - 1;
      if( !v28 )
      {
        v41 = (WCHAR *)v26[3];
        if( !v41 )
          goto LABEL_25;
        MultiSZ = PnpAllocateMultiSZ(v41, 0x7FFFFFFFui64, v25);
        goto LABEL_24;
      }
      v29 = v28 - 1;
      if( !v29 )
      {
        MultiSZ = PiSwDeviceMakeCompatibleIds(*(_QWORD *)v2, (CHAR **)Irp + 7);
        goto LABEL_24;
      }
      v30 = v29 - 1;
      if( v30 )
      {
        if( v30 != 2 || !v26[5] )
          goto LABEL_25;
        v31 = (wchar_t *)ExAllocatePoolWithTag(PagedPool, 0x4Eui64, 0x57706E50ui64);
        *((_QWORD *)Irp + 7) = v31;
        if( !v31 )
        {
          updated = -1073741670;
          goto LABEL_25;
        }
        PnpStringFromGuid(*(int **)(*(_QWORD *)v2 + 40i64), v31);
        goto LABEL_24;
      }
      v20 = (WCHAR *)v26[2];
    }
    else
    {
      v20 = (WCHAR *)v26[1];
    }
    v21 = 200i64;
LABEL_23:
    MultiSZ = PnpAllocatePWSTR(v20, v21, 0x57706E50ui64, (WCHAR **)Irp + 7);
LABEL_24:
    updated = MultiSZ;
    goto LABEL_25;
  }
  if( v7 == 12 )
  {
    v32 = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)v32 + 242);
    ExAcquireResourceExclusiveLite((ERESOURCE *)PiSwLockObj, 1u);
    v33 = *(_QWORD *)v2;
    if( !*(_QWORD *)v2 )
      goto LABEL_69;
    v34 = *(_DWORD *)(v6 + 8);
    if( v34 )
    {
      if( v34 != 1 )
        goto LABEL_25;
      v20 = *(WCHAR **)(v33 + 56);
    }
    else
    {
      v20 = *(WCHAR **)(v33 + 48);
    }
    if( !v20 )
      goto LABEL_25;
    v21 = 0x7FFFFFFFi64;
    goto LABEL_23;
  }
  if( !*(_BYTE *)(v6 + 1) )
  {
    v35 = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)v35 + 242);
    ExAcquireResourceExclusiveLite((ERESOURCE *)PiSwLockObj, 1u);
    if( (v2[2] & 1) == 0 )
    {
      updated = PiSwDeviceInterfacesUpdateState(*(_QWORD *)v2, 1);
      if( updated < 0 )
        PiSwDeviceInterfacesUpdateState(*(_QWORD *)v2, 0);
      else
        v2[2] |= 1u;
      goto LABEL_25;
    }
    goto LABEL_12;
  }
  if( v7 == 1 )
    goto LABEL_20;
  if( v7 == 2 )
  {
    v44 = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)v44 + 242);
    ExAcquireResourceExclusiveLite((ERESOURCE *)PiSwLockObj, 1u);
    v45 = v2[2] | 2;
    v2[2] = v45;
    PiSwProcessRemove(DeviceObject, (v45 & 8) != 0);
    if( (v2[2] & 8) == 0 )
      PiSwDestroyDeviceObject(DeviceObject);
    goto LABEL_59;
  }
  if( v7 <= 6 )
    goto LABEL_20;
  if( v7 == 7 )
  {
    if( *(_DWORD *)(v6 + 8) != 4 )
      goto LABEL_26;
    v46 = ExAllocatePoolWithTag(PagedPool, 0x10ui64, 0x57706E50ui64);
    v47 = v46;
    if( v46 )
    {
      *(_DWORD *)v46 = 1;
      v46[1] = DeviceObject;
      ObfReferenceObject(DeviceObject);
      *((_QWORD *)Irp + 7) = v47;
      goto LABEL_20;
    }
LABEL_67:
    updated = -1073741670;
    goto LABEL_26;
  }
  if( v7 == 9 )
  {
    v8 = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)v8 + 242);
    ExAcquireResourceExclusiveLite((ERESOURCE *)PiSwLockObj, 1u);
    if( *(_QWORD *)v2 )
    {
      v9 = *(_QWORD *)(v6 + 8);
      si128 = _mm_load_si128((const __m128i *)&_xmm);
      *(_DWORD *)(v9 + 16) = 0;
      *(_DWORD *)(v9 + 20) = 1;
      *(__m128i *)(v9 + 24) = si128;
      *(_DWORD *)(v9 + 40) = _mm_cvtsi128_si32(si128);
      *(_DWORD *)(v9 + 44) = 0;
      *(_DWORD *)(v9 + 48) = 0;
      v11 = *(_DWORD *)(v9 + 4) | 0x240;
      *(_DWORD *)(v9 + 4) = v11;
      v12 = v11 ^ ((unsigned __int8)v11 ^ (unsigned __int8)(16 * *(_DWORD *)(*(_QWORD *)v2 + 64i64))) & 0x10;
      *(_DWORD *)(v9 + 4) = v12;
      v13 = v12 ^ ((unsigned __int8)v12 ^ (unsigned __int8)((unsigned __int8)*(_DWORD *)(*(_QWORD *)v2 + 64i64) << 6)) & 0x80;
      *(_DWORD *)(v9 + 4) = v13;
      v14 = v13 ^ (v13 ^ (*(_DWORD *)(*(_QWORD *)v2 + 64i64) << 15)) & 0x20000;
      *(_DWORD *)(v9 + 4) = v14;
      *(_DWORD *)(v9 + 4) = v14 ^ ((unsigned __int16)v14 ^ (unsigned __int16)~(32 * *(_DWORD *)(*(_QWORD *)v2 + 64i64))) & 0x100;
LABEL_12:
      updated = 0;
LABEL_25:
      ExReleaseResourceLite((PERESOURCE)PiSwLockObj);
      KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
      goto LABEL_26;
    }
    goto LABEL_69;
  }
LABEL_26:
  *((_DWORD *)Irp + 12) = updated;
  IofCompleteRequest(Irp, 0);
  return(unsigned int)updated;
}

Referenced by:

No references.