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