IopReleaseDeviceResources
NTSTATUS __fastcall IopReleaseDeviceResources(__int64 a1, int a2){
NTSTATUS result;
PVOID v5;
int v6;
const wchar_t *v7;
BOOL v8;
_ETHREAD *CurrentThread;
void(__fastcall *v10)(__int64, __int64, PVOID);
__int64 v11;
UINT64 DataSize;
struct _UNICODE_STRING ValueName;
UINT64 v14;
PVOID Resource;
HANDLE KeyHandle;
ValueName = 0i64;
if( !*(_QWORD *)(a1 + 416) && (*(_DWORD *)(a1 + 396) & 0x80u) == 0 )
return 0;
LODWORD(v14) = 0;
v5 = 0i64;
Resource = 0i64;
if( a2 && (*(_DWORD *)(a1 + 396) & 1) == 0 )
{
IopQueryDeviceResources(*(_DEVICE_OBJECT **)(a1 + 32), 0i64, &Resource, &v14);
if( v6 < 0 )
{
Resource = 0i64;
LODWORD(v14) = 0;
}
else
{
v5 = Resource;
}
}
result = IopLegacyResourceAllocation(
ArbiterRequestUndefined,
PnpDriverObject,
*(DEVICE_OBJECT **)(a1 + 32),
0i64,
0i64);
if( result >= 0 )
{
PnpRequestDeviceAction(0i64, AssignResources, 0, 0i64, 0i64, 0i64);
if( a2 && (*(_DWORD *)(a1 + 396) & 1) == 0 )
{
v7 = *(const wchar_t **)(a1 + 48);
KeyHandle = 0i64;
if( (int)CmOpenDeviceRegKey(PiPnpRtlCtx, v7, 20, 0, 983103, v5 != 0i64, (__int64)&KeyHandle, 0i64) >= 0 )
{
*(_DWORD *)&ValueName.Length = 1441812;
ValueName.Buffer = (wchar_t *)L"BootConfig";
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
LOBYTE(v8) = 1;
ExAcquireResourceSharedLite(&PnpRegistryDeviceResource, v8);
if( Resource )
{
LODWORD(DataSize) = v14;
ZwSetValueKey(KeyHandle, &ValueName, 0i64, 8ui64, Resource, DataSize);
}
else
{
ZwDeleteValueKey(KeyHandle, &ValueName);
}
ExReleaseResourceLite(&PnpRegistryDeviceResource);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
ZwClose(KeyHandle);
v5 = Resource;
}
if( v5 )
{
PipSetDevNodeFlags(a1, 64);
v10 = (void(__fastcall *)(__int64, __int64, PVOID))IopAllocateBootResourcesRoutine;
v11 = *(_QWORD *)(a1 + 32);
*(_QWORD *)(a1 + 544) = v5;
v10(4i64, v11, v5);
}
}
return 0;
}
return result;
}Referenced by:
PnpDisableDevice
PnpDriverLoadingFailed
PnpRemoveLockedDeviceNode
PnpSurpriseRemoveLockedDeviceNode