Commit code, circa 2005
This commit is contained in:
1
SDIPDATA.CFG
Executable file
1
SDIPDATA.CFG
Executable file
@@ -0,0 +1 @@
|
||||
ON 192.168.0.4 9002 192.168.0.254 1234
|
||||
BIN
SDLOADER.BIN
Executable file
BIN
SDLOADER.BIN
Executable file
Binary file not shown.
BIN
SDpatch.dol
Executable file
BIN
SDpatch.dol
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 62 KiB |
200
install.txt
Executable file
200
install.txt
Executable file
@@ -0,0 +1,200 @@
|
||||
GameCube Action Replay SD Loader V1.00. Copyright 2005.
|
||||
by Costis (costis@gbaemu.com) and Parasyte
|
||||
|
||||
INSTALLATION GUIDE
|
||||
|
||||
=================
|
||||
Things You Need
|
||||
=================
|
||||
|
||||
- Action Replay (ANY version!!!)
|
||||
- Nintendo SD Adapter
|
||||
- SD Card (Any size)
|
||||
- SD Card Reader/Writer for PC and Windows XP, NT, or 2000 (or a way to run code on GC.)
|
||||
|
||||
|
||||
==============
|
||||
Installation
|
||||
==============
|
||||
|
||||
NOTE: SDLoad works with ALL versions of the Action Replay by Datel!
|
||||
|
||||
1. Ensure that your SD reader creates a virtual drive (Example: F:\) and that you
|
||||
can read and write files to the card without any problems. Your SD card must also
|
||||
be formatted with FAT16 (FAT12 and FAT32 are NOT supported.)
|
||||
|
||||
2. Run sdpatch.exe, passing the SD reader drive letter on the command line.
|
||||
(Example: sdpatch.exe F:\)
|
||||
|
||||
This program will install the boot driver to the SD card. The boot driver will
|
||||
only have to be installed once, and will have to be installed on each SD card you
|
||||
wish to use with SD Loader. This is just the initial driver, and NOT the menu
|
||||
program, so it will never have to be changed!
|
||||
|
||||
Be assured that the file system of the card will remain COMPLETELY in tact after you
|
||||
have run the sdpatch.exe (or alternatively sdpatch.dol) program! They have advanced
|
||||
error checking, so there really is NOT any possibility for the file system on your
|
||||
card to become corrupted.
|
||||
|
||||
NOTE: If you do not have a computer with Windows XP, NT, or 2000 installed, or
|
||||
you cannot get sdpatch.exe to work for some reason and you already have a
|
||||
means of uploading code to your GameCube (such as PSO), then you can install
|
||||
the boot driver to the SD card by booting sdpatch.dol to your GC and following
|
||||
the on-screen instructions.
|
||||
|
||||
3. Copy SDLOADER.BIN to the root directory of the SD card. This is the DOL file
|
||||
selection menu that boots up after the Action Replay and lets you select what
|
||||
DOL to boot from the card. Since it's simply a file on the SD card, upgrading or
|
||||
replacing it is as easy as overwriting the file with a newer version in Explorer!
|
||||
|
||||
You may also copy any DOL files you want to the SD card, at this point. Try the
|
||||
included testdemo.dol file, as it's guaranteed to work! The SD boot menu supports
|
||||
subdirectories as well, so your DOL's can be arranged inside any directories you
|
||||
want. SDLOADER.BIN, however, MUST be copied to the root directory in order for
|
||||
the boot driver to locate it.
|
||||
|
||||
4. Additionally, the SD Loader Menu system can setup the BBA for you and allow
|
||||
NETWORK BOOT support. This means that just like PSOload, you can upload DOL
|
||||
or binary files from your computer through the network to your GameCube. If
|
||||
you want this functionality, create a new file named SDIPDATA.CFG containing
|
||||
the following text:
|
||||
|
||||
ON 192.168.0.4 9002 192.168.0.254 1234
|
||||
|
||||
The format is "ON PCIP PCPORT GCIP GCPORT" and must NOT contain any additional
|
||||
spaces or blank lines. Currently, due to a limitation of the current version
|
||||
of PSOload released, the GC IP address must end in 254 (xxx.xxx.xxx.254) and
|
||||
the GC port must be 1234. You must set the PC IP to your PC's IP address and
|
||||
the PC port to any free UDP port.
|
||||
|
||||
If you do not need network boot functionality, you can leave the SDIPDATA.CFG
|
||||
file off of the SD card, or change the first word of the file to "OFF".
|
||||
Both SDLOADER.BIN and SDIPDATA.CFG must be in the SD card's root directory.
|
||||
|
||||
You can tell that the SD boot menu has recognized the network configuration file
|
||||
if you see "INITIALIZING BBA..." at the top once it is running. Refer to the
|
||||
"Using SD Loader" section for information on how to use the network boot feature.
|
||||
|
||||
5. After installing the boot driver to your SD card, place the card and SD adapter
|
||||
into your GameCube's memory card slot A. Insert the Action Replay card or a
|
||||
standard memory card into slot B and start up the Action Replay. From the AR
|
||||
main menu, select Action Replay Codes. Select the USA flag, then ADD NEW GAME.
|
||||
Enter "SDLOAD" as the game name and push the "done" key. Now enter "(m)" as
|
||||
the code name.
|
||||
|
||||
Enter the following code:
|
||||
|
||||
7YPR-RKZZ-MH6W5
|
||||
D26A-PE4J-1XX2W
|
||||
ZJHY-B1ZH-6P00G
|
||||
|
||||
|
||||
Next, select ADD NEW CODE and name the code "SDLOAD".
|
||||
Enter the following code:
|
||||
|
||||
AF4H-JPF5-H1B5J
|
||||
MVAB-7TQE-ABZPB
|
||||
V2CK-QQ1A-Y6P72
|
||||
M5N6-CMMH-9EURT
|
||||
0JFM-3A6C-VZ6VK
|
||||
KYV8-0JGV-0GR1N
|
||||
2EGU-HVKF-NDMCN
|
||||
7AH0-J9JZ-HHGNJ
|
||||
4MHU-G8XT-ZRYCJ
|
||||
9474-KF41-8KG34
|
||||
QMEV-G90N-A8RV0
|
||||
KD4G-5QHV-74D46
|
||||
V97K-652Q-Y4TEY
|
||||
6M4W-9GPT-E99NG
|
||||
QPFY-DJAF-E01FV
|
||||
2Z6E-P2WY-24WV4
|
||||
6NHW-G3NH-HP31Y
|
||||
A2KF-MCKN-D645J
|
||||
K5V8-EF9W-7GFQC
|
||||
XTU3-269T-VH5NE
|
||||
H9GP-C4PP-6FGF9
|
||||
HF77-R45C-ZXPDV
|
||||
22Y3-D98C-50AJM
|
||||
WTWZ-EC88-U5ZTV
|
||||
36G1-UGDG-J2G84
|
||||
DUMT-15KR-DXJ8K
|
||||
JV55-6VF5-2Z02T
|
||||
D4R8-MVJ5-QGR21
|
||||
1G3C-APD7-1CUVD
|
||||
|
||||
|
||||
Finally, select the code named "SDLOAD" and press A to enable it. (The
|
||||
check box next to the code name will be filled when the code is enabled.)
|
||||
Press START and open/close the lid when asked.
|
||||
|
||||
6. The SD Loader main menu will now be shown on the screen. At this point, you can
|
||||
select from all dol files you have written to the SD card. You can also pull
|
||||
the SD card out and write new files to it. Just reinsert the SD card when ready
|
||||
and the SD Loader menu will refresh the card contents. If you have written the
|
||||
configuration file for network boot, you can also boot a GC executable with it
|
||||
at any time of your choice.
|
||||
|
||||
|
||||
=================
|
||||
Using SD Loader
|
||||
=================
|
||||
|
||||
Many versions of Action Replay contain a bug that will keep newly entered codes
|
||||
disabled. The second time you use SD Loader, you must enable the code from the
|
||||
code list. After this has been done, the enabled code will be saved to the card
|
||||
in slot B.
|
||||
|
||||
You can then get into the SD Loader menu by simply selecting START from the AR
|
||||
main menu and open/close the disc cover when asked. That's right! All it will
|
||||
take from this point on to boot back into the menu is simply turning on your GC,
|
||||
pressing A, and opening\closing your GameCube's cover once!
|
||||
|
||||
Some newer versions of Action Replay may disallow booting their own discs. The
|
||||
Japanese "Pro Action Replay" is especially sensitive. If you are unable to get
|
||||
the SD Loader menu to show up (if the GameCube hangs after closing the disc lid,
|
||||
for example) then you may be required to swap discs when the AR asks. Any game
|
||||
disc will work, so long as the GameCube can read it properly.
|
||||
To do this, select START from the AR main manu, as usual. Open the disc cover
|
||||
and replace the AR disc with another disc. For example, Super Smash Bros. Melee
|
||||
or Pikmin (whatever games you have). After closing the disc cover, the SD Loader
|
||||
menu will show up!
|
||||
|
||||
To use the network boot functionality with PSO Loader v2.0, the GC's IP address
|
||||
must be x.x.x.254, and the GC's Port must be set to 1234. (See the installation
|
||||
notes above) Use psoload's -r switch to send dol files.
|
||||
For example:
|
||||
|
||||
psoload.exe -r -u9002 testdemo.dol
|
||||
|
||||
|
||||
|
||||
===============
|
||||
DOL Reloading
|
||||
===============
|
||||
|
||||
SD Loader supports DOL reloading in the same way as PSO Loader. To add reload
|
||||
support to your own DOL files, jump to address 0x80001800 in GameCube memory.
|
||||
You can achieve this in C by either using function pointers, or by using some
|
||||
inline assembly:
|
||||
|
||||
asm ("lis 3, 0x8000");
|
||||
asm ("ori 3, 3, 0x1800");
|
||||
asm ("mtlr 3");
|
||||
asm ("blr");
|
||||
|
||||
Once the reloader has been invoked, the SD card browser menu will be reloaded
|
||||
and you will be able to network boot again or select another DOL file from the
|
||||
card to load.
|
||||
|
||||
|
||||
==============
|
||||
Known Issues
|
||||
==============
|
||||
|
||||
- A few DOL files which rely on Phantasy Star Online may not work well with SD loader.
|
||||
- The the SD Loader Menu will not show up if the SD card Adapter is removed or
|
||||
inserted while in the Action Replay menu. The SD card adapter CAN be removed to change
|
||||
cards or make changes to the current card while in the SD card boot menu, however!
|
||||
- PC IP must be correct in the SDIPDATA.CFG file if you choose to use it. Otherwise the
|
||||
menu code may hang.
|
||||
|
||||
316
readme.txt
Executable file
316
readme.txt
Executable file
@@ -0,0 +1,316 @@
|
||||
GameCube Action Replay SD Loader V1.00. Copyright 2005.
|
||||
by Costis (costis@gbaemu.com and http://www.gcdev.com)
|
||||
|
||||
README FIRST!!!
|
||||
|
||||
===================
|
||||
Short Description
|
||||
===================
|
||||
|
||||
The Action Replay SD Loader (or SDLOAD for short) is an tool which
|
||||
allows you to boot code on an unmodified GameCube within 10 to 15
|
||||
seconds from the time you turn it on! It makes use of an Action Replay
|
||||
code which tricks the GameCube into running my bootloader code and loading
|
||||
my SD card selection menu. The selection menu supports all these features:
|
||||
|
||||
- Loading any DOL file from the SD card in any directory and subdirectory.
|
||||
- Loading any DOL or binary file with PSOload from your computer through
|
||||
the network.
|
||||
- Reloading or exiting back to the SD selection menu from your programs
|
||||
by branching to the small reloader code (just like in PSOload V2.00).
|
||||
- NO need for a modified GameCube, works on ALL unmodified GameCubes.
|
||||
- Works on EVERY Action Replay revision -- One code to rule them all!
|
||||
- Only 29 codes to insert once. They are saved on the Action Replay
|
||||
memory card after you have written them in the first time and you
|
||||
just have to select "Start Game" every subsequent time to boot into
|
||||
the SD loader menu.
|
||||
- Can be installed WITHOUT a way to run code on the GameCube prior to
|
||||
this! All you need is an Action Replay, an SD card adapter for the
|
||||
GameCube, and an SD card.
|
||||
- Boots to the SDLOADER selection menu on the FIRST Action Replay boot.
|
||||
|
||||
Please read the sections below even though they are lengthy. This can
|
||||
be the IDEAL GameCube development solution for you! Once you are done
|
||||
reading and are ready to try out my loader, follow the installation
|
||||
process in install.txt.
|
||||
|
||||
Also, if you are a developer or hacker, I have included a special section
|
||||
for you at the end of this readme about source code, etc....
|
||||
|
||||
Having problems with the loader or cannot get it to work? Post on the
|
||||
GCDev.com forums with a clear description of your problem or even e-mail
|
||||
me at costis@gbaemu.com and I will try to get back to you as soon as
|
||||
possible with the solution. Also, I'd love to hear feedback for this project,
|
||||
especially after all of the hard work I have to put into it! Send ALL
|
||||
comments, suggestions, and even constructive criticism to costis@gbaemu.com
|
||||
as well or likewise post on the forums.
|
||||
|
||||
|
||||
======================
|
||||
Detailed Description
|
||||
======================
|
||||
|
||||
Well... As I promised around a week ago, here it is -- my surprise
|
||||
GameCube release on New Year's day! Happy New Year everyone!!!!
|
||||
|
||||
Around two years ago, I released a program called PSOload which allowed
|
||||
people to boot their own homebrew code on the GameCube by exploiting
|
||||
a network feature of the online game Phantasy Star Online. GameCube
|
||||
development has come a long way since then, and I find it simply amazing
|
||||
how many people have ardently coped with the annoyance and inefficiencies
|
||||
of having to boot through PSO every single time, waiting for it to load
|
||||
through the title screens, going through the main menu, and then finally
|
||||
waiting for it to connect to my loader server! I myself used this method
|
||||
of code uploading for quite some time (until I lost my PSO disk ;))
|
||||
|
||||
I estimate that it takes more than 2 minutes or so to boot code each time
|
||||
using the PSO exploit method from the time when the GameCube is turned on!
|
||||
Sure, now that the viper chip has been released and tmbinc has released
|
||||
sources for his homebrew BIOS replacement chip, people can go modify their
|
||||
GC's and run code on them right when they are turned on. But there are many
|
||||
disadvantages to modifying your GameCube...
|
||||
|
||||
1. You have to open your GameCube console, voiding your warranty.
|
||||
2. If something goes wrong in the installation, you may be forever
|
||||
left with a broken GameCube.
|
||||
3. You can only boot code on that GameCube itself, not on any other
|
||||
unmodified GameCube's so you can't really show your stuff off
|
||||
to friends on their own GC's.
|
||||
4. The installation process is much more complicated and there are
|
||||
countless places where it can go wrong...
|
||||
5. This new code loading method I have released allows you to develop
|
||||
for the GameCube just as efficiently as with a modified console!
|
||||
|
||||
SO what is this tool I am releasing? I like to call it SDLOAD. It is a completely
|
||||
different method of uploading code on unmodified GC's. It takes approximately
|
||||
10 to 15 seconds from the time you have turned on your GC to the time you are
|
||||
able to boot any DOL file of your choice. How does this work you say? My SD
|
||||
bootloader makes use of the Action Replay in order to exploit the GameCube
|
||||
and gain full control over it, allowing the user to select any homebrew file
|
||||
to load and run. The Action Replay is a product made by Datel, which normally
|
||||
allows users to "enhance" their gaming experiences by entering cheat codes for
|
||||
GameCube games. It can be bought for around $30 at any local video game store or
|
||||
online at places such as GameStop (http://www.gamestop.com.)
|
||||
|
||||
This is the part that Parasyte contributed a huge amount to... After many hours
|
||||
of hard work, Parasyte came up with a method to trick ANY version Action Replay
|
||||
disk to patch *itself* rather than any other game with a small amount of GC
|
||||
program code encrypted in special Action Replay codes! After the code has been
|
||||
entered, you select "Start Game", open and close the cover once, and the Action
|
||||
Replay happily patches itself with a very small amount of code of my choice!
|
||||
|
||||
I had an SD card adapter for the GC laying around, so I came up with the idea of
|
||||
trying to cram an SD card bootloader inside this small code space... After much
|
||||
optimization and pure PowerPC assembly code writing, I came up with 29 Action
|
||||
Replay codes which can be used to load code from an SD card, and this is where
|
||||
SDLOAD was born!
|
||||
|
||||
This is how it works... You need an SD card adapter (which you can either buy
|
||||
from places like Lik-Sang, make yourself -- see included instructions, or kindly
|
||||
request for me to make and sell you one), an Action Replay disk (can be bought
|
||||
in most stores), an SD card reader for the PC, and of course... an SD card!
|
||||
That's it! Just these items and you can be set to run code on ANY unmodified
|
||||
GameCube within seconds!!! I know how tedious it is to have to enter AR codes
|
||||
by hand, especially if you do not own a GC keyboard and have to use the controller,
|
||||
so I have worked very hard and have managed to fit the whole bootloader init code
|
||||
in only 29 AR codes. To "install" SDLOAD, you just have to enter the bootloader code
|
||||
in the AR and prepare the SD card with the SD card reader and my included PC program.
|
||||
After you have completed these two steps, you are set to run the SDLOADER menu program
|
||||
by simply turning on your GameCube, pressing A to Start Game, and opening and closing
|
||||
the DVD disk cover.
|
||||
|
||||
===============
|
||||
SDLOADER MENU
|
||||
===============
|
||||
|
||||
Once you are greeted with the menu, you have the power of running homebrew GC code
|
||||
in your hands! The menu will display a directory and file listing of all of the
|
||||
DOL files on the SD card. You can browse through and even go into multiple subdirectories.
|
||||
Use the UP and DOWN D-PAD buttons to step through the menu items in those directions.
|
||||
The scrollbar on the right side indicates your current position. Press the A button
|
||||
over a folder in order to go inside that folder, and press A over a DOL file in order
|
||||
to load that file from the card and execute it. The L trigger button takes you to
|
||||
the very top of the directory (HOME), and the R trigger button takes you to the very
|
||||
bottom of the current directory (END). Pressing the B button will lead you to the parent
|
||||
directory (alternatively you can press A over the ".." folder item to be taken back
|
||||
to the parent folder.) Finally, the Z button will always return you to the root
|
||||
directory of the card.
|
||||
|
||||
You can remove the SD card at ANY time while the menu program is running. Once you
|
||||
have removed the SD card from the memory card slot, the menu will detect this and
|
||||
will say "REINSERT SD CARD IN SLOT A" at the top right part of the screen. You may
|
||||
now make any changes to the SD card you want or even reinsert a different SD card,
|
||||
and the loader will refresh the dir listing.
|
||||
|
||||
There is also a preliminary feature for using programs that do not know how to unlock
|
||||
official Nintendo memory cards properly (specifically GCS...) I believe this may only
|
||||
work properly with 59 block cards, but whatever. If you use the X button over a DOL file,
|
||||
the menu will load it just like if you pressed the A button. However, once it has finished
|
||||
reading the file from the card, it will say "REMOVE SD CARD" at the top right of the screen.
|
||||
Once you remove the card from the slot, it will request "INSERT MEMCARD". Insert a
|
||||
memory card into slot A at this point and SDLOADER will unlock it before executing
|
||||
the DOL file which it has just loaded!
|
||||
|
||||
Finally, the last two features of the current release are especially useful for homebrew
|
||||
developers... I have added a Network Boot feature. This allows you to configure the
|
||||
SDLOADER menu to initialize the BBA and accept DOL or binary files from PSOload at ANY
|
||||
time while the menu is running. While the BBA has been activated, the PSOload detection
|
||||
code is running in the background, so you are still free to traverse through the menus
|
||||
and select a DOL to boot from the SD card itself. However, once you run PSOload with
|
||||
the -r option, the menu will say "NETWORK BOOT..." in the top right and will load and
|
||||
execute a GC executable from PSOload through the network. This should make quick changes
|
||||
and test cycles extremely efficient, reducing the need to write every new build to the
|
||||
SD card and exchange it back and forth between your GC and PC reader. Details for
|
||||
configuring SDLOADER to set up the BBA and work with network boot are all included
|
||||
in install.txt which is included in this package.
|
||||
|
||||
Continuing with the tradition of the reload feature in PSOload, I have included a
|
||||
reloader feature in SDLOADER as well! In fact, I have been able to make it function
|
||||
in the exact same way as the PSOload reload feature to the user, except it is even
|
||||
better this time. Last time, if you executed the reloader before you had PSOload -r
|
||||
running on your computer, the GameCube would crash. Now, if you jump to the reloader
|
||||
code, it will reload the menu program from the SD card and execute it, allowing you
|
||||
to either boot a new DOL from the SD card itself or load another executable from
|
||||
the network through PSOload -r! Make sure that the sD card is inserted before
|
||||
using the reloader feature to exit back to the menu, of course. Once again, exact
|
||||
details for using the reloader feature (including example code for invoking it)
|
||||
can be found in install.txt
|
||||
|
||||
===================
|
||||
SD CARD CONNECTOR
|
||||
===================
|
||||
|
||||
I realize that Lik-Sang is one one of the only places where you can buy an SD card
|
||||
adapter for the GameCube if you are not located in Japan, and they have it for
|
||||
pretty expensive... ($30 or so). The SD card adapter is very simple hardware, however.
|
||||
In fact, it is "straight-through" and a homebrew adapter can be made by hacking up
|
||||
an old GC memory card and soldering a few wires to an SD card connector. SD card connectors
|
||||
can be removed from cheap SD card readers or even bought as discrete components from
|
||||
electronic parts stores or online catalogs such as Digikey (http://www.digikey.com).
|
||||
|
||||
To make the connector follow this guide:
|
||||
|
||||
In this PDF document (http://www.egr.msu.edu/classes/ece480/goodman/fall/group05/deliverables/appnote_foust.pdf)
|
||||
on the second page, there is a pinout of a standard SD card. Match these pins to your
|
||||
SD connector.
|
||||
|
||||
DarkFader has a memory card connector pinout in this photo:
|
||||
http://darkfader.net/ngc/files/memcard.jpg
|
||||
|
||||
You must connect the two VSS pins (VSS and VSS2) on the SD card connector together
|
||||
and to GND on the memory card pad (pin 2 or pin 10). You must connect VCC to 3.3V (pin 8).
|
||||
You must connect the CLK pin on the SD card to the CLK pad on the memcard (pin 11).
|
||||
You must connect the CS pin on the SD card to the CS pad on the memcard (pin 9).
|
||||
You must connect the MOSI pin on the SD card to the MOSI pad on the memcard (pin 5).
|
||||
Finally, you must connect the MISO pin on the SD card to the MISO pad on the memcard (pin 7.)
|
||||
|
||||
It's around 3 A.M. at night right now, so I am too tired to write a proper how-to
|
||||
guide with photos and diagrams, etc. But I have promised to release this tonight,
|
||||
so I am keeping my promise. I will release such a detailed guide within the coming
|
||||
days to facilitate the process.
|
||||
|
||||
I really do not want the difficulty of obtaining an SD card adapter to hinder
|
||||
people from using my loader, so if you definitely cannot buy one from an online
|
||||
store such as Lik-Sang (http://www.lik-sang.com) and do not feel comfortable
|
||||
making your own, feel free to send me an e-mail and I can probably arrange to make
|
||||
a homebrew connector for you, provided that you pay all component and shipping
|
||||
expenses. I estimate that it'll cost maybe around $10-15 or so per connector.
|
||||
|
||||
I have high hopes that my SD bootloader will become THE new development solution for
|
||||
the GameCube. SD cards are high density, so you can put EVERY homebrew DOL file ever
|
||||
created on an SD card and have them all to load whenever you want. You can take
|
||||
your Action Replay disk and SD card to friends' houses and show them all your
|
||||
neat new GameCube stuff on their own GC's. This does NOT require a PC to boot
|
||||
code once you have the DOL files on your SD card, so you do not have to drag
|
||||
laptops along with you, and it works on all GameCubes, so you do not have to
|
||||
bring along your whole GameCube if you are using a mod-chip for development!
|
||||
|
||||
PLEASE do not let the SD card connector discourage you from trying out this
|
||||
loader. Like I said, I would be happy to make a few connectors and give them
|
||||
out for as cheap as I can without a deficit. Send me an e-mail at costis@gbaemu.com
|
||||
if you want to do this, although if buying an official adapter is not a problem
|
||||
for you, *please* respect my time and go for that instead. It will look far more
|
||||
professional anyway, and you will have the guarantee of its durability. And after
|
||||
all, $30 is almost nothing compared to the cost and rarity of BroadBand Adapters
|
||||
right now. The PSO method right now costs around $60 for PSO (which is very
|
||||
difficult to find in stores because it has been discontinued) and $40 for the BBA.
|
||||
This totals to around $100! For SDLOAD, the Action Replay costs only $30, and the
|
||||
SD card adapter costs $30 as well if you get the official one! That totals to around
|
||||
$60 for a complete GameCube development environment that is arguably even MORE
|
||||
efficient than modifyng your GC with a mod-chip. You may also be able to find
|
||||
old Action Replay disks on E-Bay for much cheaper.
|
||||
|
||||
=================
|
||||
FOR DEVELOPERS
|
||||
=================
|
||||
|
||||
I have included the full source code of the sdpatch.exe program (see install.txt
|
||||
for instructions on how to use it and what it is for.) The main reason for this is
|
||||
that it is specific to NT operating systems (Windows NT/2000/XP) and I have no knowledge
|
||||
of the Linux or Mac OS X operating systems myself... Knowing that many people use
|
||||
these alternative operating systems (from experience with PSOload), I have released
|
||||
the source code so that anyone can port it to any other operating system. sdpatch.exe
|
||||
does use a lot of system specific calls, but it should easily be portable to Linux
|
||||
and Mac OS X by replacing them with the low-level equivalents for those OS's. If anyone
|
||||
ports sdpatch.exe to any other OS than Windows, please contact me and I will upload
|
||||
it to GCDev.com for posting.
|
||||
|
||||
The menu program that is loaded after you open and close the cover on the Action Replay
|
||||
(SDLOADER) is just a simple file on the SD card. It's the file that you copied to the
|
||||
root directory of the card while following the installation text called SDLOADER.BIN.
|
||||
This file is a simple GameCube executable binary which is loaded and copied to RAM
|
||||
location 0x81700000 (the high 1MB of RAM on the GC's 24MB of main RAM.) You can easily
|
||||
replace SDLOADER.BIN with your own creation to have it boot at start-up instead of
|
||||
the default menu if you choose to do so. Just set your compiler to compile for a
|
||||
target text base section of 0x81700000 (-Ttext 0x81700000) and then use objcopy to
|
||||
convert the output ELF file from the linker to a binary:
|
||||
|
||||
powerpc-elf-objcopy -O binary sdloader.elf SDLOADER.BIN (for example...)
|
||||
|
||||
The only precaution you have to take is that your binary file is 1MB or less in size,
|
||||
as otherwise it will overflow through the top of the GC's RAM!
|
||||
|
||||
=======================
|
||||
CREDITS AND GREETINGS
|
||||
=======================
|
||||
|
||||
I would like to thank Parasyte first and foremost for making this loader a
|
||||
possibility. He figured out the incredible Action Replay patching method
|
||||
which allowed me to create an SD card bootloader code which works on EVERY
|
||||
Action Replay and on the first boot. He also provided me with stable
|
||||
network code for interfacing the BroadBand Adapter and helped me test every
|
||||
stage of the loader as a whole until I got rid of all the visible bugs.
|
||||
|
||||
Other credits and greetings (in no specific order) go out to...
|
||||
|
||||
DayDream -- HUGE thanks for drawing the SD logo at the top of SDLOADER!!!!
|
||||
smilydude -- Thanks for making some FAT16 raw test images for me!
|
||||
BigRedPmp
|
||||
Lord_NightMare
|
||||
tmbinc
|
||||
dovoto
|
||||
The_1 -- Thanks for testing out some AR codes on your Action Replay!
|
||||
SubDrag
|
||||
Sappharad
|
||||
joat
|
||||
kevtris
|
||||
DuoDreamer
|
||||
DarkFader
|
||||
groepaz
|
||||
DesktopMan -- Thanks for donating the SD card connector in the first place!
|
||||
Myria
|
||||
Samson
|
||||
sgstair
|
||||
asterick
|
||||
Zeus
|
||||
JustBurn
|
||||
Guyfawkes
|
||||
woo
|
||||
|
||||
And everyone else I have missed!!!
|
||||
|
||||
You can contact me at costis@gbaemu.com or by making a post on the GCDev.com forums:
|
||||
http://forums.gcdev.com. http://www.gcdev.com is and always WILL be the home site
|
||||
of this project.
|
||||
|
||||
Help me make this project a success! AND HAPPY NEW YEAR EVERYONE!!!!!!
|
||||
23
src/.svn/all-wcprops
Executable file
23
src/.svn/all-wcprops
Executable file
@@ -0,0 +1,23 @@
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 40
|
||||
/svn/aklabs/!svn/ver/12/trunk/sdload/src
|
||||
END
|
||||
StdAfx.h
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 49
|
||||
/svn/aklabs/!svn/ver/12/trunk/sdload/src/StdAfx.h
|
||||
END
|
||||
SDpatch.cpp
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 52
|
||||
/svn/aklabs/!svn/ver/12/trunk/sdload/src/SDpatch.cpp
|
||||
END
|
||||
StdAfx.cpp
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 51
|
||||
/svn/aklabs/!svn/ver/12/trunk/sdload/src/StdAfx.cpp
|
||||
END
|
||||
133
src/.svn/entries
Executable file
133
src/.svn/entries
Executable file
@@ -0,0 +1,133 @@
|
||||
10
|
||||
|
||||
dir
|
||||
44
|
||||
https://127.0.0.1/svn/aklabs/trunk/sdload/src
|
||||
https://127.0.0.1/svn/aklabs
|
||||
|
||||
|
||||
|
||||
2007-05-26T23:54:26.388980Z
|
||||
12
|
||||
andrew
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
eb184899-6090-47d4-a65b-558f62f6ea1c
|
||||
|
||||
StdAfx.h
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2010-02-05T03:38:37.448248Z
|
||||
e8e5c1f00c8cf3a330ca2d8e50cb51e1
|
||||
2007-05-26T23:54:26.388980Z
|
||||
12
|
||||
andrew
|
||||
has-props
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
667
|
||||
|
||||
SDpatch.cpp
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2010-02-05T03:38:37.463873Z
|
||||
93ae488c00f97aca04f0964e4728e860
|
||||
2007-05-26T23:54:26.388980Z
|
||||
12
|
||||
andrew
|
||||
has-props
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
12008
|
||||
|
||||
StdAfx.cpp
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2010-02-05T03:38:37.463873Z
|
||||
6f6c522057b40e4e3537b61d8bd430e0
|
||||
2007-05-26T23:54:26.388980Z
|
||||
12
|
||||
andrew
|
||||
has-props
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
294
|
||||
|
||||
CVS
|
||||
dir
|
||||
|
||||
5
src/.svn/prop-base/SDpatch.cpp.svn-base
Executable file
5
src/.svn/prop-base/SDpatch.cpp.svn-base
Executable file
@@ -0,0 +1,5 @@
|
||||
K 14
|
||||
svn:executable
|
||||
V 0
|
||||
|
||||
END
|
||||
5
src/.svn/prop-base/StdAfx.cpp.svn-base
Executable file
5
src/.svn/prop-base/StdAfx.cpp.svn-base
Executable file
@@ -0,0 +1,5 @@
|
||||
K 14
|
||||
svn:executable
|
||||
V 0
|
||||
|
||||
END
|
||||
5
src/.svn/prop-base/StdAfx.h.svn-base
Executable file
5
src/.svn/prop-base/StdAfx.h.svn-base
Executable file
@@ -0,0 +1,5 @@
|
||||
K 14
|
||||
svn:executable
|
||||
V 0
|
||||
|
||||
END
|
||||
267
src/.svn/text-base/SDpatch.cpp.svn-base
Executable file
267
src/.svn/text-base/SDpatch.cpp.svn-base
Executable file
@@ -0,0 +1,267 @@
|
||||
// SDpatch.cpp : Defines the entry point for the console application.
|
||||
// by Costis. Copyright 2005.
|
||||
//
|
||||
// This is the source code for the SDpatch.exe program described in
|
||||
// the install.txt documentation. Feel free to port it to any OS of
|
||||
// your choice and send it to me for release!
|
||||
//
|
||||
|
||||
|
||||
#include "stdafx.h"
|
||||
|
||||
|
||||
#include <windows.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
const char *OS_version = "Windows 2000\\NT\\XP";
|
||||
|
||||
// Usage.
|
||||
void usage (void)
|
||||
{
|
||||
printf ("Usage: SDpatch.exe drive_letter\n\n");
|
||||
printf ("\tdrive_letter\tSD card drive letter mapped by Windows.\n\n");
|
||||
printf ("WARNING: If you choose the wrong drive letter, such as\n");
|
||||
printf ("\t one mapped to a hard drive, there is a large\n");
|
||||
printf ("\t possibility that the drive contents will become\n");
|
||||
printf ("\t corrupted!!! CHOOSE THE DRIVE LETTER CAREFULLY!\n");
|
||||
exit (0);
|
||||
}
|
||||
|
||||
// This is the level 2 boot-code for file systems without MBR's.
|
||||
const int sd_lev2_vbr_size = 352;
|
||||
const unsigned char sd_lev2_vbr[352] = {0x90, 0x63, 0x68, 0x00, 0x7D, 0x3B, 0x4B, 0x78, 0x3A, 0x20, 0x02, 0x02, 0x3D, 0x20, 0x80, 0x10,
|
||||
0x3B, 0x40, 0xFF, 0xD6, 0x7F, 0x5B, 0xD6, 0x2C, 0x3B, 0x20, 0xFF, 0xCE, 0x7F, 0x3B, 0xCE, 0x2C,
|
||||
0x8A, 0xFB, 0xFF, 0xD0, 0x7F, 0x5A, 0xB9, 0xD6, 0x57, 0x56, 0x48, 0x2C, 0x7E, 0xE9, 0xB2, 0x14,
|
||||
0x7D, 0x36, 0x4B, 0x78, 0x7F, 0x19, 0xD2, 0x14, 0x8B, 0x9B, 0xFF, 0xD1, 0x8B, 0x5B, 0xFF, 0xD2,
|
||||
0x53, 0x5C, 0x44, 0x2E, 0x3B, 0x9C, 0x00, 0x0F, 0x57, 0x9C, 0xE1, 0x3E, 0x7F, 0x18, 0xE2, 0x14,
|
||||
0x57, 0x27, 0x48, 0x1E, 0x53, 0x27, 0x4C, 0x2C, 0x48, 0x00, 0x00, 0x95, 0x39, 0x29, 0x02, 0x00,
|
||||
0x3B, 0x39, 0x00, 0x01, 0x7C, 0x19, 0xC0, 0x00, 0x40, 0x82, 0xFF, 0xE8, 0x83, 0x17, 0x00, 0x00,
|
||||
0x3F, 0x18, 0xAC, 0xBC, 0x37, 0x18, 0xB3, 0xB1, 0x40, 0x82, 0x00, 0x14, 0x83, 0x17, 0x00, 0x04,
|
||||
0x3F, 0x18, 0xBE, 0xBC, 0x37, 0x18, 0xBA, 0xAE, 0x41, 0x82, 0x00, 0x0C, 0x3A, 0xF7, 0x00, 0x20,
|
||||
0x4B, 0xFF, 0xFF, 0xDC, 0x3B, 0x00, 0x00, 0x1A, 0x7F, 0x17, 0xC6, 0x2C, 0x8B, 0x5B, 0xFF, 0xCD,
|
||||
0x3D, 0x20, 0x81, 0x70, 0x3A, 0xF8, 0xFF, 0xFE, 0x7E, 0xF7, 0xD1, 0xD6, 0x7E, 0xF7, 0xCA, 0x14,
|
||||
0x7E, 0xB7, 0xD2, 0x14, 0x56, 0xE7, 0x48, 0x1E, 0x52, 0xE7, 0x4C, 0x2C, 0x48, 0x00, 0x00, 0x31,
|
||||
0x39, 0x29, 0x02, 0x00, 0x3A, 0xF7, 0x00, 0x01, 0x7C, 0x17, 0xA8, 0x00, 0x40, 0x82, 0xFF, 0xE8,
|
||||
0x57, 0x18, 0x08, 0x3C, 0x7F, 0x16, 0xC6, 0x2C, 0x28, 0x18, 0xFF, 0xF7, 0x41, 0x80, 0xFF, 0xC8,
|
||||
0x3D, 0x20, 0x81, 0x70, 0x7D, 0x28, 0x03, 0xA6, 0x4E, 0x80, 0x00, 0x21, 0x7D, 0x48, 0x02, 0xA6,
|
||||
0x7E, 0x29, 0x03, 0xA6, 0x90, 0xA3, 0x68, 0x00, 0x4B, 0x00, 0x18, 0x7D, 0x3F, 0xA0, 0x51, 0x00,
|
||||
0x4B, 0x00, 0x18, 0x75, 0x3B, 0x80, 0x00, 0x00, 0x7C, 0xFD, 0xE0, 0x30, 0x4B, 0x00, 0x18, 0x69,
|
||||
0x3B, 0x9C, 0x00, 0x08, 0x2C, 0x1C, 0x00, 0x20, 0x40, 0x82, 0xFF, 0xF0, 0x3F, 0xA0, 0x95, 0x00,
|
||||
0x4B, 0x00, 0x18, 0x55, 0x3F, 0xA0, 0xFF, 0x00, 0x4B, 0x00, 0x18, 0x4D, 0x4B, 0x00, 0x18, 0x49,
|
||||
0x3C, 0x9F, 0x02, 0x00, 0x74, 0x84, 0xFF, 0x00, 0x40, 0x82, 0xFF, 0xF4, 0x4B, 0x00, 0x18, 0x39,
|
||||
0x57, 0xFF, 0x46, 0x3E, 0x7F, 0xE9, 0x21, 0xAE, 0x7C, 0x09, 0x20, 0xAC, 0x38, 0x84, 0x00, 0x01,
|
||||
0x42, 0x00, 0xFF, 0xEC, 0x90, 0x63, 0x68, 0x00, 0x7D, 0x48, 0x03, 0xA6, 0x4E, 0x80, 0x00, 0x20};
|
||||
|
||||
// This is the level 2 boot-code for MBR based file systems.
|
||||
const int sd_lev2_mbr_size = 380;
|
||||
const unsigned char sd_lev2_mbr[380] = {0x90, 0x63, 0x68, 0x00, 0x3A, 0x20, 0x02, 0x02, 0x3B, 0x00, 0x01, 0x86, 0x7F, 0x09, 0xC4, 0x2C,
|
||||
0x57, 0x07, 0x48, 0x1E, 0x53, 0x07, 0x4C, 0x2C, 0x3D, 0x20, 0x81, 0x01, 0x48, 0x00, 0x00, 0xED,
|
||||
0x3B, 0x69, 0x00, 0x40, 0x3D, 0x20, 0x80, 0x10, 0x3B, 0x40, 0xFF, 0xD6, 0x7F, 0x5B, 0xD6, 0x2C,
|
||||
0x3B, 0x20, 0xFF, 0xCE, 0x7F, 0x3B, 0xCE, 0x2C, 0x7F, 0x39, 0xC2, 0x14, 0x8A, 0xFB, 0xFF, 0xD0,
|
||||
0x7F, 0x5A, 0xB9, 0xD6, 0x57, 0x56, 0x48, 0x2C, 0x7E, 0xE9, 0xB2, 0x14, 0x7D, 0x36, 0x4B, 0x78,
|
||||
0x7F, 0x19, 0xD2, 0x14, 0x8B, 0x9B, 0xFF, 0xD1, 0x8B, 0x5B, 0xFF, 0xD2, 0x53, 0x5C, 0x44, 0x2E,
|
||||
0x3B, 0x9C, 0x00, 0x0F, 0x57, 0x9C, 0xE1, 0x3E, 0x7F, 0x18, 0xE2, 0x14, 0x57, 0x27, 0x48, 0x1E,
|
||||
0x53, 0x27, 0x4C, 0x2C, 0x48, 0x00, 0x00, 0x95, 0x39, 0x29, 0x02, 0x00, 0x3B, 0x39, 0x00, 0x01,
|
||||
0x7C, 0x19, 0xC0, 0x00, 0x40, 0x82, 0xFF, 0xE8, 0x83, 0x17, 0x00, 0x00, 0x3F, 0x18, 0xAC, 0xBC,
|
||||
0x37, 0x18, 0xB3, 0xB1, 0x40, 0x82, 0x00, 0x14, 0x83, 0x17, 0x00, 0x04, 0x3F, 0x18, 0xBE, 0xBC,
|
||||
0x37, 0x18, 0xBA, 0xAE, 0x41, 0x82, 0x00, 0x0C, 0x3A, 0xF7, 0x00, 0x20, 0x4B, 0xFF, 0xFF, 0xDC,
|
||||
0x3B, 0x00, 0x00, 0x1A, 0x7F, 0x17, 0xC6, 0x2C, 0x8B, 0x5B, 0xFF, 0xCD, 0x3D, 0x20, 0x81, 0x70,
|
||||
0x3A, 0xF8, 0xFF, 0xFE, 0x7E, 0xF7, 0xD1, 0xD6, 0x7E, 0xF7, 0xCA, 0x14, 0x7E, 0xB7, 0xD2, 0x14,
|
||||
0x56, 0xE7, 0x48, 0x1E, 0x52, 0xE7, 0x4C, 0x2C, 0x48, 0x00, 0x00, 0x31, 0x39, 0x29, 0x02, 0x00,
|
||||
0x3A, 0xF7, 0x00, 0x01, 0x7C, 0x17, 0xA8, 0x00, 0x40, 0x82, 0xFF, 0xE8, 0x57, 0x18, 0x08, 0x3C,
|
||||
0x7F, 0x16, 0xC6, 0x2C, 0x28, 0x18, 0xFF, 0xF7, 0x41, 0x80, 0xFF, 0xC8, 0x3D, 0x20, 0x81, 0x70,
|
||||
0x7D, 0x28, 0x03, 0xA6, 0x4E, 0x80, 0x00, 0x21, 0x7D, 0x48, 0x02, 0xA6, 0x7E, 0x29, 0x03, 0xA6,
|
||||
0x90, 0xA3, 0x68, 0x00, 0x4B, 0x00, 0x18, 0x61, 0x3F, 0xA0, 0x51, 0x00, 0x4B, 0x00, 0x18, 0x59,
|
||||
0x3B, 0x80, 0x00, 0x00, 0x7C, 0xFD, 0xE0, 0x30, 0x4B, 0x00, 0x18, 0x4D, 0x3B, 0x9C, 0x00, 0x08,
|
||||
0x2C, 0x1C, 0x00, 0x20, 0x40, 0x82, 0xFF, 0xF0, 0x3F, 0xA0, 0x95, 0x00, 0x4B, 0x00, 0x18, 0x39,
|
||||
0x3F, 0xA0, 0xFF, 0x00, 0x4B, 0x00, 0x18, 0x31, 0x4B, 0x00, 0x18, 0x2D, 0x3C, 0x9F, 0x02, 0x00,
|
||||
0x74, 0x84, 0xFF, 0x00, 0x40, 0x82, 0xFF, 0xF4, 0x4B, 0x00, 0x18, 0x1D, 0x57, 0xFF, 0x46, 0x3E,
|
||||
0x7F, 0xE9, 0x21, 0xAE, 0x7C, 0x09, 0x20, 0xAC, 0x38, 0x84, 0x00, 0x01, 0x42, 0x00, 0xFF, 0xEC,
|
||||
0x90, 0x63, 0x68, 0x00, 0x7D, 0x48, 0x03, 0xA6, 0x4E, 0x80, 0x00, 0x20};
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
int i, ptype;
|
||||
HANDLE mfile;
|
||||
DWORD ret;
|
||||
unsigned char mbuf[512], vbuf[512];
|
||||
char tname[512];
|
||||
char buffer[MAX_PATH];
|
||||
const unsigned char *sd_lev2;
|
||||
unsigned long sd_lev2_size;
|
||||
|
||||
printf ("SDLoad Card Patcher V1.00 by Costis\n");
|
||||
printf ("(%s Version)\n", OS_version);
|
||||
|
||||
// Check the operating system version...
|
||||
if (GetVersion() & 0x80000000)
|
||||
{
|
||||
// Oops! The user has tried to run this under an incompatible OS!
|
||||
printf ("This program can only be run from Windows 2000\\NT\\XP.\n");
|
||||
exit (0);
|
||||
}
|
||||
|
||||
// Check if the user has passed a valid parameter...
|
||||
if (argc != 2)
|
||||
usage ();
|
||||
|
||||
if ((((argv[1][0] < 'A') || (argv[1][0] > 'Z')) && ((argv[1][0] < 'a') || (argv[1][0] > 'z'))) ||
|
||||
(strlen(argv[1]) > 3))
|
||||
{
|
||||
// The drive letter must be from A through Z and
|
||||
// drive letters must be specified as X, X:, or even X:/
|
||||
printf ("Invalid drive letter specification.\n");
|
||||
exit (0);
|
||||
}
|
||||
|
||||
// Fix the drive letter so that QueryDosDevice accepts it.
|
||||
argv[1][1] = ':';
|
||||
argv[1][2] = 0;
|
||||
|
||||
// Check to make sure the drive is removable...
|
||||
// We don't want a user accidentally corrupting their
|
||||
// hard drive's MBR!
|
||||
if (GetDriveType(argv[1]) != DRIVE_REMOVABLE)
|
||||
{
|
||||
// Oh, oh! A drive which is not removable has been selected...
|
||||
printf ("The drive selected is not a removable device.\n");
|
||||
printf ("Please specify the drive letter of the SD card adapter!\n");
|
||||
exit (0);
|
||||
}
|
||||
|
||||
printf ("\nQuerying device name of drive %s...", argv[1]);
|
||||
|
||||
ret = QueryDosDevice(argv[1], buffer, sizeof(buffer));
|
||||
if (!ret)
|
||||
{
|
||||
// The user has selected an invalid driver letter...
|
||||
printf ("Failed. Invalid drive letter!\n");
|
||||
exit (0);
|
||||
} else
|
||||
printf ("OK!\n");
|
||||
|
||||
// Success! We have retrieved a low-level device name for the specified
|
||||
// drive letter. We want to access partition 0, so remove the last part
|
||||
// from it which is not needed...
|
||||
for (i = strlen (buffer) - 1; i >= 0; i--)
|
||||
{
|
||||
if (buffer[i] == '\\')
|
||||
{
|
||||
buffer[i] = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// And append a Partition0 indicator to the end of it...
|
||||
sprintf (tname, "\\\\.\\GLOBALROOT\\%s\\Partition0", buffer);
|
||||
printf ("Device name: %s\n", tname);
|
||||
|
||||
// Create a low-level Windows file to access the drive as a raw device.
|
||||
printf ("Obtaining low-level access to drive...");
|
||||
mfile = CreateFile (tname, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL);
|
||||
if (mfile == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
// Error!
|
||||
printf ("Failed. Could not create file!\n");
|
||||
exit (0);
|
||||
} else
|
||||
printf ("OK!\n");
|
||||
|
||||
printf ("Reading first sector...");
|
||||
SetFilePointer (mfile, 0, NULL, FILE_BEGIN);
|
||||
ReadFile (mfile, &mbuf, 512, &ret, NULL);
|
||||
if (ret != 512)
|
||||
{
|
||||
// Error! Maybe the user has forgotten to insert an SD card?!?!
|
||||
printf ("Failed! Make sure a working SD card is inserted!\n");
|
||||
CloseHandle (mfile);
|
||||
exit (0);
|
||||
} else
|
||||
printf ("OK!\n");
|
||||
|
||||
// Success! We have managed to read out the first sector of the drive.
|
||||
// Check byte index 0x15 (drive media type descriptor) and byte index
|
||||
// 0x26 (extended signature) to find out whether this sector is a
|
||||
// master boot record or a volume boot record...
|
||||
if ((mbuf[0x26] == 0x29) && (mbuf[0x15] == 0xF8))
|
||||
{
|
||||
// This is a volume boot record, NOT a master boot record...
|
||||
printf ("Volume Boot Record found in Sector 0.\n");
|
||||
// We therefore want to patch in the VBR level 2 code:
|
||||
ptype = 1;
|
||||
sd_lev2 = sd_lev2_vbr;
|
||||
sd_lev2_size = sd_lev2_vbr_size;
|
||||
} else {
|
||||
// This is a master boot record...
|
||||
printf ("Master Boot Record found in Sector 0.\n");
|
||||
// We therefore want to patch in the MBR level 2 code:
|
||||
ptype = 0;
|
||||
sd_lev2 = sd_lev2_mbr;
|
||||
sd_lev2_size = sd_lev2_mbr_size;
|
||||
}
|
||||
|
||||
printf ("Inserting level 2 boot-code in %cBR...", (ptype ? 'V' : 'M'));
|
||||
|
||||
// Patch in the code in the right offset...
|
||||
memcpy (mbuf + 0x40, sd_lev2, sd_lev2_size);
|
||||
|
||||
// Attempt to write the new sector 0 back to the card.
|
||||
SetFilePointer (mfile, 0, NULL, FILE_BEGIN);
|
||||
WriteFile (mfile, mbuf, 512, &ret, NULL);
|
||||
|
||||
if (ret != 512)
|
||||
{
|
||||
// Write failure! Maybe the user has write protected their card?!?!
|
||||
printf ("Write Error! Check the write protect switch on the SD card.\n");
|
||||
CloseHandle (mfile);
|
||||
exit (0);
|
||||
} else
|
||||
printf ("OK!\n");
|
||||
|
||||
// Apparently our write succeeded! Let's check to make sure...
|
||||
printf ("Verifying Master Boot Record...");
|
||||
|
||||
// Read sector 0 again.
|
||||
SetFilePointer (mfile, 0, NULL, FILE_BEGIN);
|
||||
ReadFile (mfile, &vbuf, 512, &ret, NULL);
|
||||
if (ret != 512)
|
||||
{
|
||||
printf ("Read Error!\n");
|
||||
CloseHandle (mfile);
|
||||
exit (0);
|
||||
}
|
||||
|
||||
// Compare the new read back sector 0, with the one that was suppsoed to
|
||||
// have been written.
|
||||
if (memcmp (mbuf, vbuf, 512) != 0)
|
||||
{
|
||||
// Oops! They are not the same...
|
||||
printf ("Verification Failed!\n");
|
||||
CloseHandle (mfile);
|
||||
exit (0);
|
||||
} else
|
||||
printf ("OK!\n");
|
||||
|
||||
// Success! We can now release the file handle back to Windows...
|
||||
printf ("Releasing low-level access handle...");
|
||||
|
||||
if (!CloseHandle (mfile))
|
||||
{
|
||||
// This would be such a great place for the process to fail, eh? ;)
|
||||
printf ("Failed!\n");
|
||||
exit (0);
|
||||
} else
|
||||
printf ("OK!\n");
|
||||
|
||||
// Finally! The SD card patching process has been completed! Tell the
|
||||
// user the good news and instruct them to continue the installation
|
||||
// process...
|
||||
printf ("\nThe SD card has been patched successfully. The file\n");
|
||||
printf ("system on it should remain completely functional as\n");
|
||||
printf ("before, and you may now proceed to the next step of\n");
|
||||
printf ("the Action Replay SD card bootloader installation\n");
|
||||
printf ("process.\n\n");
|
||||
|
||||
// End of program.
|
||||
return 0;
|
||||
}
|
||||
8
src/.svn/text-base/StdAfx.cpp.svn-base
Executable file
8
src/.svn/text-base/StdAfx.cpp.svn-base
Executable file
@@ -0,0 +1,8 @@
|
||||
// stdafx.cpp : source file that includes just the standard includes
|
||||
// writeSD.pch will be the pre-compiled header
|
||||
// stdafx.obj will contain the pre-compiled type information
|
||||
|
||||
#include "stdafx.h"
|
||||
|
||||
// TODO: reference any additional headers you need in STDAFX.H
|
||||
// and not in this file
|
||||
19
src/.svn/text-base/StdAfx.h.svn-base
Executable file
19
src/.svn/text-base/StdAfx.h.svn-base
Executable file
@@ -0,0 +1,19 @@
|
||||
// stdafx.h : include file for standard system include files,
|
||||
// or project specific include files that are used frequently, but
|
||||
// are changed infrequently
|
||||
//
|
||||
|
||||
#if !defined(AFX_STDAFX_H__5D442ED7_8B5E_46D9_A725_BBE6D427B72A__INCLUDED_)
|
||||
#define AFX_STDAFX_H__5D442ED7_8B5E_46D9_A725_BBE6D427B72A__INCLUDED_
|
||||
|
||||
#if _MSC_VER > 1000
|
||||
#pragma once
|
||||
#endif // _MSC_VER > 1000
|
||||
|
||||
|
||||
// TODO: reference additional headers your program requires here
|
||||
|
||||
//{{AFX_INSERT_LOCATION}}
|
||||
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
|
||||
|
||||
#endif // !defined(AFX_STDAFX_H__5D442ED7_8B5E_46D9_A725_BBE6D427B72A__INCLUDED_)
|
||||
23
src/CVS/.svn/all-wcprops
Executable file
23
src/CVS/.svn/all-wcprops
Executable file
@@ -0,0 +1,23 @@
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 44
|
||||
/svn/aklabs/!svn/ver/12/trunk/sdload/src/CVS
|
||||
END
|
||||
Repository
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 55
|
||||
/svn/aklabs/!svn/ver/12/trunk/sdload/src/CVS/Repository
|
||||
END
|
||||
Root
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 49
|
||||
/svn/aklabs/!svn/ver/12/trunk/sdload/src/CVS/Root
|
||||
END
|
||||
Entries
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 52
|
||||
/svn/aklabs/!svn/ver/12/trunk/sdload/src/CVS/Entries
|
||||
END
|
||||
130
src/CVS/.svn/entries
Executable file
130
src/CVS/.svn/entries
Executable file
@@ -0,0 +1,130 @@
|
||||
10
|
||||
|
||||
dir
|
||||
44
|
||||
https://127.0.0.1/svn/aklabs/trunk/sdload/src/CVS
|
||||
https://127.0.0.1/svn/aklabs
|
||||
|
||||
|
||||
|
||||
2007-05-26T23:54:26.388980Z
|
||||
12
|
||||
andrew
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
eb184899-6090-47d4-a65b-558f62f6ea1c
|
||||
|
||||
Repository
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2010-02-05T03:38:37.432623Z
|
||||
4f439e1598ee78856a826040d07dda7a
|
||||
2007-05-26T23:54:26.388980Z
|
||||
12
|
||||
andrew
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
17
|
||||
|
||||
Root
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2010-02-05T03:38:37.432623Z
|
||||
7af14a164593104c1e7a07a572dd352a
|
||||
2007-05-26T23:54:26.388980Z
|
||||
12
|
||||
andrew
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
24
|
||||
|
||||
Entries
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2010-02-05T03:38:37.432623Z
|
||||
ac052c0d3477c504a3bba1c44f5ca54d
|
||||
2007-05-26T23:54:26.388980Z
|
||||
12
|
||||
andrew
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
142
|
||||
|
||||
4
src/CVS/.svn/text-base/Entries.svn-base
Executable file
4
src/CVS/.svn/text-base/Entries.svn-base
Executable file
@@ -0,0 +1,4 @@
|
||||
/SDpatch.cpp/1.1.1.1/Sun Jan 1 00:15:01 2006//
|
||||
/StdAfx.cpp/1.1.1.1/Sun Jan 1 00:15:01 2006//
|
||||
/StdAfx.h/1.1.1.1/Sun Jan 1 00:15:01 2006//
|
||||
D
|
||||
1
src/CVS/.svn/text-base/Repository.svn-base
Executable file
1
src/CVS/.svn/text-base/Repository.svn-base
Executable file
@@ -0,0 +1 @@
|
||||
utils/sdload/src
|
||||
1
src/CVS/.svn/text-base/Root.svn-base
Executable file
1
src/CVS/.svn/text-base/Root.svn-base
Executable file
@@ -0,0 +1 @@
|
||||
andrew@gabbo:/home/cvsd
|
||||
4
src/CVS/Entries
Executable file
4
src/CVS/Entries
Executable file
@@ -0,0 +1,4 @@
|
||||
/SDpatch.cpp/1.1.1.1/Sun Jan 1 00:15:01 2006//
|
||||
/StdAfx.cpp/1.1.1.1/Sun Jan 1 00:15:01 2006//
|
||||
/StdAfx.h/1.1.1.1/Sun Jan 1 00:15:01 2006//
|
||||
D
|
||||
1
src/CVS/Repository
Executable file
1
src/CVS/Repository
Executable file
@@ -0,0 +1 @@
|
||||
utils/sdload/src
|
||||
1
src/CVS/Root
Executable file
1
src/CVS/Root
Executable file
@@ -0,0 +1 @@
|
||||
andrew@gabbo:/home/cvsd
|
||||
267
src/SDpatch.cpp
Executable file
267
src/SDpatch.cpp
Executable file
@@ -0,0 +1,267 @@
|
||||
// SDpatch.cpp : Defines the entry point for the console application.
|
||||
// by Costis. Copyright 2005.
|
||||
//
|
||||
// This is the source code for the SDpatch.exe program described in
|
||||
// the install.txt documentation. Feel free to port it to any OS of
|
||||
// your choice and send it to me for release!
|
||||
//
|
||||
|
||||
|
||||
#include "stdafx.h"
|
||||
|
||||
|
||||
#include <windows.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
const char *OS_version = "Windows 2000\\NT\\XP";
|
||||
|
||||
// Usage.
|
||||
void usage (void)
|
||||
{
|
||||
printf ("Usage: SDpatch.exe drive_letter\n\n");
|
||||
printf ("\tdrive_letter\tSD card drive letter mapped by Windows.\n\n");
|
||||
printf ("WARNING: If you choose the wrong drive letter, such as\n");
|
||||
printf ("\t one mapped to a hard drive, there is a large\n");
|
||||
printf ("\t possibility that the drive contents will become\n");
|
||||
printf ("\t corrupted!!! CHOOSE THE DRIVE LETTER CAREFULLY!\n");
|
||||
exit (0);
|
||||
}
|
||||
|
||||
// This is the level 2 boot-code for file systems without MBR's.
|
||||
const int sd_lev2_vbr_size = 352;
|
||||
const unsigned char sd_lev2_vbr[352] = {0x90, 0x63, 0x68, 0x00, 0x7D, 0x3B, 0x4B, 0x78, 0x3A, 0x20, 0x02, 0x02, 0x3D, 0x20, 0x80, 0x10,
|
||||
0x3B, 0x40, 0xFF, 0xD6, 0x7F, 0x5B, 0xD6, 0x2C, 0x3B, 0x20, 0xFF, 0xCE, 0x7F, 0x3B, 0xCE, 0x2C,
|
||||
0x8A, 0xFB, 0xFF, 0xD0, 0x7F, 0x5A, 0xB9, 0xD6, 0x57, 0x56, 0x48, 0x2C, 0x7E, 0xE9, 0xB2, 0x14,
|
||||
0x7D, 0x36, 0x4B, 0x78, 0x7F, 0x19, 0xD2, 0x14, 0x8B, 0x9B, 0xFF, 0xD1, 0x8B, 0x5B, 0xFF, 0xD2,
|
||||
0x53, 0x5C, 0x44, 0x2E, 0x3B, 0x9C, 0x00, 0x0F, 0x57, 0x9C, 0xE1, 0x3E, 0x7F, 0x18, 0xE2, 0x14,
|
||||
0x57, 0x27, 0x48, 0x1E, 0x53, 0x27, 0x4C, 0x2C, 0x48, 0x00, 0x00, 0x95, 0x39, 0x29, 0x02, 0x00,
|
||||
0x3B, 0x39, 0x00, 0x01, 0x7C, 0x19, 0xC0, 0x00, 0x40, 0x82, 0xFF, 0xE8, 0x83, 0x17, 0x00, 0x00,
|
||||
0x3F, 0x18, 0xAC, 0xBC, 0x37, 0x18, 0xB3, 0xB1, 0x40, 0x82, 0x00, 0x14, 0x83, 0x17, 0x00, 0x04,
|
||||
0x3F, 0x18, 0xBE, 0xBC, 0x37, 0x18, 0xBA, 0xAE, 0x41, 0x82, 0x00, 0x0C, 0x3A, 0xF7, 0x00, 0x20,
|
||||
0x4B, 0xFF, 0xFF, 0xDC, 0x3B, 0x00, 0x00, 0x1A, 0x7F, 0x17, 0xC6, 0x2C, 0x8B, 0x5B, 0xFF, 0xCD,
|
||||
0x3D, 0x20, 0x81, 0x70, 0x3A, 0xF8, 0xFF, 0xFE, 0x7E, 0xF7, 0xD1, 0xD6, 0x7E, 0xF7, 0xCA, 0x14,
|
||||
0x7E, 0xB7, 0xD2, 0x14, 0x56, 0xE7, 0x48, 0x1E, 0x52, 0xE7, 0x4C, 0x2C, 0x48, 0x00, 0x00, 0x31,
|
||||
0x39, 0x29, 0x02, 0x00, 0x3A, 0xF7, 0x00, 0x01, 0x7C, 0x17, 0xA8, 0x00, 0x40, 0x82, 0xFF, 0xE8,
|
||||
0x57, 0x18, 0x08, 0x3C, 0x7F, 0x16, 0xC6, 0x2C, 0x28, 0x18, 0xFF, 0xF7, 0x41, 0x80, 0xFF, 0xC8,
|
||||
0x3D, 0x20, 0x81, 0x70, 0x7D, 0x28, 0x03, 0xA6, 0x4E, 0x80, 0x00, 0x21, 0x7D, 0x48, 0x02, 0xA6,
|
||||
0x7E, 0x29, 0x03, 0xA6, 0x90, 0xA3, 0x68, 0x00, 0x4B, 0x00, 0x18, 0x7D, 0x3F, 0xA0, 0x51, 0x00,
|
||||
0x4B, 0x00, 0x18, 0x75, 0x3B, 0x80, 0x00, 0x00, 0x7C, 0xFD, 0xE0, 0x30, 0x4B, 0x00, 0x18, 0x69,
|
||||
0x3B, 0x9C, 0x00, 0x08, 0x2C, 0x1C, 0x00, 0x20, 0x40, 0x82, 0xFF, 0xF0, 0x3F, 0xA0, 0x95, 0x00,
|
||||
0x4B, 0x00, 0x18, 0x55, 0x3F, 0xA0, 0xFF, 0x00, 0x4B, 0x00, 0x18, 0x4D, 0x4B, 0x00, 0x18, 0x49,
|
||||
0x3C, 0x9F, 0x02, 0x00, 0x74, 0x84, 0xFF, 0x00, 0x40, 0x82, 0xFF, 0xF4, 0x4B, 0x00, 0x18, 0x39,
|
||||
0x57, 0xFF, 0x46, 0x3E, 0x7F, 0xE9, 0x21, 0xAE, 0x7C, 0x09, 0x20, 0xAC, 0x38, 0x84, 0x00, 0x01,
|
||||
0x42, 0x00, 0xFF, 0xEC, 0x90, 0x63, 0x68, 0x00, 0x7D, 0x48, 0x03, 0xA6, 0x4E, 0x80, 0x00, 0x20};
|
||||
|
||||
// This is the level 2 boot-code for MBR based file systems.
|
||||
const int sd_lev2_mbr_size = 380;
|
||||
const unsigned char sd_lev2_mbr[380] = {0x90, 0x63, 0x68, 0x00, 0x3A, 0x20, 0x02, 0x02, 0x3B, 0x00, 0x01, 0x86, 0x7F, 0x09, 0xC4, 0x2C,
|
||||
0x57, 0x07, 0x48, 0x1E, 0x53, 0x07, 0x4C, 0x2C, 0x3D, 0x20, 0x81, 0x01, 0x48, 0x00, 0x00, 0xED,
|
||||
0x3B, 0x69, 0x00, 0x40, 0x3D, 0x20, 0x80, 0x10, 0x3B, 0x40, 0xFF, 0xD6, 0x7F, 0x5B, 0xD6, 0x2C,
|
||||
0x3B, 0x20, 0xFF, 0xCE, 0x7F, 0x3B, 0xCE, 0x2C, 0x7F, 0x39, 0xC2, 0x14, 0x8A, 0xFB, 0xFF, 0xD0,
|
||||
0x7F, 0x5A, 0xB9, 0xD6, 0x57, 0x56, 0x48, 0x2C, 0x7E, 0xE9, 0xB2, 0x14, 0x7D, 0x36, 0x4B, 0x78,
|
||||
0x7F, 0x19, 0xD2, 0x14, 0x8B, 0x9B, 0xFF, 0xD1, 0x8B, 0x5B, 0xFF, 0xD2, 0x53, 0x5C, 0x44, 0x2E,
|
||||
0x3B, 0x9C, 0x00, 0x0F, 0x57, 0x9C, 0xE1, 0x3E, 0x7F, 0x18, 0xE2, 0x14, 0x57, 0x27, 0x48, 0x1E,
|
||||
0x53, 0x27, 0x4C, 0x2C, 0x48, 0x00, 0x00, 0x95, 0x39, 0x29, 0x02, 0x00, 0x3B, 0x39, 0x00, 0x01,
|
||||
0x7C, 0x19, 0xC0, 0x00, 0x40, 0x82, 0xFF, 0xE8, 0x83, 0x17, 0x00, 0x00, 0x3F, 0x18, 0xAC, 0xBC,
|
||||
0x37, 0x18, 0xB3, 0xB1, 0x40, 0x82, 0x00, 0x14, 0x83, 0x17, 0x00, 0x04, 0x3F, 0x18, 0xBE, 0xBC,
|
||||
0x37, 0x18, 0xBA, 0xAE, 0x41, 0x82, 0x00, 0x0C, 0x3A, 0xF7, 0x00, 0x20, 0x4B, 0xFF, 0xFF, 0xDC,
|
||||
0x3B, 0x00, 0x00, 0x1A, 0x7F, 0x17, 0xC6, 0x2C, 0x8B, 0x5B, 0xFF, 0xCD, 0x3D, 0x20, 0x81, 0x70,
|
||||
0x3A, 0xF8, 0xFF, 0xFE, 0x7E, 0xF7, 0xD1, 0xD6, 0x7E, 0xF7, 0xCA, 0x14, 0x7E, 0xB7, 0xD2, 0x14,
|
||||
0x56, 0xE7, 0x48, 0x1E, 0x52, 0xE7, 0x4C, 0x2C, 0x48, 0x00, 0x00, 0x31, 0x39, 0x29, 0x02, 0x00,
|
||||
0x3A, 0xF7, 0x00, 0x01, 0x7C, 0x17, 0xA8, 0x00, 0x40, 0x82, 0xFF, 0xE8, 0x57, 0x18, 0x08, 0x3C,
|
||||
0x7F, 0x16, 0xC6, 0x2C, 0x28, 0x18, 0xFF, 0xF7, 0x41, 0x80, 0xFF, 0xC8, 0x3D, 0x20, 0x81, 0x70,
|
||||
0x7D, 0x28, 0x03, 0xA6, 0x4E, 0x80, 0x00, 0x21, 0x7D, 0x48, 0x02, 0xA6, 0x7E, 0x29, 0x03, 0xA6,
|
||||
0x90, 0xA3, 0x68, 0x00, 0x4B, 0x00, 0x18, 0x61, 0x3F, 0xA0, 0x51, 0x00, 0x4B, 0x00, 0x18, 0x59,
|
||||
0x3B, 0x80, 0x00, 0x00, 0x7C, 0xFD, 0xE0, 0x30, 0x4B, 0x00, 0x18, 0x4D, 0x3B, 0x9C, 0x00, 0x08,
|
||||
0x2C, 0x1C, 0x00, 0x20, 0x40, 0x82, 0xFF, 0xF0, 0x3F, 0xA0, 0x95, 0x00, 0x4B, 0x00, 0x18, 0x39,
|
||||
0x3F, 0xA0, 0xFF, 0x00, 0x4B, 0x00, 0x18, 0x31, 0x4B, 0x00, 0x18, 0x2D, 0x3C, 0x9F, 0x02, 0x00,
|
||||
0x74, 0x84, 0xFF, 0x00, 0x40, 0x82, 0xFF, 0xF4, 0x4B, 0x00, 0x18, 0x1D, 0x57, 0xFF, 0x46, 0x3E,
|
||||
0x7F, 0xE9, 0x21, 0xAE, 0x7C, 0x09, 0x20, 0xAC, 0x38, 0x84, 0x00, 0x01, 0x42, 0x00, 0xFF, 0xEC,
|
||||
0x90, 0x63, 0x68, 0x00, 0x7D, 0x48, 0x03, 0xA6, 0x4E, 0x80, 0x00, 0x20};
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
int i, ptype;
|
||||
HANDLE mfile;
|
||||
DWORD ret;
|
||||
unsigned char mbuf[512], vbuf[512];
|
||||
char tname[512];
|
||||
char buffer[MAX_PATH];
|
||||
const unsigned char *sd_lev2;
|
||||
unsigned long sd_lev2_size;
|
||||
|
||||
printf ("SDLoad Card Patcher V1.00 by Costis\n");
|
||||
printf ("(%s Version)\n", OS_version);
|
||||
|
||||
// Check the operating system version...
|
||||
if (GetVersion() & 0x80000000)
|
||||
{
|
||||
// Oops! The user has tried to run this under an incompatible OS!
|
||||
printf ("This program can only be run from Windows 2000\\NT\\XP.\n");
|
||||
exit (0);
|
||||
}
|
||||
|
||||
// Check if the user has passed a valid parameter...
|
||||
if (argc != 2)
|
||||
usage ();
|
||||
|
||||
if ((((argv[1][0] < 'A') || (argv[1][0] > 'Z')) && ((argv[1][0] < 'a') || (argv[1][0] > 'z'))) ||
|
||||
(strlen(argv[1]) > 3))
|
||||
{
|
||||
// The drive letter must be from A through Z and
|
||||
// drive letters must be specified as X, X:, or even X:/
|
||||
printf ("Invalid drive letter specification.\n");
|
||||
exit (0);
|
||||
}
|
||||
|
||||
// Fix the drive letter so that QueryDosDevice accepts it.
|
||||
argv[1][1] = ':';
|
||||
argv[1][2] = 0;
|
||||
|
||||
// Check to make sure the drive is removable...
|
||||
// We don't want a user accidentally corrupting their
|
||||
// hard drive's MBR!
|
||||
if (GetDriveType(argv[1]) != DRIVE_REMOVABLE)
|
||||
{
|
||||
// Oh, oh! A drive which is not removable has been selected...
|
||||
printf ("The drive selected is not a removable device.\n");
|
||||
printf ("Please specify the drive letter of the SD card adapter!\n");
|
||||
exit (0);
|
||||
}
|
||||
|
||||
printf ("\nQuerying device name of drive %s...", argv[1]);
|
||||
|
||||
ret = QueryDosDevice(argv[1], buffer, sizeof(buffer));
|
||||
if (!ret)
|
||||
{
|
||||
// The user has selected an invalid driver letter...
|
||||
printf ("Failed. Invalid drive letter!\n");
|
||||
exit (0);
|
||||
} else
|
||||
printf ("OK!\n");
|
||||
|
||||
// Success! We have retrieved a low-level device name for the specified
|
||||
// drive letter. We want to access partition 0, so remove the last part
|
||||
// from it which is not needed...
|
||||
for (i = strlen (buffer) - 1; i >= 0; i--)
|
||||
{
|
||||
if (buffer[i] == '\\')
|
||||
{
|
||||
buffer[i] = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// And append a Partition0 indicator to the end of it...
|
||||
sprintf (tname, "\\\\.\\GLOBALROOT\\%s\\Partition0", buffer);
|
||||
printf ("Device name: %s\n", tname);
|
||||
|
||||
// Create a low-level Windows file to access the drive as a raw device.
|
||||
printf ("Obtaining low-level access to drive...");
|
||||
mfile = CreateFile (tname, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL);
|
||||
if (mfile == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
// Error!
|
||||
printf ("Failed. Could not create file!\n");
|
||||
exit (0);
|
||||
} else
|
||||
printf ("OK!\n");
|
||||
|
||||
printf ("Reading first sector...");
|
||||
SetFilePointer (mfile, 0, NULL, FILE_BEGIN);
|
||||
ReadFile (mfile, &mbuf, 512, &ret, NULL);
|
||||
if (ret != 512)
|
||||
{
|
||||
// Error! Maybe the user has forgotten to insert an SD card?!?!
|
||||
printf ("Failed! Make sure a working SD card is inserted!\n");
|
||||
CloseHandle (mfile);
|
||||
exit (0);
|
||||
} else
|
||||
printf ("OK!\n");
|
||||
|
||||
// Success! We have managed to read out the first sector of the drive.
|
||||
// Check byte index 0x15 (drive media type descriptor) and byte index
|
||||
// 0x26 (extended signature) to find out whether this sector is a
|
||||
// master boot record or a volume boot record...
|
||||
if ((mbuf[0x26] == 0x29) && (mbuf[0x15] == 0xF8))
|
||||
{
|
||||
// This is a volume boot record, NOT a master boot record...
|
||||
printf ("Volume Boot Record found in Sector 0.\n");
|
||||
// We therefore want to patch in the VBR level 2 code:
|
||||
ptype = 1;
|
||||
sd_lev2 = sd_lev2_vbr;
|
||||
sd_lev2_size = sd_lev2_vbr_size;
|
||||
} else {
|
||||
// This is a master boot record...
|
||||
printf ("Master Boot Record found in Sector 0.\n");
|
||||
// We therefore want to patch in the MBR level 2 code:
|
||||
ptype = 0;
|
||||
sd_lev2 = sd_lev2_mbr;
|
||||
sd_lev2_size = sd_lev2_mbr_size;
|
||||
}
|
||||
|
||||
printf ("Inserting level 2 boot-code in %cBR...", (ptype ? 'V' : 'M'));
|
||||
|
||||
// Patch in the code in the right offset...
|
||||
memcpy (mbuf + 0x40, sd_lev2, sd_lev2_size);
|
||||
|
||||
// Attempt to write the new sector 0 back to the card.
|
||||
SetFilePointer (mfile, 0, NULL, FILE_BEGIN);
|
||||
WriteFile (mfile, mbuf, 512, &ret, NULL);
|
||||
|
||||
if (ret != 512)
|
||||
{
|
||||
// Write failure! Maybe the user has write protected their card?!?!
|
||||
printf ("Write Error! Check the write protect switch on the SD card.\n");
|
||||
CloseHandle (mfile);
|
||||
exit (0);
|
||||
} else
|
||||
printf ("OK!\n");
|
||||
|
||||
// Apparently our write succeeded! Let's check to make sure...
|
||||
printf ("Verifying Master Boot Record...");
|
||||
|
||||
// Read sector 0 again.
|
||||
SetFilePointer (mfile, 0, NULL, FILE_BEGIN);
|
||||
ReadFile (mfile, &vbuf, 512, &ret, NULL);
|
||||
if (ret != 512)
|
||||
{
|
||||
printf ("Read Error!\n");
|
||||
CloseHandle (mfile);
|
||||
exit (0);
|
||||
}
|
||||
|
||||
// Compare the new read back sector 0, with the one that was suppsoed to
|
||||
// have been written.
|
||||
if (memcmp (mbuf, vbuf, 512) != 0)
|
||||
{
|
||||
// Oops! They are not the same...
|
||||
printf ("Verification Failed!\n");
|
||||
CloseHandle (mfile);
|
||||
exit (0);
|
||||
} else
|
||||
printf ("OK!\n");
|
||||
|
||||
// Success! We can now release the file handle back to Windows...
|
||||
printf ("Releasing low-level access handle...");
|
||||
|
||||
if (!CloseHandle (mfile))
|
||||
{
|
||||
// This would be such a great place for the process to fail, eh? ;)
|
||||
printf ("Failed!\n");
|
||||
exit (0);
|
||||
} else
|
||||
printf ("OK!\n");
|
||||
|
||||
// Finally! The SD card patching process has been completed! Tell the
|
||||
// user the good news and instruct them to continue the installation
|
||||
// process...
|
||||
printf ("\nThe SD card has been patched successfully. The file\n");
|
||||
printf ("system on it should remain completely functional as\n");
|
||||
printf ("before, and you may now proceed to the next step of\n");
|
||||
printf ("the Action Replay SD card bootloader installation\n");
|
||||
printf ("process.\n\n");
|
||||
|
||||
// End of program.
|
||||
return 0;
|
||||
}
|
||||
8
src/StdAfx.cpp
Executable file
8
src/StdAfx.cpp
Executable file
@@ -0,0 +1,8 @@
|
||||
// stdafx.cpp : source file that includes just the standard includes
|
||||
// writeSD.pch will be the pre-compiled header
|
||||
// stdafx.obj will contain the pre-compiled type information
|
||||
|
||||
#include "stdafx.h"
|
||||
|
||||
// TODO: reference any additional headers you need in STDAFX.H
|
||||
// and not in this file
|
||||
19
src/StdAfx.h
Executable file
19
src/StdAfx.h
Executable file
@@ -0,0 +1,19 @@
|
||||
// stdafx.h : include file for standard system include files,
|
||||
// or project specific include files that are used frequently, but
|
||||
// are changed infrequently
|
||||
//
|
||||
|
||||
#if !defined(AFX_STDAFX_H__5D442ED7_8B5E_46D9_A725_BBE6D427B72A__INCLUDED_)
|
||||
#define AFX_STDAFX_H__5D442ED7_8B5E_46D9_A725_BBE6D427B72A__INCLUDED_
|
||||
|
||||
#if _MSC_VER > 1000
|
||||
#pragma once
|
||||
#endif // _MSC_VER > 1000
|
||||
|
||||
|
||||
// TODO: reference additional headers your program requires here
|
||||
|
||||
//{{AFX_INSERT_LOCATION}}
|
||||
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
|
||||
|
||||
#endif // !defined(AFX_STDAFX_H__5D442ED7_8B5E_46D9_A725_BBE6D427B72A__INCLUDED_)
|
||||
BIN
testdemo.dol
Executable file
BIN
testdemo.dol
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 166 KiB |
Reference in New Issue
Block a user