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

  1. 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 PanelHardware and SoundSoundRecording.)
  2. Right-click and select View Disabled Devices. The device Stereo Mix appears.
  3. Enable the Stereo Mix device.
  4. Start the game.

If that doesn’t solve the issue, try the next suggestion.

Use a mic & headphones

  1. Plug in a microphone into the microphone jack.
  2. Plug in headphones into the headphone jack.
  3. 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 PanelHardware and SoundSoundRecording.)
  4. Set Microphone as the default input device.
  5. Switch to the Playback tab.
  6. Set Headphones as the default audio playback device.
  7. 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:

  1. Double-click the orange volume/speaker icon in your task bar. This opens the HD Audio Manager.
  2. Click on the folder icon in the upper right edge.
  3. 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.
  4. 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.
  5. 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

  1. Go to the installation folder of CoD4.
  2. Enter the miles folder.
  3. Rename the file mssmp3.asi to mssmp3.asi.bak.
  4. 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:

  1. Open StartRun and enter sysdm.cpl to display the System Properties dialog box.
  2. Go to HardwareDevice Manager.
  3. Expand Sound, video, and game controllers.
  4. 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 a JMP to DSOUND.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 be DSERR_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 a IsBadReadPtr check on it before handling it, the game crashes. I tried changing the %s to %X which fixes this crash indeed, but because the DirectSoundCaptureCreate 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