You really don't want to read from buffers because you never know where it is in the pipeline and you will normally end up with +20ms of GPU-CPU synchronization.
Even with a copy to a staging resource marked for reading you will still have a large stall if the buffer is still in use on the GPU before you copy it to the staging resource.
If you need access to the vertex\index buffer then just use the CPU side data you had before you built your buffer and then just reupload with a map\unmap or updatesubresource call if the data has changed.
To read from a buffer that is non readable you first need to setup a staging resource that can not be bound to the pipeline in anyway then you copy your vertex\index buffer to the staging resource and then read from that buffer.
Setting up the staging resource:
bufferDescription.BindFlags = BindFlags.None;
bufferDescription.SizeInBytes = TerrainVertex.Stride; //your terrain vertex size * count
bufferDescription.StructureByteStride = TerrainVertex.Stride; // your terrain vertex size
bufferDescription.OptionFlags = ResourceOptionFlags.BufferStructured;
bufferDescription.CpuAccessFlags = CpuAccessFlags.Read;
bufferDescription.Usage = ResourceUsage.Staging;
DebugBuffer = _device.CreateBuffer(bufferDescription);
Copy the buffer:
// You should wait a few frames before you try to use the Debugbuffer as the copy is async and will stall the pipeline if you try to use it before the copy is done by the GPU
_Context.CopyResource(CurrentTerrainVertexBuffer, DebugBuffer);
Reading the Staging resource:
TerrainVertex[] CPUTerrainData = new TerrainVertex[vertcoun - 1] {};
DataBox dbox = _context.MapSubresource(DebugBuffer, 0, MapMode.Read, Direct3D11.MapFlags.None);
readout(dbox.DataPointer, CPUTerrainData);
_context.UnmapSubresource(DebugBuffer, 0);
dbox = null;
I'm using sharpDX but its only a wrapper around nativeDX so you should be able to work out what I'm doing as the naming is very close between sharpDX and nativeDX.
Once again this will be slow so as long as you don't want to do it every frame you should be ok and remember that GPU-CPU sync time is +20ms so do not read from the staging resource until a few frames have passed so you can avoid a stall if the GPU hasn't copied the data yet.