Hm I think there still might be a crash.

There is a critical code:
#1 obtain block pointer and compare with NULL
#2 increment ref count

Which obviously can't be atomic with InterlockedXXX:
There might be a thread which between #1 and #2 invokes delete on block.
Maybe I am wrong.