IopCreateLegacyDeviceIds
NTSTATUS __stdcall IopCreateLegacyDeviceIds(INT64 a1, UINT16 *a2, INT64 a3){
int v3;
WCHAR *v4;
__int64 v5;
int v6;
__int64 v7;
__int64 v8;
size_t v9;
VOID **PoolWithTag;
int v11;
UINT64 dwFlags;
const wchar_t *PropertySize;
UINT64 Flags;
WCHAR *ppszDestEnd;
UINT64 pcchRemaining;
v3 = HIDWORD(a2);
ppszDestEnd = 0i64;
v4 = 0i64;
pcchRemaining = 0i64;
if( a1 )
v5 = *(_QWORD *)(*(_QWORD *)(a1 + 312) + 40i64);
else
v5 = 0i64;
if( v5 && *(_QWORD *)(v5 + 48) )
{
if( a3 )
{
v6 = *(_DWORD *)(a3 + 4);
if( (unsigned int)(v6 + 1) > 0x13 )
v6 = 18;
}
else
{
v6 = 0;
}
v7 = v6;
v8 = -1i64;
do
++v8;
while( *(_WORD *)(*((_QWORD *)&stru_140009520 + v7 + 3) + 2 * v8) );
v9 = 2 * (*a2 + (_DWORD)v8) + 42;
PoolWithTag = ExAllocatePoolWithTag(1ui64, v9, 1869181008i64);
v4 = (WCHAR *)PoolWithTag;
if( !PoolWithTag )
return -1073741670;
memset(PoolWithTag, 0i64, v9);
Flags = *((_QWORD *)&stru_140009520 + v7 + 3);
PropertySize = L"DETECTED";
v11 = RtlStringCchPrintfExW(
v4,
(unsigned __int64)v9 >> 1,
&ppszDestEnd,
&pcchRemaining,
0i64,
(WCHAR *)L"%ws%ws\\%wZ");
if( v11 >= 0 )
{
HIDWORD(dwFlags) = v3;
v11 = RtlStringCchPrintfW(ppszDestEnd + 1, pcchRemaining - 1, (WCHAR *)L"%ws\\%wZ");
if( v11 >= 0 )
{
LODWORD(Flags) = 0;
LODWORD(PropertySize) = v9;
LODWORD(dwFlags) = 7;
v11 = CmSetDeviceRegProp(
*(&stru_140CF2E80 + 607),
*(WCHAR **)(v5 + 48),
0i64,
CM_REG_PROP_COMPATIBLEIDS,
dwFlags,
(UINT8 *)v4,
(UINT64)PropertySize,
Flags);
}
}
}
else
{
v11 = -1073741811;
}
if( v4 )
ExFreePoolWithTag(v4, 0);
return v11;
}Referenced by:
IoReportDetectedDevice