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