CmOpenDevicePanelRegKeyWorker
NTSTATUS __fastcall CmOpenDevicePanelRegKeyWorker(
HPNPCTX *hPnpCtx,
INT64 a2,
INT64 a3,
INT64 a4,
UINT64 a5,
INT8 a6,
VOID **a7,
UINT64 *pRegDisposition){
wchar_t *PoolWithTag;
unsigned int v9;
unsigned __int64 v12;
UINT64 i;
int v14;
int inited;
INT64 v16;
unsigned __int16 Length;
unsigned __int8 v18;
VOID *v19;
WCHAR *v20;
HSYSCTX *v21;
NTSTATUS Tree;
__int64 v23;
INT64 v25;
INT64 pszDest;
INT64 cchDest;
INT64 v28;
VOID *Handle;
INT64 v30;
_UNICODE_STRING DestinationString;
INT64 v32;
PoolWithTag = 0i64;
LODWORD(v32) = 0;
v9 = a3;
v30 = 0i64;
Handle = 0i64;
DestinationString = 0i64;
if( !(_DWORD)a3 || (a3 & 0xFFFFFE9F) != 0 )
goto LABEL_36;
LODWORD(v12) = 317;
for( i = 317i64; ; i = (unsigned int)v12 )
{
PoolWithTag = (wchar_t *)ExAllocatePoolWithTag(1ui64, i, 1380994640i64);
if( !PoolWithTag )
break;
CmGetDevicePanelRegKeyPath(
(unsigned int)v12 >> 1,
(const WCHAR *)a2,
v9,
v16,
v25,
(_NTSTRSAFE_PWSTR)PoolWithTag,
(unsigned int)v12 >> 1,
(INT64)&v32);
inited = v14;
if( v14 != -1073741789 )
goto LABEL_9;
ExFreePoolWithTag(PoolWithTag, 0);
PoolWithTag = 0i64;
v12 = 2i64 * (unsigned int)v32;
if( v12 > 0xFFFFFFFF )
{
inited = -1073741675;
goto LABEL_37;
}
}
inited = -1073741801;
LABEL_9:
if( inited < 0 )
goto LABEL_37;
if( (v9 & 0x100) == 0 )
{
inited = RtlInitUnicodeStringEx(&DestinationString, PoolWithTag);
if( inited < 0 )
goto LABEL_37;
Length = DestinationString.Length;
if( DestinationString.Length < (unsigned int)v12
&& DestinationString.Length > 0x32u
&& (unsigned __int8)RtlPrefixUnicodeString(
&`_CmOpenDevicePanelRegKeyWorker'::`2'::ObjectPathRootPrefix,
&DestinationString,
1u) )
{
DestinationString.MaximumLength -= 50;
DestinationString.Buffer = PoolWithTag + 25;
DestinationString.Length = Length - 50;
v18 = (unsigned __int8)RtlPrefixUnicodeString(
&`_CmDeleteDevicePanelRegKeyWorker'::`2'::DevicePanelsKeyPrefix,
&DestinationString,
1u);
inited = PnpCtxGetCachedContextBaseKey(
hPnpCtx,
(PNPCTX_BASE_KEY_TYPE)(v18 != 0 ? PNPCTX_BASE_KEY_TYPE_CODEVICEINSTALLERS : PNPCTX_BASE_KEY_TYPE_CONTROLSET),
(VOID **)&v30);
if( inited < 0 )
goto LABEL_37;
v19 = (VOID *)v30;
v20 = PoolWithTag + 46;
if( !v18 )
v20 = PoolWithTag + 25;
goto LABEL_25;
}
LABEL_36:
inited = -1073741811;
goto LABEL_37;
}
v20 = PoolWithTag;
if( hPnpCtx )
v21 = (HSYSCTX *)*((_QWORD *)hPnpCtx + 28);
else
v21 = 0i64;
inited = SysCtxRegOpenCurrentUserKey(v21, 0, 0x2000000, &Handle, v25, pszDest, cchDest, v28);
if( inited < 0 )
goto LABEL_37;
v19 = Handle;
LABEL_25:
if( a6 )
{
LODWORD(v25) = a5;
Tree = PnpCtxRegCreateTree(hPnpCtx, v19, v20, 0i64, v25, 0i64, a7, pRegDisposition);
}
else
{
if( hPnpCtx )
v23 = *((_QWORD *)hPnpCtx + 28);
else
v23 = 0i64;
Tree = SysCtxRegOpenKey(v23, v19, v20, 0, a5, a7);
if( Tree >= 0 )
*(_DWORD *)pRegDisposition = 2;
}
if( Tree == -1073741444 )
{
inited = -1073741595;
}
else if( Tree < 0 )
{
inited = Tree;
}
LABEL_37:
if( Handle )
ZwClose((_HANDLE)Handle);
if( PoolWithTag )
ExFreePoolWithTag(PoolWithTag, 0);
return inited;
}Referenced by:
CmOpenDevicePanelRegKey