How to fix the Call of Duty 4: Modern Warfare Multiplayer crash on startup?
Solution 1:
This is a very common problem due to sloppy programming on Activision’s part. It is related to the system’s audio device, e.g. a problem with your sound card drivers, mostly if it is a Realtek or a Sigmatel onboard sound card.
Here are some things you can try:
Enable Stereo Mix
- Right-click the volume/speaker icon in your system tray, and select Recording devices. (If you don’t have the icon in your system tray, open Control Panel → Hardware and Sound → Sound → Recording.)
- Right-click and select View Disabled Devices. The device Stereo Mix appears.
- Enable the Stereo Mix device.
- Start the game.
If that doesn’t solve the issue, try the next suggestion.
Use a mic & headphones
- Plug in a microphone into the microphone jack.
- Plug in headphones into the headphone jack.
- Right-click the volume/speaker icon in your system tray, and select Recording devices. (If you don’t have the icon in your system tray, open Control Panel → Hardware and Sound → Sound → Recording.)
- Set Microphone as the default input device.
- Switch to the Playback tab.
- Set Headphones as the default audio playback device.
- Start the game.
If that doesn’t solve the issue, try the next suggestion.
Realtek: Disable front panel jack detection
If you have an Realtek onboard sound card, this might help:
- Double-click the orange volume/speaker icon in your task bar. This opens the HD Audio Manager.
- Click on the folder icon in the upper right edge.
- Check Disable front panel jack detection. This forces the driver to load microphone support even without a mic plugged in. Close the top-most window.
- In case you’re using the digital output, make sure that the Digital Output device is set as the default. To do that, click on Digital Output in the upper bar and on Set Default Device next to the volume adjuster.
- Start the game.
If that doesn’t solve the issue, try the next suggestion.
Sigmatel: install updates
If you have a Sigmatel onboard sound card, install all Windows updates and the latest Sigmatel drivers from http://www.dell.com/.
Remove the mssmp3.asi
file
- Go to the installation folder of CoD4.
- Enter the
miles
folder. - Rename the file
mssmp3.asi
tomssmp3.asi.bak
. - Start the game.
If that doesn’t solve the issue, try the next suggestion.
Update PunkBuster
Make sure PunkBuster is updated to the latest version.
Install Call of Duty 4 patches
Install all patches up to at least v1.5. (Currently, the latest available patch is v1.7.)
If that doesn’t solve the issue, try the next suggestion.
Reinstall sound card drivers
Before continuing, please make note of the make and model of your sound card prior to removing it in order to aid in reinstallation at a later date.
Uninstall your sound card drivers as follows:
- Open Start → Run and enter
sysdm.cpl
to display the System Properties dialog box. - Go to Hardware → Device Manager.
- Expand Sound, video, and game controllers.
- Right-click the sound card driver and then select Uninstall.
Then let Windows install its default sound drivers.
If that doesn’t solve the issue, try the next suggestion.
Update BIOS
If you are running the game from a secondary partition, download and install the latest BIOS updates from your motherboard manufacturer.
If that doesn’t solve the issue, try the next suggestion.
Disable onboard sound in BIOS
Disable the onboard sound card in the BIOS.
Solution 2:
Here are some interesting details about the unfortunate programming error that causes this bug. Credit to Xero|Hawk from the Infinity Ward forums for his research on this subject.
After looking into this a bit (as I’m affected myself), I found out that the crash is caused by this piece of code (most likely a little programming mistake):
004ED380 /$ 51 PUSH ECX 004ED381 |. 6A 00 PUSH 0 004ED383 |. 68 78B55E0D PUSH iw3mp.0D5EB578 004ED388 |. 6A 00 PUSH 0 004ED38A |. C705 D0824001>MOV DWORD PTR DS:[14082D0],iw3mp.004ED37> 004ED394 |. C705 D4824001>MOV DWORD PTR DS:[14082D4],iw3mp.014082D> 004ED39E |. C605 4EB55E0D>MOV BYTE PTR DS:[D5EB54E],0 004ED3A5 |. E8 1C9F1500 CALL <JMP.&DSOUND.#6> 004ED3AA |. 85C0 TEST EAX,EAX 004ED3AC |. 7D 14 JGE SHORT iw3mp.004ED3C2 004ED3AE |. 50 PUSH EAX ; /Arg3 004ED3AF |. 68 A0376E00 PUSH iw3mp.006E37A0 ; |Arg2 = 006E37A0 ASCII "Error initializing direct sound instance! %s" 004ED3B4 |. 6A 09 PUSH 9 ; |Arg1 = 00000009 004ED3B6 |. E8 15F90000 CALL iw3mp.004FCCD0 ; \iw3mp.004FCCD0 <-- crashes inside this function 004ED3BB |. 83C4 0C ADD ESP,0C 004ED3BE |. 33C0 XOR EAX,EAX 004ED3C0 |. 59 POP ECX 004ED3C1 |. C3 RETN 004ED3C2 |> B8 01000000 MOV EAX,1 004ED3C7 |. A2 4EB55E0D MOV BYTE PTR DS:[D5EB54E],AL 004ED3CC |. 59 POP ECX 004ED3CD \. C3 RETN
JMP.&DSOUND.#6
is aJMP
toDSOUND.DirectSoundCaptureCreate
, and its return value is directly used for the string formatting. Most likely the programmer wanted to have a formatted error message displayed (which would beDSERR_NODRIVER
), or the error value in hex, or whatever, but instead he treated the return value as a string pointer and because the formatting func doesnt do aIsBadReadPtr
check on it before handling it, the game crashes. I tried changing the%s
to%X
which fixes this crash indeed, but because theDirectSoundCaptureCreate
call isnt supposed to fail, the game crashes at a different position, probably when it’s trying to use the interface the first time.0057A7E2 |. 803D 4EB55E0D>|CMP BYTE PTR DS:[D5EB54E],0 <-- the IsCaptureInitialized bool, most likely 0057A7E9 |. 75 04 |JNZ SHORT iw3mp2.0057A7EF <-- but because the Create call failed, its not (see code snippet above),... 0057A7EB |. 33F6 |XOR ESI,ESI <-- ...so make ESI zero... 0057A7ED |. EB 45 |JMP SHORT iw3mp2.0057A834 <-- ...and jump to our crashing code line (it uses ESI as pointer - very smart) 0057A7EF |> A1 D4824001 |MOV EAX,DWORD PTR DS:[14082D4] 0057A7F4 |. 6A 48 |PUSH 48 0057A7F6 |. 8BF0 |MOV ESI,EAX 0057A7F8 |. 83C0 48 |ADD EAX,48 0057A7FB |. 6A 00 |PUSH 0 0057A7FD |. 56 |PUSH ESI 0057A7FE |. A3 D4824001 |MOV DWORD PTR DS:[14082D4],EAX 0057A803 |. E8 A8890F00 |CALL iw3mp2.006731B0 0057A808 |. 8B0D D43E7200 |MOV ECX,DWORD PTR DS:[723ED4] 0057A80E |. 83C4 0C |ADD ESP,0C 0057A811 |. C746 2C 00200>|MOV DWORD PTR DS:[ESI+2C],2000 0057A818 |. C746 30 FF000>|MOV DWORD PTR DS:[ESI+30],0FF 0057A81F |. C746 34 80000>|MOV DWORD PTR DS:[ESI+34],80 0057A826 |. 894E 38 |MOV DWORD PTR DS:[ESI+38],ECX 0057A829 |. C746 1C FFFFF>|MOV DWORD PTR DS:[ESI+1C],-1 0057A830 |. C646 44 02 |MOV BYTE PTR DS:[ESI+44],2 0057A834 |> 8B4E 38 |MOV ECX,DWORD PTR DS:[ESI+38] <-- crashing here 0057A837 |. 8B46 2C |MOV EAX,DWORD PTR DS:[ESI+2C] 0057A83A |. 8D7E 04 |LEA EDI,DWORD PTR DS:[ESI+4] 0057A83D |. 57 |PUSH EDI 0057A83E |. C746 08 00C80>|MOV DWORD PTR DS:[ESI+8],0C800 0057A845 |. E8 7623F7FF |CALL iw3mp2.004ECBC0 0057A84A |. 83C4 04 |ADD ESP,4 0057A84D |. 85C0 |TEST EAX,EAX 0057A84F |. 7D 21 |JGE SHORT iw3mp2.0057A872 0057A851 |. 68 B8356E00 |PUSH iw3mp2.006E35B8 ; ASCII "Error: Failed to create DirectSound play buffer" 0057A856 |. 6A 09 |PUSH 9 0057A858 |. E8 B323F8FF |CALL iw3mp2.004FCC10
The same mistake has been done at least one more time, namely here:
0057A94F |. 8B11 MOV EDX,DWORD PTR DS:[ECX] 0057A951 |. 8B42 08 MOV EAX,DWORD PTR DS:[EDX+8] 0057A954 |. 51 PUSH ECX 0057A955 |. FFD0 CALL EAX 0057A957 |. 8B35 60B55E0D MOV ESI,DWORD PTR DS:[D5EB560] 0057A95D |> 3BC3 CMP EAX,EBX 0057A95F |. 891D 78B55E0D MOV DWORD PTR DS:[D5EB578],EBX 0057A965 |. 7D 16 JGE SHORT iw3mp2.0057A97D 0057A967 |. 50 PUSH EAX ; /Arg3 0057A968 |. 68 D0376E00 PUSH iw3mp2.006E37D0 ; |Arg2 = 006E37D0 ASCII "Error releasing direct sound instance! %s" 0057A96D |. 6A 09 PUSH 9 ; |Arg1 = 00000009 0057A96F |. E8 5C23F8FF CALL iw3mp2.004FCCD0 ; \iw3mp2.004FCCD0