NtDuplicateObject
NTSTATUS __stdcall NtDuplicateObject(
VOID *SourceProcessHandle,
VOID *SourceHandle,
VOID *TargetProcessHandle,
VOID **TargetHandle,
_ACCESS_MASK DesiredAccess,
UINT64 HandleAttributes,
UINT64 Options){
VOID *v10;
char PreviousMode;
NTSTATUS result;
int v13;
VOID *v14;
VOID *v15;
NTSTATUS v16;
__int64 v17;
UINT64 Tag;
UINT64 Taga;
PVOID *Object;
POBJECT_HANDLE_INFORMATION HandleInformation;
PVOID v22;
PVOID v23;
__int64 v24[3];
v10 = 0i64;
v24[0] = 0i64;
v23 = 0i64;
v22 = 0i64;
PreviousMode = KeGetCurrentThread()->PreviousMode;
if( TargetHandle && PreviousMode )
{
v17 = (__int64)TargetHandle;
if( (unsigned __int64)TargetHandle >= 0x7FFFFFFF0000i64 )
v17 = 0x7FFFFFFF0000i64;
*(_QWORD *)v17 = *(_QWORD *)v17;
*TargetHandle = 0i64;
}
LODWORD(Tag) = 1967415887;
result = ObReferenceObjectByHandleWithTag(
SourceProcessHandle,
0x40ui64,
(_OBJECT_TYPE *)PsProcessType,
PreviousMode,
Tag,
&v23,
0i64);
if( result >= 0 )
{
if( TargetProcessHandle )
{
LODWORD(Taga) = 1967415887;
v13 = ObReferenceObjectByHandleWithTag(
TargetProcessHandle,
0x40ui64,
(_OBJECT_TYPE *)PsProcessType,
PreviousMode,
Taga,
&v22,
0i64);
if( v13 < 0 )
{
v22 = 0i64;
goto LABEL_7;
}
}
else
{
v13 = 0;
}
v10 = v22;
LABEL_7:
LODWORD(HandleInformation) = Options;
LODWORD(Object) = HandleAttributes;
LODWORD(Taga) = DesiredAccess;
v14 = SourceHandle;
v15 = v23;
v16 = ObDuplicateObject(
(INT64)v23,
(UINT64)v14,
(INT64)v10,
(UINT64 *)v24,
Taga,
(INT64)Object,
(INT64)HandleInformation,
PreviousMode);
if( TargetHandle )
*TargetHandle = (VOID *)v24[0];
ObfDereferenceObjectWithTag(v15, 0x7544624Fui64);
if( v10 )
ObfDereferenceObjectWithTag(v10, 0x7544624Fui64);
if( v13 < 0 )
return v13;
return v16;
}
return result;
}Referenced by:
No references.