DrvDbGetDeviceIdMappedProperty
__int64 __fastcall DrvDbGetDeviceIdMappedProperty(
__int64 *a1,
__int64 a2,
HANDLE a3,
__int64 a4,
_DWORD *a5,
_WORD *a6,
unsigned int a7,
unsigned int *a8){
__int64 *v10;
int v11;
__int64 v12;
__int64 v13;
char v14;
__int64 v15;
const UNICODE_STRING *v16;
int v17;
__int64 v18;
int RegValueMappedProperty;
__int64 v21;
__int64 v22;
unsigned int v23;
unsigned int v24;
unsigned int v25;
WCHAR *v26;
HANDLE v27;
unsigned int v28;
int ObjectDatabaseNodeName;
unsigned int v30;
__int64 **i;
__int64 *v32;
__int64 v33;
__int64 v34;
__int64 **v35;
INT64 a5a;
unsigned int v37;
unsigned int v38;
HANDLE Handle;
__int64 *a1a;
char v41;
a1a = a1;
Handle = 0i64;
v10 = a1;
v37 = 0;
*a5 = 0;
*a8 = 0;
v11 = *(_DWORD *)(a4 + 16);
v38 = 0;
v41 = 0;
if( v11 != 2 )
{
if( v11 == 3 )
{
a1 = (__int64 *)0xBADB47CC74A2E194i64;
v12 = *(_QWORD *)a4 - DEVPKEY_DeviceId_DriverInfMatches;
if( *(_QWORD *)a4 == DEVPKEY_DeviceId_DriverInfMatches )
v12 = *(_QWORD *)(a4 + 8) + 0x4524B8338B5D1E6Ci64;
if( !v12 )
{
v13 = *(_QWORD *)a4 - DEVPKEY_DeviceId_DriverInfMatches;
if( *(_QWORD *)a4 == DEVPKEY_DeviceId_DriverInfMatches )
v13 = *(_QWORD *)(a4 + 8) + 0x4524B8338B5D1E6Ci64;
v14 = 1;
if( !v13 )
goto LABEL_9;
goto LABEL_30;
}
}
LABEL_65:
v30 = 0;
for( i = &off_140001728; ; i += 5 )
{
v32 = *i;
if( *((_DWORD *)*i + 4) == v11 )
{
v33 = *v32 - *(_QWORD *)a4;
if( *v32 == *(_QWORD *)a4 )
v33 = v32[1] - *(_QWORD *)(a4 + 8);
if( !v33 )
break;
}
if( ++v30 )
return(unsigned int)-1073741802;
}
v34 = 5i64 * v30;
v35 = &(&off_140001728)[5 * v30];
if( v35 )
{
if( !a3 )
{
RegValueMappedProperty = DrvDbOpenDeviceIdRegKey(v10, a2, 1i64, 0, (INT64)&Handle, 0i64);
if( RegValueMappedProperty < 0 )
goto LABEL_21;
a3 = Handle;
}
RegValueMappedProperty = DrvDbGetRegValueMappedProperty(v34, a3, (__int64)v35, a5, a6, a7, a8);
goto LABEL_21;
}
return(unsigned int)-1073741802;
}
v21 = *(_QWORD *)a4 - DEVPKEY_NODE;
if( *(_QWORD *)a4 == DEVPKEY_NODE )
v21 = *(_QWORD *)(a4 + 8) + 0x5008C7D4C8250077i64;
if( !v21 )
{
LODWORD(a5a) = a7 >> 1;
*a5 = 18;
ObjectDatabaseNodeName = DrvDbGetObjectDatabaseNodeName(a1, 5i64, a2, a6, a5a, (UINT64 *)a8);
RegValueMappedProperty = ObjectDatabaseNodeName;
if( (int)(ObjectDatabaseNodeName + 0x80000000) < 0 || ObjectDatabaseNodeName == -1073741789 )
*a8 *= 2;
goto LABEL_21;
}
v22 = *(_QWORD *)a4 - DEVPKEY_DeviceId_DriverInfNames;
if( *(_QWORD *)a4 == DEVPKEY_DeviceId_DriverInfNames )
v22 = *(_QWORD *)(a4 + 8) + 0x4524B8338B5D1E6Ci64;
if( v22 )
goto LABEL_65;
LABEL_30:
v14 = 0;
LABEL_9:
if( *(_WORD *)a2 != 64 || (v26 = wcschr((WCHAR *)(a2 + 2), 0x3Au)) == 0i64 || (v15 = (__int64)(v26 + 1)) == 0 )
v15 = a2;
if( v15 == a2 && !v10[5] )
{
v16 = (const UNICODE_STRING *)v10[2];
if( v16 == (const UNICODE_STRING *)(v10 + 2) )
goto LABEL_20;
while( 1 )
{
LODWORD(a5a) = 1;
v17 = DrvDbOpenObjectRegKey(a1a, v16, 5i64, (WCHAR *)a2, a5a, 0, (INT64)&Handle, 0i64, 0i64);
RegValueMappedProperty = v17;
if( v17 >= 0 )
{
v41 = 1;
RegValueMappedProperty = DrvDbGetDeviceIdDriverInfMatches(
v18,
Handle,
(__int64)a6 + v38,
(a7 - v38) >> 1,
&v37,
v14);
ZwClose(Handle);
Handle = 0i64;
if( RegValueMappedProperty >= 0 )
goto LABEL_32;
if( RegValueMappedProperty != -1073741275 )
{
if( RegValueMappedProperty != -1073741789 )
{
LABEL_18:
if( (int)(RegValueMappedProperty + 0x80000000) >= 0 && RegValueMappedProperty != -1073741789 )
goto LABEL_21;
if( v41 )
{
if( *a8 )
{
*a5 = 8210;
v25 = *a8 + 2;
*a8 = v25;
if( a6 && v25 <= a7 )
a6[((unsigned __int64)v25 >> 1) - 1] = 0;
else
RegValueMappedProperty = -1073741789;
}
else
{
RegValueMappedProperty = -1073741275;
}
}
else
{
LABEL_20:
RegValueMappedProperty = -1073741772;
}
goto LABEL_21;
}
LABEL_32:
v23 = 2 * v37 - 2;
if( 2 * v37 <= 2 )
v23 = 2 * v37;
if( a6 )
{
v24 = v38;
if( v23 + v38 < a7 )
v24 = v23 + v38;
v38 = v24;
}
*a8 += v23;
goto LABEL_17;
}
}
else if( v17 != -1073741772 )
{
goto LABEL_18;
}
RegValueMappedProperty = 0;
LABEL_17:
v16 = *(const UNICODE_STRING **)&v16->Length;
if( v16 == (const UNICODE_STRING *)(a1a + 2) )
goto LABEL_18;
}
}
v27 = 0i64;
if( a3 != (HANDLE)-1i64 )
v27 = a3;
if( !v27 )
{
RegValueMappedProperty = DrvDbOpenDeviceIdRegKey(v10, a2, 1i64, 0, (INT64)&Handle, 0i64);
if( RegValueMappedProperty < 0 )
goto LABEL_21;
v27 = Handle;
}
RegValueMappedProperty = DrvDbGetDeviceIdDriverInfMatches((__int64)a1, v27, (__int64)a6, a7 >> 1, &v37, v14);
if( (int)(RegValueMappedProperty + 0x80000000) < 0 || RegValueMappedProperty == -1073741789 )
{
v28 = 2 * v37;
*a5 = 8210;
*a8 = v28;
}
LABEL_21:
if( Handle )
ZwClose(Handle);
return(unsigned int)RegValueMappedProperty;
}Referenced by:
DrvDbDispatchDeviceId