По первой ссылке видно -- была в каждом файле отдельная таблицаstatic struct unix_funcs unix_funcs =
{
- NtUserDrawCaptionTemp,
- NtUserDrawMenuBarTemp,
- NtUserEndPaint,
- NtUserExcludeUpdateRgn,
- NtUserReleaseDC,
- NtUserScrollDC,
- NtUserSelectPalette,
- NtUserUpdateLayeredWindow,
и вызывался сервис (системная функция) вот так:
BOOL WINAPI NtUserDrawCaptionTemp( HWND hwnd, HDC hdc, const RECT *rect, HFONT font,
HICON icon, const WCHAR *str, UINT flags )
{
if (!unix_funcs) return FALSE;
return unix_funcs->pNtUserDrawCaptionTemp( hwnd, hdc, rect, font, icon, str, flags );
}
Теперь обобщили и всё вызывается через единый переходник. Про цели не знаю. В оригинальной NT с каждым ядром и сервипаком индексы системных сервисов меняются, потому их и там наверняка и в вирусах используют лишь в исключительных случаях; так что вряд ли это что-то даст для совместимости. Вероятно, так удобнее поддерживать.
По скорости вызова мало что изменилось, добавилась одна команда для вычисления адреса в таблице по индексу сервиса. Косвенное обращение в и в предыдущем варианте есть. Предсказатель в данном случае смотрит на адрес, откуда был вызов и предшествующие команды, а не адрес в таблице переходов:
2.4.2.3 Branch Prediction
Branch prediction predicts the branch target and enables the processor to begin executing instructions
long before the branch true execution path is known. All branches utilize the branch prediction unit (BPU)
for prediction. This unit predicts the target address not only based on the EIP of the branch but also
based on the execution path through which execution reached this EIP. The BPU can efficiently predict the
following branch types:
• Conditional branches.
• Direct calls and jumps.
• Indirect calls and jumps.
• Returns.