There are a number of places the error might be occurring, and I suspect that a "USB Device simulation" won't actually help you find them.
Here's my candidates for the problem source (most likely first):
1. The device you are controlling has a bug in it's software/firmware that is timing dependent. Something like a buffer overflowwhen commands come faster then it can process them. You won't find that with a simulation.
You can test for it by slowing down your commands to the device, but that's never conclusive since it may just make the problem less likely to happen.
2. The usbser.sys driver is out-of-date on the specific XP pc's that exhibit the problem. (I recently solved a similar problem that I traced to out-of-date winusb.sys files on Vista machines that were not updated because they aren't connected to the net.)
[One would assume that the usbser.sys is relatively bug free if it has been updated.]
If the problem is an out-of-date driver you can test it by updating the driver.
If the driver is up-to-date, it could still be a problem with the driver. It would probably be an issue with the way the driver handshakes with the device and determines if the device is ready. This is both a timing dependent issue specific to the device and potentially an issue with the specific (possibly wrong) way the device implements the USB protocol. You won't see the problem if you simulate the device.
3. The problem is in your code -- in which case you can write a simulator at a level above the USB device level.
The best way to debug the problem is to get your hands on a PC and a device that shows the problem and get USB analyzer on it.
You can't solve the problem without having access to a real device and a host that exhibits the problem.
How will you know it's fixed otherwise?
That said, there is no such thing as a "USB cross-over cable".
I'm assuming you are talking about USB 1.1 or 2.0 (and not 3.0).
Those USB cables consist of one pair of differential wires. The same pair of wires transmits data from the host to the device and from the device to the host. The host controls all the timing and (simplistically) the device only transmits on the pair of wires when it is responding to a command from the host.
The easiest way to do what you are asking would be to get two USB to serial adapters (https://www.google.com/search?q=usb+to+serial+adapter
]) and connect them with a serial cross-over cable (https://www.google.com/search?q=null+modem
Then you just need to write something that sits on the other USB port and simulates the device.