WmipRegisterDevice

INT64 __stdcall WmipRegisterDevice(_DEVICE_OBJECT *DeviceObject, UINT64 RegistrationFlag){
  unsigned int v2; 
  char v3; 
  CHAR *RegEntryByDevice; 
  DEVICE_OBJECT *AttachedDeviceReference; 
  int updated; 
  __int64 v8; 
  v2 = 0;
  v3 = 0;
  if( (RegistrationFlag & 0x80000000) != 0i64 )
    v2 = 0x10000000;
  if( (RegistrationFlag & 0x10000) != 0 )
    v2 |= 16 * (RegistrationFlag & 0xF00000 | 0x4000000);
  KeWaitForSingleObject(&WmipSMMutex, Executive, 0, 0, 0i64);
  RegEntryByDevice = (CHAR *)WmipFindRegEntryByDevice(DeviceObject);
  if( RegEntryByDevice )
  {
    KeReleaseMutex(&WmipSMMutex, 0);
    updated = 0x40000000;
LABEL_13:
    WmipUnreferenceRegEntry((INT64)RegEntryByDevice);
    goto LABEL_14;
  }
  if( (v2 & 0x10000000) != 0 )
  {
    updated = 0;
  }
  else
  {
    AttachedDeviceReference = IoGetAttachedDeviceReference(DeviceObject);
    WmipUpdateDeviceStackSize(*((_BYTE *)AttachedDeviceReference + 76) + 1);
    HalPutDmaAdapter((PADAPTER_OBJECT)AttachedDeviceReference);
    updated = ObReferenceObjectByPointer(DeviceObject, 0, 0i64, 0);
  }
  if( updated < 0 )
  {
    KeReleaseMutex(&WmipSMMutex, 0);
  }
  else
  {
    v8 = WmipAllocRegEntry(DeviceObject, v2);
    RegEntryByDevice = (CHAR *)v8;
    if( v8 )
    {
      _InterlockedAdd((volatile signed __int32 *)(v8 + 48), 1u);
      KeReleaseMutex(&WmipSMMutex, 0);
      if( (v2 & 0x10000000) != 0 )
      {
        updated = WmipRegisterOrUpdateDS((__int64)RegEntryByDevice, 0);
        if( updated < 0 )
          v3 = 1;
      }
      else
      {
        v3 = 0;
        updated = WmipQueueRegWork(0i64, RegEntryByDevice);
        if( updated < 0 )
          v3 = 1;
      }
      goto LABEL_13;
    }
    KeReleaseMutex(&WmipSMMutex, 0);
    updated = -1073741670;
  }
LABEL_14:
  if( v3 )
    WmipDeregisterRegEntry(RegEntryByDevice);
  return(unsigned int)updated;
}

Referenced by:

IoWMIRegistrationControl