Step 0: A timer is associated with every item in the queue.
Step 1: Queued Irp and released spinlock.
Step2: Initialize timer, SetTimer().
Step3: Cancel Timer, CompleteIrp().
Now if get step 1 to step 3 as in sequence, NO problem.
If step 1 occurs and step 3(which is happening in my case and
CancelTimer can bring surprises becoz Step2 has not yet started), I
want to move InitializeTimer to Step1 and to gaurantee it is
initialised, I want to move it into SpinLock but as usual DDK never
agrees with whatever I plan.
I always feel my hands are tied when I am developing Microsoft
programs or drivers 