Пробую написать драйвер и пообщаться с IOAPIC но поподаю на BSOD может кто что подскажет? Код (Text): IOAPIC=0FEC00000h fastcall MmMapIoSpace,IOAPIC,4*1024,MmNonCached mov dword ptr [eax],10h mov eax,dword ptr [eax+10h] push eax fastcall MmUnmapIoSpace,ebx,4*1024
для полноты картины Код (Text): mov eax, dwAddress xchg eax,ebx; << предлогаю это опустить под вызов MmMapIoSpace fastcall MmMapIoSpace,IOAPIC,4*1024,MmNonCached; << память мапим, получаем адрес региона в еах mov dword ptr [eax],10h mov eax,dword ptr [eax+10h] push eax fastcall MmUnmapIoSpace,ebx,4*1024; << анмапим левую память, указатель на которую в ebx=dwAddress... pop eax
Freeman Бсод раньше так что это не влияет. Поправил. пробвал так Код (Text): fastcall MmMapIoSpace,IOAPIC,4*1024,MmNonCached mov ebx,eax fastcall MmUnmapIoSpace,ebx,4*1024 Всеравно бсод.
Судя по этому и тому что пишут. BSOD происходит из-за того что IRQL не того уровня. Нужно поднять уровень привелегий, а как это сделать?
http://www.osronline.com/ddkx/kmarch/k106_9j5e.htm KeRaiseIrql http://www.osronline.com/DDKx/kmarch/k105_02eq.htm
Есть баги 1) fastcall юзается вместо stdcall (invoke) 2) нет проверки на null от MmMapIoSpace 3) 1-й параметр MmMapIoSpace 8байт, хз что в masm с приведением типов А приоритет тут непричем.
IRQL тут не при чем =) у винды любой пейдж фаулт при irql>1 это сразу IRQL_NOT_LESS_OR_EQUAL, проблема в повреждении памяти, которая у тебя возникала изза неправильной конвенции вызова. вывод: юзать си, где контролируются типы =))