PiCMDeviceAction
NTSTATUS __stdcall PiCMDeviceAction(
VOID *IoctlInputBuffer,
UINT64 IoctlInputBufferSize,
VOID *IoctlOutputBuffer,
UINT64 IoctlOutputBufferSize,
UINT64 *BytesUsed){
unsigned int v5;
_CMAPI_INPUT_OBJECT_DATA v7;
int v8;
NTSTATUS inited;
WCHAR *v10;
INT64 v11;
UINT64 v12;
PNP_DEVICE_ACTION_REQUEST v13;
NTSTATUS v14;
UINT64 v16;
int v17;
int v18;
int v19;
PNP_DEVICE_ACTION_REQUEST v20;
UINT64 v21;
UINT64 *DeviceProblem;
INT64 *ProblemStatus;
UINT64 v24;
INT64 v25;
INT64 CompletionStatus;
INT64 v27;
_UNICODE_STRING DestinationString;
_CMAPI_INPUT_OBJECT_DATA ObjectData[4];
WCHAR *SourceString[2];
UINT64 ExpectedOutputSize;
unsigned int IoctlOutputBufferSizea;
UINT64 *v33;
IoctlOutputBufferSizea = IoctlOutputBufferSize;
ExpectedOutputSize = 0i64;
v5 = IoctlOutputBufferSize;
CompletionStatus = 0i64;
*(_DWORD *)v33 = 0;
v7 = 0;
DestinationString = 0i64;
v8 = 0;
*(_OWORD *)ObjectData = 0i64;
v27 = 0i64;
*(_OWORD *)SourceString = 0i64;
inited = PiCMCaptureObjectInputData(
IoctlInputBuffer,
IoctlInputBufferSize,
(_CMAPI_INPUT_OBJECT_DATA *)(unsigned int)BytesUsed);
if( inited >= 0 )
{
v10 = SourceString[0];
if( !SourceString[0] || ObjectData[2] != 1 || !IoctlOutputBuffer || v5 < 8 )
{
inited = -1073741811;
goto LABEL_26;
}
if( HIDWORD(SourceString[1]) == 1 )
{
v8 = ObjectData[1];
if( (unsigned int)(ObjectData[1] - 1) > 5 )
inited = -1073741811;
}
else
{
if( HIDWORD(SourceString[1]) != 2 )
goto LABEL_52;
v7 = ObjectData[1];
if( (unsigned int)(ObjectData[1] - 1) > 1 )
inited = -1073741811;
}
if( inited < 0 )
goto LABEL_26;
inited = CmValidateDeviceName((WCHAR *)(unsigned int)(HIDWORD(SourceString[1]) - 1));
if( inited < 0 )
goto LABEL_26;
if( HIDWORD(SourceString[1]) == 1 )
{
if( v8 <= 0 )
goto LABEL_52;
if( v8 > 2 )
{
if( v8 > 6 )
goto LABEL_52;
if( PiAuDoesClientHaveAccess(2ui64) && PiAuDoesClientHavePrivilege(0xAui64) )
{
inited = RtlInitUnicodeStringEx(&DestinationString, SourceString[0]);
if( inited >= 0 )
{
v17 = v8 - 3;
if( v17 )
{
v18 = v17 - 1;
if( v18 )
{
v19 = v18 - 1;
if( v19 )
{
if( v19 != 1 )
{
inited = -1073741811;
LODWORD(CompletionStatus) = -1073741811;
goto LABEL_26;
}
v20 = ConfigureDeviceReset;
}
else
{
v20 = ConfigureDeviceExtensions;
}
}
else
{
v20 = ConfigureDeviceClass;
}
}
else
{
v20 = ConfigureDevice;
}
inited = PiQueueDeviceRequest(&DestinationString, v20, v16, 1ui64, &CompletionStatus);
if( inited >= 0 )
inited = CompletionStatus;
}
LABEL_26:
inited = PiCMReturnBasicResultData(
(unsigned int)inited,
(unsigned int)ExpectedOutputSize,
IoctlOutputBuffer,
IoctlOutputBufferSizea,
v33,
(INT64)ProblemStatus,
v24,
v25);
goto LABEL_27;
}
}
else if( PiAuDoesClientHaveAccess(0x20ui64) && PiAuDoesClientHavePrivilege(0xAui64) )
{
if( !CmIsRootDevice(SourceString[0]) )
{
LODWORD(CompletionStatus) = CmGetDeviceStatus(
*(&stru_140CF2E80 + 607),
SourceString[0],
0i64,
(UINT64 *)((char *)&CompletionStatus + 4),
(UINT64 *)((char *)&v27 + 4),
&v27,
v24);
if( (int)CompletionStatus >= 0 )
{
if( (CompletionStatus & 0x800000000i64) != 0 )
goto LABEL_26;
if( (CompletionStatus & 0x40000000000i64) != 0 )
{
inited = PiCMSetProblem(
v10,
0i64,
CMAPI_SET_DEVICE_PROBLEM_NORMAL,
v11,
(INT64)DeviceProblem,
(UINT64)ProblemStatus,
v24);
if( inited < 0 )
goto LABEL_26;
}
}
inited = RtlInitUnicodeStringEx(&DestinationString, v10);
if( inited < 0 )
goto LABEL_26;
v13 = StartDevice;
if( v8 != 1 )
v13 = ResetDevice;
v14 = PiQueueDeviceRequest(&DestinationString, v13, v12, 1ui64, 0i64);
LABEL_25:
inited = v14;
goto LABEL_26;
}
LABEL_52:
inited = -1073741811;
goto LABEL_26;
}
}
else
{
if( HIDWORD(SourceString[1]) != 2 )
goto LABEL_52;
if( PiAuDoesClientHaveAccess(0x20ui64) && PiAuDoesClientHavePrivilege(0xAui64) )
{
inited = RtlInitUnicodeStringEx(&DestinationString, SourceString[0]);
if( inited < 0 )
goto LABEL_26;
v14 = PiQueueDeviceRequest(&DestinationString, ReenumerateDeviceTree, v21, v7 != 2, 0i64);
goto LABEL_25;
}
}
inited = -1073741790;
goto LABEL_26;
}
LABEL_27:
PiCMReleaseObjectInputData(ObjectData);
return inited;
}Referenced by:
PiCMHandleIoctl