PiDevCfgCopyDeviceKeys
NTSTATUS __stdcall PiDevCfgCopyDeviceKeys(
VOID *SourceKeyHandle,
VOID *TargetKeyHandle,
UINT64 Flags,
PI_DEVCFG_RESOLVE_CONTEXT *ResolveContext){
int v6;
int v7;
int v8;
INT64 v10;
INT64 v11;
INT64 v12;
INT64 v13;
UINT64 Flagsa;
VOID *SourceKeyHandlea;
VOID *TargetKeyHandlea;
VOID *KeySecurityDescriptor;
_LIST_ENTRY CopyKeyStack;
KeySecurityDescriptor = 0i64;
SourceKeyHandlea = 0i64;
TargetKeyHandlea = 0i64;
CopyKeyStack.Blink = &CopyKeyStack;
LODWORD(Flagsa) = 1;
CopyKeyStack.Flink = &CopyKeyStack;
if( PiDevCfgGetKeySecurityDescriptor(
SourceKeyHandle,
&KeySecurityDescriptor,
Flags,
(INT64)ResolveContext,
v10,
v11,
v12,
v13) >= 0 )
{
ZwSetSecurityObject((UINT64)TargetKeyHandle, 4ui64, (INT64)KeySecurityDescriptor);
ExFreePoolWithTag(KeySecurityDescriptor, 0);
}
PiDevCfgPushCopyKeyEntry(&CopyKeyStack, SourceKeyHandle, TargetKeyHandle, 1ui64);
v7 = v6;
while( v7 >= 0 )
{
if( !PiDevCfgPopCopyKeyEntry(&CopyKeyStack, &SourceKeyHandlea, &TargetKeyHandlea, &Flagsa) )
break;
v8 = Flagsa;
v7 = PiDevCfgCopyDeviceKey((_HANDLE)SourceKeyHandlea, (INT64)TargetKeyHandlea, 0i64, 0i64);
if( (v8 & 0x40000000) != 0 )
{
ZwClose((_HANDLE)SourceKeyHandlea);
ZwClose((_HANDLE)TargetKeyHandlea);
}
}
while( PiDevCfgPopCopyKeyEntry(&CopyKeyStack, &SourceKeyHandlea, &TargetKeyHandlea, &Flagsa) )
{
if( (Flagsa & 0x40000000) != 0 )
{
ZwClose((_HANDLE)SourceKeyHandlea);
ZwClose((_HANDLE)TargetKeyHandlea);
}
}
return v7;
}Referenced by:
PiDevCfgConfigureDeviceInterface
PiDevCfgConfigureDeviceKeyCallback
PiDevCfgResetDeviceKeyCallback
PipCommitPendingOsExtensionResource
PipCommitPendingService