PiDmObjectCreate
NTSTATUS __stdcall PiDmObjectCreate(PNP_OBJECT_TYPE ObjectType, WCHAR *ObjectName, PI_DM_OBJECT **Object){
__int64 v5;
size_t v6;
VOID **PoolWithTag;
VOID **v8;
INT64 *v9;
WCHAR *v10;
NTSTATUS PWSTR;
INT64 v12;
INT64 v13;
wchar_t *v14;
wchar_t *v15;
__int64 v16;
__int64 v17;
INT64 v18;
_DWORD *v19;
__int64 v20;
unsigned int v21;
const _DEVPROPKEY **v22;
_PI_DM_CACHED_PROPERTY_KEY *v23;
unsigned int v25;
wchar_t *v26;
_QWORD *v27;
UINT64 CachedKeysCount;
_PI_DM_CACHED_PROPERTY_KEY *CachedKeys;
_UNICODE_STRING String;
UINT8 PropertyBuffer;
*Object = 0i64;
CachedKeys = 0i64;
LODWORD(CachedKeysCount) = 0;
PropertyBuffer = 0;
PiDmGetCacheKeys((_PNP_OBJECT_TYPE)ObjectType, (const _PI_DM_CACHED_PROPERTY_KEY **)&CachedKeys, &CachedKeysCount);
v5 = (unsigned int)CachedKeysCount;
v6 = 24 * CachedKeysCount + 112;
PoolWithTag = ExAllocatePoolWithTag(1ui64, v6, 1517317712i64);
v8 = PoolWithTag;
if( !PoolWithTag )
return -1073741670;
memset(PoolWithTag, 0i64, v6);
*v8 = 0i64;
v9 = (INT64 *)(v8 + 2);
*((_DWORD *)v8 + 2) = 1;
*((_DWORD *)v8 + 7) = ObjectType;
PWSTR = PnpAllocatePWSTR(ObjectName, 0x7FFFFFFFui64, 0x5A706E50u, v8 + 2);
if( PWSTR < 0 )
goto LABEL_41;
v12 = *v9;
if( ObjectType == 3 )
{
PWSTR = CmSetDeviceInterfacePathFormat(v10, v12);
if( PWSTR < 0 )
goto LABEL_41;
v13 = *v9;
PWSTR = 0;
String = 0i64;
v14 = (wchar_t *)(v13 + 8);
if( v14 )
{
v15 = v14;
v16 = 0x7FFFi64;
do
{
if( !*v15 )
break;
++v15;
--v16;
}
while( v16 );
goto LABEL_9;
}
}
else
{
PWSTR = PnpValidateObjectName((__int64)v10, v12, ObjectType);
if( PWSTR < 0 )
goto LABEL_41;
v14 = (wchar_t *)*v9;
PWSTR = 0;
String = 0i64;
if( v14 )
{
v26 = v14;
v16 = 0x7FFFi64;
do
{
if( !*v26 )
break;
++v26;
--v16;
}
while( v16 );
LABEL_9:
v17 = (0x7FFF - v16) & -(__int64)(v16 != 0);
PWSTR = v16 == 0 ? 0xC000000D : 0;
if( v16 )
{
String.Buffer = v14;
String.Length = 2 * v17;
String.MaximumLength = 2 * v17 + 2;
}
}
}
if( PWSTR < 0 )
goto LABEL_41;
PWSTR = RtlHashUnicodeString(&String, 1u, 0i64, (UINT64 *)v8 + 3);
switch( ObjectType )
{
case 1:
v27 = v8 + 11;
break;
case 2:
case 4:
v27 = v8 + 5;
break;
case 5:
case 6:
v8[6] = v8 + 5;
v8[5] = v8 + 5;
v27 = v8 + 8;
break;
default:
goto LABEL_17;
}
*v27 = v27;
v27[1] = v27;
LABEL_17:
if( (_DWORD)v5 )
{
v19 = v8 + 14;
v20 = v5;
do
{
*v19 = 1;
v19 += 6;
--v20;
}
while( v20 );
}
v21 = 0;
v22 = (const _DEVPROPKEY **)&off_140001528;
v23 = CachedKeys;
while( ObjectType != *((_DWORD *)v22 - 2) )
{
LABEL_22:
++v21;
v22 += 7;
if( v21 >= 3 )
goto LABEL_23;
}
PiDmGetCachedKeyIndex(v23, v5, *v22, v18);
if( v25 < (unsigned int)v5 )
{
PWSTR = PiDmCacheDataEncode(
0x11ui64,
&PropertyBuffer,
1ui64,
(unsigned int)v23[6 * v25 + 2],
v23[6 * v25 + 3],
(PI_DM_CACHED_PROPERTY_DATA *)&v8[3 * v25 + 14]);
if( PWSTR < 0 )
goto LABEL_41;
goto LABEL_22;
}
PWSTR = -1073741595;
LABEL_23:
if( PWSTR < 0 )
{
LABEL_41:
PiDmObjectRelease((_PI_DM_OBJECT *)v8);
return PWSTR;
}
*Object = (PI_DM_OBJECT *)v8;
return PWSTR;
}Referenced by:
PiDmAddCacheReferenceForObject
PiDmObjectManagerPopulate