PiCMDeviceAction
NTSTATUS __stdcall PiCMDeviceAction(
PVOID IoctlInputBuffer,
UINT64 IoctlInputBufferSize,
PVOID IoctlOutputBuffer,
UINT64 IoctlOutputBufferSize,
UINT64 *BytesUsed){
unsigned int v5;
int v7;
int v8;
NTSTATUS inited;
WCHAR *v10;
int v11;
int v12;
int v13;
INT64 v14;
INT64 v15;
NTSTATUS v16;
INT64 v18;
int v19;
int v20;
int v21;
INT64 v22;
INT64 v23;
unsigned int v24;
INT64 v25;
int v26;
_DWORD v27[5];
INT64 v28[2];
PCWSTR SourceString[2];
UINT64 ExpectedOutputSize;
unsigned int IoctlOutputBufferSizea;
UINT64 *v32;
IoctlOutputBufferSizea = IoctlOutputBufferSize;
ExpectedOutputSize = 0i64;
v5 = IoctlOutputBufferSize;
v25 = 0i64;
*(_DWORD *)v32 = 0;
v7 = 0;
memset(v27, 0, sizeof(v27));
v8 = 0;
*(_OWORD *)v28 = 0i64;
v26 = 0;
*(_OWORD *)SourceString = 0i64;
inited = PiCMCaptureObjectInputData(
(UINT64)IoctlInputBuffer,
IoctlInputBufferSize,
(unsigned int)BytesUsed,
(INT64)v28);
if( inited >= 0 )
{
v10 = (WCHAR *)SourceString[0];
if( !SourceString[0] || LODWORD(v28[1]) != 1 || !IoctlOutputBuffer || v5 < 8 )
{
inited = -1073741811;
goto LABEL_26;
}
v11 = HIDWORD(SourceString[1]);
if( HIDWORD(SourceString[1]) == 1 )
{
v8 = HIDWORD(v28[0]);
if( (unsigned int)(HIDWORD(v28[0]) - 1) > 5 )
inited = -1073741811;
}
else
{
if( HIDWORD(SourceString[1]) != 2 )
goto LABEL_52;
v7 = HIDWORD(v28[0]);
if( (unsigned int)(HIDWORD(v28[0]) - 1) > 1 )
inited = -1073741811;
}
if( inited < 0 )
goto LABEL_26;
inited = CmValidateDeviceName((unsigned int)(HIDWORD(SourceString[1]) - 1), SourceString[0]);
if( inited < 0 )
goto LABEL_26;
v12 = v11 - 1;
if( v12 )
{
if( v12 != 1 )
goto LABEL_52;
if( PiAuDoesClientHaveAccess(0x20ui64) && PiAuDoesClientHavePrivilege(0xAui64) )
{
inited = RtlInitUnicodeStringEx((UNICODE_STRING *)&v27[1], v10);
if( inited < 0 )
goto LABEL_26;
v16 = PiQueueDeviceRequest((INT64)&v27[1], 9i64, v23, v7 != 2, 0i64);
goto LABEL_25;
}
}
else
{
if( v8 <= 0 )
goto LABEL_52;
if( v8 > 2 )
{
if( v8 > 6 )
goto LABEL_52;
if( PiAuDoesClientHaveAccess(2ui64) && PiAuDoesClientHavePrivilege(0xAui64) )
{
inited = RtlInitUnicodeStringEx((UNICODE_STRING *)&v27[1], v10);
if( inited >= 0 )
{
v19 = v8 - 3;
if( v19 )
{
v20 = v19 - 1;
if( v20 )
{
v21 = v20 - 1;
if( v21 )
{
if( v21 != 1 )
{
inited = -1073741811;
LODWORD(v25) = -1073741811;
goto LABEL_26;
}
v22 = 24i64;
}
else
{
v22 = 23i64;
}
}
else
{
v22 = 22i64;
}
}
else
{
v22 = 21i64;
}
inited = PiQueueDeviceRequest((INT64)&v27[1], v22, v18, 1i64, (INT64)&v25);
if( inited >= 0 )
inited = v25;
}
LABEL_26:
inited = PiCMReturnBasicResultData(
(unsigned int)inited,
(unsigned int)ExpectedOutputSize,
IoctlOutputBuffer,
IoctlOutputBufferSizea,
v32);
goto LABEL_27;
}
}
else if( PiAuDoesClientHaveAccess(0x20ui64) && PiAuDoesClientHavePrivilege(0xAui64) )
{
if( !CmIsRootDevice(v10) )
{
LODWORD(v25) = CmGetDeviceStatus(PiPnpRtlCtx, v10, 0i64, (int *)&v25 + 1, v27, &v26, v24);
if( (int)v25 >= 0 )
{
if( (v25 & 0x800000000i64) != 0 )
goto LABEL_26;
if( (v25 & 0x40000000000i64) != 0 )
{
PiCMSetProblem(v10, 0i64, 1i64);
inited = v13;
if( v13 < 0 )
goto LABEL_26;
}
}
inited = RtlInitUnicodeStringEx((UNICODE_STRING *)&v27[1], v10);
if( inited < 0 )
goto LABEL_26;
v15 = 16i64;
if( v8 != 1 )
v15 = 12i64;
v16 = PiQueueDeviceRequest((INT64)&v27[1], v15, v14, 1i64, 0i64);
LABEL_25:
inited = v16;
goto LABEL_26;
}
LABEL_52:
inited = -1073741811;
goto LABEL_26;
}
}
inited = -1073741790;
goto LABEL_26;
}
LABEL_27:
PiCMReleaseObjectInputData((INT64)v28);
return inited;
}Referenced by:
No references.