Sure, the steps are basically as follows:
In order to control the motion of a character controller from the data embedded in the animation we need to extract the motion data from the animation.
The rotation is inherently there and can be left as there is no requirement to rotate the character controller. However, the horizontal displacement of the animated character from it's start position needs to be extracted from the animation.
The easiest way of doing this is to advance the animation each frame and using the root bone measure the displacement on the x and z axis from the start position in global space.
Things get a little more tricky as the animation will move physically with the character controller and so will be offset by the time the next frame comes around from the start position by the distance moved. So you need to recalculate the offsets each time and subtract these from the new animated root bone displacement to obtain the real global position for the character controller.
Once the target position is known, you can calculate the distance moved and, using the time delta value, the speed.
Using the current position of the character contoller and the new required position a vector can be constructed and normalised and then multiplied by the speed to obtain the velocity vector required to move the controller.
Prior to updating the CSkeleton matrix you need to reset the root bone position to it's start position in the animation to lock the animation position to the controller.
Once the animation completes then the start position in global space is reset to the current Controller position so that all motion from this point on is relative to the new position.
The vertical motion of the root bone also needs to be considered to deal with jump animations etc and needs to look at changes in the relative distance of the root bone from it's start position. This allows you to apply a vertical velocity component to the character controller if required for better collision control.
There are various alternate ways of extracting the data and utilising it to control the motion. It could all be done in local space and transformed to global space and the data could in theory be extracted once and stored in a lookup table and positional information extracted according to time with interpolation applied where necessary.
Due to complications with trying to do everything with one CSkeleton I was forced to use a second copy for the analysis and extraction and apply the changes to the first.
It may not be pretty but it works
Hopefully this gives you a bit more insight.