MLinstall - USB Installer tool for ML

Started by petabyte, July 18, 2021, 01:14:50 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.


MLinstall is a Windows/Linux utility that makes it easier to install Magic Lantern.

Read more:

Old post:
I've been working on a utility that should help with installing Magic Lantern.
Source code:

It currently can:

- Run Canon event procedures:
Based on some research in, I've
gotten Canon's `0x9052` PTP command to work properly. This allows for
commands like "EnableBootDisk" and "DisableBootDisk" to be run via PTP.
I think this command is standard on almost all Canon cameras, so it
could possibly replace custom firmware files. (?)

- Card Tools:
I've also added a card flag enabler (bootdisk, canon basic), and an
option to disable them without reformatting card.
(just writes an underscore on the first character of each)

Walter Schulz

Avoiding messing with custom firmware files and thus avoiding legal issues (without the need to access via UART) will have a big impact IMO!

Any plans to make it work on macOS?


I think it should be pretty easy to get it to work. But the only Mac I have is an old iMac G4, which is probably too old.

The old python version ( should work on it.

Walter Schulz

No hurry!

Another one: EOS M is not supported by gphoto2, Tornado EOS, EOS Webcam Utility. Has anyone tested your tools with EOS M?


Not that I know of. I guess the safe way to check would be looking for the string "ExecuteEventProc" in a ram dump.


Does this mean that ptp command 0x9052 (36946) is not supported?
Quotepython3 ./
    StandardVersion = 100
    VendorExtensionID = Microsoft
    VendorExtensionVersion = 100
    VendorExtensionDesc =
    FunctionalMode = 0
    OperationsSupported = ['GetDevicePropDesc', 'GetDevicePropValue', 'SetDevicePropValue', 'ResetDevicePropValue', 'GetDeviceInfo', 'OpenSession', 'CloseSession', 'CheckEvent', 36956, 36957, 'ChangeUSBProtocol', 'GetStorageIDs', 'GetStorageInfo', 'GetNumObjects', 'GetObjectHandles', 'GetObjectInfo', 'GetObject', 'GetThumb', 'GetPartialObject', 'SendObjectInfo', 'SendObject', 'DeleteObject', 'FormatStore', 'SetObjectProtection', 'GetObjectSize', 'GetObjectInfoEx', 'GetPartialObjectEx', 'GetObjectAttributes', 'SendPartialObject', 'GetObjectHandleByName', 'SetObjectTime', 'SetObjectArchive', 36940, 'SendObjectInfoByPath', 'SendObjectByPath', 36920, 36921, 36922, 36923, 36939, 36960, 36962, 38913, 38914, 38915, 38916, 38917, 'EOSGetEvent', 'EOSGetStorageIDs', 'EOSGetStorageInfo', 'EOSGetObjectInfo', 'EOSDeleteObject', 'EOSFormatStore', 'EOSGetPartialObject', 'EOSGetObjectInfoEx', 'EOSGetThumbEx', 'EOSSetObjectAttributes', 'EOSTransferComplete', 'EOSCancelTransfer', 37164, 37170, 37173, 37184, 37185, 37187, 'EOSPCHDDCapacity', 37183, 'EOSSetEventMode', 'EOSSetUILock', 'EOSResetUILock', 'EOSKeepDeviceOn', 37181, 37174, 37175, 'EOSSetRemoteMode', 'EOSGetViewFinderImage', 'EOSRemoteReleaseOn', 'EOSRemoteReleaseOff', 'EOSZoom', 'EOSZoomPosition', 'EOSDoAf', 'EOSAfCancel', 'EOSDriveLens', 37211, 36911, 'EOSSetDevicePropValueEx', 'EOSRequestDevicePropValue', 37250, 37251, 37252, 37253, 36944, 36945]
    EventsSupported = ['CancelTransaction', 'ObjectAdded', 'ObjectRemoved', 'StoreAdded', 'StoreRemoved', 'DevicePropChanged', 'ObjectInfoChanged', 'DeviceInfoChanged', 'RequestObjectTransfer', 'StoreFull', 'DeviceReset', 'StorageInfoChanged', 'UnreportedStatus', 49153, 49157, 49162, 49409]
    DevicePropertiesSupported = [53317, 53322, 53294, 53295, 'BatteryLevel', 53250, 'ViewfinderMode', 'UnixTime', 53319, 53318, 53296, 53321, 'CameraModel', 'CameraOwner', 'FlashMemory', 53328, 53329, 53330, 53331, 53332, 53335, 54274, 54278, 54279, 54019]
    CaptureFormats = ['EXIF_JPEG']
    ImageFormats = ['Association', 'Script', 'DPOF', 'WAV', 'EXIF_JPEG', 'UndefinedImage', 'CRW3', 47490, 45317, 48897]
    Manufacturer = Canon Inc.
    Model = Canon EOS M3
    DeviceVersion = 3-
    SerialNumber = *


I guess not, assuming Canon didin't change the command ID or anything.


I already found that the command 0x9052 becomes available after calling the command 0x9050 three times.



Just because of Canon's firmware:

uint handle_PTP_OC_0x9050
               (undefined4 param_1,undefined4 *param_2,undefined4 param_3,undefined4 param_4,
               undefined4 param_5)

  uint uVar1;
  uint uVar2;
  uint uVar3;
  uint uVar4;
  uint uVar5;
  uint uVar6;
  uint uVar7;
  undefined2 local_38 [2];
  undefined4 local_34;
  undefined4 uStack48;
  undefined4 local_2c;
  uVar7 = 0;
  uStack48 = param_5;
  local_2c = 0;
  DAT_0000ef68 += 1;
  local_34 = param_4;
  if (DAT_0000ef68 == 3) {
    uVar1 = add_ptp_handler(&DAT_00009052,handle_PTP_OC_0x9052 + 1,0);
    uVar2 = add_ptp_handler(&DAT_00009053,handle_PTP_OC_0x9053 + 1,0);
    uVar3 = add_ptp_handler(&DAT_00009057,handle_PTP_OC_0x9057 + 1,0);
    uVar4 = add_ptp_handler(&DAT_00009058,handle_PTP_OC_0x9058 + 1,0);
    uVar5 = add_ptp_handler(&DAT_00009059,handle_PTP_OC_0x9059 + 1,0);
    uVar6 = add_ptp_handler(&DAT_0000905a,handle_PTP_OC_0x905a + 1,0);
    uVar7 = add_ptp_handler(&DAT_0000905b,handle_PTP_OC_0x905b + 1,0);
    uVar7 |= uVar6 | uVar5 | uVar4 | uVar3 | uVar2 | uVar1;
    DAT_0000ef64 = 1;
  if ((uVar7 & 1) == 0) {
    local_38[0] = 0x2001;
    (*(code *)param_2[3])(*param_2,local_38);
  else {
    local_38[0] = 0x201f;
    (*(code *)param_2[3])(*param_2,local_38);
    uVar7 = 1;
  return uVar7;


Quote from: Ant123 on July 19, 2021, 07:58:08 PM
I already found that the command 0x9052 becomes available after calling the command 0x9050 three times.

Have you tried calling 0x9052 after doing that?



Is there the way to run event procedures with arguments?


Yes, I think you can send integer arguments simply via the standard PTP arguments.

I've set up to work like this:
`camera.eos_run_command("EnableBootDisk", [1, 2, 3])`


I've added a few more features to the app:
- Redo UI with a GTK "notebook"
- Add "Make card scriptable"
- Add "Make card un-scriptable"
- Add credits and license
- Add button hints
- Better error messages


Big thanks for your help. It saves the lazy hardware guys (me) from having to crack open their cameras to get the full features of their devices.

Windows 10 wouldn't work correctly, as it doesn't install a standard PTP driver for my 1600D, so I booted up into a LiveUSB version of Ubuntu 21 and ran your linux version succesfully.


I was able to reproduce it on Windows 10. Looking for a solution...


Apparently I forgot that I had installed libusb in my Windows 7 testing VM, so
I wasn't aware of this issue.

A quick solution is to download Zadig ( and replace WinUSB with
libusb-win32. Here's a GIF animation showing exactly what to do:

If this doesn't work, please let me know.


Experiment for a "one click install":
Plug in camera + SD card, and click a button to fully install Magic Lantern.

PTP is used to detect model/firmware version, and the correct Magic Lantern build
is unzipped into the SD card. The bootdisk flag and the card flags are written as well.

Also see the Github issue:

This is just a proof-of-concept to see if it would work. It won't be released any time soon, if
it is released at all. Feedback/ideas for this are welcome.



Thanks petabyte, Enabling/Disabling Boot Disk works fine on 700D/5D3, also tested custom event procedure and it works fine on both cameras

I had "No PTP/USB device found" issue on Windows 10, and doing the following fixes the problem:

Quote from: petabyte on August 09, 2021, 03:44:41 AM
A quick solution is to download Zadig ( and replace WinUSB with
libusb-win32. Here's a GIF animation showing exactly what to do:

Please add this as note for Windows users in OP :D

Great work!


Sure. Although I would think that the MANUAL.txt in the zip file and the note in the release description would be enough...

Thanks for testing!


Version 0.7 released.

- Added an untested activator for 0x9052 as per Ant123's findings (
Still not sure what models require it, so it's just a button for now.

- Added a "module store"
I thought this would be a cool idea. You can plug the SD card into your computer and install modules, just like an app store on a smartphone. Here's a demonstration:


Quote from: Ant123 on July 19, 2021, 09:21:11 PM
Is there the way to run event procedures with arguments?
Yes. Thanks to petabyte for publishing the first usage details.


Version 0.8.1 Released.

I've implemented srsa_4c's findings in the mlinstall EvProc parser.

It includes a basic command parser. It accepts plain text (commands), 
strings (between quotes), and numbers (base 10 and hex).

FooBar "Hello, World"
foo_bar 123 0x123

Use at your own risk.