Ok, spot what's wrong with this line:
memcpy(pVertex, &m_vFrames[0].vVertices[0], m_nTriangles*3);
pVertex is returned from locking a VB.
That bug has taken me the best part of 2 hours to track down. At least my MD2 loading code works now...
Ok, here's a screenie of the engine so far. I can load a MD2 model just fine now, and render it as an indexed triangle list. I had to muck about a bit though, since texture coordinates are specified per triangle, not per vertex. So I've duplicated a lot of vertices in order to get a 1:1 mapping of texture coordinates to vertices (I just created 3*num_triangles vertices).
I should optimize this by going through and removing duplicate vertices. This should be pretty straightforwards to do, I'll try to do it on the train on the way home.
Anyway, screenie:
Click to Enlarge
Nothing special, just showing a rotating wireframe MD2 model with my GUI code functioning with it. Gets around 83FPS on my laptop, which is pretty beastly.