Target: The Curse of Monkey Island 3 v1.0 Tools: W32Dasm 8.93 HIEW v6.40 We Install this game with Full Instalation. I didn't do that in the first installation but I will brief you how to fix that too. Ok, when the installation is done. Take out the CD and try to play it. You start with the CURSE.EXE file and it is a Launcher to the game. Anyway, you notice the usual message saying that you must have the CD to play the game. Ok, have in mind what is says. Take Backup to the CURSE.EXE and open one of the backups in W32Dasm. Now open the StrRef and try to find the string from the MessageBox. "Unable to find The Curse of Monkey Island CD. Please insert either The Curse of Monkey Island CD into the CD-ROM drive." Ok, can we find this one? Yes, we can. Here: * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00401B93(C) | :00401BB6 8D45EC lea eax, dword ptr [ebp-14] :00401BB9 8D4DE4 lea ecx, dword ptr [ebp-1C] :00401BBC 50 push eax :00401BBD E8706B0100 call 00418732 * Possible StringData Ref from Data Obj ->"Comi.la1" | :00401BC2 6808674200 push 00426708 :00401BC7 8D4DE4 lea ecx, dword ptr [ebp-1C] :00401BCA E87A6C0100 call 00418849 :00401BCF 6A00 push 00000000 :00401BD1 8B45E4 mov eax, dword ptr [ebp-1C] :00401BD4 50 push eax :00401BD5 8D8D40FFFFFF lea ecx, dword ptr [ebp+FFFFFF40] :00401BDB E87D2B0000 call 0040475D <-- same CALL.. :00401BE0 85C0 test eax, eax :00401BE2 756E jne 00401C52 <-- same jump.. :00401BE4 8D45EC lea eax, dword ptr [ebp-14] :00401BE7 8D4DE4 lea ecx, dword ptr [ebp-1C] :00401BEA 50 push eax :00401BEB E8426B0100 call 00418732 * Possible StringData Ref from Data Obj ->"Comi.la2" | :00401BF0 68A4624200 push 004262A4 :00401BF5 8D4DE4 lea ecx, dword ptr [ebp-1C] :00401BF8 E84C6C0100 call 00418849 :00401BFD 6A00 push 00000000 :00401BFF 8B45E4 mov eax, dword ptr [ebp-1C] :00401C02 50 push eax :00401C03 8D8D40FFFFFF lea ecx, dword ptr [ebp+FFFFFF40] :00401C09 E84F2B0000 call 0040475D <-- same CALL.. :00401C0E 85C0 test eax, eax :00401C10 7540 jne 00401C52 <-- same jump... :00401C12 6A00 push 00000000 :00401C14 6A00 push 00000000 * Possible StringData Ref from Data Obj ->"/LNCH026/Unable to find The Curse " ->"of Monkey Island CD. Please insert " ->"either The Curse of Monkey Island " ->"CD into the CD-ROM drive." | :00401C16 6884664200 push 00426684 :00401C1B E8D0140000 call 004030F0 :00401C20 83C404 add esp, 00000004 :00401C23 50 push eax :00401C24 E83B910100 call 0041AD64 :00401C29 C645FC07 mov [ebp-04], 07 :00401C2D E83E010000 call 00401D70 :00401C32 C645FC06 mov [ebp-04], 06 :00401C36 E83D010000 call 00401D78 :00401C3B C645FC05 mov [ebp-04], 05 :00401C3F E83C010000 call 00401D80 :00401C44 C645FC03 mov [ebp-04], 03 :00401C48 E83B010000 call 00401D88 :00401C4D E959FDFFFF jmp 004019AB * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:00401BE2(C), :00401C10(C) | :00401C52 6A03 push 00000003 :00401C54 8D45DC lea eax, dword ptr [ebp-24] :00401C57 50 push eax :00401C58 8D4DEC lea ecx, dword ptr [ebp-14] :00401C5B E83B1D0100 call 0041399B :00401C60 C645FC0D mov [ebp-04], 0D :00401C64 8B00 mov eax, dword ptr [eax] :00401C66 50 push eax Ok, what do we have here. Well, the two files stated up there are placed in the root of the orginal CD. We must deal with this one. So we can edit the two jumps I have pointed out and tell them to JMP. We can browse further up to see that we can use the GetDriveTypeA API also: * Reference To: KERNEL32.GetDriveTypeA, Ord:00DEh | :00401B74 FF15FCE74200 Call dword ptr [0042E7FC] :00401B7A C645FC08 mov [ebp-04], 08 :00401B7E 83E805 sub eax, 00000005 :00401B81 83F801 cmp eax, 00000001 :00401B84 1BC0 sbb eax, eax :00401B86 40 inc eax :00401B87 8945DC mov dword ptr [ebp-24], eax :00401B8A E8C1010000 call 00401D50 :00401B8F 837DDC00 cmp dword ptr [ebp-24], 00000000 :00401B93 7421 je 00401BB6 :00401B95 8B45EC mov eax, dword ptr [ebp-14] :00401B98 50 push eax * Possible StringData Ref from Data Obj ->"/LNCH023/'%s' is not a valid CD-ROM " ->"drive." | :00401B99 6814674200 push 00426714 :00401B9E E84D150000 call 004030F0 :00401BA3 83C404 add esp, 00000004 :00401BA6 50 push eax :00401BA7 8D8538FDFFFF lea eax, dword ptr [ebp+FFFFFD38] :00401BAD 50 push eax :00401BAE E80D3C0000 call 004057C0 :00401BB3 83C40C add esp, 0000000C I have choosed to let it be as it is here. Follow me down and we will take care of the rest instead. We do have a different MessageBox now, like this: "Couldn't change the current directory to the root of the CD which is necessary to be able to play The Curse of Monkey Island. Will try to run anyway..." Ok, if we have all necessary files on our harddrive, the game will run. Otherwise it will ask for those files missing. The files are the fontfiles in the subdir Resourse. So copy the files font*.* to \Resourse in the Monkey Island gamedir. Ok, I had to copy the Comi.* to the gameroot. This is just because I didn't do a Full Install. Ok, but now the game WILL actually run after that message. But I don't wanna have it on my face, so we'll Fix that too. * Reference To: KERNEL32.SetCurrentDirectoryA, Ord:0207h | :00401C67 FF15F8E74200 Call dword ptr [0042E7F8] :00401C6D 8B4DCC mov ecx, dword ptr [ebp-34] :00401C70 83F801 cmp eax, 00000001 :00401C73 C645FC08 mov [ebp-04], 08 :00401C77 194DCC sbb dword ptr [ebp-34], ecx :00401C7A F75DCC neg [ebp-34] :00401C7D E8C6000000 call 00401D48 :00401C82 837DCC00 cmp dword ptr [ebp-34], 00000000 :00401C86 7417 je 00401C9F <-- yup, this one it is. :00401C88 6A00 push 00000000 :00401C8A 6A00 push 00000000 * Possible StringData Ref from Data Obj ->"/LNCH024/Couldn't change the current " ->"directory to the root of the CD " ->"which is necessary to be able " ->"to play The Curse of Monkey Island. " ->"Will try to run anyway..." | :00401C8C 68E0654200 push 004265E0 :00401C91 E85A140000 call 004030F0 :00401C96 83C404 add esp, 00000004 :00401C99 50 push eax :00401C9A E8C5900100 call 0041AD64 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00401C86(C) | :00401C9F 8D8524F8FFFF lea eax, dword ptr [ebp+FFFFF824] :00401CA5 50 push eax :00401CA6 6808020000 push 00000208 Easy to fix it just edit it to JMP. Change 74 to EB and save it. Now test it again and yes it will run. This might not be the 100% effective method to fix this game, but it works. And that was the goal. So, my second tutorial is finnished. Another game is FIX'ed. Cool! AlpHaz