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