mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-19 21:03:48 -07:00
add: mem spiffs wipe
This commit is contained in:
parent
146c8f4e8e
commit
ccbfdf9e88
5 changed files with 93 additions and 23 deletions
|
@ -1900,6 +1900,13 @@ static void PacketReceived(PacketCommandNG *packet) {
|
||||||
LED_B_OFF();
|
LED_B_OFF();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case CMD_SPIFFS_WIPE: {
|
||||||
|
LED_B_ON();
|
||||||
|
rdv40_spiffs_safe_wipe();
|
||||||
|
reply_ng(CMD_SPIFFS_WIPE, PM3_SUCCESS, NULL, 0);
|
||||||
|
LED_B_OFF();
|
||||||
|
break;
|
||||||
|
}
|
||||||
case CMD_FLASHMEM_SET_SPIBAUDRATE: {
|
case CMD_FLASHMEM_SET_SPIBAUDRATE: {
|
||||||
if (packet->length != sizeof(uint32_t))
|
if (packet->length != sizeof(uint32_t))
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -472,16 +472,20 @@ int rdv40_spiffs_is_symlink(const char *s) {
|
||||||
// ATTENTION : you must NOT provide the whole filename (so please do not include the .lnk extension)
|
// ATTENTION : you must NOT provide the whole filename (so please do not include the .lnk extension)
|
||||||
// TODO : integrate in read_function
|
// TODO : integrate in read_function
|
||||||
int rdv40_spiffs_read_as_symlink(char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level) {
|
int rdv40_spiffs_read_as_symlink(char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level) {
|
||||||
RDV40_SPIFFS_SAFE_FUNCTION( //
|
RDV40_SPIFFS_SAFE_FUNCTION(
|
||||||
char linkdest[SPIFFS_OBJ_NAME_LEN]; //
|
char linkdest[SPIFFS_OBJ_NAME_LEN];
|
||||||
char linkfilename[SPIFFS_OBJ_NAME_LEN]; //
|
char linkfilename[SPIFFS_OBJ_NAME_LEN];
|
||||||
sprintf(linkfilename, "%s.lnk", filename);
|
sprintf(linkfilename, "%s.lnk", filename);
|
||||||
if (DBGLEVEL > 1) Dbprintf("Linkk real filename is destination is : %s", linkfilename);
|
|
||||||
|
if (DBGLEVEL > 1) Dbprintf("Linkk real filename is : " _YELLOW_("%s"), linkfilename);
|
||||||
|
|
||||||
read_from_spiffs((char *)linkfilename, (uint8_t *)linkdest, SPIFFS_OBJ_NAME_LEN);
|
read_from_spiffs((char *)linkfilename, (uint8_t *)linkdest, SPIFFS_OBJ_NAME_LEN);
|
||||||
if (DBGLEVEL > 1) Dbprintf("Symlink destination is : %s", linkdest);
|
|
||||||
read_from_spiffs((char *)linkdest, (uint8_t *)dst, size); //
|
if (DBGLEVEL > 1) Dbprintf("Symlink destination is : " _YELLOW_("%s"), linkdest);
|
||||||
)
|
|
||||||
}
|
read_from_spiffs((char *)linkdest, (uint8_t *)dst, size);
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
// BEWARE ! This function is DESTRUCTIVE as it will UPDATE an existing symlink
|
// BEWARE ! This function is DESTRUCTIVE as it will UPDATE an existing symlink
|
||||||
// Since it creates a .lnk extension file it may be minor to mistake the order of arguments
|
// Since it creates a .lnk extension file it may be minor to mistake the order of arguments
|
||||||
|
@ -601,6 +605,37 @@ void rdv40_spiffs_safe_print_tree(uint8_t banner) {
|
||||||
rdv40_spiffs_lazy_mount_rollback(changed);
|
rdv40_spiffs_lazy_mount_rollback(changed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void rdv40_spiffs_safe_wipe(void) {
|
||||||
|
|
||||||
|
int changed = rdv40_spiffs_lazy_mount();
|
||||||
|
|
||||||
|
spiffs_DIR d;
|
||||||
|
struct spiffs_dirent e;
|
||||||
|
struct spiffs_dirent *pe = &e;
|
||||||
|
SPIFFS_opendir(&fs, "/", &d);
|
||||||
|
|
||||||
|
while ((pe = SPIFFS_readdir(&d, pe))) {
|
||||||
|
|
||||||
|
if (rdv40_spiffs_is_symlink((const char *)pe->name)) {
|
||||||
|
|
||||||
|
char linkdest[SPIFFS_OBJ_NAME_LEN];
|
||||||
|
read_from_spiffs((char *)pe->name, (uint8_t *)linkdest, SPIFFS_OBJ_NAME_LEN);
|
||||||
|
|
||||||
|
remove_from_spiffs(linkdest);
|
||||||
|
Dbprintf(".lnk removed %s", pe->name);
|
||||||
|
|
||||||
|
remove_from_spiffs((char *)pe->name);
|
||||||
|
Dbprintf("removed %s", linkdest);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
remove_from_spiffs((char *)pe->name);
|
||||||
|
Dbprintf("removed %s", pe->name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SPIFFS_closedir(&d);
|
||||||
|
rdv40_spiffs_lazy_mount_rollback(changed);
|
||||||
|
}
|
||||||
|
|
||||||
// Selftest function
|
// Selftest function
|
||||||
void test_spiffs(void) {
|
void test_spiffs(void) {
|
||||||
|
|
|
@ -58,6 +58,8 @@ int rdv40_spiffs_stat(char *filename, uint32_t *buf, RDV40SpiFFSSafetyLevel leve
|
||||||
uint32_t size_in_spiffs(const char *filename);
|
uint32_t size_in_spiffs(const char *filename);
|
||||||
int exists_in_spiffs(const char *filename);
|
int exists_in_spiffs(const char *filename);
|
||||||
|
|
||||||
|
void rdv40_spiffs_safe_wipe(void);
|
||||||
|
|
||||||
#define SPIFFS_OK 0
|
#define SPIFFS_OK 0
|
||||||
#define SPIFFS_ERR_NOT_MOUNTED -10000
|
#define SPIFFS_ERR_NOT_MOUNTED -10000
|
||||||
#define SPIFFS_ERR_FULL -10001
|
#define SPIFFS_ERR_FULL -10001
|
||||||
|
|
|
@ -74,7 +74,14 @@ static int usage_flashmemspiffs_load(void) {
|
||||||
return PM3_SUCCESS;
|
return PM3_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int usage_flashmemspiffs_wipe(void) {
|
||||||
|
PrintAndLogEx(NORMAL, "wipes all files on the device filesystem " _RED_("* Warning *"));
|
||||||
|
PrintAndLogEx(NORMAL, "Usage: mem spiffs wipe [h]");
|
||||||
|
PrintAndLogEx(NORMAL, "");
|
||||||
|
PrintAndLogEx(NORMAL, "Examples:");
|
||||||
|
PrintAndLogEx(NORMAL, _YELLOW_(" mem spiffs wipe"));
|
||||||
|
return PM3_SUCCESS;
|
||||||
|
}
|
||||||
static int CmdFlashMemSpiFFSMount(const char *Cmd) {
|
static int CmdFlashMemSpiFFSMount(const char *Cmd) {
|
||||||
(void)Cmd; // Cmd is not used so far
|
(void)Cmd; // Cmd is not used so far
|
||||||
clearCommandBuffer();
|
clearCommandBuffer();
|
||||||
|
@ -413,6 +420,23 @@ out:
|
||||||
return ret_val;
|
return ret_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int CmdFlashMemSpiFFSWipe(const char *Cmd) {
|
||||||
|
|
||||||
|
char ctmp = tolower(param_getchar(Cmd, 0));
|
||||||
|
if (ctmp == 'h') {
|
||||||
|
return usage_flashmemspiffs_wipe();
|
||||||
|
}
|
||||||
|
|
||||||
|
PrintAndLogEx(INFO, "Wiping all files from SPIFFS FileSystem");
|
||||||
|
PacketResponseNG resp;
|
||||||
|
clearCommandBuffer();
|
||||||
|
SendCommandNG(CMD_SPIFFS_WIPE, NULL, 0);
|
||||||
|
WaitForResponse(CMD_SPIFFS_WIPE, &resp);
|
||||||
|
PrintAndLogEx(INFO, "Done!");
|
||||||
|
PrintAndLogEx(HINT, "Try use '" _YELLOW_("mem spiffs tree") "' to verify.");
|
||||||
|
return PM3_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static int CmdFlashMemSpiFFSLoad(const char *Cmd) {
|
static int CmdFlashMemSpiFFSLoad(const char *Cmd) {
|
||||||
|
|
||||||
char filename[FILE_PATH_SIZE] = {0};
|
char filename[FILE_PATH_SIZE] = {0};
|
||||||
|
@ -473,20 +497,18 @@ static int CmdFlashMemSpiFFSLoad(const char *Cmd) {
|
||||||
static command_t CommandTable[] = {
|
static command_t CommandTable[] = {
|
||||||
|
|
||||||
{"help", CmdHelp, AlwaysAvailable, "This help"},
|
{"help", CmdHelp, AlwaysAvailable, "This help"},
|
||||||
{
|
{"copy", CmdFlashMemSpiFFSCopy, IfPm3Flash, "Copy a file to another (destructively) in SPIFFS FileSystem in FlashMEM (spiffs)"},
|
||||||
"copy", CmdFlashMemSpiFFSCopy, IfPm3Flash,
|
{"check", CmdFlashMemSpiFFSCheck, IfPm3Flash, "Check/try to defrag faulty/fragmented Filesystem"},
|
||||||
"Copy a file to another (destructively) in SPIFFS FileSystem in FlashMEM (spiffs)"
|
{"dump", CmdFlashMemSpiFFSDump, IfPm3Flash, "Dump a file from SPIFFS FileSystem in FlashMEM (spiffs)"},
|
||||||
},
|
{"info", CmdFlashMemSpiFFSInfo, IfPm3Flash, "Print filesystem info and usage statistics (spiffs)"},
|
||||||
{"check", CmdFlashMemSpiFFSCheck, IfPm3Flash, "Check/try to defrag faulty/fragmented Filesystem"},
|
{"load", CmdFlashMemSpiFFSLoad, IfPm3Flash, "Upload file into SPIFFS Filesystem (spiffs)"},
|
||||||
{"dump", CmdFlashMemSpiFFSDump, IfPm3Flash, "Dump a file from SPIFFS FileSystem in FlashMEM (spiffs)"},
|
{"mount", CmdFlashMemSpiFFSMount, IfPm3Flash, "Mount the SPIFFS Filesystem if not already mounted (spiffs)"},
|
||||||
{"info", CmdFlashMemSpiFFSInfo, IfPm3Flash, "Print filesystem info and usage statistics (spiffs)"},
|
{"remove", CmdFlashMemSpiFFSRemove, IfPm3Flash, "Remove a file from SPIFFS FileSystem in FlashMEM (spiffs)"},
|
||||||
{"load", CmdFlashMemSpiFFSLoad, IfPm3Flash, "Upload file into SPIFFS Filesystem (spiffs)"},
|
{"rename", CmdFlashMemSpiFFSRename, IfPm3Flash, "Rename/move a file in SPIFFS FileSystem in FlashMEM (spiffs)"},
|
||||||
{"mount", CmdFlashMemSpiFFSMount, IfPm3Flash, "Mount the SPIFFS Filesystem if not already mounted (spiffs)"},
|
{"test", CmdFlashMemSpiFFSTest, IfPm3Flash, "Test SPIFFS Operations (require wiping pages 0 and 1)"},
|
||||||
{"remove", CmdFlashMemSpiFFSRemove, IfPm3Flash, "Remove a file from SPIFFS FileSystem in FlashMEM (spiffs)"},
|
{"tree", CmdFlashMemSpiFFSTree, IfPm3Flash, "Print the Flash Memory FileSystem Tree (spiffs)"},
|
||||||
{"rename", CmdFlashMemSpiFFSRename, IfPm3Flash, "Rename/move a file in SPIFFS FileSystem in FlashMEM (spiffs)"},
|
|
||||||
{"test", CmdFlashMemSpiFFSTest, IfPm3Flash, "Test SPIFFS Operations (require wiping pages 0 and 1)"},
|
|
||||||
{"tree", CmdFlashMemSpiFFSTree, IfPm3Flash, "Print the Flash Memory FileSystem Tree (spiffs)"},
|
|
||||||
{"unmount", CmdFlashMemSpiFFSUnmount, IfPm3Flash, "Un-mount the SPIFFS Filesystem if not already mounted (spiffs)"},
|
{"unmount", CmdFlashMemSpiFFSUnmount, IfPm3Flash, "Un-mount the SPIFFS Filesystem if not already mounted (spiffs)"},
|
||||||
|
{"wipe", CmdFlashMemSpiFFSWipe, IfPm3Flash, "Wipe all files from SPIFFS FileSystem." _RED_("* dangerous *") },
|
||||||
{NULL, NULL, NULL, NULL}
|
{NULL, NULL, NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -409,11 +409,12 @@ typedef struct {
|
||||||
#define CMD_SPIFFS_MOUNT 0x0130
|
#define CMD_SPIFFS_MOUNT 0x0130
|
||||||
#define CMD_SPIFFS_UNMOUNT 0x0131
|
#define CMD_SPIFFS_UNMOUNT 0x0131
|
||||||
#define CMD_SPIFFS_WRITE 0x0132
|
#define CMD_SPIFFS_WRITE 0x0132
|
||||||
|
|
||||||
// We take +0x1000 when having a variant of similar function (todo : make it an argument!)
|
// We take +0x1000 when having a variant of similar function (todo : make it an argument!)
|
||||||
#define CMD_SPIFFS_APPEND 0x1132
|
#define CMD_SPIFFS_APPEND 0x1132
|
||||||
|
|
||||||
#define CMD_SPIFFS_READ 0x0133
|
#define CMD_SPIFFS_READ 0x0133
|
||||||
//We use no open/close instruvtion, as they are handled internally.
|
//We use no open/close instruction, as they are handled internally.
|
||||||
#define CMD_SPIFFS_REMOVE 0x0134
|
#define CMD_SPIFFS_REMOVE 0x0134
|
||||||
#define CMD_SPIFFS_RM CMD_SPIFFS_REMOVE
|
#define CMD_SPIFFS_RM CMD_SPIFFS_REMOVE
|
||||||
#define CMD_SPIFFS_RENAME 0x0135
|
#define CMD_SPIFFS_RENAME 0x0135
|
||||||
|
@ -424,6 +425,9 @@ typedef struct {
|
||||||
#define CMD_SPIFFS_FSTAT 0x0138
|
#define CMD_SPIFFS_FSTAT 0x0138
|
||||||
#define CMD_SPIFFS_INFO 0x0139
|
#define CMD_SPIFFS_INFO 0x0139
|
||||||
#define CMD_SPIFFS_FORMAT CMD_FLASHMEM_WIPE
|
#define CMD_SPIFFS_FORMAT CMD_FLASHMEM_WIPE
|
||||||
|
|
||||||
|
#define CMD_SPIFFS_WIPE 0x013A
|
||||||
|
|
||||||
// This take a +0x2000 as they are high level helper and special functions
|
// This take a +0x2000 as they are high level helper and special functions
|
||||||
// As the others, they may have safety level argument if it makkes sense
|
// As the others, they may have safety level argument if it makkes sense
|
||||||
#define CMD_SPIFFS_PRINT_TREE 0x2130
|
#define CMD_SPIFFS_PRINT_TREE 0x2130
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue