PiCMSetObjectProperty

NTSTATUS __stdcall PiCMSetObjectProperty(
        VOID *IoctlInputBuffer,
        UINT64 IoctlInputBufferSize,
        VOID *IoctlOutputBuffer,
        UINT64 IoctlOutputBufferSize,
        UINT64 *BytesUsed){
  unsigned int v5; 
  unsigned int v8; 
  int v9; 
  int v10; 
  _CMAPI_INPUT_PROPERTY_DATA v11; 
  WCHAR *v12; 
  int v13; 
  int v14; 
  unsigned int v15; 
  int v16; 
  int v18; 
  int v19; 
  int v20; 
  int v21; 
  __int64 v22; 
  int v23; 
  int v24; 
  int v25; 
  __int64 v26; 
  __int64 v27; 
  __int64 v28; 
  __int64 v29; 
  INT64 PropertyType; 
  UINT8 *PropertyBuffer; 
  INT64 PropertySize; 
  UINT64 v33[2]; 
  UINT64 *v34; 
  _CMAPI_INPUT_PROPERTY_DATA PropertyData[20]; 
  UINT64 *v36; 

  v5 = IoctlInputBufferSize;
  v34 = v36;
  v8 = IoctlOutputBufferSize;
  memset(PropertyData, 0i64, 0x48u);
  *(_DWORD *)v36 = 0;
  v9 = PiCMCapturePropertyInputData(IoctlInputBuffer, v5, (_CMAPI_INPUT_PROPERTY_DATA *)(unsigned int)BytesUsed);
  if( v9 >= 0 )
  {
    v10 = PropertyData[2];
    v11 = PropertyData[12];
    v12 = *(WCHAR **)&PropertyData[4];
    v33[0] = *(_QWORD *)&PropertyData[14];
    if( PropertyData[11] == 14 )
    {
      v27 = *(_QWORD *)&PropertyData[7] - *(_QWORD *)&DEVPKEY_Device_FriendlyName.fmtid.Data1;
      if( *(_QWORD *)&PropertyData[7] == *(_QWORD *)&DEVPKEY_Device_FriendlyName.fmtid.Data1 )
        v27 = *(_QWORD *)&PropertyData[9] - *(_QWORD *)DEVPKEY_Device_FriendlyName.fmtid.Data4;
      if( !v27 )
        goto LABEL_49;
    }
    if( PropertyData[11] == 3 )
    {
      v22 = *(_QWORD *)&PropertyData[7] - *(_QWORD *)&DEVPKEY_Device_FriendlyNameAttributes.fmtid.Data1;
      if( *(_QWORD *)&PropertyData[7] == *(_QWORD *)&DEVPKEY_Device_FriendlyNameAttributes.fmtid.Data1 )
        v22 = *(_QWORD *)&PropertyData[9] - *(_QWORD *)DEVPKEY_Device_FriendlyNameAttributes.fmtid.Data4;
      if( !v22 )
        goto LABEL_49;
    }
    if( PropertyData[11] == 4 )
    {
      v26 = *(_QWORD *)&PropertyData[7] - DEVPKEY_DriverPackage_SourceMediaPath;
      if( *(_QWORD *)&PropertyData[7] == DEVPKEY_DriverPackage_SourceMediaPath )
        v26 = *(_QWORD *)&PropertyData[9] + 0x4524B8338B5D1E6Ci64;
      if( !v26 )
        goto LABEL_49;
    }
    if( PropertyData[11] != 2 )
      goto LABEL_6;
    v28 = *(_QWORD *)&PropertyData[7] - DEVPKEY_WIA_DeviceType;
    if( *(_QWORD *)&PropertyData[7] == DEVPKEY_WIA_DeviceType )
      v28 = *(_QWORD *)&PropertyData[9] - 0x2F09E22B0008C7BEi64;
    if( v28 )
LABEL_6:
      v13 = 0;
    else
LABEL_49:
      v13 = 1;
    if( !PiAuDoesClientHaveAccess(v13 != 0 ? 64 : 2) )
    {
      v9 = -1073741790;
      goto LABEL_20;
    }
    if( !v12 || PropertyData[1] || !IoctlOutputBuffer || (v14 = 8, v8 < 8) )
    {
      v9 = -1073741811;
      goto LABEL_20;
    }
    v15 = 0;
    if( v10 > 6 )
    {
      v18 = v10 - 65537;
      if( v18 )
      {
        v19 = v18 - 1;
        if( v19 )
        {
          v20 = v19 - 1;
          if( v20 )
          {
            v21 = v20 - 1;
            if( v21 )
            {
              if( v21 != 1 )
                goto LABEL_29;
              v14 = 11;
            }
            else
            {
              v14 = 10;
            }
          }
          else
          {
            v14 = 9;
          }
        }
      }
      else
      {
        v14 = 7;
      }
      v15 = *(&stru_140CF2E80 + 608) != 0i64 ? v14 : 0;
    }
    else
    {
      if( v10 == 6 )
      {
        v15 = 6;
        goto LABEL_16;
      }
      v16 = v10 - 1;
      if( !v16 )
      {
        v15 = 1;
        goto LABEL_16;
      }
      v23 = v16 - 1;
      if( !v23 )
      {
        v15 = 2;
        goto LABEL_16;
      }
      v24 = v23 - 1;
      if( !v24 )
      {
        v15 = 4;
        goto LABEL_16;
      }
      v25 = v24 - 1;
      if( !v25 )
      {
        v15 = 3;
        goto LABEL_16;
      }
      if( v25 == 1 )
      {
        v15 = 5;
        goto LABEL_16;
      }
    }
LABEL_29:
    if( !v15 )
      v9 = -1073741811;
LABEL_16:
    if( v9 >= 0 )
    {
      LODWORD(PropertyBuffer) = v11;
      v9 = PiPnpRtlSetObjectProperty(
             *(&stru_140CF2E80 + 607),
             (PNP_OBJECT_TYPE)v12,
             (VOID *)v15,
             0i64,
             0i64,
             (UINT64)&PropertyData[7],
             PropertyBuffer,
             v33[0]);
      if( v9 == -1073741790 )
      {
        if( PropertyData[11] != 38 )
          goto LABEL_20;
        v29 = *(_QWORD *)&PropertyData[7] - *(_QWORD *)&DEVPKEY_Device_BaseContainerId.fmtid.Data1;
        if( *(_QWORD *)&PropertyData[7] == *(_QWORD *)&DEVPKEY_Device_BaseContainerId.fmtid.Data1 )
          v29 = *(_QWORD *)&PropertyData[9] - *(_QWORD *)DEVPKEY_Device_BaseContainerId.fmtid.Data4;
        if( v29 )
          goto LABEL_20;
        v9 = -1073741264;
      }
      if( v9 >= 0 && v15 == 1 )
      {
        *(_OWORD *)v33 = 0i64;
        if( RtlInitUnicodeStringEx((_UNICODE_STRING *)v33, v12) >= 0 )
          PnpSetDeviceInstancePropertyChangeEventFromDeviceInstance((unsigned __int16 *)v33);
      }
    }
LABEL_20:
    v9 = PiCMReturnBasicResultData(
           (unsigned int)v9,
           (unsigned int)PropertyData[17],
           IoctlOutputBuffer,
           v8,
           v34,
           PropertyType,
           (INT64)PropertyBuffer,
           PropertySize);
  }
  PiCMReleasePropertyInputData(PropertyData);
  return v9;
}

Referenced by:

PiCMHandleIoctl