SmKmFileInfoDuplicate
__int64 __fastcall SmKmFileInfoDuplicate(_OWORD *a1, __int64 a2){
NTSTATUS v4;
void *v5;
SIZE_T v6;
UINT8 *NonPaged;
int v8;
__int128 v9;
__int128 v10;
__int128 v11;
PVOID *Object;
UINT64 AccessMode;
PHANDLE Handle;
void *TargetHandle[2];
__int128 v17;
__int128 v18;
__int128 v19;
HANDLE TargetProcessHandle;
PVOID v21;
TargetProcessHandle = 0i64;
memset((INT64)TargetHandle, 0i64);
v4 = ObOpenObjectByPointer(SmKmGlobals, 0x200u, 0i64, 0, 0i64, 0, &TargetProcessHandle);
if( v4 >= 0 )
{
if( !*(_QWORD *)a2
|| (LODWORD(Handle) = 6,
LODWORD(AccessMode) = 0,
LODWORD(Object) = 0,
v4 = ZwDuplicateObject(
TargetProcessHandle,
*(PVOID *)a2,
TargetProcessHandle,
TargetHandle,
(UINT64)Object,
AccessMode,
(UINT64)Handle),
v4 >= 0)
&& (v21 = 0i64,
v4 = ObReferenceObjectByHandle(TargetHandle[0], 0x10003u, 0i64, 0, &v21, 0i64),
TargetHandle[1] = v21,
v4 >= 0) )
{
v5 = *(void **)(a2 + 16);
if( v5 )
{
*(_QWORD *)&v17 = *(_QWORD *)(a2 + 16);
ObfReferenceObject(v5);
*((_QWORD *)&v17 + 1) = *(_QWORD *)(a2 + 24);
}
v6 = (unsigned int)(16 * *(_DWORD *)(a2 + 56));
NonPaged = (UINT8 *)SSHSupportAllocateNonPaged(v6, 0x74586D73u);
*(_QWORD *)&v19 = NonPaged;
if( NonPaged )
{
memmove(NonPaged, *(UINT8 **)(a2 + 48), v6);
v8 = *(_DWORD *)(a2 + 56);
v9 = v17;
*a1 = *(_OWORD *)TargetHandle;
DWORD2(v19) = v8;
v10 = v18;
a1[1] = v9;
v11 = v19;
a1[2] = v10;
a1[3] = v11;
memset((INT64)TargetHandle, 0i64);
v4 = 0;
}
else
{
v4 = -1073741670;
}
}
}
if( TargetProcessHandle )
ZwClose(TargetProcessHandle);
SmKmFileInfoCleanup((__int64)TargetHandle);
return(unsigned int)v4;
}Referenced by:
SMKM_STORE::SmStStart