PiDevCfgEnforceDevicePolicy
NTSTATUS __stdcall PiDevCfgEnforceDevicePolicy(
_DEVICE_NODE *DeviceNode,
PI_DEVCFG_DEVICE_CONTEXT *DeviceContext,
WCHAR *ClassGuidString){
INT64 v3;
int v6;
NTSTATUS v7;
INT64 v8;
NTSTATUS v9;
char v10;
unsigned int v11;
NTSTATUS v12;
WCHAR *v13;
NTSTATUS v14;
WCHAR *v15;
const wchar_t *v16;
__int64 v17;
const wchar_t *v18;
__int64 v19;
NTSTATUS v20;
WCHAR *v21;
NTSTATUS v22;
WCHAR *v23;
WCHAR *v24;
WCHAR *v25;
const wchar_t *v26;
WCHAR *v27;
char v28;
const wchar_t *v29;
__int64 v30;
const wchar_t *v31;
__int64 v32;
__int64 v33;
NTSTATUS v34;
WCHAR *v35;
NTSTATUS v36;
WCHAR *v37;
const wchar_t *v38;
__int64 v39;
const wchar_t *v40;
__int64 v41;
char v42;
WCHAR *v43;
unsigned int v44;
INT64 v46;
INT64 v47;
char v48;
char v49;
char v50;
char v51;
char v52;
char v53;
VOID *PolicyKeyHandle;
WCHAR *PolicyStringList;
INT64 v56;
__int64 v57;
const wchar_t *v58;
VOID *KeyHandle;
WCHAR *Str1;
WCHAR *v61;
WCHAR *v62;
_OBJECT_ATTRIBUTES ObjectAttributes;
WCHAR *v64;
WCHAR *v65;
PVOID P;
UINT8 PolicyEnabled;
v57 = 8913030i64;
v58 = L"\\Registry\\Machine\\Software\\Policies\\Microsoft\\Windows\\DeviceInstall";
ObjectAttributes.ObjectName = (_UNICODE_STRING *)&v57;
Str1 = 0i64;
v61 = 0i64;
v62 = 0i64;
v64 = 0i64;
v65 = 0i64;
PolicyEnabled = 0;
v6 = 576;
*(_QWORD *)&ObjectAttributes.Length = 48i64;
*(_QWORD *)&ObjectAttributes.Attributes = 576i64;
KeyHandle = 0i64;
ObjectAttributes.RootDirectory = 0i64;
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
v7 = ZwOpenKey(&KeyHandle, 0x20019ui64, &ObjectAttributes, v3, v46, 0i64, 0i64, v56);
if( v7 == -1073741772 )
{
if( !PnpBootMode )
{
LABEL_5:
v9 = 0;
goto LABEL_129;
}
LODWORD(v57) = 6422624;
v58 = L"\\Registry\\Machine\\System\\DriverDatabase\\Policies";
*(_QWORD *)&ObjectAttributes.Length = 48i64;
ObjectAttributes.ObjectName = (_UNICODE_STRING *)&v57;
*(_QWORD *)&ObjectAttributes.Attributes = 576i64;
KeyHandle = 0i64;
ObjectAttributes.RootDirectory = 0i64;
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
v7 = ZwOpenKey(
&KeyHandle,
0x20019ui64,
&ObjectAttributes,
v8,
v47,
(INT64)PolicyKeyHandle,
(INT64)PolicyStringList,
v56);
}
if( v7 < 0 )
goto LABEL_5;
LODWORD(v57) = 1703960;
v58 = L"Restrictions";
ObjectAttributes.RootDirectory = KeyHandle;
*(_QWORD *)&ObjectAttributes.Length = 48i64;
ObjectAttributes.ObjectName = (_UNICODE_STRING *)&v57;
*(_QWORD *)&ObjectAttributes.Attributes = 576i64;
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
if( ZwOpenKey(
&PolicyKeyHandle,
0x20019ui64,
&ObjectAttributes,
v8,
v47,
(INT64)PolicyKeyHandle,
(INT64)PolicyStringList,
v56) < 0 )
goto LABEL_5;
LOBYTE(v6) = 0;
v10 = 0;
LODWORD(v56) = v6;
v48 = 0;
v51 = 0;
v50 = 0;
v49 = 0;
v52 = 0;
v53 = 0;
v11 = 1;
if( PiDevCfgQueryPolicyEnabled(PolicyKeyHandle, (WCHAR *)L"AllowDenyLayered", &PolicyEnabled) >= 0 )
LODWORD(v56) = PolicyEnabled != 0;
if( PiDevCfgQueryPolicyEnabled(PolicyKeyHandle, (WCHAR *)L"DenyRemovableDevices", &PolicyEnabled) >= 0
&& PolicyEnabled
&& (DeviceNode->CapabilityFlags & 0x10) != 0 )
{
v10 = 1;
}
v12 = PiDevCfgQueryPolicyStringList(PolicyKeyHandle, (WCHAR *)L"AllowDeviceClasses", &PolicyStringList);
v13 = PolicyStringList;
if( v12 < 0 )
v13 = 0i64;
PolicyStringList = v13;
v14 = PiDevCfgQueryPolicyStringList(PolicyKeyHandle, (WCHAR *)L"DenyDeviceClasses", &Str1);
v15 = Str1;
if( v14 < 0 )
v15 = 0i64;
P = v15;
if( ClassGuidString )
{
if( v13 )
{
v16 = v13;
if( *v13 )
{
while( wcsicmp(v16, ClassGuidString) )
{
v17 = -1i64;
do
++v17;
while( v16[v17] );
v16 += v17 + 1;
if( !*v16 )
goto LABEL_28;
}
v48 = 1;
}
}
else if( !v15 )
{
goto LABEL_36;
}
LABEL_28:
if( v15 )
{
v18 = v15;
if( *v15 )
{
while( wcsicmp(v18, ClassGuidString) )
{
v19 = -1i64;
do
++v19;
while( v18[v19] );
v18 += v19 + 1;
if( !*v18 )
goto LABEL_36;
}
v51 = 1;
v10 = 1;
}
}
}
LABEL_36:
v20 = PiDevCfgQueryPolicyStringList(PolicyKeyHandle, (WCHAR *)L"AllowDeviceIDs", &v61);
v21 = v61;
if( v20 < 0 )
v21 = 0i64;
Str1 = v21;
v22 = PiDevCfgQueryPolicyStringList(PolicyKeyHandle, (WCHAR *)L"DenyDeviceIDs", &v62);
v23 = v62;
if( v22 < 0 )
v23 = 0i64;
if( v21 || v23 )
{
v24 = (WCHAR *)2;
v25 = (WCHAR *)(DeviceContext + 8);
v61 = (WCHAR *)2;
v62 = (WCHAR *)(DeviceContext + 8);
do
{
v26 = *(const wchar_t **)v25;
if( *(_QWORD *)v25 && *v26 )
{
v27 = Str1;
v28 = v49;
do
{
if( v27 )
{
if( !v28 )
{
v29 = v27;
if( *v27 )
{
while( wcsicmp(v29, v26) )
{
v30 = -1i64;
do
++v30;
while( v29[v30] );
v29 += v30 + 1;
if( !*v29 )
goto LABEL_55;
}
v28 = 1;
v48 = 1;
}
}
}
LABEL_55:
if( v23 )
{
if( !v50 )
{
v31 = v23;
if( *v23 )
{
while( wcsicmp(v31, v26) )
{
v32 = -1i64;
do
++v32;
while( v31[v32] );
v31 += v32 + 1;
if( !*v31 )
goto LABEL_64;
}
v50 = 1;
v10 = 1;
}
}
}
LABEL_64:
v33 = -1i64;
do
++v33;
while( v26[v33] );
v26 += v33 + 1;
}
while( *v26 );
v24 = v61;
v49 = v28;
v25 = v62;
}
v25 += 8;
v24 = (WCHAR *)((char *)v24 - 1);
v62 = v25;
v61 = v24;
}
while( v24 );
v21 = Str1;
}
v34 = PiDevCfgQueryPolicyStringList(PolicyKeyHandle, (WCHAR *)L"AllowInstanceIDs", &v64);
v35 = v64;
if( v34 < 0 )
v35 = 0i64;
v36 = PiDevCfgQueryPolicyStringList(PolicyKeyHandle, (WCHAR *)L"DenyInstanceIDs", &v65);
v37 = v65;
if( v36 < 0 )
v37 = 0i64;
if( v35 )
{
v38 = v35;
if( *v35 )
{
while( wcsicmp(v38, *((const wchar_t **)DeviceContext + 1)) )
{
v39 = -1i64;
do
++v39;
while( v38[v39] );
v38 += v39 + 1;
if( !*v38 )
goto LABEL_84;
}
v53 = 1;
v48 = 1;
}
}
else if( !v37 )
{
goto LABEL_92;
}
LABEL_84:
if( v37 )
{
v40 = v37;
if( *v37 )
{
while( wcsicmp(v40, *((const wchar_t **)DeviceContext + 1)) )
{
v41 = -1i64;
do
++v41;
while( v40[v41] );
v40 += v41 + 1;
if( !*v40 )
goto LABEL_92;
}
v52 = 1;
v10 = 1;
}
}
LABEL_92:
if( v10 )
{
v43 = PolicyStringList;
v42 = v56;
goto LABEL_105;
}
if( v48 )
{
v43 = PolicyStringList;
goto LABEL_101;
}
v42 = v56;
if( (_BYTE)v56
|| PiDevCfgQueryPolicyEnabled(PolicyKeyHandle, (WCHAR *)L"DenyUnspecified", &PolicyEnabled) < 0
|| !PolicyEnabled )
{
v43 = PolicyStringList;
v9 = 0;
goto LABEL_117;
}
v43 = PolicyStringList;
if( (ClassGuidString || !PolicyStringList) && (!BYTE6(qword_140C50A2C) || !BYTE4(qword_140C50A2C)) )
{
LABEL_105:
if( v42 && v48 )
{
if( v52 )
{
v11 = 0;
}
else if( !v50 )
{
v11 = 3 - (v51 != 0);
}
if( v53 )
v44 = 0;
else
v44 = 2 - (v49 != 0);
v9 = v44 >= v11 ? 0xC0000361 : 0;
}
else
{
v9 = -1073740959;
}
goto LABEL_117;
}
LABEL_101:
v9 = 0;
LABEL_117:
if( v43 )
ExFreePoolWithTag(v43, 0);
if( P )
ExFreePoolWithTag(P, 0);
if( v21 )
ExFreePoolWithTag(v21, 0);
if( v23 )
ExFreePoolWithTag(v23, 0);
if( v35 )
ExFreePoolWithTag(v35, 0);
if( v37 )
ExFreePoolWithTag(v37, 0);
LABEL_129:
if( PolicyKeyHandle )
ZwClose((_HANDLE)PolicyKeyHandle);
if( KeyHandle )
ZwClose((_HANDLE)KeyHandle);
return v9;
}Referenced by:
PiDevCfgConfigureDevice