verifier calls each context a "leak"

As part of chasing my problem getting hangs on “sc stop”, I have simplified
my mini-filter to do nothing but add a stream context to each stream
referenced by a pre-write. If the context already exists then I just
release the existing one instead of adding a new one. I don’t do a release
for the allocate but I do one for each get and set. This keeps the context
reference count at one which I verify with asserts everywhere. I keep these
created contexts on a list so that I can work with them in the unload
routine.

When I run this ultra simple filter with verify enabled, the verifier
bugchks after my unload routine with an error saying that I have X non-paged
memory leaks. X is always equal to the number of contexts I have created.

In my unload routine I have tried three different things to eliminate the
leaks. I loop through each context from my context list and perform the
action I am testing. Here are the results of each test:

  1. If I call FltReleaseContext on a context I get this error immediately
    during the call on the first one. I have observed this error before when I
    decrease the context ref count to zero:

*** Assertion failed: !FlagOn((CtxNode)->TreeLink.Flags,TNFL_IN_TREE)
*** Source File: d:\xpsprtm\base\fs\filtermgr\filter\contextsup.c, line 468

  1. If I call FltObjectDereference on a context I get this error immediately
    during the call on the first one:

*** Assertion failed: ((PFLT_OBJECT)(FltObject))->RundownRef.Count >=
EX_RUNDOWN_COUNT_INC
*** Source File: d:\xpsprtm\base\fs\filtermgr\filter\syncsup.c, line 113

  1. If I call FltDeleteContext on each context then I get the leaks error
    from the verifier, the same as not calling anything at all.

Can someone give me any idea of what is going on? What does it want from
me?