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.