только что у себя проверил vmware workstation 5.5.3-34685 windows XP professional version 2002 service pack 2 computer Intel(R) Xeon(TM) CPU 2.40Ghz 2.39Ghz 256 MB of RAM код точь-в-точь как у тебя, только не инлайн а .asm (мне надо и 32 и 64) все работает на серверных системах давно протестили а на ХП - вот специально посмотрел
Ты нашел причину или просто место где падает? Если раньше не падало а сча начало падать -- что менял помниш?
разобрался очень приблизительно значицца так на той варе где упало было PAE я его выключил (boot.ini - /nopae /noexecute=alwaysoff) падать перестало рядом вара win2003x64sp1 там PAE всегда ON - и там все идеально работало и работает вывод делаю такой - vmware.exe чего-то свое хачит и ПО_ФАКТУ_НЕ_СЕТТИТ_WP_в_CR0_в_XPSP2 вообще говоря это АХТУНГ
Под VmWare с WinXP, WinXP SP2, Win2003 аналогичный код работает без вопросов. С PAE, без PAE, с DEP`ом и без него. Дизасм-листинг куска от cli до sti запости, плз
sasha_s Точно, в первом посте, проглядел. Подумал, что может быть фича компилятора с тем, что он не сохраняет регистры между последовательными __asm. Еще вариант - попробуй под Driver Verifier`ом прогнать. Может быть он что-нибудь более полезное в баг-чеке напишет.
wp.asm Код (Text): ;хотите BSOD? вызовите restore без предварительного disable ifdef _WIN64 .code public disable_write_protect disable_write_protect proc mov rax,cr0 mov qword ptr protect,rax btr rax,10h mov cr0,rax ret disable_write_protect endp public restore_write_protect restore_write_protect proc mov rax,qword ptr protect mov cr0,rax ret restore_write_protect endp .data protect dq 0 else .486p .model flat .code public disable_write_protect disable_write_protect proc mov eax,cr0 mov dword ptr protect,eax btr eax,10h mov cr0,eax ret disable_write_protect endp public restore_write_protect restore_write_protect proc mov eax,dword ptr protect mov cr0,eax ret restore_write_protect endp .data protect dd 0 endif end вызывается так: Код (Text): KeEnterCriticalRegion( ); disable_write_protect( ); *( TYPE_AcceptSecurityContext* )ptr = hook_AcceptSecurityContext; restore_write_protect( ); KeLeaveCriticalRegion( ); VMWare Server 1.0.0 build 28343 Computer AMD Opteron(TM) Processor 246 2.0 Ghz 256 Mb RAM версию ХП я писал выше на варе НИКОГДА не устанавливался софтайс с PAE падает но вроде с PAGE_FAULT, сейчас смотрю дамп без PAE - просто работает
Код (Text): ULONG_PTR UnprotectMemory() { ULONG_PTR oldCr0; _disable(); oldCr0 = __readcr0(); __writecr0(oldCr0 & (ULONG_PTR) 0xFFFFFFFFFFFEFFFF); _enable(); return oldCr0; } VOID ProtectMemory(IN ULONG_PTR oldCr0) { _disable(); __writecr0(oldCr0); _enable(); } Работает везде. Разницы хоть убей не вижу ЗЫ: VmWare Workstation 5.5.3, два разных билда
к сожалению не вижу как я могу этот твой код себе вставить собери маленький дрв и приаттач если интересно я проверю на падучей лабе
все как и прежде: без Айса падает с Айсом не падает Без Айса с /nopae тоже падает С Айсом и с Verifier-ом не падает
z0mailbox А смысла нет. Код генерится практически такой же. sasha_s Предположение: когда падает в баг-чек посмотри содержимое Cr0. Может быть WP оказывается установлен?
попытка прочитать и понять это http://kb.vmware.com/vmtnkb/search.do?cmd=displayKC&docType=kc&externalId=1889&sliceId=SAL_Public&dialogID=4901574&stateId=0%200%204899268&doctag=Author,%20KB%20Article привело к тяжелому ступору пойду выпью чего-нибудь завтра перечитаю
http://www.win2osx.net/forum/archive/index.php/t-1690.html Там по поводу Mac`ов под VmWare обсуждение. Фишка такая же - игра с флагом paevm и включением-выключением PAE в гостевой ОС приводит к странненьким результатам (здесь работает - а здесь... не работает...). По ходу дела, косяк VmWare. Может попробовать на версиях до 5.5 также держать его включенным?
короче народ я разобрался конкретно в моем случае. ВМВара и XP непричем... а дело в следующем: для сброса/востановления этого бита я использовал следующие макросы #define DISABLE_BIT(CR0Reg) \ __asm cli; \ __asm mov eax, cr0; \ __asm mov CR0Reg, eax; \ __asm and eax, 0xFFFEFFFF; \ __asm mov cr0, eax; \ #define ENABLE_BIT(CR0Reg) \ __asm mov eax, CR0Reg; \ __asm mov cr0, eax; \ __asm sti; \ соответственно код выглядел так: ULONG CR0Reg; DISABLE_BIT(CR0Reg); //какие-то манипуляции ENABLE_BIT(CR0Reg) ; вся ляля в том что этот бит не сбрасывался! А почему?! я поставил опцию для компилера (Visual Studio 6.0) "/EP" (Copies preprocessor output to standard output) посмотрел этот вывод... на месте макросов были строки: __asm cli; __asm mov eax, cr0; __asm mov CR0Reg, eax; __asm and eax, 0xFFFEFFFF; __asm mov cr0, eax;; и __asm mov eax, CR0Reg; __asm mov cr0, eax; __asm sti;; Но этот код не линкуется в бинарник. Вот сча глянул бинарник и обалдел, нет там этого кода, там от этих макросов тока по первой комманде: __asm cli; и __asm mov eax, CR0Reg; После вставки кода напрямую в исходник, без макросов -- все заработало! Макросы -- это ЗЛО! ВСЕМ СПАСИБО ЗА УЧАСТИЕ...