Windows System Software -- Consulting, Training, Development -- Unique Expertise, Guaranteed Results

Before Posting...
Please check out the Community Guidelines in the Announcements and Administration Category.

More Info on Driver Writing and Debugging

The free OSR Learning Library has more than 50 articles on a wide variety of topics about writing and debugging device drivers and Minifilters. From introductory level to advanced. All the articles have been recently reviewed and updated, and are written using the clear and definitive style you've come to expect from OSR over the years.

Check out The OSR Learning Library at:

How to acknowledge Win7 oplocks and get NewOplockLevel pended?

Fernando_RobertoFernando_Roberto Member - All Emails Posts: 198

Hi there!

When you have a legacy Level 1 oplock broken with FILE_OPLOCK_BROKEN_TO_LEVEL_2, you get the FSCTL_OPLOCK_BREAK_ACKNOWLEDGE IRP pended, so that you can be notified whenever the Level 2 oplock breaks. That means you can acknowledge the first oplock break and wait for the new oplock level to be broken using only one IRP.

As far as I could understand, this is not possible when using Win7 oplocks. When you have an RW oplock broken to R (from REQUEST_OPLOCK_OUTPUT_BUFFER.NewOplockLevel), you must first acknowledge the oplock break, and this IRP will always complete, then you must request a new R oplock that will be pended until the oplock breaks to none.

Is that true?
Am I missing anything?


Fernando Roberto da Silva
DriverEntry Kernel Development


  • Scott_Noone_(OSR)Scott_Noone_(OSR) Administrator Posts: 3,376

    That sounds right to me.


  • Fernando_RobertoFernando_Roberto Member - All Emails Posts: 198

    We have a layered file system which is managing its cache based on the oplock state we get from the underlying file system. Initially we request an RW oplock to build a cache for read and write requests we receive.

    Now, besides flushing the cache when I see the oplock break from RW to R, this Win7 behavior is forcing me to purge all cache data. This is because there is a time window between acknowledging the RW oplock break and requesting a new R oplock on the same file stream. There is no way of knowing whether the file has been changed since the acknowledge was received.

    Does anyone know a better way of dealing with this and prevent the cache from being purged? I mean, just like we used to do on legacy oplock by having FSCTL_OPLOCK_BREAK_ACKNOWLEDGE IRP pended until the Level 2 oplock breaks to None.

    Thanks in advance,

    Fernando Roberto da Silva
    DriverEntry Kernel Development

Sign In or Register to comment.

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Upcoming OSR Seminars
OSR has suspended in-person seminars due to the Covid-19 outbreak. But, don't miss your training! Attend via the internet instead!
Writing WDF Drivers 7 Dec 2020 LIVE ONLINE
Internals & Software Drivers 25 Jan 2021 LIVE ONLINE
Developing Minifilters 8 March 2021 LIVE ONLINE