CmGetInstallerClassRegPropWorker
NTSTATUS __stdcall CmGetInstallerClassRegPropWorker(
HPNPCTX *hPnpCtx,
WCHAR *ClassGuid,
VOID *BaseKeyHandle,
_CM_REG_PROP CmRegProp,
UINT64 *CmRegPropType,
UINT8 *PropertyBuffer,
UINT64 *PropertySize,
UINT64 Flags){
NTSTATUS v8;
VOID *v10;
int v11;
UINT8 *v12;
WCHAR *v13;
HPNPCTX *v14;
UINT64 v15;
UINT8 v16;
HPNPCTX *v17;
WCHAR *v18;
NTSTATUS ValueIndirect;
int v21;
VOID *v22;
VOID **ClassKey;
VOID **ClassKeya;
UINT64 *Disposition;
UINT64 *Dispositiona;
INT64 v27;
VOID *v28;
VOID *hKey[2];
VOID *Handle[7];
v8 = 0;
HIDWORD(hKey[1]) = 0;
Handle[0] = 0i64;
v10 = BaseKeyHandle;
*(VOID **)((char *)hKey + 4) = 0i64;
hKey[0] = 0i64;
if( (_WORD)Flags )
return -1073741811;
if( !PropertySize || !CmRegPropType )
{
v8 = -1073741811;
goto LABEL_18;
}
v11 = *(_DWORD *)PropertySize;
if( !*(_DWORD *)PropertySize )
{
v12 = 0i64;
goto LABEL_6;
}
v12 = PropertyBuffer;
if( !PropertyBuffer )
return -1073741811;
LABEL_6:
*(_DWORD *)PropertySize = 0;
*(_DWORD *)CmRegPropType = 0;
if( (unsigned int)(CmRegProp - 1) > 0x24
|| !(unsigned __int8)CmClassPropertyRead(
(VOID *)(unsigned int)CmRegProp,
(INT8)ClassGuid,
(_LARGE_INTEGER *)BaseKeyHandle,
*(VOID **)&CmRegProp,
ClassKey,
(UINT64)Disposition,
v27,
v28,
(_DIAGNOSTIC_CONTEXT *)hKey[0],
(INT64)hKey[1],
(UINT64)Handle[0],
(UINT64)Handle[1],
(UINT8 *)Handle[2]) )
{
return -1073741264;
}
if( !v10 )
{
LOBYTE(Dispositiona) = 0;
LODWORD(ClassKeya) = 33554433;
v8 = CmOpenInstallerClassRegKey(v17, v13, v15, v16, ClassKeya, Dispositiona);
if( v8 < 0 )
goto LABEL_18;
v17 = hPnpCtx;
}
if( CmRegProp == CM_REG_PROP_CLASS
|| CmRegProp == CM_REG_PROP_FRIENDLYNAME
|| CmRegProp <= CM_REG_PROP_LOWERFILTERS && CmRegProp > CM_REG_PROP_UI_NUMBER )
{
if( !v10 )
v10 = hKey[1];
}
else
{
v22 = hKey[1];
if( v10 )
v22 = v10;
v8 = PnpOpenPropertiesKey((__int64)v17, v22, 0i64, 1u, 0, (int)Dispositiona, (INT64)Handle);
if( v8 < 0 )
goto LABEL_17;
v10 = Handle[0];
}
v18 = MapCmClassPropertyToRegValue(v14, CmRegProp);
if( !v18 )
{
v8 = -1073741264;
goto LABEL_18;
}
LODWORD(hKey[0]) = v11;
ValueIndirect = PnpCtxRegQueryValueIndirect(
hPnpCtx,
v10,
v18,
(UINT64 *)((char *)hKey + 4),
v12,
(UINT64 *)hKey,
0i64);
if( ValueIndirect != -1073741772 && ValueIndirect != -1073741444 )
{
if( (int)(ValueIndirect + 0x80000000) >= 0 && ValueIndirect != -1073741789 )
{
v8 = ValueIndirect;
goto LABEL_18;
}
v21 = HIDWORD(hKey[0]);
if( (HIDWORD(hKey[0]) != 1 || LODWORD(hKey[0]) >= 2)
&& (LODWORD(hKey[0]) >= 2 || HIDWORD(hKey[0]) != 7)
&& (HIDWORD(hKey[0]) != 4 || LODWORD(hKey[0]) == 4) )
{
if( CmRegProp == CM_REG_PROP_CLASS && LODWORD(hKey[0]) > 0x40 )
{
v8 = -1073741595;
}
else
{
*(_DWORD *)PropertySize = hKey[0];
*(_DWORD *)CmRegPropType = v21;
if( ValueIndirect || !v11 )
v8 = -1073741789;
}
goto LABEL_18;
}
}
LABEL_17:
v8 = -1073741275;
LABEL_18:
if( Handle[0] )
ZwClose((_HANDLE)Handle[0]);
if( hKey[1] )
ZwClose((_HANDLE)hKey[1]);
return v8;
}Referenced by:
CmGetInstallerClassRegProp