Objects flowing down the geometry pipeline are broken into separate channels. That is, the pipeline can operate on only portions of objects and not the entire thing as a whole. Some examples of channels that objects are broken into are the geometry portion (points), the topology portion (polygons or faces), the selection level of the object (object, face, vertex, etc.), and its texture coordinates. This allows the pipeline to operate more efficiently, by only copying the necessary data.
Modifiers must inform 3ds Max which channels they require to perform their modification. Copies of the needed channels are made and passed up the pipeline. 3ds Max will only pass copies of a minimum set of needed channels up the pipeline. If a certain channel is not required by any modifiers anywhere in a pipeline it is not copied and passed along.
Modifiers inform 3ds Max which channels they require by implementing the method Modifier::ChannelsUsed(). This list of channels must include the channels the modifier actually alters but may include more. Here is the implementation of Modifier::ChannelsUsed() by the Volume Select modifier:
ChannelMask ChannelsUsed() { return OBJ_CHANNELS; }
Note that OBJ_CHANNELS is defined as:
#define OBJ_CHANNELS \ (TOPO_CHANNEL | GEOM_CHANNEL | SELECT_CHANNEL | TEXMAP_CHANNEL | MTL_CHANNEL | SUBSEL_TYPE_CHANNEL | DISP_ATTRIB_CHANNEL | VERTCOLOR_CHANNEL | GFX_DATA_CHANNEL)
This means that the pipeline must have all these channels up to date in the object that gets passed to the modifier before it can properly do its work. Technically, this is actually overkill for the Normals modifier. It wouldn't need the TEXMAP_CHANNEL and VERTCOLOR_CHANNEL since they aren't in fact used. It really only needs the GEOM_CHANNEL, TOPO_CHANNEL, and the SELECT_CHANNEL.
For more information see the topic Indicating Required Channels.
A modifier must also inform 3ds Max which channels it will actually alter its function as a modifier. It does this by implementing the method Modifer::ChannelsChanged(). Here is the implementation of ChannelsChanged() by the Volume Select modifier:
ChannelMask ChannelsChanged() { return SELECT_CHANNEL|SUBSEL_TYPE_CHANNEL|GEOM_CHANNEL; }
This indicates that this modifier alters the selection channel, the sub-object selection channel, and the geometry channel. Note that the geometry channel is modified because the vertices themselves get selected via the vertSelBitArray in the Mesh class and are thus modified.
For more information see the topic Indicating Changed Channels.