LODSD загружает слово из того, на что указывает ESI, в EAX, а затем увеличивает ESI на 4 (указывая на следующее слово).
Вы просматриваете низкоуровневый обратный вызов клавиатуры , в соответствии с MSDN вызов обратного вызова поместит указатель на KBDLLHOOKSTRUCT в lParam, MOV ESI, [lParam] помещает это указатель в ESI для последующего использования LODSD.
Структура содержит виртуальный ключевой код, за которым следуют код сканирования, некоторые флаги, временную метку и указатель на дополнительную информацию, каждая длиной в DWORD. Таким образом, первый LODSD считывает vkcode в EAX, а следующий читает код сканирования в (и перезаписывает) EAX. Затем он сдвигает код сканирования с битов 0-7 на биты 16-23 для последующего использования GetKeyNameText . EAX и ECX затем меняются местами.
Следующий LODSD считывает флаги, связанные с нажатием клавиши, флаг, который указывает, была ли нажата расширенная клавиша (Fxx или клавиши от цифровой клавиатуры и т. Д.), На бит 0, он и другие биты сдвинуты на бит 24 и далее, заполняя младшие биты 0. Затем ИЛИ выполняет двоичное ИЛИ скан-кода в битах 16-23 в ECX и флаг расширенного ключа в бите 24 в EAX, объединяя все биты в ECX. (Двоичное ИЛИ устанавливает каждый бит в 1, когда один или оба исходных бита установлены в 1, в противном случае 0), эта информация затем передается в GetKeyNameText, чтобы получить текстовое представление нажатой клавиши, например CAPSLOCK или LEFT SHIFT, в 32-байтовом символе буфер.