SdbpResolveMatchingFile
NTSTATUS __stdcall SdbpResolveMatchingFile(
VOID *hSDB,
tagSEARCHDBCONTEXT *pContext,
WCHAR *szMatchFile,
UINT64 nMatchFileLength,
tagSEARCHPATHPART *pSearchPathPart,
WCHAR **szFullPathOut){
WCHAR **v6;
int v7;
NTSTATUS v11;
tagSEARCHPATHPART *v12;
NTSTATUS v13;
UINT64 v14;
VOID *v15;
INT64 v16;
UINT64 v17;
WCHAR *v18;
WCHAR *v19;
UINT64 v20;
__int64 v21;
INT8 *v23;
UINT64 v24;
unsigned __int64 v25;
unsigned __int64 v26;
INT8 *v27;
UINT64 v28;
INT64 ResolveForWow64;
UINT64 pullResult;
WCHAR *NetworkPathNtOut;
__int16 v34;
v6 = szFullPathOut;
v7 = nMatchFileLength;
pullResult = 0i64;
NetworkPathNtOut = 0i64;
*szFullPathOut = 0i64;
v34 = -1;
v11 = 0;
LOWORD(szFullPathOut) = -1;
if( !(_DWORD)nMatchFileLength )
{
v23 = "Invalid match file length";
v24 = 561i64;
goto LABEL_28;
}
v12 = pSearchPathPart;
if( *szMatchFile != 37 )
{
v25 = (unsigned int)pSearchPathPart[2];
v26 = v25 + (unsigned int)nMatchFileLength;
if( v26 >= v25 )
{
v14 = v26 + 1;
if( v26 + 1 >= v26 )
goto LABEL_6;
v24 = 617i64;
}
else
{
v24 = 612i64;
}
LABEL_42:
v23 = (INT8 *)"Invalid path size";
goto LABEL_28;
}
if( AslEnvGetProcessWowInfo(&szFullPathOut, &v34) < 0 )
{
v23 = (INT8 *)"AslEnvGetProcessWowInfo failed [%x]";
v24 = 582i64;
goto LABEL_28;
}
AslImageFileToArchitecture(*((_WORD *)hSDB + 288));
LOWORD(ResolveForWow64) = (_WORD)szFullPathOut;
v13 = AslEnvExpandStrings2(*((PVOID *)pContext + 7), szMatchFile, 0i64, 0i64, &pullResult, ResolveForWow64);
if( (int)(v13 + 0x80000000) >= 0 && v13 != -1073741789 )
{
v23 = (INT8 *)"AslEnvExpandStrings2 failed [%x]";
v24 = 599i64;
LABEL_28:
AslLogCallPrintf(1ui64, (INT8 *)"SdbpResolveMatchingFile", v24, v23);
return v11;
}
v14 = 2 * pullResult;
LABEL_6:
if( v14 + 20 < v14 )
{
v24 = 623i64;
goto LABEL_42;
}
pullResult = v14 + 20;
if( RtlULongLongMult(v14 + 20, 2ui64, &pullResult) < 0 )
{
v23 = "Invalid buffer size";
v24 = 628i64;
goto LABEL_28;
}
v17 = pullResult;
if( pullResult < 0x208 )
v17 = 520i64;
v18 = (WCHAR *)AslAlloc(v15, v17, v16);
v19 = v18;
if( !v18 )
{
v23 = (INT8 *)"Out of memory";
v24 = 636i64;
goto LABEL_28;
}
if( *szMatchFile != 37 )
{
memmove(v18, *(const VOID **)v12, 2 * v12[2]);
memmove(&v19[v12[2]], szMatchFile, 2 * (v7 + 1));
v20 = v17 >> 1;
goto LABEL_14;
}
if( AslEnvGetProcessWowInfo(&szFullPathOut, &v34) < 0 )
{
v27 = (INT8 *)"AslEnvGetProcessWowInfo failed [%x]";
v28 = 648i64;
LABEL_37:
AslLogCallPrintf(1ui64, (INT8 *)"SdbpResolveMatchingFile", v28, v27);
goto LABEL_21;
}
AslImageFileToArchitecture(*((_WORD *)hSDB + 288));
LOWORD(ResolveForWow64) = (_WORD)szFullPathOut;
v20 = v17 >> 1;
if( AslEnvExpandStrings2(*((PVOID *)pContext + 7), szMatchFile, v19, v20, &pullResult, ResolveForWow64) >= 0 )
{
LABEL_14:
if( AslPathClean(v19, v19, v20) >= 0 )
{
if( AslPathToNetworkPathNt(&NetworkPathNtOut, v19) >= 0 )
{
ExFreePoolWithTag(v19, 0x74705041u);
v19 = NetworkPathNtOut;
}
else if( wcsnicmp(v19, L"\\??\\", 4u) )
{
v21 = -1i64;
do
++v21;
while( v19[v21] );
memmove(v19 + 4, v19, 2 * v21 + 2);
*(_QWORD *)v19 = *(_QWORD *)L"\\??\\";
}
*v6 = v19;
v11 = 1;
v19 = 0i64;
goto LABEL_21;
}
v27 = (INT8 *)"AslPathClean failed [%x]";
v28 = 690i64;
goto LABEL_37;
}
AslLogCallPrintf(
1ui64,
(INT8 *)"SdbpResolveMatchingFile",
0x299ui64,
(INT8 *)"AslEnvExpandStrings2 failed to expand strings for %ws [%x]");
LABEL_21:
if( v19 )
ExFreePoolWithTag(v19, 0x74705041u);
return v11;
}Referenced by:
SdbpCheckMatchingDir
SdbpCheckMatchingFiles
SdbpCheckMatchingTextEntry
SdbpCheckMatchingWildcardFiles