I used the mbed LPC ARM board some years back. It has drag-and-drop downloading.
As I recall:
The board has a second smaller microprocessor. It runs the USB mass storage support code, and it uses FATFS and a smallish SPI flash chip.
So a drag and drop actually causes the 2nd microprocessor to take the new file and store it in flash.
Then, IIRC, the 2nd micro installs that file’s code in the main processor if the date is younger than the last installed file (or there is no prior).
I don’t recall how the 2nd micro causes the 1st micro to get and self-program (write flash).
The reason for the 2nd micro was that it always worked, no matter errors in user code and using it adds cost but avoids diminishing the flash available to user code and it didn’t disrupt the reset sequence of the 1st micro from the defaults.
The Teensy 3 board (Freescale Cortex M3) has a 2nd micro too. It doesn’t use the scheme above as USB storage, but it does allow the primary MCU to not have special reset code/sequence, nor does it cost flash space. It could be drag and drop but instead it is invoked by the IDE (Visual Micro’s IDE (Visual Studio) or Arduino’s IDE). These IDEs are both supporting the ARMs from Atmel, Freescale, ST Micro and others.
The 2nd micro is low cost, like < $1.