.686 .model flat, stdcall option casemap:none include ntstatus.inc include ntddk.inc include ntoskrnl.inc includelib ntoskrnl.lib .code szno db "CPU微码没有加载",0 szformat db "加载微码版本为%0d",0 DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING local state:dword ;int 3 pushad pushfd mov ECX, 008bh xor EAX, EAX xor EDX, EDX WRMSR ;//向MSR 8BH写0, 清除MSR中的信息 mov EAX, 0001 CPUID ;//读CPUID, 让CPU查看微码版本, 并把微码版本送到MSR 8B中 mov ECX, 008bh RDMSR ;//读出当前CPU微码版本 mov state,edx popfd popad .if state == 0 invoke DbgPrint,addr szno .else invoke DbgPrint,addr szformat,state .endif mov eax, 0 ret DriverEntry endp end DriverEntry ;made at 2011.08.18 ;本文改编自网上的相关代码。 檢查 CPU 能否執行 CPUID? //http://home.educities.edu.tw/wanker742126/ 並不是所有的 CPU 都能執行 CPUID 指令,例如 8086/88、80286、80386,當然啦,現在大概也找不到這些 CPU 了,不過還是把檢查的方法說一說。根據英特爾文獻,Intel? Processor Identification and the CPUID Instruction,的記載,如果 CPU 延伸旗標 ( EFLAG ) 的第 21 位元 ( 稱為 ID ) 可以由軟體寫入的話,那麼你的 CPU 可以執行 CPUID。底下是一段檢查的程式碼: ;如果程式可以改變 EFLAGE 的第 21 位元,那麼 CPUID 有效,否則無效 pushfd ;使延伸旗標推入堆疊 pop eax ;把堆疊中的延伸旗標彈出至 EAX mov ecx,eax ;保存舊的延伸旗標 xor eax,200000h ;改變強制延伸旗標第 21 位元 push eax ;把改變後新的延伸旗標推入堆疊 popfd ;存入延伸旗標 pushfd ;再取出延伸旗標 pop eax xor eax,ecx ;如果延伸旗標的第21位元為1,那麼 jz no_cpuid ;CPUID存在,否則不存在 ……可以執行 CPUID 指令…… no_cpuid: ……不能執行 CPUID 指令……
2012年7月5日星期四
cpu_microcode.asm
订阅:
博文评论 (Atom)
没有评论:
发表评论