PiCMValidateDeviceInstance
NTSTATUS __stdcall PiCMValidateDeviceInstance(
VOID *IoctlInputBuffer,
UINT64 IoctlInputBufferSize,
VOID *IoctlOutputBuffer,
UINT64 IoctlOutputBufferSize,
UINT64 *BytesUsed){
UINT64 *v5;
unsigned int v6;
int v8;
_CMAPI_INPUT_OBJECT_DATA v9;
int v10;
INT64 *ProblemStatus;
UINT64 v13;
INT64 v14;
int v15;
int v16;
VOID *ObjectBaseKey;
INT64 DeviceProblem;
UINT64 DeviceStatus;
_CMAPI_INPUT_OBJECT_DATA ObjectData[4];
WCHAR *DeviceInstanceId[2];
UINT64 ExpectedOutputSize;
_SECURITY_SUBJECT_CONTEXT SubjectContext;
UINT64 *Matched;
v5 = Matched;
v15 = 0;
v16 = 0;
v6 = IoctlOutputBufferSize;
LODWORD(DeviceStatus) = 0;
*(_DWORD *)Matched = 0;
DeviceProblem = 0i64;
ObjectBaseKey = 0i64;
*(_OWORD *)ObjectData = 0i64;
ExpectedOutputSize = 0i64;
*(_OWORD *)DeviceInstanceId = 0i64;
LOBYTE(Matched) = 1;
memset(&SubjectContext, 0, sizeof(SubjectContext));
v8 = PiCMCaptureObjectInputData(
IoctlInputBuffer,
IoctlInputBufferSize,
(_CMAPI_INPUT_OBJECT_DATA *)(unsigned int)BytesUsed);
if( v8 < 0 )
goto LABEL_17;
if( !DeviceInstanceId[0]
|| (v9 = ObjectData[1], (unsigned int)(ObjectData[1] - 1) > 1)
|| ObjectData[2] != 1
|| HIDWORD(DeviceInstanceId[1])
|| !IoctlOutputBuffer
|| v6 < 8 )
{
v10 = -1073741811;
goto LABEL_14;
}
v10 = PnpOpenObjectRegKey(*(&stru_140CF2E80 + 607), (__int64)DeviceInstanceId[0], 1u, 1, 0, (__int64)&ObjectBaseKey);
if( v10 >= 0 )
{
if( v9 == 2 && PiAuDoesClientHaveAccess(2ui64) )
{
LABEL_19:
LODWORD(Matched) = 4;
if( (int)RegRtlQueryValue(ObjectBaseKey, L"Phantom", &v15, &v16, (__int64)&Matched) < 0
|| v15 != 4
|| (_DWORD)Matched != 4
|| !v16 )
{
goto LABEL_14;
}
goto LABEL_21;
}
SeCaptureSubjectContext((INT64)&SubjectContext);
v10 = PiPnpRtlApplyMandatoryFilters(
*(&stru_140CF2E80 + 607),
DeviceInstanceId[0],
1,
ObjectBaseKey,
&SubjectContext,
(UINT8 *)&Matched);
SeReleaseSubjectContext(&SubjectContext);
if( v10 >= 0 )
{
if( !(_BYTE)Matched )
goto LABEL_21;
if( v9 == 2 )
goto LABEL_19;
if( CmGetDeviceStatus(
*(&stru_140CF2E80 + 607),
DeviceInstanceId[0],
ObjectBaseKey,
&DeviceStatus,
(UINT64 *)((char *)&DeviceProblem + 4),
&DeviceProblem,
v13) < 0 )
LABEL_21:
v10 = -1073741810;
}
}
LABEL_14:
if( ObjectBaseKey )
ZwClose((_HANDLE)ObjectBaseKey);
v8 = PiCMReturnBasicResultData(
(unsigned int)v10,
(unsigned int)ExpectedOutputSize,
IoctlOutputBuffer,
v6,
v5,
(INT64)ProblemStatus,
v13,
v14);
LABEL_17:
PiCMReleaseObjectInputData(ObjectData);
return v8;
}Referenced by:
PiCMHandleIoctl