NtOpenKeyTransactedEx
NTSTATUS __stdcall NtOpenKeyTransactedEx(
VOID **KeyHandle,
UINT64 DesiredAccess,
_OBJECT_ATTRIBUTES *ObjectAttributes,
UINT64 OpenOptions,
VOID *TransactionHandle){
_ETHREAD *CurrentThread;
int v6;
int v8;
UINT8 v10;
_ETHREAD *v11;
INT8 PreviousMode;
NTSTATUS v13;
__int64 v14;
NTSTATUS v15;
NTSTATUS v16;
PVOID Object;
PVOID v19;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v6 = OpenOptions;
v8 = DesiredAccess;
--CurrentThread->Tcb.KernelApcDisable;
v10 = ExAcquireRundownProtection((_EX_RUNDOWN_REF *)&CmpDummyThreadEvent + 132);
v11 = (_ETHREAD *)KeGetCurrentThread();
if( !v10 )
{
KeLeaveCriticalRegionThread(&v11->Tcb);
return -1073741431;
}
PreviousMode = v11->Tcb.PreviousMode;
Object = 0i64;
v13 = ObReferenceObjectByHandle(TransactionHandle, 4ui64, *(&CmpDummyThreadEvent + 6), PreviousMode, &Object, 0i64);
v14 = (__int64)Object;
v15 = v13;
if( v13 == -1073741788 )
{
v19 = 0i64;
v16 = ObReferenceObjectByHandle(
TransactionHandle,
4ui64,
(_OBJECT_TYPE *)TmTransactionObjectType,
KeGetCurrentThread()->PreviousMode,
&v19,
0i64);
v14 = (__int64)v19;
v15 = v16;
goto LABEL_4;
}
if( v13 >= 0 )
{
v14 = (unsigned __int64)Object | 1;
LABEL_4:
if( v15 >= 0 )
v15 = CmOpenKey(KeyHandle, v8, ObjectAttributes, v6, v14);
}
if( v14 )
CmpTransDereferenceTransaction(v14);
ExReleaseRundownProtection((_EX_RUNDOWN_REF *)&CmpDummyThreadEvent + 132);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
return v15;
}Referenced by:
NtOpenKeyTransacted