[pso] IRQL_NOT_LESS_OR_EQUAL

Matei Gruber matei.gruber at gmail.com
Sun Apr 19 22:52:10 EEST 2009


Multumesc Gabriel.

1. Abordarea driverului meu a fost sa marchez IRP-urile ca pending si
sa le completez pe masura ce primesc data dintr-un DpcForIsr, pornit
din ISR. Dat fiind ca din DPC nu pot accesa memorie paginata, (care
cred ca este cazul bufferelor asociate IRP), n-am cum sa completez
bufferele. Este viabila o astfel de abordare?

2. In DPC fac toata treaba.

3. Am dat google dupa DIRQL operations si n-am gasit nimic.

4. Am gasit punctul in care crapa driverul tocmai cu !analyze -v.

Matei

2009/4/19 Gabriel Bercea <gamitech at gmail.com>:
>>
>>3. Pot sa accesez memorie paginata din DPC?
>>
> NU. DPC = IRQL DISPATCH_LEVEL
>
>>
>>2. Deci, recomandarea ar fi sa declansez un DpcForIsr din Intrerupere
>>si sa ma uit acolo la IRPuri?
>>
>
> In ISR nu este recomandat sa faci atata overhead. De aia exista DPC.
>
>>
>>1. Ca sa vad daca IRP-ul este un read sau un write. In ISR scot date
>>din IRP-urile de write, si completez IRP-urile de read. Stiu, este
>>destul de heavy pentru un ISR.
>>
>
> Check DIRQL operations.
>
> Hints:
>
> Data viitoare cand iei BSOD arata si tu output de la !analyze -v , chiar nu
> ajuta cu mare lucru ce ai spus mai sus.
> Cum de esti sigur ca acolo crapa driverul ?
> Try:
>
> !isr
> !locks
> !apc
> !thread
>
> Ajuta.
>
>
>
> 2009/4/19 Matei Gruber <matei.gruber at gmail.com>
>>
>> Salut.
>>
>> 0. Multumesc Razvan.
>>
>> 1. Ca sa vad daca IRP-ul este un read sau un write. In ISR scot date
>> din IRP-urile de write, si completez IRP-urile de read. Stiu, este
>> destul de heavy pentru un ISR.
>>
>> 2. Deci, recomandarea ar fi sa declansez un DpcForIsr din Intrerupere
>> si sa ma uit acolo la IRPuri?
>>
>> 3. Pot sa accesez memorie paginata din DPC?
>>
>> Matei
>>
>> 2009/4/19 Razvan Deaconescu <razvan.deaconescu at cs.pub.ro>:
>> > On Sun, 2009-04-19 at 21:43 +0300, Matei Gruber wrote:
>> >> Salut,
>> >>
>> >> Îmi crapă driverul de UART pe windoze cu IRQL_NOT_LESS_OR_EQUAL din
>> >> cauza unui access la memorie pe întrerupere. În intrerupere accesez
>> >> device objectul (non-pageable) și o listă de obiecte alocate din
>> >> NonPagedPool. Îmi intră swapperul și văd BSOD când fac din ISR
>> >>
>> >> if (IoGetCurrentIrpStackLocation(irp)->MajorFunction != IRP_MJ_READ)
>> >> ...
>> >
>> > De ce faci acces la campul MajorFunction din intrerupere? Cine este
>> > IRP-ul primit?
>> >
>> >> MSDN zice că funcția e safe la orice IRQL, dar nu știu dacă IRP-urile
>> >> și stivele asociate pot fi paginate. Poate fi accesarea acestor zone
>> >> din context DPC o soluție?
>> >
>> > Nu stiu exact ce faci in rutina de tratare a intreruperii dar, in mod
>> > normal, operatii de acest gen e bine sa le executi la PASSIVE_LEVEL
>> > (context proces) sau DISPATCH_LEVEL (DPC).
>> >
>> > Razvan
>> >
>> > _______________________________________________
>> > pso mailing list
>> > pso at cursuri.cs.pub.ro
>> > http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/pso
>> >
>> _______________________________________________
>> pso mailing list
>> pso at cursuri.cs.pub.ro
>> http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/pso
>
>
> _______________________________________________
> pso mailing list
> pso at cursuri.cs.pub.ro
> http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/pso
>
>


More information about the pso mailing list