SdbpResolveMatchingFile

INT64 __fastcall SdbpResolveMatchingFile(INT64 a1, INT64 a2, const WCHAR *a3, UINT64 a4, INT64 a5, WCHAR **a6){
  WCHAR **v6; 
  int v7; 
  unsigned int v11; 
  INT64 v12; 
  int ProcessWowInfo; 
  NTSTATUS v14; 
  ULONGLONG v15; 
  VOID *v16; 
  INT64 v17; 
  UINT64 v18; 
  UINT8 *v19; 
  WCHAR *v20; 
  int v21; 
  __int16 v22; 
  UINT64 v23; 
  NTSTATUS v24; 
  __int64 v25; 
  unsigned __int64 v27; 
  unsigned __int64 v28; 
  UINT64 v29; 
  const CHAR *v30; 
  UINT64 v31; 
  UINT64 *ReturnedLength; 
  INT64 ResolveForWow64; 
  INT64 ResolveForWow64a; 
  __int16 v35; 
  ULONGLONG pullResult; 
  WCHAR *NetworkPathNtOut; 
  __int16 v40; 
  v6 = a6;
  v7 = a4;
  pullResult = 0i64;
  NetworkPathNtOut = 0i64;
  *a6 = 0i64;
  v40 = -1;
  v11 = 0;
  LOWORD(a6) = -1;
  if( !(_DWORD)a4 )
  {
    AslLogCallPrintf(1ui64, "SdbpResolveMatchingFile", 0x231ui64, "Invalid match file length");
    return v11;
  }
  v12 = a5;
  if( *a3 != 37 )
  {
    v27 = *(unsigned int *)(a5 + 8);
    v28 = v27 + (unsigned int)a4;
    if( v28 >= v27 )
    {
      v15 = v28 + 1;
      if( v28 + 1 >= v28 )
        goto LABEL_6;
      v29 = 617i64;
    }
    else
    {
      v29 = 612i64;
    }
LABEL_43:
    AslLogCallPrintf(1ui64, "SdbpResolveMatchingFile", v29, "Invalid path size");
    return v11;
  }
  ProcessWowInfo = AslEnvGetProcessWowInfo(&a6, &v40);
  if( ProcessWowInfo < 0 )
  {
    AslLogCallPrintf(1ui64, "SdbpResolveMatchingFile", 0x246ui64, "AslEnvGetProcessWowInfo failed [%x]", ProcessWowInfo);
    return v11;
  }
  AslImageFileToArchitecture(*(_WORD *)(a1 + 576));
  LOWORD(ResolveForWow64) = (_WORD)a6;
  v14 = AslEnvExpandStrings2(*(PVOID *)(a2 + 56), (PWCHAR)a3, 0i64, 0i64, &pullResult, ResolveForWow64);
  if( (int)(v14 + 0x80000000) >= 0 && v14 != -1073741789 )
  {
    LODWORD(ReturnedLength) = v14;
    AslLogCallPrintf(1ui64, "SdbpResolveMatchingFile", 0x257ui64, "AslEnvExpandStrings2 failed [%x]", ReturnedLength);
    return v11;
  }
  v15 = 2 * pullResult;
LABEL_6:
  if( v15 + 20 < v15 )
  {
    v29 = 623i64;
    goto LABEL_43;
  }
  pullResult = v15 + 20;
  if( RtlULongLongMult(v15 + 20, 2ui64, &pullResult) < 0 )
  {
    AslLogCallPrintf(1ui64, "SdbpResolveMatchingFile", 0x274ui64, "Invalid buffer size");
    return v11;
  }
  v18 = pullResult;
  if( pullResult < 0x208 )
    v18 = 520i64;
  v19 = (UINT8 *)AslAlloc(v16, v18, v17);
  v20 = (WCHAR *)v19;
  if( !v19 )
  {
    AslLogCallPrintf(1ui64, "SdbpResolveMatchingFile", 0x27Cui64, "Out of memory");
    return v11;
  }
  if( *a3 != 37 )
  {
    memmove(v19, *(UINT8 **)v12, 2i64 * *(unsigned int *)(v12 + 8));
    memmove((UINT8 *)&v20[*(unsigned int *)(v12 + 8)], (UINT8 *)a3, 2i64 * (unsigned int)(v7 + 1));
    v23 = v18 >> 1;
    goto LABEL_16;
  }
  v21 = AslEnvGetProcessWowInfo(&a6, &v40);
  if( v21 < 0 )
  {
    v30 = "AslEnvGetProcessWowInfo failed [%x]";
    v31 = 648i64;
LABEL_38:
    LODWORD(ReturnedLength) = v21;
    AslLogCallPrintf(1ui64, "SdbpResolveMatchingFile", v31, v30, ReturnedLength);
    goto LABEL_23;
  }
  v22 = AslImageFileToArchitecture(*(_WORD *)(a1 + 576));
  if( v22 == -1 )
    v22 = v40;
  v35 = v22;
  LOWORD(ResolveForWow64) = (_WORD)a6;
  v23 = v18 >> 1;
  v24 = AslEnvExpandStrings2(*(PVOID *)(a2 + 56), (PWCHAR)a3, v20, v23, &pullResult, ResolveForWow64);
  if( v24 >= 0 )
  {
LABEL_16:
    v21 = AslPathClean(v20, v20, v23);
    if( v21 >= 0 )
    {
      if( (int)AslPathToNetworkPathNt(&NetworkPathNtOut, v20) >= 0 )
      {
        ExFreePoolWithTag(v20, 0x74705041u);
        v20 = NetworkPathNtOut;
      }
      else if( wcsnicmp(v20, L"\\??\\", 4ui64) )
      {
        v25 = -1i64;
        do
          ++v25;
        while( v20[v25] );
        memmove((UINT8 *)v20 + 8, (UINT8 *)v20, 2 * v25 + 2);
        *(_QWORD *)v20 = *(_QWORD *)L"\\??\\";
      }
      *v6 = v20;
      v11 = 1;
      v20 = 0i64;
      goto LABEL_23;
    }
    v30 = "AslPathClean failed [%x]";
    v31 = 690i64;
    goto LABEL_38;
  }
  LODWORD(ResolveForWow64a) = v24;
  AslLogCallPrintf(
    1ui64,
    "SdbpResolveMatchingFile",
    0x299ui64,
    "AslEnvExpandStrings2 failed to expand strings for %ws [%x]",
    a3,
    ResolveForWow64a,
    v35);
LABEL_23:
  if( v20 )
    ExFreePoolWithTag(v20, 0x74705041u);
  return v11;
}

Referenced by:

SdbpCheckMatchingDir
SdbpCheckMatchingFiles
SdbpCheckMatchingTextEntry
SdbpCheckMatchingWildcardFiles