donrevan, thank you for taking the time to write up that assembly. I just gave it a try and it unfortunately crashed once I fired that first bullet. I really wish I could offer some help but I don't really know assembly. Once psychonic told me about LTCG in the signatures thread, I knew things would quickly start to get over my head. I understand that some arguments are being passed through registers, which therefore changes the arguments themselves, but doubt I could construct any of those move instructions as you did.
I'll see if I can make any progress for the time being by hooking CBaseEntity::FireBullets(...) since that's what SDKHooks does. I doubt it's going to work out as intended because CCSPlayer::FireBullet(...) and FX_FireBullets(...) have a lot of their own custom functionality, but I guess there's no harm in trying.
Finally, do you think perhaps any of these issues we're running into are because of CSWeaponID and WeaponSound_t? I had to manually copy their definitions into my headers because I could not find public definitions anywhere, but they are just enums, so shouldn't they technically be no different than (and could even be replaced by) an int instead? Or could they be the arguments contributing to these crashes?