некий драйвер создает в csrss.exe поток с помощью ZwCreateThread. этому потоку жизненно необходимо узнать линейный адрес PEB, что он и делает с помощью mov eax fs:[30h]. при загруженной системе запуск драйвера происходит как по маслу - поток в csrss.exe создается, запускается и выполняет свои прямые обязанности. если же драйвер запускается со стартом системы, начинаются странные проблемы - mov eax, fs:[30h] в csrss.exe вызывает access violation. mov eax, fs:[18h] тоже. эта ошибка приводит к завершению csrss.exe и windows показывает нам красивый синий экран. ошибка при загрузке происходит не всегда. в 10% случаев (!) fs:[30h] все-таки указывает куда нужно, и загрузка проходит без эксцессов. вкупе с тем, что при уже загруженной системе инжект также замечательно работает, вариант с неверной инициализацией потока отпадает. дамы и господа, не могли бы вы подсказать - что ускользнуло от моего сознания? что может служить причиной столь непристойного поведения регистра fs? PS: значение fs для потока задается из драйвера и равно 0x38. ось - xp sp3
Значит юзермодный тред, нужна маска в сегментных регистрах в таком случае(RPL_MASK = 3). Ошибки не должно быть, опишите подробнее.
n0name Раз поток начал выполняться значит страница с TEB создана и дескриптор в GDT тоже для неё. Чтото явно не то, желательно на момент исключения посмотреть дескриптор и пр.
Clerk, n0name, спасибо огромное за помощь и правильные наводящие вопросы ошибка была все-таки в инициализации потока - при ручном создании контекста потока задавал ContextFlags с указанием неправильной архитектуры. теперь ума не приложу, почему в 10% случаев это работало. будьте внимательны, друзья!