CmOpenDevicePanelRegKeyWorker
__int64 __fastcall CmOpenDevicePanelRegKeyWorker(
__int64 a1,
const wchar_t *a2,
int a3,
__int64 a4,
ACCESS_MASK a5,
char a6,
void **a7,
_DWORD *a8){
wchar_t *pszDest;
unsigned __int64 v12;
UINT64 i;
int v14;
int inited;
__int64 v16;
unsigned __int16 Length;
char v18;
HANDLE v19;
const wchar_t *v20;
_QWORD *v21;
int Tree;
__int64 v23;
int v25;
size_t cchDest;
HANDLE Handle;
void *v28;
struct _UNICODE_STRING DestinationString;
__int64 v30;
pszDest = 0i64;
LODWORD(v30) = 0;
v28 = 0i64;
Handle = 0i64;
DestinationString = 0i64;
if( !a3 || (a3 & 0xFFFFFE9F) != 0 )
goto LABEL_36;
LODWORD(v12) = 317;
for( i = 317i64; ; i = (unsigned int)v12 )
{
pszDest = (wchar_t *)ExAllocatePoolWithTag(PagedPool, i, 0x52504E50ui64);
if( !pszDest )
break;
LODWORD(cchDest) = (unsigned int)v12 >> 1;
CmGetDevicePanelRegKeyPath((unsigned int)v12 >> 1, a2, a3, v16, v25, pszDest, cchDest, (__int64)&v30);
inited = v14;
if( v14 != -1073741789 )
goto LABEL_9;
ExFreePoolWithTag(pszDest, 0);
pszDest = 0i64;
v12 = 2i64 * (unsigned int)v30;
if( v12 > 0xFFFFFFFF )
{
inited = -1073741675;
goto LABEL_37;
}
}
inited = -1073741801;
LABEL_9:
if( inited < 0 )
goto LABEL_37;
if( (a3 & 0x100) == 0 )
{
inited = RtlInitUnicodeStringEx(&DestinationString, pszDest);
if( inited < 0 )
goto LABEL_37;
Length = DestinationString.Length;
if( DestinationString.Length < (unsigned int)v12
&& DestinationString.Length > 0x32u
&& (unsigned __int8)RtlPrefixUnicodeString(
(PVOID)&`_CmOpenDevicePanelRegKeyWorker'::`2'::ObjectPathRootPrefix,
(INT64 *)&DestinationString) )
{
DestinationString.MaximumLength -= 50;
DestinationString.Buffer = pszDest + 25;
DestinationString.Length = Length - 50;
v18 = RtlPrefixUnicodeString(
(PVOID)&`_CmDeleteDevicePanelRegKeyWorker'::`2'::DevicePanelsKeyPrefix,
(INT64 *)&DestinationString);
inited = PnpCtxGetCachedContextBaseKey(a1, v18 != 0 ? 11 : 4, (__int64 *)&v28);
if( inited < 0 )
goto LABEL_37;
v19 = v28;
v20 = pszDest + 46;
if( !v18 )
v20 = pszDest + 25;
goto LABEL_25;
}
LABEL_36:
inited = -1073741811;
goto LABEL_37;
}
v20 = pszDest;
if( a1 )
v21 = *(_QWORD **)(a1 + 224);
else
v21 = 0i64;
inited = SysCtxRegOpenCurrentUserKey(v21, 0, 0x2000000u, &Handle);
if( inited < 0 )
goto LABEL_37;
v19 = Handle;
LABEL_25:
if( a6 )
{
Tree = PnpCtxRegCreateTree(a1, v19, v20, 0, a5, 0i64, (__int64)a7, (__int64)a8);
}
else
{
if( a1 )
v23 = *(_QWORD *)(a1 + 224);
else
v23 = 0i64;
Tree = SysCtxRegOpenKey(v23, (char *)v19, v20, 0, a5, a7);
if( Tree >= 0 )
*a8 = 2;
}
if( Tree == -1073741444 )
{
inited = -1073741595;
}
else if( Tree < 0 )
{
inited = Tree;
}
LABEL_37:
if( Handle )
ZwClose(Handle);
if( pszDest )
ExFreePoolWithTag(pszDest, 0);
return(unsigned int)inited;
}Referenced by:
CmOpenDevicePanelRegKey