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