LdrpResCompareResourceNames
NTSTATUS __stdcall LdrpResCompareResourceNames(
VOID *ModuleBase,
VOID *FileHandle,
UINT64 MappingSize,
UINT64 ResourceName,
const _IMAGE_RESOURCE_DIRECTORY *ResourceDirectory,
const _IMAGE_RESOURCE_DIRECTORY_ENTRY *ResourceDirectoryEntry,
UINT64 Flags,
INT64 *Return){
NTSTATUS v9;
__int64 Name;
unsigned __int16 *v13;
NTSTATUS v14;
__int64 v15;
v9 = 0;
if( ResourceDirectory && ResourceDirectoryEntry )
{
Name = ResourceDirectoryEntry->Name;
if( (ResourceName & 0xFFFFFFFFFFFF0000ui64) != 0 )
{
if( (int)Name >= 0 )
{
*(_DWORD *)Return = -1;
return v9;
}
LODWORD(Name) = Name & 0x7FFFFFFF;
v13 = (unsigned __int16 *)((char *)ResourceDirectory + Name);
if( (Flags & 0x1000) != 0
&& (v13 < (unsigned __int16 *)ResourceDirectory
|| (unsigned __int64)v13 > MappingSize + ((unsigned __int64)ModuleBase & 0xFFFFFFFFFFFFFFFCui64))
|| ((unsigned __int64)(v13 + 1) & 0xFFFFFFFFFFFF0000ui64) == 0 )
{
return -1073741701;
}
v14 = wcsncmp((const WCHAR *)ResourceName, v13 + 1, *v13);
if( v14 )
goto LABEL_18;
v15 = -1i64;
do
++v15;
while( *(_WORD *)(ResourceName + 2 * v15) );
if( v15 == *v13 )
{
LABEL_18:
*(_DWORD *)Return = v14;
return v9;
}
}
else
{
if( (int)Name >= 0 )
{
if( (Flags & 0x1000) == 0 || (Name & 0xFFFFFFFFFFFF0000ui64) == 0 )
{
*(_DWORD *)Return = ResourceName - Name;
return v9;
}
return -1073741701;
}
if( (Flags & 0x1000) != 0 && (Name & 0xFFFFFFFFFFFF0000ui64) == 0 )
return -1073741701;
}
*(_DWORD *)Return = 1;
return v9;
}
return -1073741811;
}Referenced by:
LdrpResSearchResourceInsideDirectory