wie in den News schon berichtet, gibt es eine in der Firmware vorhandene Skriptsprache, mit der sich interessante Dinge anstellen lassen.
Gleich zu Beginn dieser Diskussion soll darauf hingewiesen werden, dass man sich genau überlegen muss, was man mit dieser Möglichkeit anstellen möchte. Bei unsachgemäßer Anwendung besteht die Gefahr, dass die Firmware der Kamera unbrauchbar wird.
Was sind die Voraussetzungen, um ein Canon-Basic-Skript zum Laufen zu bringen?
1. Eine Speicherkarte, formatiert als FAT12/FAT16 oder FAT32. Bootfähigkeit wird nicht benötigt. Die Kartengröße sollte mindestens 512 MB betragen.
2. Die Speicherkarte muss aber trotzdem im Bootsektor besonders vorbereitet werden. Dazu benötigen wir einen Disk-Editor Zu empfehlen ist hier das Programm HxD in der portablen Version (Achtung richtige Version beim Download auswählen). Mit diesem Editor wird Speicherkarte angesprochen und am Offset 0x1F0 die Zeichenkette SCRIPT eingetragen. Dazu das Programm starten und unter "Extras" "Datenträger öffnen.." aufrufen. Das richtige Laufwerk für die SD-Karte auswählen. Die Option "schreibgeschützt öffnen" abwählen. Mit "Ok" das Öffnen bestätigen. Nun kann am genannten Offset die der Eintrag "SCRIPT" im rechten Fenster durchgeführt werden.
Alternativ kann auch das Programm EOSCard benutzt werden, um den Eintrag "SCRIPT" zu erzeugen. Dazu das Programm öffnen. Das Programm erkennt normalerweise die eingelegte SD-Karte automatisch. Mit "Refresh" kann die Erkennung wiederholt werden. Einfach die Option "SCRIPT" aktivieren. Die anderen Optionen sind unwichtig. Mit "Save" speichern.
3. Nun muss eine Datei mit dem Namen script.req erstellt werden. In ihr wird mit einem Text-Editor folgende Zeichenkette eingetragen: for DC_scriptdisk ohne Enter für eine neue Zeile.
4. Das eigentliche Canon-Basic-Skript kommt in die Datei extend.m. Der Name dieser Datei darf nicht anders angegeben werden, egal um welches Skript es sich handelt.
5. Das Skript wird gestartet, in dem man die Kamera im Wiedergabe-Modus startet und die Taste [SET.FUNC] drückt. Bei Kameras mit Touchscreen beim Einschalten Zoom-Hebel nach links halten und nach Einschalten loslassen und zum Skriptstart wieder nach links drücken.
Grundlegende Informationen zur Skriptsprache und deren Syntax werden in diesem Wiki-Artikel erarbeitet.
Das nachstehende Skript ist die übliche Hello-World-Demo. CHDKLover (Danke für die schnelle Integration) hat schon den Canon-Basic-Dialekt in den Syntax-Highlighter aufgenommen. Er ist im Syntax-BBCode unter "Canon Basic" erreichbar.
Syntax: [ Download ] [ Verstecken ]
Benutze Canon Basic Syntax Highlighting
private sub sayHello()
a=LCDMsg_Create()
LCDMsg_SetStr(a,"Hello World!")
end sub
private sub Initialize()
UI.CreatePublic()
sayHello()
end sub
a=LCDMsg_Create()
LCDMsg_SetStr(a,"Hello World!")
end sub
private sub Initialize()
UI.CreatePublic()
sayHello()
end sub
Erstellt in 0.012 Sekunden, mit GeSHi 1.0.8.9
Es kann einfach in die leere Datei extend.m kopiert werden.
Das folgendes Skript (Autor reyalp) erstellt einen Firmware-Dump. Die im Anhang befindliche Zip-Datei enthält die beiden notwendigen Dateien. Diese werden auf die wie oben in Punkt 1 und 2 beschrieben vorbereitete SD-Karte kopiert. Kamera im Wiedergabemodus einschalten! (Wenn vorhanden [>]-Taste für den Wiedergabemodus zum Einschalten benutzen.)
Skript mit FUNC.SET starten. Eine Weile warten (ca. 1 Minute). Möglicherweise wird auf dem Display nichts angezeigt, da die Farbwerte für die Schrift von Kamera zu Kamera unterschiedlich sind. Das Skript erzeugt auf der SD-Karte zwei Dateien: PRIMARY.BIN und CBDUMPER.LOG.
PRIMARY.BIN ist der Firmware-Dump. In CBDUMPER.LOG werden Log-Informationen geschrieben. Wenn nur diese Datei verfügbar ist, war die Erstellung des Firmware-Dumps nicht erfolgreich. Bei Verfügbarkeit der Log-Datei hat man aber Gewissheit, dass das Skript funktioniert.
Ein erfolgreich erstellter Firmware-Dump hat eine Größe von 8 oder 16 MB. Bei neueren Kameras kann die Größe abweichen.
Kann trotz funktionierendem Skript kein Firmware-Dump erzeugt werden, passen möglicherweise die vorgegebenen Adressen und/oder Signaturen für die Kamera nicht und müssen angepasst werden.
Syntax: [ Download ] [ Verstecken ]
Benutze Canon Basic Syntax Highlighting
DIM startaddr=0
DIM os="unk"
DIM lcdmsg=0
DIM msgstr=0
private sub GetStart()
if memcmp(0xFFC00004,"gaonisoy",8) = 0 then
startaddr = 0xFFC00000
os = "dry"
exit sub
end if
if memcmp(0xFFC00008,"Copyrigh",8) = 0 then
startaddr = 0xFFC00000
os = "vx"
exit sub
end if
if memcmp(0xFF810004,"gaonisoy",8) = 0 then
startaddr = 0xFF810000
os = "dry"
exit sub
end if
if memcmp(0xFF810008,"Copyrigh",8) = 0 then
startaddr = 0xFF810000
os = "vx"
exit sub
end if
if memcmp(0xFF000004,"gaonisoy",8) = 0 then
startaddr = 0xFF000000
os = "dry"
exit sub
end if
end sub
private sub RegisterProcs()
if System.Create() = -1 then
SystemEventInit()
end if
if ExecuteEventProcedure("UI_RegistDebugEventProc") = -1 then
ExecuteEventProcedure("UI.CreatePublic")
end if
end sub
private sub InitMsg()
lcdmsg = ExecuteEventProcedure("LCDMsg_Create")
msgstr = AllocateMemory(80)
msgfile = Fopen_Fut("A/CBDUMPER.LOG","w")
if msgfile <> 0 then
Fclose_Fut(msgfile)
end if
end sub
private sub PutMsg(msg)
if lcdmsg >= 0 then
LCDMsg_SetStr(lcdmsg,msg)
end if
msgfile = Fopen_Fut("A/CBDUMPER.LOG","a")
if msgfile <> 0 then
Fwrite_Fut(msg,strlen(msg),1,msgfile)
Fwrite_Fut("\n",1,1,msgfile)
Fclose_Fut(msgfile)
end if
end sub
private sub Initialize()
RegisterProcs()
InitMsg()
PutMsg("Started")
GetStart()
if startaddr <> 0 then
sprintf(msgstr,"%0X %s",startaddr,os)
PutMsg(msgstr)
romsize = 0xFFFFFFFC - startaddr
dumpfile = Fopen_Fut("A/PRIMARY.BIN","w")
if dumpfile <> 0 then
Fwrite_Fut(startaddr,romsize,1,dumpfile)
Fclose_Fut(dumpfile)
Wait(500)
PutMsg("done")
else
PutMsg("file error")
end if
else
PutMsg("not found!")
end if
FreeMemory(msgstr)
end sub
DIM os="unk"
DIM lcdmsg=0
DIM msgstr=0
private sub GetStart()
if memcmp(0xFFC00004,"gaonisoy",8) = 0 then
startaddr = 0xFFC00000
os = "dry"
exit sub
end if
if memcmp(0xFFC00008,"Copyrigh",8) = 0 then
startaddr = 0xFFC00000
os = "vx"
exit sub
end if
if memcmp(0xFF810004,"gaonisoy",8) = 0 then
startaddr = 0xFF810000
os = "dry"
exit sub
end if
if memcmp(0xFF810008,"Copyrigh",8) = 0 then
startaddr = 0xFF810000
os = "vx"
exit sub
end if
if memcmp(0xFF000004,"gaonisoy",8) = 0 then
startaddr = 0xFF000000
os = "dry"
exit sub
end if
end sub
private sub RegisterProcs()
if System.Create() = -1 then
SystemEventInit()
end if
if ExecuteEventProcedure("UI_RegistDebugEventProc") = -1 then
ExecuteEventProcedure("UI.CreatePublic")
end if
end sub
private sub InitMsg()
lcdmsg = ExecuteEventProcedure("LCDMsg_Create")
msgstr = AllocateMemory(80)
msgfile = Fopen_Fut("A/CBDUMPER.LOG","w")
if msgfile <> 0 then
Fclose_Fut(msgfile)
end if
end sub
private sub PutMsg(msg)
if lcdmsg >= 0 then
LCDMsg_SetStr(lcdmsg,msg)
end if
msgfile = Fopen_Fut("A/CBDUMPER.LOG","a")
if msgfile <> 0 then
Fwrite_Fut(msg,strlen(msg),1,msgfile)
Fwrite_Fut("\n",1,1,msgfile)
Fclose_Fut(msgfile)
end if
end sub
private sub Initialize()
RegisterProcs()
InitMsg()
PutMsg("Started")
GetStart()
if startaddr <> 0 then
sprintf(msgstr,"%0X %s",startaddr,os)
PutMsg(msgstr)
romsize = 0xFFFFFFFC - startaddr
dumpfile = Fopen_Fut("A/PRIMARY.BIN","w")
if dumpfile <> 0 then
Fwrite_Fut(startaddr,romsize,1,dumpfile)
Fclose_Fut(dumpfile)
Wait(500)
PutMsg("done")
else
PutMsg("file error")
end if
else
PutMsg("not found!")
end if
FreeMemory(msgstr)
end sub
Erstellt in 0.013 Sekunden, mit GeSHi 1.0.8.9
Gruß msl