PiDrvDbLoadNodeWorkerCallback

VOID __stdcall PiDrvDbLoadNodeWorkerCallback(PVOID Parameter){
  _UNICODE_STRING *v1; 
  NTSTATUS Hive; 
  NTSTATUS v4; 
  __int64 *v5; 
  _DWORD *v6; 
  __int64 v7; 
  WCHAR v8; 
  int v9; 
  __int64 v10; 
  __int64 v11; 
  int v12; 
  ULONG v13; 
  unsigned int v14; 
  HANDLE Handle; 
  v1 = (_UNICODE_STRING *)((char *)Parameter + 16);
  v12 = 1;
  Handle = 0i64;
  v13 = 0;
  v14 = 0;
  PnpDiagnosticTraceObject(&KMPnPEvt_DriverDatabaseLoad_Start, (_UNICODE_STRING *)Parameter + 1);
  PnpDiagnosticTraceObject(&KMPnPEvt_DriverDatabaseLoaded_Start, v1);
  Hive = PiDrvDbLoadHive((UNICODE_STRING *)Parameter + 2, (UNICODE_STRING *)Parameter + 3, 0i64);
  v4 = Hive;
  if( Hive < 0 )
  {
    if( Hive == -1073741772 || Hive == -1073741766 )
      *((_BYTE *)Parameter + 80) = 1;
    goto LABEL_35;
  }
  v5 = (__int64 *)((char *)Parameter + 72);
  if( (int)SysCtxRegOpenKey(
              0i64,
              (char *)Handle,
              (const WCHAR *)L"DriverDatabase",
              0,
              0x2000000u,
              (void **)Parameter + 9) < 0 )
  {
    *((_BYTE *)Parameter + 80) = 1;
    goto LABEL_5;
  }
  if( *((_QWORD *)Parameter + 60) == 0xFFFFFFFFi64 )
  {
    if( (int)PnpGetObjectProperty(
                PiPnpRtlCtx,
                *((_QWORD *)Parameter + 3),
                7i64,
                *v5,
                0i64,
                (__int64)DEVPKEY_DriverDatabase_UnloadTimeout,
                &v12,
                (unsigned __int64)&v14,
                4,
                &v13,
                0) >= 0
      && v12 == 7
      && v13 == 4 )
    {
      v7 = v14;
    }
    else
    {
      v7 = 120000i64;
      v14 = 120000;
    }
    if( (_DWORD)v7 != -1 )
      *((_QWORD *)Parameter + 60) = -10000 * v7;
  }
  v6 = (char *)Parameter + 496;
  if( *((_DWORD *)Parameter + 124) != 259 )
    goto LABEL_5;
  if( (int)PnpGetObjectProperty(
              PiPnpRtlCtx,
              *((_QWORD *)Parameter + 3),
              7i64,
              *v5,
              0i64,
              (__int64)DEVPKEY_DriverDatabase_SetupOptions,
              &v12,
              (unsigned __int64)Parameter + 492,
              4,
              &v13,
              0) < 0
    || v12 != 7
    || v13 != 4 )
  {
    *((_DWORD *)Parameter + 123) = 51;
  }
  if( (int)PnpGetObjectProperty(
              PiPnpRtlCtx,
              *((_QWORD *)Parameter + 3),
              7i64,
              *v5,
              0i64,
              (__int64)DEVPKEY_DriverDatabase_SetupStatus,
              &v12,
              (unsigned __int64)Parameter + 496,
              4,
              &v13,
              0) < 0
    || v12 != 24
    || v13 != 4 )
  {
    *v6 = 259;
LABEL_27:
    v9 = PiDrvDbSetupNodeHive((INT64)Parameter, *((WCHAR **)Parameter + 3), v8);
    v10 = *v5;
    v11 = *((_QWORD *)Parameter + 3);
    *v6 = v9;
    PnpSetObjectProperty(
      PiPnpRtlCtx,
      v11,
      7u,
      v10,
      0i64,
      (__int64)DEVPKEY_DriverDatabase_SetupStatus,
      24,
      (__int64)Parameter + 496,
      4u,
      0);
    goto LABEL_5;
  }
  if( *v6 == 259 )
    goto LABEL_27;
LABEL_5:
  ZwClose(Handle);
  ZwResetEvent(*((PVOID *)Parameter + 59), 0i64);
  v4 = PiDrvDbUnloadHive((UNICODE_STRING *)Parameter + 2, *((PVOID *)Parameter + 59));
  if( v4 == 259 )
  {
    v4 = 0;
    goto LABEL_7;
  }
  if( v4 < 0 )
    v4 = 0;
  ZwSetEvent(*((PVOID *)Parameter + 59), 0i64);
LABEL_35:
  if( v4 == -1073741431 )
    v4 = -1073741077;
LABEL_7:
  *((_DWORD *)Parameter + 64) = v4;
  KeSetEvent((PRKEVENT)((char *)Parameter + 200), 0);
  PnpDiagnosticTraceObjectWithStatus(&KMPnPEvt_DriverDatabaseLoad_Stop, v1, (unsigned int)v4);
  if( v4 < 0 )
    PnpDiagnosticTraceObjectWithStatus(&KMPnPEvt_DriverDatabaseLoaded_Stop, v1, (unsigned int)v4);
}

Referenced by:

No references.