ObCompleteObjectDuplication
NTSTATUS __stdcall ObCompleteObjectDuplication(
_OB_DUPLICATE_OBJECT_STATE *DuplicateInfo,
_EPROCESS *TargetProcess,
INT8 PreviousMode,
VOID **TargetHandle,
UINT64 *GrantedAccess){
_HANDLE_TABLE *v9;
_HANDLE_TABLE *v10;
void *Object;
bool v12;
NTSTATUS v13;
char *v14;
_OBJECT_HEADER *v15;
_OBJECT_TYPE *v16;
_KNOWN_CONTROLLER_TYPE v17;
_KNOWN_CONTROLLER_TYPE v18;
unsigned __int64 Handle;
UINT64 *v20;
int v21;
int v23;
UINT64 AccessMode;
_KNOWN_CONTROLLER_TYPE v25;
_OBJECT_TYPE *ObjectType;
_LIST_ENTRY ThreadCallbackListHead;
UINT64 v28;
*TargetHandle = 0i64;
v9 = ObReferenceProcessHandleTable(TargetProcess);
v10 = v9;
if( v9 )
{
Object = DuplicateInfo->Object;
v12 = v9 == HandleTable;
LODWORD(v28) = DuplicateInfo->TargetAccess;
v13 = ObpIncrementHandleCountEx(
ObDuplicateHandle,
&v28,
TargetProcess,
Object,
PreviousMode,
DuplicateInfo->HandleAttributes,
0i64);
if( v13 >= 0 )
{
v14 = (char *)DuplicateInfo->Object;
v15 = (_OBJECT_HEADER *)(v14 - 48);
v16 = (_OBJECT_TYPE *)ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ (unsigned __int8)*(v14 - 24) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)v14 - 48) >> 8)];
ThreadCallbackListHead.Blink = &ThreadCallbackListHead;
ThreadCallbackListHead.Flink = &ThreadCallbackListHead;
ObjectType = v16;
if( !ObpFilterOperation(v16) )
{
LABEL_4:
ObfReferenceObjectWithTag(DuplicateInfo->Object, 0x6E48624Fui64);
Handle = (unsigned __int64)ExCreateHandleEx(
v10,
v15,
(unsigned int)v28,
DuplicateInfo->HandleAttributes,
&DuplicateInfo->ObjectInfo);
if( Handle )
{
if( (DuplicateInfo->HandleAttributes & 4) != 0 && SeAuditingWithTokenForSubcategory(123i64, 0i64) )
SeAuditHandleDuplication(
DuplicateInfo->SourceHandle,
(VOID *)Handle,
DuplicateInfo->SourceProcess,
TargetProcess);
}
else
{
ObfDereferenceObjectWithTag(DuplicateInfo->Object, 0x7544624Fui64);
ObpDecrementHandleCount(TargetProcess, v15);
v13 = -1073741670;
}
if( v12 )
Handle |= 0xFFFFFFFF80000000ui64;
ExReleaseRundownProtection(&TargetProcess->RundownProtect);
if( ThreadCallbackListHead.Flink != &ThreadCallbackListHead )
ObpPostInterceptHandleDuplicate(
DuplicateInfo->Object,
v12,
(unsigned int)v13,
(unsigned int)v28,
&ThreadCallbackListHead);
if( v13 >= 0 )
{
v20 = GrantedAccess;
v21 = v28;
*TargetHandle = (VOID *)Handle;
*(_DWORD *)v20 = v21;
}
if( (xmmword_140CFB490 & 0x40) != 0 && v13 >= 0 )
{
LODWORD(AccessMode) = TargetProcess->UniqueProcessId;
EtwTraceDuplicateHandle(
DuplicateInfo->SourceHandle,
(VOID *)Handle,
DuplicateInfo->Object,
LODWORD(DuplicateInfo->SourceProcess->UniqueProcessId),
AccessMode,
ObjectType);
}
return v13;
}
LOBYTE(v17) = v12;
v25 = (int)v28;
v13 = ObpPreInterceptHandleDuplicate(v18, v17, (_KNOWN_CONTROLLER_TYPE)&v25);
if( v13 >= 0 )
{
v23 = v28;
if( !v12 )
v23 = v25;
LODWORD(v28) = v23;
goto LABEL_4;
}
ObpDecrementHandleCount(TargetProcess, v15);
}
ExReleaseRundownProtection(&TargetProcess->RundownProtect);
return v13;
}
return -1073741558;
}Referenced by:
AlpcpExposeHandleAttribute
AlpcpQueryHandleInformationMessage