How (Where) is FilterAddDevice routine called ??

I am new in driver programming.I am debugging a filter driver ,which runs very well when my system has BASIC disks, but crashes when there is a DYNAMIC disk.
Using WINDBG ,i have the faulting code :

{ .

**** —> deviceExtension = (PDEVICE_EXTENSION)((PDEVICE_OBJECT)(*(pTempDeviceObject +i))->DeviceExtension);

if(DriveLetter==‘0’) //

**** This statement seems to be generating exception (Access violation)

pTempDeviceObject is an array of device objects filled by FilterAddDevice(IoCreateDevice) routine.

FilterAddDevice is getting called to fill up the pTempDeviceObject array, for volumes on basic disk.

but it doesn’t seem to be filling up the array, for volumes on dynamic disk.

for eg. if there are 2 volumes on Basic disk and 1 volume on Dynamic disk, FilterAddDevice is called only twice.

(This is what is making me believe that device object for dynamic volume is not getting created)

???- I am not able to get ,what (Where / How ) exactly calls the FilterAddDevice to fill up the pTempDeviceObject, so that i can make necessary changes to support dynamic disks as well.

I have an unclear idea that pnp manager has got some role in calling FilterAddDevice routine