CmpCmdHiveOpen
__int64 __fastcall CmpCmdHiveOpen(
const UNICODE_STRING *a1,
char a2,
char *a3,
ULONG_PTR *a4,
unsigned int a5,
char a6,
__int64 a7,
_BYTE *a8,
void *a9){
UINT8 v13;
int v14;
int v15;
int v16;
unsigned int v17;
NTSTATUS inited;
NTSTATUS v19;
unsigned int v20;
int v21;
struct _DMA_ADAPTER *v22;
NTSTATUS v23;
_ETHREAD *CurrentThread;
UINT64 ImpersonationLevel;
UINT64 ImpersonationLevela;
_GUID *v28;
_GUID *v29;
UINT8 *v30;
UINT8 *v31;
BOOL v32;
INT64 HiveRmUuid[2];
_HIVE_LOAD_FAILURE *HiveLoadFailure;
_CMHIVE **CmHive;
__int64 v36;
struct _EVENT_DATA_DESCRIPTOR v37;
__int64 *v38;
__int64 v39;
HiveRmUuid[0] = a7;
HiveLoadFailure = (_HIVE_LOAD_FAILURE *)a8;
HiveRmUuid[1] = (INT64)a9;
CmHive = (_CMHIVE **)a4;
v13 = IoSetThreadHardErrorMode(0);
v14 = 0;
BYTE2(v32) = v13;
if( (a6 & 1) != 0 )
{
v14 = 0x8000;
if( (a6 & 2) == 0 )
v14 = 294912;
}
v15 = v14 | 0x80000;
if( (a6 & 4) == 0 )
v15 = v14;
v16 = v15 | 0x108000;
if( (a6 & 8) == 0 )
v16 = v15;
v17 = v16 | 2;
if( (a5 & 0x20000000) == 0 )
v17 = v16;
LODWORD(ImpersonationLevel) = a5;
inited = CmpInitHiveFromFile(
(_UNICODE_STRING *)a1,
v17,
(_CMHIVE **)a4,
(UINT8 *)a3,
ImpersonationLevel,
(_GUID *)HiveRmUuid[0],
v28,
v30,
HiveLoadFailure);
v19 = inited;
if( !HiveRmUuid[0] && a2 && (a6 & 0x20) == 0 )
{
if( inited == -1073741790
|| (v20 = inited + 1073741724, v20 <= 0xE) && (v21 = 17473, _bittest(&v21, v20))
|| v19 == -1073741421 )
{
LOWORD(v32) = 0;
LODWORD(HiveRmUuid[0]) = 0;
v22 = (struct _DMA_ADAPTER *)PsReferenceImpersonationTokenEx(
(INT64)KeGetCurrentThread(),
1,
(BYTE *)&v32 + 1,
&v32,
HiveRmUuid,
0i64);
v19 = RtlImpersonateSelfEx(SecurityImpersonation, 0i64, 0i64);
if( v19 >= 0 )
{
LODWORD(ImpersonationLevela) = a5;
v23 = CmpInitHiveFromFile(
(_UNICODE_STRING *)a1,
v17,
CmHive,
(UINT8 *)a3,
ImpersonationLevela,
0i64,
v29,
v31,
HiveLoadFailure);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v19 = v23;
if( v22 )
PsImpersonateClient(CurrentThread, v22, BYTE1(v32), v32, HiveRmUuid[0]);
else
PsImpersonateClient(CurrentThread, 0i64, 0, 0, SecurityImpersonation);
if( v19 >= 0
&& (a5 & 0x2000000) != 0
&& (unsigned int)dword_140C02130 > 5
&& tlgKeywordOn((__int64)&dword_140C02130, 0x400000000008i64) )
{
v36 = 0x1000000i64;
v38 = &v36;
v39 = 8i64;
tlgWriteTransfer_EtwWriteTransfer(
(__int64)&dword_140C02130,
(unsigned __int8 *)byte_140022D4B,
0i64,
0i64,
3u,
&v37);
}
}
if( v22 )
HalPutDmaAdapter(v22);
}
}
IoSetThreadHardErrorMode(BYTE2(v32));
return(unsigned int)v19;
}Referenced by:
CmLoadAppKey
CmLoadKey
CmReplaceKey
CmpFlushBackupHive