SdbpInitializeSearchDBContext

NTSTATUS __stdcall SdbpInitializeSearchDBContext(tagSEARCHDBCONTEXT *pContext){
  INT64 v1; 
  tagSEARCHDBCONTEXT *v2; 
  WCHAR *ProcessHistory; 
  __int64 v4; 
  __int64 v5; 
  WCHAR *v6; 
  __int64 v7; 
  __int64 v8; 
  NTSTATUS result; 
  INT8 *v10; 
  UINT64 v11; 

  v2 = pContext;
  if( *((_QWORD *)pContext + 9) )
    return 1;
  ProcessHistory = (WCHAR *)*((_QWORD *)pContext + 8);
  if( !ProcessHistory )
  {
    if( (*pContext & 2) != 0 || (pContext = (tagSEARCHDBCONTEXT *)*((_QWORD *)pContext + 7)) == 0i64 )
    {
      v4 = -1i64;
      v5 = -1i64;
      do
        ++v5;
      while( *(_WORD *)(*((_QWORD *)v2 + 4) + 2 * v5) );
      do
        ++v4;
      while( *(_WORD *)(*((_QWORD *)v2 + 5) + 2 * v4) );
      v6 = (WCHAR *)AslAlloc(pContext, 2 * ((int)v4 + (int)v5 + 1), v1);
      ProcessHistory = v6;
      if( !v6 )
      {
        v10 = (INT8 *)"Failed to allocate process history buffer";
        v11 = 338i64;
        goto LABEL_17;
      }
      v7 = (unsigned int)v5;
      v8 = (unsigned int)v5;
      memmove(v6, *((const VOID **)v2 + 4), v8 * 2);
      memmove(&ProcessHistory[v8], *((const VOID **)v2 + 5), 2 * v4);
      ProcessHistory[(unsigned int)v4 + v7] = 0;
    }
    else
    {
      ProcessHistory = SdbpGetProcessHistory((WCHAR *)pContext, *((WCHAR **)v2 + 4), *((WCHAR **)v2 + 5));
      if( !ProcessHistory )
      {
        v10 = "Failed to retrieve process history";
        v11 = 353i64;
LABEL_17:
        AslLogCallPrintf(1ui64, (INT8 *)"SdbpInitializeSearchDBContext", v11, v10);
        return 0;
      }
    }
  }
  *((_QWORD *)v2 + 8) = ProcessHistory;
  result = SdbpCreateSearchPathPartsFromPath(ProcessHistory, (tagSEARCHPATH **)v2 + 9);
  if( result )
    *v2 |= 1u;
  return result;
}

Referenced by:

SdbpCheckMatchingDir
SdbpCheckMatchingFiles
SdbpCheckMatchingTextEntry
SdbpCheckMatchingWildcardFiles