CmCreateKey
__int64 __fastcall CmCreateKey(
_QWORD *a1,
int a2,
_OBJECT_ATTRIBUTES *a3,
__int64 a4,
__int128 *a5,
int a6,
_DWORD *a7,
__int64 a8){
__int64 v11;
unsigned int v12;
char PreviousMode;
INT64 v14;
const VOID *v15;
__int64 v16;
__int64 v17;
unsigned __int64 ObjectName;
int v19;
unsigned __int64 v20;
unsigned __int64 v21;
unsigned __int64 v22;
_PRIVILEGE_SET *TransientPoolWithQuotaTag;
_PRIVILEGE_SET *v24;
NTSTATUS v25;
void *RootDirectory;
char v28;
__int64 v29;
UINT64 DesiredAccess;
char v31;
BOOL v32;
unsigned int v33;
_HANDLE Handle[2];
PPRIVILEGE_SET Privileges;
_UNICODE_STRING v36;
PVOID Object;
__int64 v38;
__int128 v39;
int v40;
size_t Size[2];
_QWORD *v42;
_OBJECT_ATTRIBUTES *v43;
_DWORD *v44;
__int128 v45;
_UNICODE_STRING v46;
unsigned __int64 v47;
INT64 ParseContext[38];
__int128 TimeStamp[2];
v42 = a1;
v43 = a3;
v11 = (__int64)a5;
v44 = a7;
*(_QWORD *)Handle = 0i64;
v36 = 0i64;
v39 = 0i64;
Privileges = 0i64;
v40 = 0;
memset(TimeStamp, 0, sizeof(TimeStamp));
v38 = 0i64;
if( *(BOOLEAN **)((char *)&NlsMbCodePageTag + 7) )
EtwGetKernelTraceTimestamp((_LARGE_INTEGER *)TimeStamp, 0x20000ui64);
memset(ParseContext, 0i64, 0x128u);
LODWORD(ParseContext[12]) = -1;
ParseContext[19] = (INT64)&ParseContext[18];
ParseContext[18] = (INT64)&ParseContext[18];
memset(&ParseContext[27], 0i64, 0x50u);
HIDWORD(ParseContext[3]) = a2 & 0x300;
v12 = a2 & 0xFFFFFCFF;
v33 = v12;
v32 = CmpAcquireShutdownRundown();
if( v32 )
{
PreviousMode = KeGetCurrentThread()->PreviousMode;
v31 = PreviousMode;
if( PreviousMode == 1 )
{
if( a5 )
{
v45 = 0i64;
if( (unsigned __int64)a5 >= 0x7FFFFFFF0000i64 )
v11 = 0x7FFFFFFF0000i64;
v14 = *(unsigned int *)v11;
LODWORD(v45) = v14;
v15 = *(const VOID **)(v11 + 8);
*((_QWORD *)&v45 + 1) = v15;
v39 = v45;
if( (_WORD)v14 )
{
if( ((unsigned __int8)v15 & 1) != 0 )
ExRaiseDatatypeMisalignment();
v22 = (unsigned __int64)v15 + (unsigned __int16)v14;
if( v22 > 0x7FFFFFFF0000i64 || v22 < (unsigned __int64)v15 )
MEMORY[0x7FFFFFFF0000] = 0;
}
if( (v14 & 1) != 0 )
{
v25 = -1073741811;
goto LABEL_45;
}
if( (_WORD)v14 )
{
*(_QWORD *)Size = (unsigned __int16)v14;
TransientPoolWithQuotaTag = (_PRIVILEGE_SET *)CmpAllocateTransientPoolWithQuotaTag(
v14,
(unsigned __int16)v14,
0x78634D43ui64);
Privileges = TransientPoolWithQuotaTag;
if( !TransientPoolWithQuotaTag )
{
v25 = -1073741670;
goto LABEL_45;
}
v24 = TransientPoolWithQuotaTag;
memmove(TransientPoolWithQuotaTag, v15, Size[0]);
*((_QWORD *)&v39 + 1) = v24;
}
v12 = v33;
}
v16 = (__int64)a1;
if( (unsigned __int64)a1 >= 0x7FFFFFFF0000i64 )
v16 = 0x7FFFFFFF0000i64;
*(_QWORD *)v16 = 0i64;
if( a7 )
{
v17 = (__int64)a7;
if( (unsigned __int64)a7 >= 0x7FFFFFFF0000i64 )
v17 = 0x7FFFFFFF0000i64;
*(_DWORD *)v17 = *(_DWORD *)v17;
}
if( ((unsigned __int8)a3 & 3) != 0 )
ExRaiseDatatypeMisalignment();
ObjectName = (unsigned __int64)a3->ObjectName;
v47 = ObjectName;
v46 = 0i64;
if( ObjectName >= 0x7FFFFFFF0000i64 )
ObjectName = 0x7FFFFFFF0000i64;
v19 = *(_DWORD *)ObjectName;
*(_DWORD *)&v46.Length = v19;
v20 = *(_QWORD *)(ObjectName + 8);
v46.Buffer = (wchar_t *)v20;
v36 = v46;
if( (_WORD)v19 )
{
if( (v20 & 1) != 0 )
ExRaiseDatatypeMisalignment();
v21 = v20 + (unsigned __int16)v19;
if( v21 > 0x7FFFFFFF0000i64 || v21 < v20 )
MEMORY[0x7FFFFFFF0000] = 0;
}
if( (v36.Length & 1) != 0 )
{
v25 = -1073741811;
goto LABEL_45;
}
RootDirectory = a3->RootDirectory;
*(_QWORD *)Handle = RootDirectory;
PreviousMode = 1;
}
else
{
if( a5 )
v39 = *a5;
v36 = *a3->ObjectName;
RootDirectory = a3->RootDirectory;
*(_QWORD *)Handle = RootDirectory;
}
if( *(BOOLEAN **)((char *)&NlsMbCodePageTag + 7) && RootDirectory )
{
v28 = KeGetCurrentThread()->PreviousMode;
Object = 0i64;
if( ObReferenceObjectByHandle(*(VOID **)Handle, 0i64, (_OBJECT_TYPE *)CmKeyObjectType, v28, &Object, 0i64) >= 0 )
{
v38 = *((_QWORD *)Object + 1);
HalPutDmaAdapter((PADAPTER_OBJECT)Object);
}
PreviousMode = v31;
}
if( (a6 & 0x100001F) == a6 )
{
LODWORD(ParseContext[3]) = a6;
LODWORD(ParseContext[0]) = 1;
ParseContext[1] = *((_QWORD *)&v39 + 1);
WORD2(ParseContext[0]) = v39;
ParseContext[9] = a8;
LODWORD(DesiredAccess) = v12;
v25 = ObOpenObjectByName(
a3,
(_OBJECT_TYPE *)CmKeyObjectType,
PreviousMode,
0i64,
DesiredAccess,
ParseContext,
(VOID **)Handle);
if( v25 >= 0 )
{
*a1 = *(_QWORD *)Handle;
if( a7 )
*a7 = ParseContext[4];
}
}
else
{
v25 = -1073741811;
}
}
else
{
if( HvShutdownComplete && (*(&stru_140C23628 + 2336) & 8) != 0 )
KeBugCheckEx(0x51u, (PVOID)0xE, (PVOID)1, a3, 0i64);
v25 = -1073741431;
}
LABEL_45:
if( *(BOOLEAN **)((char *)&NlsMbCodePageTag + 7) )
{
v29 = v38;
LOBYTE(v29) = 10;
(*(void(__fastcall **)(__int64, __int128 *, _QWORD, _QWORD, __int64, _UNICODE_STRING *))((char *)&NlsMbCodePageTag
+ 7))(
v29,
TimeStamp,
(unsigned int)v25,
0i64,
v38,
&v36);
}
if( Privileges )
CmSiFreeMemory(Privileges);
CmpCleanupParseContext((INT64)ParseContext, 0);
if( v32 )
CmpReleaseShutdownRundown();
return(unsigned int)v25;
}Referenced by:
NtCreateKey
NtCreateKeyTransacted