CmOpenKey
__int64 __fastcall CmOpenKey(VOID **a1, int a2, _OBJECT_ATTRIBUTES *a3, int a4, __int64 a5){
unsigned int v9;
__int64 v10;
char PreviousMode;
__int64 v12;
unsigned __int64 ObjectName;
int v14;
unsigned __int64 v15;
unsigned __int64 v16;
NTSTATUS v17;
char v19;
__int64 v20;
UINT64 DesiredAccess;
void *RootDirectory;
UINT64 Handle;
PVOID Object;
__int64 v25;
_UNICODE_STRING v26;
int v27;
VOID **v28;
_OBJECT_ATTRIBUTES *v29;
_UNICODE_STRING v30;
_LARGE_INTEGER TimeStamp[2];
__int128 v32;
INT64 ParseContext[38];
v28 = a1;
v29 = a3;
Handle = 0i64;
v26 = 0i64;
v27 = 0;
*(_OWORD *)&TimeStamp[0].anonymous_0.LowPart = 0i64;
v32 = 0i64;
v25 = 0i64;
if( *(BOOLEAN **)((char *)&NlsMbCodePageTag + 7) )
EtwGetKernelTraceTimestamp(TimeStamp, 0x20000ui64);
memset(ParseContext, 0i64, 0x128u);
LODWORD(ParseContext[12]) = -1;
ParseContext[19] = (INT64)&ParseContext[18];
ParseContext[18] = (INT64)&ParseContext[18];
memset(&ParseContext[27], 0, 80);
HIDWORD(ParseContext[3]) = a2 & 0x300;
v9 = a2 & 0xFFFFFCFF;
if( CmpAcquireShutdownRundown() )
{
if( (a4 & 0x1C) == a4 )
{
PreviousMode = KeGetCurrentThread()->PreviousMode;
if( PreviousMode == 1 )
{
v12 = (__int64)a1;
if( (unsigned __int64)a1 >= 0x7FFFFFFF0000i64 )
v12 = 0x7FFFFFFF0000i64;
*(_QWORD *)v12 = 0i64;
if( ((unsigned __int8)a3 & 3) != 0 )
ExRaiseDatatypeMisalignment();
ObjectName = (unsigned __int64)a3->ObjectName;
v30 = 0i64;
if( ObjectName >= 0x7FFFFFFF0000i64 )
ObjectName = 0x7FFFFFFF0000i64;
v14 = *(_DWORD *)ObjectName;
*(_DWORD *)&v30.Length = v14;
v15 = *(_QWORD *)(ObjectName + 8);
v30.Buffer = (wchar_t *)v15;
v26 = v30;
if( (_WORD)v14 )
{
if( (v15 & 1) != 0 )
ExRaiseDatatypeMisalignment();
v16 = v15 + (unsigned __int16)v14;
if( v16 > 0x7FFFFFFF0000i64 || v16 < v15 )
MEMORY[0x7FFFFFFF0000] = 0;
}
}
else
{
v26 = *a3->ObjectName;
}
RootDirectory = a3->RootDirectory;
if( *(BOOLEAN **)((char *)&NlsMbCodePageTag + 7) )
{
if( a3->RootDirectory )
{
v19 = KeGetCurrentThread()->PreviousMode;
Object = 0i64;
if( ObReferenceObjectByHandle(RootDirectory, 0i64, (_OBJECT_TYPE *)CmKeyObjectType, v19, &Object, 0i64) >= 0 )
{
v25 = *((_QWORD *)Object + 1);
HalPutDmaAdapter((PADAPTER_OBJECT)Object);
}
}
}
ParseContext[9] = a5;
LODWORD(ParseContext[3]) = a4;
LODWORD(DesiredAccess) = v9;
v17 = ObOpenObjectByName(
a3,
(_OBJECT_TYPE *)CmKeyObjectType,
PreviousMode,
0i64,
DesiredAccess,
ParseContext,
(VOID **)&Handle);
if( v17 >= 0 )
*a1 = (VOID *)Handle;
if( *(BOOLEAN **)((char *)&NlsMbCodePageTag + 7) )
{
v20 = v25;
LOBYTE(v20) = 11;
(*(void(__fastcall **)(__int64, _LARGE_INTEGER *, _QWORD, _QWORD, __int64, _UNICODE_STRING *))((char *)&NlsMbCodePageTag + 7))(
v20,
TimeStamp,
(unsigned int)v17,
0i64,
v25,
&v26);
}
CmpCleanupParseContext((INT64)ParseContext, 0);
CmpReleaseShutdownRundown();
return(unsigned int)v17;
}
else
{
CmpReleaseShutdownRundown();
return 3221225714i64;
}
}
else
{
if( *(BOOLEAN **)((char *)&NlsMbCodePageTag + 7) )
{
LOBYTE(v10) = 11;
(*(void(__fastcall **)(__int64, _LARGE_INTEGER *, __int64, _QWORD, _QWORD, _QWORD))((char *)&NlsMbCodePageTag + 7))(
v10,
TimeStamp,
3221225865i64,
0i64,
0i64,
0i64);
}
return 3221225865i64;
}
}Referenced by:
AdtpObjsInitialize
ExpWatchLicenseInfoWork
ExpWatchProductTypeWork
NtOpenKey
NtOpenKeyEx
NtOpenKeyTransactedEx