Перечитал всю документацию (Intel). Везде написано что в режиме совместимости на интеловских процах инструкция syscall не поддерживается. Даже в описании SYSCALL ничего не сказано про MSR-регистр IA32_CSTAR. Но в этой же документации для инструкции SYSRET есть два опкода: для возврата в режим совместимости и в 64-битный режим (у него REX.W профикс). Как-то криво получается, из режима совместимости вызвать нельзя, а вернуться можно. На компе помимо 32-битной версии винды, стоит ещё и 64-битная (WinXP64), решил посмотреть как 32-битные проги вызывают системный сервис. Запустил OllyDebug, открыл процесс на отладку (кстати, он что-то глючит), в самом конце цепочки API функций стоит дальний прыжок с селектором 33, насколько я понял это прыжок на шлюз вызова. Писать программу переводящую процессор в long mode и моделирующую данную ситуацию вручную просто лень. Поэтому вопрос: всё-таки какие есть способы вызвать системный код в режиме совместимости? Пока я знаю только один способ который будет работать на Intel и AMD - через шлюз вызова.
А ты попробуй WinDbg. OllyDbg не может трасировать 64-битный код. Увидишь кое-что интересное. Переход происходит в сегмент 64-битного кода библиотеки wow64cpu.
По поводу cstar и lstar можно почитать вот эту запись, там у меня довольно сырой, но все же реверс http://lhc645.wordpress.com/2009/09/07/вызов-системных-сервисов-в-winxp-x64-notes/ также, здесь есть закрепленная тема по 32-х битные приложения под x64 (хотя с этим вы уже разобрались) http://wasm.ru/forum/viewtopic.php?id=37393 Отсюда следует вывод, что cstar использовать нельзя, в винде это нереализовано.