I handle this all through shaders, but it was a bit of work to get setup. I'm not sure the performance implications this may have( testing and experience would dictate) but when you lock a buffer you are able to move bytes into and out of it. I would try keeping a local copy of the vertex data, and lock/fill the vb each time you adjust the mesh.
As for the adjusting, you have the triangle index, and with it you can find the exact vertices that this triangle is made up of. simply change the height component of those 3 vertices, lock and fill, and render as normal.
In my terrain editor in progress, http://www.gamedev.net/blog/900/entry-2259765-slow-days/, I use a height map for elevation data. When using the raise/lower tool, if the mouse is down while updating, i pick the terrain to get an x,z pair at the intersection, use those to get uv coordinates, and use the UV coords to render a small brush to the height map, which raises or lowers the heights in the area that the brush intersects.