NtRenameKey
NTSTATUS __stdcall NtRenameKey(
VOID *KeyHandle,
_UNICODE_STRING *NewName,
_OBJECT_TYPE *a3,
INT64 a4,
INT64 a5,
INT64 a6,
INT64 a7,
INT64 a8){
char v9;
unsigned int PreviousMode;
char v11;
char v12;
_ETHREAD *CurrentThread;
UINT8 v14;
NTSTATUS v15;
char v16;
int v17;
wchar_t *Buffer;
unsigned __int64 v19;
unsigned __int16 v20;
PPRIVILEGE_SET v21;
INT64 v22;
INT8 v23;
PVOID *v24;
unsigned int v25;
PVOID v26;
UINT64 v27;
INT64 v28;
INT8 v29;
PVOID *v30;
_ETHREAD *v31;
int v32;
NTSTATUS v34;
UINT8 v35;
PADAPTER_OBJECT DmaAdapter[2];
VOID *Src[2];
int v38;
PPRIVILEGE_SET Privileges;
__int64 v40[2];
PVOID Handle;
__int128 v42;
_SECURITY_SUBJECT_CONTEXT SubjectContext;
_SLIST_ENTRY *Argument[2];
__int128 v45;
__int64 v46;
UNICODE_STRING NewKeyName;
_KAPC_STATE ApcState;
Handle = KeyHandle;
*(_OWORD *)Src = 0i64;
memset(&ApcState, 0, sizeof(ApcState));
v9 = 0;
DmaAdapter[0] = 0i64;
Privileges = 0i64;
PreviousMode = KeGetCurrentThread()->PreviousMode;
v11 = 0;
*(_OWORD *)Argument = 0i64;
v45 = 0i64;
v46 = 0i64;
v40[1] = (__int64)v40;
v40[0] = (__int64)v40;
v38 = 0;
v12 = 0;
memset(&SubjectContext, 0, sizeof(SubjectContext));
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
v14 = ExAcquireRundownProtection((_EX_RUNDOWN_REF *)&CmpDummyThreadEvent + 132);
v35 = v14;
if( !v14 )
KeLeaveCriticalRegionThread(KeGetCurrentThread());
if( !v14 )
{
v15 = -1073741431;
v34 = -1073741431;
v16 = 0;
goto LABEL_45;
}
if( (_BYTE)PreviousMode == 1 )
{
v42 = 0i64;
if( (unsigned __int64)NewName >= 0x7FFFFFFF0000i64 )
NewName = (_UNICODE_STRING *)0x7FFFFFFF0000i64;
v17 = *(_DWORD *)&NewName->Length;
LODWORD(v42) = v17;
Buffer = NewName->Buffer;
*((_QWORD *)&v42 + 1) = Buffer;
*(_OWORD *)Src = v42;
if( (_WORD)v17 )
{
if( ((unsigned __int8)Buffer & 1) != 0 )
ExRaiseDatatypeMisalignment();
v19 = (unsigned __int64)Buffer + (unsigned __int16)v17;
if( v19 > 0x7FFFFFFF0000i64 || v19 < (unsigned __int64)Buffer )
MEMORY[0x7FFFFFFF0000] = 0;
}
}
else
{
*(_UNICODE_STRING *)Src = *NewName;
}
v20 = (unsigned __int16)Src[0];
if( (unsigned __int16)(LOWORD(Src[0]) - 1) > 0x1FFu || ((__int64)Src[0] & 1) != 0 )
{
v15 = -1073741811;
v34 = -1073741811;
v16 = 0;
goto LABEL_45;
}
v21 = (PPRIVILEGE_SET)Src[1];
if( CmpDoesBufferRequireCapturing(PreviousMode, Src[1]) )
{
Privileges = (PPRIVILEGE_SET)CmpAllocateTransientPoolWithQuotaTag(v22, LOWORD(Src[0]), 0x426E4D43ui64);
if( !Privileges )
{
v15 = -1073741670;
v34 = -1073741670;
v16 = 0;
goto LABEL_45;
}
v21 = Privileges;
memmove(Privileges, Src[1], LOWORD(Src[0]));
Src[1] = Privileges;
v20 = (unsigned __int16)Src[0];
WORD1(Src[0]) = Src[0];
}
v25 = 0;
if( v20 >> 1 )
{
while( LOWORD(v21->PrivilegeCount) != 92 )
{
++v25;
v21 = (PPRIVILEGE_SET)((char *)v21 + 2);
if( v25 >= v20 >> 1 )
goto LABEL_24;
}
v15 = -1073741811;
goto LABEL_28;
}
LABEL_24:
LOBYTE(v24) = PreviousMode;
v26 = Handle;
v15 = CmObReferenceObjectByHandle(Handle, 0x20006ui64, v23, v24, (OBJECT_HANDLE_INFORMATION *)DmaAdapter);
v34 = v15;
if( v15 == -1073741790 )
{
SeCaptureSubjectContext((INT64)&SubjectContext);
v12 = 1;
if( !CmDoVirtualTest(&SubjectContext, &v38) )
goto LABEL_26;
LOBYTE(v30) = PreviousMode;
v15 = CmObReferenceObjectByHandle(v26, 0x20019ui64, v29, v30, (OBJECT_HANDLE_INFORMATION *)DmaAdapter);
v34 = v15;
if( v15 < 0 )
goto LABEL_29;
if( !CmKeyBodyNeedsVirtualImage((__int64)DmaAdapter[0]) )
{
LABEL_26:
v15 = -1073741790;
LABEL_28:
v34 = v15;
LABEL_29:
v16 = 0;
goto LABEL_45;
}
v11 = 1;
}
v12 = v11;
if( v15 < 0 )
goto LABEL_29;
v31 = (_ETHREAD *)KeGetCurrentThread();
--v31->Tcb.KernelApcDisable;
v16 = 1;
if( dword_140C5083C && !ExIsResourceAcquiredSharedLite((UINT64)&CmpRegistryLock, v27, v28) )
{
Argument[0] = (_SLIST_ENTRY *)DmaAdapter[0];
Argument[1] = (_SLIST_ENTRY *)Src;
v32 = CmpCallCallBacksEx(RegNtRenameKey, Argument, 0i64, 1, RegNtPostRenameKey, (INT64)DmaAdapter[0], (INT64)v40);
v15 = v32;
if( v32 < 0 )
{
if( v32 == -1073740541 )
v15 = 0;
v34 = v15;
goto LABEL_45;
}
v9 = 1;
}
if( !v11
|| (LOBYTE(v27) = PreviousMode,
v15 = CmKeyBodyReplicateToVirtual((CM_KEY_BODY **)DmaAdapter, v27, (UINT64 *)0x20006),
v34 = v15,
v15 >= 0) )
{
CmpAttachToRegistryProcess(&ApcState);
NewKeyName = *(UNICODE_STRING *)Src;
v15 = CmRenameKey((CM_KEY_BODY *)DmaAdapter[0], &NewKeyName, PreviousMode);
v34 = v15;
KiUnstackDetachProcess(&ApcState, 0i64);
v12 = v11;
}
LABEL_45:
if( v12 )
SeReleaseSubjectContext(&SubjectContext);
if( v9 )
{
v15 = CmPostCallbackNotificationEx(
RegNtPostRenameKey,
(_SLIST_ENTRY *)DmaAdapter[0],
(unsigned int)v15,
(INT64)Argument,
0i64,
(INT64)v40);
v34 = v15;
}
if( v16 )
{
KeLeaveCriticalRegionThread(KeGetCurrentThread());
v15 = v34;
}
if( DmaAdapter[0] )
HalPutDmaAdapter(DmaAdapter[0]);
if( Privileges )
CmSiFreeMemory(Privileges);
if( v35 )
{
ExReleaseRundownProtection((_EX_RUNDOWN_REF *)&CmpDummyThreadEvent + 132);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
return v34;
}
return v15;
}Referenced by:
No references.