Dispatch code running at APC_LEVEL

Hi,
Recently I found that occasionally my file system filter driver dispatch
routine, the one that is attached to file system dispatch routine, is called
at IRQL equal to APC_LEVEL. I don’t rise IRQL, use fast mutex or spin locks
to lock driver dispatch routine.
In this dispatch routine, I call some kernel system routines like
PsGetCurrentProcess() or RtlUnicodeStringToAnsiString(…). I have checked
the latest MSDN distributed “Windows 2000 DDK” documentation, where it is
explicitly written that this two routines must(!) be called at IRQL
PASSIVE_LEVEL.
My questions are:

  1. How exact this information in DDK help file is, since the PAGED_CODE()
    macro from DDK asserts if IRQL<dispatch_level another confusing item here>is that for example the “IFS Kit Documentation” specifies
    IRQL<dispatch_level for its description of rtlunicodestringtoansisize>while the “Windows 2000 DDK” documentation for the same function(!)
    specifies IRQL PASSIVE_LEVEL.

    2. What are the consequences if such (must PASSIVE_LEVEL) system functions
    are called at IRQL APC_LEVEL? My understanding is that in that case the APC
    calls delivery will be masked and this can be the problem if
    RtlUnicodeStringToAnsiString(…) or other must PASSIVE_LEVEL functions,
    will register an APC and wait for their completion. Right?

    Thanks for any information that will help me to understand better “How it
    works”.
    WBR Primoz
    p.s: I posted this question to the NTFSD mailing list, but got no responses.
    It can be that I’m asking stupid questions, but I’m new to driver
    development.


    You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
    To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com</dispatch_level></dispatch_level>