DrvDbGetDriverDatabaseList

NTSTATUS __fastcall DrvDbGetDriverDatabaseList(
        _DRVDB_CONTEXT *pDrvDbCtx,
        UINT8 a2,
        INT64 *MatchCallbackRoutine,
        HPNPCTX *a4,
        const WCHAR *a5,
        PNP_OBJECT_TYPE a6,
        VOID *a7,
        VOID *MatchCallbackContext,
        WCHAR *Buffer,
        UINT64 BufferLen,
        UINT64 *RequiredLen){
  NTSTATUS v11; 
  unsigned __int8(__fastcall *v13)(_QWORD, _QWORD, __int64, INT64 *); 
  unsigned int v14; 
  int v15; 
  _DRVDB_CONTEXT *v16; 
  _DRVDB_CONTEXT *v17; 
  int v18; 
  unsigned int v19; 
  unsigned int v20; 
  UINT64 dwFlags; 
  _DRVDB_CONTEXT *v23; 
  unsigned __int8(__fastcall *v24)(_QWORD, _QWORD, __int64, INT64 *); 
  INT64 *v25; 

  v25 = MatchCallbackRoutine;
  v24 = (unsigned __int8(__fastcall *)(_QWORD, _QWORD, __int64, INT64 *))a2;
  v23 = pDrvDbCtx;
  v11 = 0;
  v13 = (unsigned __int8(__fastcall *)(_QWORD, _QWORD, __int64, INT64 *))a2;
  v14 = 0;
  v15 = 0;
  **(_DWORD **)&a6 = 0;
  if( a4 && (_DWORD)a5 )
  {
    *(_WORD *)a4 = 0;
    v15 = **(_DWORD **)&a6;
  }
  v16 = pDrvDbCtx + 4;
  v17 = (_DRVDB_CONTEXT *)*((_QWORD *)pDrvDbCtx + 2);
  if( v17 != pDrvDbCtx + 4 )
  {
    do
    {
      if( !v13 || v13(*(_QWORD *)pDrvDbCtx, *((_QWORD *)v17 + 3), 7i64, MatchCallbackRoutine) )
      {
        v18 = (*((unsigned __int16 *)v17 + 8) >> 1) + 1;
        **(_DWORD **)&a6 += v18;
        if( a4 )
        {
          v19 = v18 + v14;
          if( v18 + v14 < (unsigned int)a5 )
          {
            LODWORD(dwFlags) = 2304;
            RtlStringCchCopyExW((WCHAR *)a4 + v14, (unsigned int)a5 - v14, *((WCHAR **)v17 + 3), 0i64, 0i64, dwFlags);
            v14 = v19;
          }
        }
      }
      v17 = *(_DRVDB_CONTEXT **)v17;
      v13 = v24;
      pDrvDbCtx = v23;
      MatchCallbackRoutine = v25;
    }
    while( v17 != v16 );
    v15 = **(_DWORD **)&a6;
  }
  v20 = v15 + 1;
  **(_DWORD **)&a6 = v20;
  if( !a4 || v20 > (unsigned int)a5 )
    return -1073741789;
  *((_WORD *)a4 + v20 - 1) = 0;
  return v11;
}

Referenced by:

DrvDbDispatchDriverDatabase