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