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.