Clerk нет, всё-таки это недоразумение =) вообще говоря, весьма неосмотрительно со стороны MS вызывать пользовательские хендлеры при захваченной КС. и в висте это очень просто исправили: каждый элемент списка хендлеров содержит UsageCount, который увеличивается перед вызовом хендлера и уменьшается после. такие операции, как чтение указателя на новый элемент списка, уменьшение и увеличение UsageCount – выполняются при эксклюзивно захваченном SRWLock, охраняющем список. а если после уменьшения UsageCount достигает нуля (кто-то вызвал RemoveVectored*Handler() во время выполнения хендлера), то элемент списка удалеятся (тоже при захваченном SRWLock). хендлер выполняется вне блокировки, да и вообще блокировка применяется лишь на время выполнения нескольких инструкций =)
je_ Код (Text): Counter = 00010000 Imm SEH-RETURN restoring Regs : 00002A95 Full SEH-RETURN Context86 flags 00010003: 00003A11 (Full - Imm) : 00000F7C Full SEH-RETURN Context86 flags 00010007: 000039C3 (Full - Imm) : 00000F2E Full SEH-RETURN Context86 flags 0001000F: 00003DEA (Full - Imm) : 00001355 Full SEH-RETURN Context86 flags 0001001F: 00003F13 (Full - Imm) : 0000147E Full SEH-RETURN Context86 flags 0001003F: 000040AE (Full - Imm) : 00001619 IRETD Ring3>Ring3 times: 0000019C
je_ Код (Text): INT-gate Ring3 times: 00000151 INT-IRETD Ring3>>Ring3 times: 0000030E Не понятно что за цифры. В процессоре два ядра. Следует повышать приоритет и устанавливать аффинитет в 1 перед началом измерений. Вобщем смысла нет это мерить, результаты очевидны #36, 37. Если нормально измерять, то следует использовать таймер апик, измерения проводить с замаскированными прерываниями(следует залочить память к которой будет происходить в юзермоде обращение, страничное нарушение приведёт к краху, чтобы избежать его придётся патчить ядро), дабы тред исполнился в юзермоде без прерываний(планирования), иначе результаты описывают задержки с учётом планирования и других прерываний.
Вобщем у толпы одни и теже вопросы. Есть два типа ошибок. Первый нэйтивный, или ядерный, имеет префикс STATUS_*. Второй тип пользовательский. Оба кода ошибки находятся в TEB по разным смещениям. Функция RtlGetLastNtStatus() возвращает статус(точнее именно статус, это не обязательно ошибка, код формируется определённым образом), тоесть нэйтивный код ошибки. Функция RtlNtStatusToDosErrorNoTeb() конвертирует статус в пользовательский код ошибки, который и возвращает функция GetLastError(), без загрузки этого кода в TEB. Функция RtlNtStatusToDosError() юзает предыдущую функцию, в добавок она загружает статус в TEB, откуда он может быть считан посредством RtlGetLastNtStatus(). Конвертируются коды особым образом. Соответствия обоиму типу кодов можно увидеть в файле generr.c тут http://indy-vx.narod.ru/Temp/nterr.zip Описания соответственно в файлах ntstatus.h и winerr.h Теперь почему не следует юзать пользовательские коды ошибкок. Они причина заблуждений. Например смотрим соответствие: RtlNtStatusToDosError(STATUS_INVALID_CID) = ERROR_INVALID_PARAMETER, после чего GetLastError() = ERROR_INVALID_PARAMETER. Тоесть статус чётко определяет что CID передан не валидный, но винапишный код это не возвращает, а указывает что какойто параметр инвалидный. Для различных ошибок будет возвращаться один и тотже винапишный код: Распространённая ошибка - ERROR_ACCESS_DENIED. Причины: Например не можите вы с описателем потока чтото сделать, мб это STATUS_THREAD_IS_TERMINATING, тоесть он уже завершился.. Или например распространённая ошибка ERROR_NOACCESS - соответственно статус: Это может быть не выравненные данные, либо исключение по доступу к данным изза инвалидного указателя. Теперь вы юзаете нэйтивные коды ошибок. Вопросы ?
На коленке писал Прога делает лог NT_STATUS и переводит все на русский язык, все ошибки и тп в системе, делалось на коленке как POC для себя. Бинарь. https://www.sendspace.com/file/49yjgr Password: 2VdXz0cBQJ Сорцы https://www.sendspace.com/file/s0pqy5 Password: WRzDr4uJB
RET, Можно запилить годный логгер, но вы понимаете суть данной темы и почему это не нужно ? - если ньюби использует какой то такой метод, это не даст ему понять суть. Тогда без инструментов решение задачи будет невозможно. Поэтому никакой инструмент в данной теме не приемлем. Годится только отладка и изучение механизмов.