PnpShutdownDevices
__int64 PnpShutdownDevices(){
unsigned int v0;
volatile signed __int32 *DeviceEventEntry;
_DEVICE_NODE *v3;
_ETHREAD *CurrentThread;
unsigned int UserFlags;
_DEVICE_NODE *Sibling;
PVOID P;
__int64 v8;
__int64 v9;
char *v10;
char v11;
P = 0i64;
HIDWORD(v9) = 0;
LODWORD(v8) = 0;
KeSetEvent((PRKEVENT)((char *)&PnpReplaceEvent + 6656), 0, 0);
v0 = 0;
if( !*(&stru_140C452E0 + 560) && (*(&stru_140C23628 + 2336) & 0x20) == 0 )
return v0;
DeviceEventEntry = (volatile signed __int32 *)PnpCreateDeviceEventEntry(0x189u);
if( !DeviceEventEntry )
return 3221225626i64;
KeWaitForSingleObject((UINT64)&PnpReplaceEvent + 32, 0, 0, 0, 0i64);
KeWaitForSingleObject((UINT64)&PnpReplaceEvent + 352, 0, 0, 0, 0i64);
v3 = (_DEVICE_NODE *)*(&PnpReplaceEvent + 831);
v10 = &v11;
LODWORD(v9) = 10485760;
PipSetDevNodeUserFlags(*(&PnpReplaceEvent + 831), 0x10ui64);
while( 2 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquireResourceSharedLite((UINT64)&PnpReplaceEvent + 6688, 1);
v3 = v3->Child;
while( v3 )
{
UserFlags = v3->UserFlags;
if( (UserFlags & 0x20) != 0 )
{
if( v3 == (_DEVICE_NODE *)*(&PnpReplaceEvent + 831) )
{
v3 = 0i64;
break;
}
LABEL_17:
Sibling = v3->Sibling;
if( v3->Sibling )
goto LABEL_19;
v3 = v3->Parent;
PipSetDevNodeUserFlags(v3, 0x20ui64);
}
else
{
if( (UserFlags & 0x10) == 0 )
break;
Sibling = v3->Child;
if( !Sibling )
{
PipSetDevNodeUserFlags(v3, 0x20ui64);
goto LABEL_17;
}
LABEL_19:
v3 = Sibling;
}
}
ExReleaseResourceLite((PERESOURCE)((char *)&PnpReplaceEvent + 6688));
KeLeaveCriticalRegionThread(KeGetCurrentThread());
if( v3 )
{
PnpInitializeTargetDeviceRemoveEvent(
(VOID *)DeviceEventEntry,
0x189u,
v3->PhysicalDeviceObject,
0,
1,
0,
0,
46,
0,
0i64,
0i64,
(__int64)&v8,
(__int64)&v9);
P = (PVOID)DeviceEventEntry;
v0 = PnpProcessQueryRemoveAndEject((const VOID **)&P);
if( P != DeviceEventEntry && _InterlockedExchangeAdd((volatile signed __int32 *)P + 16, 0xFFFFFFFF) == 1 )
ExFreePoolWithTag(P, 0x4B706E50u);
continue;
}
break;
}
if( _InterlockedExchangeAdd(DeviceEventEntry + 16, 0xFFFFFFFF) == 1 )
ExFreePoolWithTag((PVOID)DeviceEventEntry, 0x4B706E50u);
return v0;
}Referenced by:
IoShutdownSystem