NtDuplicateObject
NTSTATUS __stdcall NtDuplicateObject(
PVOID SourceProcessHandle,
PVOID SourceHandle,
PVOID TargetProcessHandle,
PVOID *TargetHandle,
UINT64 DesiredAccess,
UINT64 HandleAttributes,
UINT64 Options){
PVOID v10;
KPROCESSOR_MODE v11;
NTSTATUS result;
int v13;
PVOID v14;
PVOID v15;
NTSTATUS v16;
__int64 v17;
PVOID v18;
PVOID Object;
void *v20;
v10 = 0i64;
v20 = 0i64;
Object = 0i64;
v18 = 0i64;
v11 = *((_BYTE *)KeGetCurrentThread() + 562);
if( TargetHandle && v11 )
{
v17 = (__int64)TargetHandle;
if( (unsigned __int64)TargetHandle >= 0x7FFFFFFF0000i64 )
v17 = 0x7FFFFFFF0000i64;
*(_QWORD *)v17 = *(_QWORD *)v17;
*TargetHandle = 0i64;
}
result = ObReferenceObjectByHandleWithTag(
SourceProcessHandle,
0x40u,
(POBJECT_TYPE)PsProcessType,
v11,
0x7544624Fu,
&Object,
0i64);
if( result >= 0 )
{
if( TargetProcessHandle )
{
v13 = ObReferenceObjectByHandleWithTag(
TargetProcessHandle,
0x40u,
(POBJECT_TYPE)PsProcessType,
v11,
0x7544624Fu,
&v18,
0i64);
if( v13 < 0 )
{
v18 = 0i64;
goto LABEL_7;
}
}
else
{
v13 = 0;
}
v10 = v18;
LABEL_7:
v14 = SourceHandle;
v15 = Object;
v16 = ObDuplicateObject(Object, v14, v10, &v20, DesiredAccess, HandleAttributes, Options, v11);
if( TargetHandle )
*TargetHandle = v20;
ObfDereferenceObjectWithTag(v15, 0x7544624Fui64);
if( v10 )
ObfDereferenceObjectWithTag(v10, 0x7544624Fui64);
if( v13 < 0 )
return v13;
return v16;
}
return result;
}Referenced by:
No references.