PiDrvDbLoadNodeWorkerCallback

VOID __stdcall PiDrvDbLoadNodeWorkerCallback(VOID *Parameter){
  unsigned __int16 *v1; 
  NTSTATUS Hive; 
  int v4; 
  INT64 *v5; 
  _DWORD *v6; 
  __int64 v7; 
  WCHAR v8; 
  int v9; 
  INT64 v10; 
  INT64 v11; 
  INT64 v12; 
  int v13; 
  INT64 v14; 
  VOID *Handle; 

  v1 = (unsigned __int16 *)((char *)Parameter + 16);
  LODWORD(v12) = 1;
  Handle = 0i64;
  v13 = 0;
  LODWORD(v14) = 0;
  PnpDiagnosticTraceObject(&KMPnPEvt_DriverDatabaseLoad_Start, (unsigned __int16 *)Parameter + 8);
  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( SysCtxRegOpenKey(0i64, Handle, L"DriverDatabase", 0, 0x2000000u, (VOID **)Parameter + 9) < 0 )
  {
    *((_BYTE *)Parameter + 80) = 1;
    goto LABEL_5;
  }
  if( *((_QWORD *)Parameter + 60) == 0xFFFFFFFFi64 )
  {
    if( PnpGetObjectProperty(
           *(&stru_140CF2E80 + 1214),
           *((_QWORD *)Parameter + 3),
           7i64,
           *v5,
           0i64,
           (INT64)&DEVPKEY_DriverDatabase_UnloadTimeout,
           (INT64)&v12,
           (INT64)&v14) >= 0
      && (_DWORD)v12 == 7
      && v13 == 4 )
    {
      v7 = (unsigned int)v14;
    }
    else
    {
      v7 = 120000i64;
      LODWORD(v14) = 120000;
    }
    if( (_DWORD)v7 != -1 )
      *((_QWORD *)Parameter + 60) = -10000 * v7;
  }
  v6 = (char *)Parameter + 496;
  if( *((_DWORD *)Parameter + 124) != 259 )
    goto LABEL_5;
  if( PnpGetObjectProperty(
         *(&stru_140CF2E80 + 1214),
         *((_QWORD *)Parameter + 3),
         7i64,
         *v5,
         0i64,
         (INT64)&DEVPKEY_DriverDatabase_SetupOptions,
         (INT64)&v12,
         (INT64)Parameter + 492) < 0
    || (_DWORD)v12 != 7
    || v13 != 4 )
  {
    *((_DWORD *)Parameter + 123) = 51;
  }
  if( PnpGetObjectProperty(
         *(&stru_140CF2E80 + 1214),
         *((_QWORD *)Parameter + 3),
         7i64,
         *v5,
         0i64,
         (INT64)&DEVPKEY_DriverDatabase_SetupStatus,
         (INT64)&v12,
         (INT64)Parameter + 496) < 0
    || (_DWORD)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(
      *(&stru_140CF2E80 + 607),
      v11,
      7u,
      v10,
      0i64,
      (__int64)&DEVPKEY_DriverDatabase_SetupStatus,
      24,
      (__int64)Parameter + 496,
      4,
      0);
    goto LABEL_5;
  }
  if( *v6 == 259 )
    goto LABEL_27;
LABEL_5:
  ZwClose((_HANDLE)Handle);
  ZwResetEvent(*((VOID **)Parameter + 59), 0i64);
  v4 = PiDrvDbUnloadHive((_UNICODE_STRING *)Parameter + 2, *((VOID **)Parameter + 59));
  if( v4 == 259 )
  {
    v4 = 0;
    goto LABEL_7;
  }
  if( v4 < 0 )
    v4 = 0;
  ZwSetEvent(*((VOID **)Parameter + 59), 0i64);
LABEL_35:
  if( v4 == -1073741431 )
    v4 = -1073741077;
LABEL_7:
  *((_DWORD *)Parameter + 64) = v4;
  KeSetEvent((PRKEVENT)((char *)Parameter + 200), 0, 0);
  PnpDiagnosticTraceObjectWithStatus(&KMPnPEvt_DriverDatabaseLoad_Stop, v1, v4);
  if( v4 < 0 )
    PnpDiagnosticTraceObjectWithStatus(&KMPnPEvt_DriverDatabaseLoaded_Stop, v1, v4);
}

Referenced by:

No references.