PiDevCfgPushCopyKeyEntry
INT64 __stdcall PiDevCfgPushCopyKeyEntry(
_LIST_ENTRY *CopyKeyStack,
PVOID SourceKeyHandle,
PVOID TargetKeyHandle,
UINT64 Flags){
NTSTATUS v4;
int v8;
_LIST_ENTRY *PoolWithTag;
_LIST_ENTRY *v10;
void **p_Flink;
_LIST_ENTRY *Blink;
struct _OBJECT_ATTRIBUTES ObjectAttributes;
v4 = 0;
v8 = Flags;
memset(&ObjectAttributes, 0, sizeof(ObjectAttributes));
PoolWithTag = (_LIST_ENTRY *)ExAllocatePoolWithTag(PagedPool, 0x28ui64, 0x63647050ui64);
v10 = PoolWithTag;
if( !PoolWithTag )
return(unsigned int)-1073741670;
LODWORD(PoolWithTag[2].Flink) = v8;
p_Flink = (void **)&PoolWithTag[1].Flink;
if( v8 >= 0 )
{
*p_Flink = SourceKeyHandle;
PoolWithTag[1].Blink = (_LIST_ENTRY *)TargetKeyHandle;
LABEL_4:
Blink = CopyKeyStack->Blink;
if( Blink->Flink != CopyKeyStack )
__fastfail(3u);
v10->Flink = CopyKeyStack;
v10->Blink = Blink;
Blink->Flink = v10;
CopyKeyStack->Blink = v10;
v10 = 0i64;
goto LABEL_6;
}
ObjectAttributes.RootDirectory = SourceKeyHandle;
ObjectAttributes.ObjectName = (_UNICODE_STRING *)&PiDevCfgEmptyString;
ObjectAttributes.Attributes = 512;
ObjectAttributes.Length = 48;
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
v4 = ZwOpenKey(p_Flink, 0x20019u, &ObjectAttributes);
if( v4 >= 0 )
{
ObjectAttributes.Length = 48;
ObjectAttributes.ObjectName = (_UNICODE_STRING *)&PiDevCfgEmptyString;
ObjectAttributes.RootDirectory = TargetKeyHandle;
ObjectAttributes.Attributes = 512;
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
v4 = ZwOpenKey((PHANDLE)&v10[1].Blink, 0xF003Fu, &ObjectAttributes);
if( v4 >= 0 )
{
LODWORD(v10[2].Flink) |= 0x40000000u;
goto LABEL_4;
}
ZwClose(*p_Flink);
}
LABEL_6:
if( v10 )
ExFreePoolWithTag(v10, 0);
return(unsigned int)v4;
}Referenced by:
PiDevCfgCopyDeviceKey
PiDevCfgCopyDeviceKeys