I was going to post a code snippet from my DX11 engine, but I don't like the way I coded it after I looked at the code. That was a few years back and I've learned a thing or two since then. It's also DX11 and you were asking about DX9, and the syntax is significantly different.
In my code, I moved the object to the origin, rotated it and moved it back. That's pretty certain to work and a simple modification, for the most part, to the code you have. It all happens between frames, and so the user never sees it.
How I would code it today is reverse the order of multiplication like Irian said. The problem is that you are using a function to do the rotation and so you have to rewrite the function, use a different function, or not use the function.
But, what I do today is create a rotation matrix, and multiply the rotation matrix by the object's matrix and store the result in the object's matrix. If you swap the order of multiplication it will change between orbiting the origin and rotating around the local axis. That's what the Matrix Rotation function is doing. Except you would have to rewrite the function to change the order of multiplication.
I'm working in OpenGL these days and the rotation function wants to do the rotation for me, which is unacceptable in my opinion. So, I force it to build a rotation matrix for me by feeding it an identity matrix. A rotated identity matrix is a rotation matrix that you can then multiply by a give object's matrix which when the two are multiplied together will return a matrix for the object that has been rotated. And if that orbits instead of rotates, you simply reverse the order of multiplication. The same thing works for quaternions except for some reason the order of multiplication with them seems opposite of what it is for matrices.