kernel drivers

0

witam. czy ktoś ma doświadczenie w pisaniu sterowników i zechce się podzielić wiedzą ?
Potrzebuję pomocy w następujących punktach:

  1. Co jest przyczyną występowania błędu DRIVER_IRQL_IS_NOT_LESS_OR_EQUAL
    gdzieś wyczytałem, że występuje w momencie próby dostępu z poziomu Ring0 do pamięci stronicowanej
    jednak ja mam sekcję danych z ustawioną flagą NOT_PAGEABLE i u mnie również ten error wywala.
    w ogóle to ten błąd mnie prześladuje. nawet gdy nie próbuję odczytu zapisu danych pomiędzy Ring0 a Ring3
    Dzieje się tak często w momencie gdy próbuje zatrzymać uruchomiony sterownik (korzystam z gotowego progaramiku
    do rejestracji/ uruchamiania sterowników jeszcze nie napisałem własnego) - czasem po prostu wywala niebieską stronę
    z tym właśnie błędem
  2. Objaśnienie rejestru MSR - mam taki oto przykładowy fragmęt kodu:
    mov  ecx, 176h
    rdmsr
w programie wszystko fajnie - działa jednak nie mam pojęcia dla czego do ECX jest ładowana własnie taka a nie inna wartość
0

Nie odpowiem ci na konkretne pytania, ale zamiast używać jakiś dziwnych "programów do uruchamiania sterowników" polecam Visual Studio z dodatkiem VisualDDK i pisanie sterowników w C/C++, a nie assembly i debugowanie ich na maszynie wirtualnej, a nie własnym systemie.

0

Maszyna virtualna do testowania Kernel Drivers ... ???

1

Tak, jak najbardziej.

ps. *wirtualna.

0

No więc właśnie sprawdziłem na maszynie *Wirtualnej wszystko sobie działa elegancko i mogło by się wydawać, że kod jest ok jednak na prawdziwym kompie ten sam kod ... znowu znany mi doskonale niebieski ekranik z tym samym errorem o którym wspomniałem ....

0

OACR coś mówi? Jego wytyczne są dość rygorystyczne, ale warto wszystkie jego warningi wziąć pod uwagę.

0
  1. Co jest przyczyną występowania błędu DRIVER_IRQL_IS_NOT_LESS_OR_EQUAL

IRQL (Interrupt Request Level) to 'poziom przerwania' oznaczający jego ważność, tak że kiedy procesor dostaje jednocześnie kilkoma przerwaniami w twarz, może zacząć od najważniejszych (oraz żeby obsługa ważniejszego przerwania nie została przerwana przez mało ważne). Co twój sterownik może z tym mieszać - nie wiem.

  1. Objaśnienie rejestru MSR - mam taki oto przykładowy fragmęt kodu:

MSR - Machine Specific Register, rejestry spoza standardowego zestawu.
W tym przypadku akurat bardzo standardowy rejestr, IA32_SYSENTER_EIP - IP kodu który ma się wykonać po wykonaniu SYSENTER.

0

Tak dzięki już ustaliłem co z tym IRQL - problem polega na tym, że nie wziąłem pod uwagę faktu, że uruchamiam kod na wielordzeniowym procku ... to, że wykonam instrukcje CLI wcale nie znaczy, że kolejny procesor nie wykona przerwania .... no jeszcze nie wiem jak to rozwiązać.

Co twój sterownik może z tym mieszać - nie wiem.

Zeby odczytać MSR tym samym potrzebne eip trzeba wyłączyć przerwania.

0
codex napisał(a):

Zeby odczytać MSR tym samym potrzebne eip trzeba wyłączyć przerwania.
Z tego co wiem to nie trzeba.

1 użytkowników online, w tym zalogowanych: 0, gości: 1