PiDrvDbLoadNode
INT64 __fastcall PiDrvDbLoadNode(INT64 a1, _QWORD *a2){
int v2;
_ETHREAD *CurrentThread;
_QWORD *v6;
unsigned int v8;
unsigned int v9;
HANDLE Handle;
v2 = 0;
Handle = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquireResourceExclusiveLite((ERESOURCE *)(a1 + 88), 1u);
if( *(_BYTE *)(a1 + 80) )
{
v2 = -1073740697;
}
else
{
if( *(_BYTE *)(a1 + 488) )
{
KeCancelTimer((PKTIMER)(a1 + 264));
*(_BYTE *)(a1 + 488) = 0;
}
v6 = (_QWORD *)(a1 + 72);
if( !*(_QWORD *)(a1 + 72) )
{
if( (int)SysCtxRegOpenKey(0i64, 0i64, *(const WCHAR **)(a1 + 40), 0, 0x2000000u, &Handle) < 0
|| (v2 = SysCtxRegOpenKey(
0i64,
(char *)Handle,
(const WCHAR *)L"DriverDatabase",
0,
0x2000000u,
(void **)(a1 + 72)),
ZwClose(Handle),
v2 < 0) )
{
if( PnpShutdownEvent.Header.SignalState )
{
v2 = -1073741077;
goto LABEL_6;
}
v8 = ZwWaitForSingleObject(*(HANDLE *)(a1 + 472), 0, 0i64);
v9 = v8;
if( !*(_BYTE *)(a1 + 489) )
{
*(_BYTE *)(a1 + 489) = 1;
PnpDiagnosticTraceObjectWithStatus(&KMPnPEvt_DriverDatabaseUnload_Stop, (_UNICODE_STRING *)(a1 + 16), v8);
PnpDiagnosticTraceObjectWithStatus(&KMPnPEvt_DriverDatabaseLoaded_Stop, (_UNICODE_STRING *)(a1 + 16), v9);
}
*(_QWORD *)(a1 + 224) = 0i64;
*(_QWORD *)(a1 + 240) = PiDrvDbLoadNodeWorkerCallback;
*(_QWORD *)(a1 + 248) = a1;
KeInitializeEvent((_KEVENT *)(a1 + 200), SynchronizationEvent, 0);
ExQueueWorkItem((WORK_QUEUE_ITEM *)(a1 + 224), CriticalWorkQueue);
KeWaitForSingleObject((PVOID)(a1 + 200), Executive, 0, 0, 0i64);
if( *v6 )
{
v2 = 0;
}
else if( *(_BYTE *)(a1 + 80) )
{
v2 = -1073740697;
}
else
{
v2 = -1073741823;
if( *(int *)(a1 + 256) < 0 )
v2 = *(_DWORD *)(a1 + 256);
}
}
}
*a2 = *v6;
}
LABEL_6:
ExReleaseResourceLite((PERESOURCE)(a1 + 88));
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
return(unsigned int)v2;
}Referenced by:
PiDrvDbNodeActionCallback