IoGetBaseFileSystemDeviceObject

Are the following correct?

1- There are two separate dev obj stacks for a storage device, initiated by the driver for the physical device, and another initiated by a file system driver? Also, it is true that there will be no VPB for the device until the filesys driver opens a file on the device, or is the VPB actually established when the filesys driver initializes?

2- Calling IoGetBaseFileSystemDeviceObject(pFileObj ) on a file object representing, say, "C:" is the same as using pFileObj->Vpb->RealDevice, hence yielding the lowest object on the physical device object stack? Likewise, does pFileObj->Vpb->DeviceObject yield the lowest object on the filesys stack?

3- Given an arbitrary device object, is the way to tell if the object is on the physical device stack rather than the filesys stack, the name field in the object will be non-null?

Thanks.