PiDevCfgCopyObjectProperties
NTSTATUS __stdcall PiDevCfgCopyObjectProperties(
VOID *SourceObjectBaseKey,
WCHAR *TargetObjectName,
PNP_OBJECT_TYPE TargetObjectType,
VOID *TargetObjectBaseKey){
WCHAR *v4;
NTSTATUS ObjectPropertyKeys;
NTSTATUS ObjectProperty;
VOID *v12;
VOID **PoolWithTag;
VOID *v14;
NTSTATUS GenericStorePropertyKeys;
VOID **v16;
unsigned int v17;
VOID *v18;
unsigned int v19;
WCHAR *v20;
INT64 v21;
INT64 v22;
VOID *v23;
INT64 v24;
INT64 v25;
WCHAR *v26;
INT64 v27;
_DEVPROPKEY *PropertyKey;
INT64 v29;
VOID *Handle;
UINT64 BufferSize;
UINT64 v32;
UINT64 PropertyType;
WCHAR *hPnpCtx;
INT64 v37;
UINT64 NumberOfBytes;
__int64 v39;
UINT64 v40;
WCHAR *PropertyLocaleName;
unsigned __int8(__fastcall *v42)(char *, __int64);
__int64 v43;
v4 = (WCHAR *)*(&stru_140CF2E80 + 607);
hPnpCtx = (WCHAR *)*(&stru_140CF2E80 + 607);
Handle = 0i64;
v32 = 0i64;
LODWORD(v37) = 0;
LODWORD(v29) = 1;
LODWORD(NumberOfBytes) = 0;
if( !TargetObjectBaseKey )
{
ObjectProperty = PnpOpenObjectRegKey(
(__int64)SourceObjectBaseKey,
(__int64)TargetObjectName,
TargetObjectType,
33554433,
0,
(__int64)&Handle);
if( ObjectProperty < 0 )
goto LABEL_8;
v4 = hPnpCtx;
}
if( PropertyLocaleName
|| (ObjectProperty = PnpOpenObjectRegKey((__int64)v4, v39, v40, 33554433, 0, (__int64)&v32), ObjectProperty >= 0) )
{
if( TargetObjectType )
{
v12 = Handle;
LODWORD(v25) = 0;
if( TargetObjectBaseKey )
v12 = TargetObjectBaseKey;
ObjectPropertyKeys = PnpGetObjectPropertyKeys(
(INT64)SourceObjectBaseKey,
(INT64)TargetObjectName,
(unsigned int)TargetObjectType,
(INT64)v12,
v21,
0,
0i64,
v25,
(INT64)&v37);
}
else
{
ObjectPropertyKeys = PnpGetGenericStorePropertyKeys(
(__int64)SourceObjectBaseKey,
TargetObjectBaseKey,
0i64,
0,
0i64,
0,
(__int64)&v37);
}
ObjectProperty = ObjectPropertyKeys;
if( (int)(ObjectPropertyKeys + 0x80000000) < 0 || ObjectPropertyKeys == -1073741789 )
{
if( !(_DWORD)v37 )
{
ObjectProperty = 0;
goto LABEL_8;
}
PoolWithTag = ExAllocatePoolWithTag(1ui64, 20i64 * (unsigned int)v37, 1667526736i64);
if( !PoolWithTag )
{
ObjectProperty = -1073741670;
goto LABEL_8;
}
if( TargetObjectType )
{
v14 = Handle;
if( TargetObjectBaseKey )
v14 = TargetObjectBaseKey;
LODWORD(v25) = v37;
GenericStorePropertyKeys = PnpGetObjectPropertyKeys(
(INT64)SourceObjectBaseKey,
(INT64)TargetObjectName,
(unsigned int)TargetObjectType,
(INT64)v14,
v22,
0,
(INT64)PoolWithTag,
v25,
(INT64)&v37);
}
else
{
GenericStorePropertyKeys = PnpGetGenericStorePropertyKeys(
(__int64)SourceObjectBaseKey,
TargetObjectBaseKey,
0i64,
0,
(__int64)PoolWithTag,
v37,
(__int64)&v37);
}
ObjectProperty = GenericStorePropertyKeys;
if( GenericStorePropertyKeys < 0 )
goto LABEL_57;
BufferSize = 256i64;
v16 = ExAllocatePoolWithTag(1ui64, 0x100ui64, 1667526736i64);
if( !v16 )
{
ObjectProperty = -1073741670;
LABEL_57:
ExFreePoolWithTag(PoolWithTag, 0);
goto LABEL_8;
}
v17 = 0;
if( !(_DWORD)v37 )
{
LABEL_55:
if( v16 )
ExFreePoolWithTag(v16, 0);
goto LABEL_57;
}
while( 1 )
{
if( v42 && !v42((char *)PoolWithTag + 20 * v17, v43) )
goto LABEL_51;
if( TargetObjectType )
{
v18 = Handle;
v19 = BufferSize;
if( TargetObjectBaseKey )
v18 = TargetObjectBaseKey;
PropertyType = (UINT64)PoolWithTag + 20 * v17;
PropertyKey = (_DEVPROPKEY *)&NumberOfBytes;
LODWORD(v27) = BufferSize;
ObjectProperty = PnpGetObjectProperty(
(ULONG)SourceObjectBaseKey,
(INT64)TargetObjectName,
(unsigned int)TargetObjectType,
(INT64)v18,
0i64,
PropertyType,
(INT64)&v29,
(INT64)v16);
if( ObjectProperty == -1073741822 )
{
ObjectProperty = 0;
goto LABEL_51;
}
}
else
{
v19 = BufferSize;
LODWORD(v24) = BufferSize;
PropertyType = (UINT64)PoolWithTag + 20 * v17;
ObjectProperty = PnpGetGenericStoreProperty(
(HPNPCTX *)SourceObjectBaseKey,
TargetObjectBaseKey,
0i64,
(_DEVPROPKEY *)PropertyType,
(UINT64 *)&v29,
(UINT8 *)v16,
v24,
&NumberOfBytes,
v27);
}
if( ObjectProperty == -1073741789 )
{
if( (unsigned int)NumberOfBytes <= v19 )
{
ObjectProperty = -1073741595;
goto LABEL_55;
}
ExFreePoolWithTag(v16, 0);
BufferSize = (unsigned int)NumberOfBytes;
v16 = ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1667526736i64);
if( !v16 )
{
ObjectProperty = -1073741670;
goto LABEL_55;
}
ObjectProperty = 0;
--v17;
}
else
{
if( ObjectProperty < 0 )
goto LABEL_55;
v20 = (WCHAR *)v32;
if( PropertyLocaleName )
v20 = PropertyLocaleName;
LODWORD(PropertyKey) = NumberOfBytes;
LODWORD(v26) = v29;
ObjectProperty = PiDevCfgSetObjectProperty(
hPnpCtx,
0i64,
v39,
(WCHAR *)(unsigned int)v40,
v20,
v23,
PropertyType,
v26,
(UINT64)v16,
PropertyKey);
if( ObjectProperty == -1073741790 )
ObjectProperty = 0;
if( ObjectProperty < 0 )
goto LABEL_55;
}
LABEL_51:
if( ++v17 >= (unsigned int)v37 )
goto LABEL_55;
}
}
}
LABEL_8:
if( Handle )
ZwClose((_HANDLE)Handle);
if( v32 )
ZwClose(v32);
return ObjectProperty;
}Referenced by:
PiDevCfgConfigureDeviceDriverConfiguration
PiDevCfgConfigureDeviceInterface
PiDevCfgInitDriverDatabaseCallback