PiCMUnregisterDeviceInterface

NTSTATUS __stdcall PiCMUnregisterDeviceInterface(
        VOID *IoctlInputBuffer,
        UINT64 IoctlInputBufferSize,
        VOID *IoctlOutputBuffer,
        UINT64 IoctlOutputBufferSize,
        UINT64 *BytesUsed){
  UINT64 *v5; 
  unsigned int v6; 
  int v8; 
  NTSTATUS ObjectProperty; 
  INT64 v10; 
  char v11; 
  _ETHREAD *CurrentThread; 
  UINT64 v13; 
  UINT64 *BytesUseda; 
  INT64 a6; 
  INT64 a7; 
  INT64 a8; 
  INT64 a9; 
  INT64 v20; 
  _CMAPI_INPUT_OBJECT_DATA v21[4]; 
  INT64 v22[2]; 
  UINT64 ExpectedOutputSize; 
  INT64 v24; 

  v5 = (UINT64 *)v24;
  v20 = 0i64;
  v6 = IoctlOutputBufferSize;
  ExpectedOutputSize = 0i64;
  *(_DWORD *)v24 = 0;
  *(_OWORD *)v21 = 0i64;
  LOBYTE(v24) = 0;
  *(_OWORD *)v22 = 0i64;
  v8 = PiCMCaptureObjectInputData(
         IoctlInputBuffer,
         IoctlInputBufferSize,
         (_CMAPI_INPUT_OBJECT_DATA *)(unsigned int)BytesUsed);
  if( v8 >= 0 )
  {
    if( PiAuDoesClientHaveAccess(2ui64) )
    {
      if( v22[0]
        && !v21[1]
        && __PAIR64__(v21[2], 0) == (HIDWORD(v22[1]) | 0x400000000i64)
        && IoctlOutputBuffer
        && v6 >= 8 )
      {
        LODWORD(a9) = 1;
        ObjectProperty = PnpGetObjectProperty(
                           *(&stru_140CF2E80 + 1214),
                           v22[0],
                           3i64,
                           0i64,
                           0i64,
                           (INT64)&DEVPKEY_DeviceInterface_Enabled,
                           (INT64)&v20,
                           (INT64)&v24);
        if( ObjectProperty >= 0 )
        {
          if( v20 == 0x100000011i64 )
          {
            v11 = v24;
          }
          else
          {
            v11 = 0;
            LOBYTE(v24) = 0;
          }
          if( v11 == -1 )
            ObjectProperty = -1073740024;
          if( ObjectProperty >= 0 )
          {
            CurrentThread = (_ETHREAD *)KeGetCurrentThread();
            --CurrentThread->Tcb.KernelApcDisable;
            ExAcquireResourceExclusiveLite((UINT64)&PnpReplaceEvent + 6688, 1, v10);
            ObjectProperty = CmDeleteDeviceInterface(
                               *(&stru_140CF2E80 + 607),
                               (WCHAR *)v22[0],
                               0i64,
                               v13,
                               (UINT64)BytesUseda,
                               a6,
                               a7,
                               a8,
                               a9);
            ExReleaseResourceLite((PERESOURCE)((char *)&PnpReplaceEvent + 6688));
            KeLeaveCriticalRegionThread(KeGetCurrentThread());
          }
        }
      }
      else
      {
        ObjectProperty = -1073741811;
      }
    }
    else
    {
      ObjectProperty = -1073741790;
    }
    v8 = PiCMReturnBasicResultData(
           (unsigned int)ObjectProperty,
           (unsigned int)ExpectedOutputSize,
           IoctlOutputBuffer,
           v6,
           v5,
           a6,
           a7,
           a8);
  }
  PiCMReleaseObjectInputData(v21);
  return v8;
}

Referenced by:

PiCMHandleIoctl