PiDrvDbLoadNode
NTSTATUS __stdcall PiDrvDbLoadNode(PI_DRVDB_NODE *DrvDbNode, VOID **BaseKeyHandle){
INT64 v2;
int v3;
_ETHREAD *CurrentThread;
VOID **v7;
int v9;
int v10;
VOID *Handle;
v3 = 0;
Handle = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquireResourceExclusiveLite((UINT64)(DrvDbNode + 22), 1, v2);
if( *((_BYTE *)DrvDbNode + 80) )
{
v3 = -1073740697;
}
else
{
if( *((_BYTE *)DrvDbNode + 488) )
{
KeCancelTimer((INT64)(DrvDbNode + 66));
*((_BYTE *)DrvDbNode + 488) = 0;
}
v7 = (VOID **)(DrvDbNode + 18);
if( !*((_QWORD *)DrvDbNode + 9) )
{
if( SysCtxRegOpenKey(0i64, 0i64, *((const WCHAR **)DrvDbNode + 5), 0, 0x2000000u, &Handle) < 0
|| (v3 = SysCtxRegOpenKey(0i64, Handle, L"DriverDatabase", 0, 0x2000000u, (VOID **)DrvDbNode + 9),
ZwClose((_HANDLE)Handle),
v3 < 0) )
{
if( *(&PnpReplaceEvent + 1665) )
{
v3 = -1073741077;
goto LABEL_6;
}
v9 = ZwWaitForSingleObject(*((_QWORD *)DrvDbNode + 59), 0, 0i64);
v10 = v9;
if( !*((_BYTE *)DrvDbNode + 489) )
{
*((_BYTE *)DrvDbNode + 489) = 1;
PnpDiagnosticTraceObjectWithStatus(&KMPnPEvt_DriverDatabaseUnload_Stop, (unsigned __int16 *)DrvDbNode + 8, v9);
PnpDiagnosticTraceObjectWithStatus(
&KMPnPEvt_DriverDatabaseLoaded_Stop,
(unsigned __int16 *)DrvDbNode + 8,
v10);
}
*((_QWORD *)DrvDbNode + 28) = 0i64;
*((_QWORD *)DrvDbNode + 30) = PiDrvDbLoadNodeWorkerCallback;
*((_QWORD *)DrvDbNode + 31) = DrvDbNode;
KeInitializeEvent((INT64)(DrvDbNode + 50), 1, 0);
ExQueueWorkItem((PWORK_QUEUE_ITEM)DrvDbNode + 7, CriticalWorkQueue);
KeWaitForSingleObject((UINT64)(DrvDbNode + 50), 0, 0, 0, 0i64);
if( *v7 )
{
v3 = 0;
}
else if( *((_BYTE *)DrvDbNode + 80) )
{
v3 = -1073740697;
}
else
{
v3 = -1073741823;
if( DrvDbNode[64] < 0 )
v3 = DrvDbNode[64];
}
}
}
*BaseKeyHandle = *v7;
}
LABEL_6:
ExReleaseResourceLite((PERESOURCE)(DrvDbNode + 22));
KeLeaveCriticalRegionThread(KeGetCurrentThread());
return v3;
}Referenced by:
PiDrvDbNodeActionCallback