SceSdif is a kernel module that is primary responsible for communicating with SD devices. This includes onboard eMMC, game card MMC, wi-fi/bluetooth SDIO devices.
To communicate with particular device SceSdif module uses device index (sd_ctx_index)
Device Index
|
Type
|
Description
|
0
|
MMC
|
onboard eMMC
|
1
|
MMC
|
game card
|
2
|
SDIO
|
wi-fi/bluetooth
|
Module
Known NIDs
Version |
Name |
World |
Privilege |
NID
|
1.69 |
SceSdif |
Non-secure |
Kernel |
0xCA882EE3
|
3.60 |
SceSdif |
? |
Kernel |
0x2E7C52F7
|
Libraries
Known NIDs
Data segment layout
Address |
Size |
Description
|
0x0000 |
0x40 |
unknown
|
0x0040 |
0x24C0 |
sd_context_global eMMC
|
0x2500 |
0x24C0 |
sd_context_global game card
|
0x49C0 |
0x24C0 |
sd_context_global wlan/bt
|
0x6E80 |
0x0x398 |
sd_context_part eMMC
|
0x7218 |
0x398 |
sd_context_part game card
|
0x75B0 |
0xC0 |
custom context used in c1271539
|
0x7670 |
0xC0 |
custom context used in c1271539
|
0x7730 |
0xC0 |
custom context used in c1271539
|
0x77F0 |
0xD38 |
custom context used in aabaa0f0
|
0x8528 |
0xD38 |
custom context used in aabaa0f0
|
0x9260 |
0x398 |
sd_context_part wlan/bt
|
0x95F8 |
0x888 |
unknown
|
0x9E80 |
0x118 |
some wlan/bt data
|
SceSdifForDriver
typedef struct output_23a4ef01
{
uint32_t unk_0;
uint32_t unk_4;
uint32_t unk_8;
uint32_t unk_C;
};
typedef struct output_24
{
uint32_t unk_0;
uint32_t unk_4;
uint32_t unk_8;
uint32_t unk_C;
uint32_t unk_10;
uint8_t unk_14;
uint8_t unk_15;
uint8_t unk_16;
uint8_t unk_17;
uint32_t unk_18;
uint32_t unk_1C;
uint32_t unk_20;
uint32_t unk_24;
};
typedef struct output_76d2b87b
{
uint32_t unk_0;
uint32_t unk_4;
uint16_t unk_8;
};
typedef struct cmd_input // size is 0x240
{
uint32_t size; // 0x240
uint32_t unk_4;
uint32_t command;
uint32_t argument;
uint8_t data0[0x50];
struct cmd_input* next_cmd;
uint32_t unk_64;
uint32_t unk_68;
uint32_t unk_6C;
uint32_t unk_70;
uint32_t unk_74;
struct sd_context_global* gctx_ptr;
uint32_t unk_7C;
uint8_t data1[0x1C0];
} cmd_input;
typedef struct sd_context_data // size is 0xC0
{
struct cmd_input* cmd_ptr;
struct cmd_input* cmd_ptr_next;
uint32_t unk_8;
uint32_t unk_C;
uint32_t sd_index;
struct sd_context_part* ctx;
uint32_t unk_18;
uint32_t unk_1C;
uint8_t data[0xA0];
} sd_context_data;
typedef struct sd_context_part // size is 0x398
{
struct sd_context_global* gctx_ptr;
uint8_t data[0x38C];
void* unk_390;
uint32_t unk_394;
} sd_context_part;
typedef struct sd_context_global // size is 0x24C0
{
struct cmd_input commands[16];
struct sd_context_data ctx_data;
} sd_context_global;
module_start
Version |
NID
|
3.60 |
0x935cd196
|
int module_start();
init
Version |
NID
|
3.60 |
0x0eb0ef86
|
int init();
deinit
Version |
NID
|
3.60 |
0xe5e5f42e
|
int deinit();
return_error
Version |
NID
|
3.60 |
0x235ad556
|
int return_error();
enable_slow_mode
Version |
NID
|
3.60 |
0xf37cf8e5
|
int enable_slow_mode();
get_card_insert_state1
Version |
NID
|
3.60 |
0x36a2b01b
|
int get_card_insert_state1(int sd_ctx_index);
get_card_insert_state2
Version |
NID
|
3.60 |
0xfd9e5cfa
|
int get_card_insert_state2(int sd_ctx_index);
gc_cmd56_response
Version |
NID
|
3.60 |
0x134e06c4
|
int gc_cmd56_response(sd_context_part* ctx, char* buffer, int length);
gc_cmd56_request
Version |
NID
|
3.60 |
0xb0996641
|
int gc_cmd56_request(sd_context_part* ctx, char* buffer, int length);
get_sd_context_global
Version |
NID
|
3.60 |
0xdc8f52f8
|
sd_context_global* get_sd_context_global(int sd_ctx_index);
get_sd_context_part_emmc
Version |
NID
|
3.60 |
0x6a71987f
|
sd_context_part* get_sd_context_part_emmc(int sd_ctx_index);
get_sd_context_part_game_cart
Version |
NID
|
3.60 |
0xb9ea5b1e
|
sd_context_part* get_sd_context_part_game_cart(int sd_ctx_index);
get_sd_context_part_wlan_bt
Version |
NID
|
3.60 |
0x6a8235fc
|
sd_context_part* get_sd_context_part_wlan_bt(int sd_ctx_index);
initialize_sd_context_part
Version |
NID
|
3.60 |
0x22c82e79
|
this function only initializes devices with sd_ctx_index 0 and 1
returns 0x80320013 on any other sd_ctx_index
int initialize_sd_context_part(int sd_ctx_index, sd_context_part** result);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0x3428884d
|
int wlan_bt_cmd52_sdio(wlan_context* wlan_ctx);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0xe80293ef
|
int wlan_bt_cmd52_sdio(wlan_context* wlan_ctx);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0xd0f78d9b
|
int wlan_bt_cmd52_sdio(wlan_context* wlan_ctx, int num0, int num1, void* unk2, int num3);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0x3c4cdc8b
|
int wlan_bt_cmd52_sdio(wlan_context* wlan_ctx, int num0, int num1, void* unk2, int num3);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0x733bc373
|
int wlan_bt_cmd52_sdio(wlan_context* wlan_ctx, int num);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0xdece963b
|
int wlan_bt_cmd52_sdio(sd_context_part* ctx, int num0, int num1, void* unk2);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0x5d65e66b
|
int wlan_bt_cmd52_sdio(sd_context_part* ctx, int num0, int num1, void* unk2);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0xbc45c83d
|
int wlan_bt_cmd52_sdio(sd_context_part* ctx, int num);
wlan_bt_initialize_custom_context
Version |
NID
|
3.60 |
0xaabaa0f0
|
this function can send these commands: cmd3, cmd52_sdio, cmd0, cmd5_sdio, cmd55, acmd41, cmd7, cmd8
this function uses array of 2 custom contexts.
this function can either set device type index to 3 and use custom context for initialization.
or it can use preinitialization (cmd0, cmd8, cmd5_sdio, cmd55, acmd41) and then check that device type index is 3.
if device type index is not 3 then 0x80320017 error is returned.
int wlan_bt_initialize_custom_context(int sd_ctx_index, sd_context_part** ctx);
wlan_bt
Version |
NID
|
3.60 |
0x855c95e1
|
int wlan_bt(wlan_context* wlan_ctx, void* unk0, void* unk1);
wlan_bt
Version |
NID
|
3.60 |
0x0c66e36f
|
int wlan_bt(sd_context_part* ctx, void* unk0);
wlan_bt_cmd7
Version |
NID
|
3.60 |
0xab0222f2
|
int wlan_bt_cmd7(sd_context_part* ctx);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0x55baeb2d
|
int wlan_bt_cmd52_sdio(wlan_context* wlan_ctx);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0xfe6f3e7b
|
int wlan_bt_cmd52_sdio(wlan_context* wlan_ctx);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0xf1a24edd
|
int wlan_bt_cmd52_sdio(wlan_context* wlan_ctx);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0x1847b18c
|
int wlan_bt_cmd52_sdio(wlan_context* wlan_ctx);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0xd3c1e2b6
|
int wlan_bt_cmd52_sdio(wlan_context* wlan_ctx, int unk0, int unk1, int unk2);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0x5bac6e70
|
int wlan_bt_cmd52_sdio(wlan_context* wlan_ctx, int unk0, int unk1, int unk2);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0x01e8eb6c
|
int wlan_bt_cmd52_sdio(sd_context_part* ctx, char* output, int destLength_100);
wlan_bt_cmd52_sdio
Version |
NID
|
3.60 |
0x763f1075
|
int wlan_bt_cmd52_sdio(sd_context_part* ctx);
wlan_bt_initialize_custom_context
Version |
NID
|
3.60 |
0x53962379
|
this function is just a wrapper for wlan_bt_initialize_custom_context (aabaa0f0)
int wlan_bt_initialize_custom_context(int sd_ctx_index);
wlan_bt_cmd0
Version |
NID
|
3.60 |
0x3b6ab29e
|
int wlan_bt_cmd0(wlan_context* wlan_ctx, void* unk0, int* result);
wlan_bt_cmd0_cmd52_sdio
Version |
NID
|
3.60 |
0x180e7395
|
int wlan_bt_cmd0_cmd52_sdio(wlan_context* wlan_ctx, char* output, int destLength_100);
wlan_bt
Version |
NID
|
3.60 |
0x0f157f49
|
int wlan_bt(wlan_context* wlan_ctx);
wlan_bt
Version |
NID
|
3.60 |
0x849e3216
|
int wlan_bt(wlan_context* wlan_ctx);
wlan_bt
Version |
NID
|
3.60 |
0xb05eff68
|
int wlan_bt(wlan_context *wlan_ctx, int unk0);
sdstor_read_sector_async
Version |
NID
|
3.60 |
0x6f8d529b
|
int sdstor_read_sector_async(sd_context_part* ctx, int sector, char* buffer, int nSectors);
sdstor_read_sector
Version |
NID
|
3.60 |
0xb9593652
|
int sdstor_read_sector(sd_context_part* ctx, int sector, char* buffer, int nSectors);
sdstor_write_sector_async
Version |
NID
|
3.60 |
0x175543d2
|
int sdstor_write_sector_async(sd_context_part* ctx, int sector, char* buffer, int nSectors);
sdstor_write_sector
Version |
NID
|
3.60 |
0xe0781171
|
int sdstor_write_sector(sd_context_part* ctx, int sector, char* buffer, int nSectors);
sdstor_copy_ctx
Version |
NID
|
3.60 |
0x23a4ef01
|
int sdstor_copy_ctx(sd_context_part* ctx, output_23a4ef01* unk0);
sdstor_cmd0_cmd13
Version |
NID
|
3.60 |
0x6cc8e28d
|
int sdstor_cmd0_cmd13(int sd_ctx_index);
sdstor_cmd32_cmd33_cmd38_sdio
Version |
NID
|
3.60 |
0x35ba9df8
|
int sdstor_cmd32_cmd33_cmd38_sdio(int sd_ctx_index, int unk0);
sdstor_initialize_sd_context_part2
Version |
NID
|
3.60 |
0xc1271539
|
this function can execute all initialization commands just as initialize_sd_context_part (22c82e79) function.
these commands include: cmd0, cmd2, cmd3, cmd5_sdio, cmd6, cmd55, acmd41, cmd9, cmd7, cmd16, cmd8
there are couple of differences however:
- it can execute cmd42 lock/unlock command.
- it does not check sd_ctx_index argument.
- it uses array of 3 custom contexts instead of sd_context_part structures.
- it checks device type index after preinitialization (cmd0, cmd8, cmd5_sdio, cmd55, acmd41)
- it only initializes device with device type index 2. otherwice 0x80320017 error is returned.
int sdstor_initialize_sd_context_part2(int sd_ctx_index, int* result);
sdstor_cmd6_cmd30
Version |
NID
|
3.60 |
0x995748ea
|
int sdstor_cmd6_cmd30(sd_context_part *input, int unk0, int unk1, void *unk2);
sdstor
Version |
NID
|
3.60 |
0xe091ba2e
|
int sdstor(sd_context_part* unk, int unk0, int unk1, int* unk2);
sdif_write
Version |
NID
|
3.60 |
0x60642f49
|
int sdif_write(sd_context_part *ctx, int unk0, int unk1);
sdif_write
Version |
NID
|
3.60 |
0x0203ecdc
|
int sdif_write(sd_context_part *ctx, int unk0, int unk1);
sdif
Version |
NID
|
3.60 |
0x29a71e7f
|
int sdif();
sdif_cmd0_cmd13
Version |
NID
|
3.60 |
0x53518827
|
int sdif_cmd0_cmd13(sd_context_global *ctx, int *result);
sdif_cmd0
Version |
NID
|
3.60 |
0x475d8e45
|
int sdif_cmd0(int sd_ctx_index);
sdif
Version |
NID
|
3.60 |
0x3df7e207
|
int sdif(int sd_ctx_index, output_24* result);
sdif
Version |
NID
|
3.60 |
0x76d2b87b
|
int sdif(int sd_ctx_index, output_76d2b87b* result);
sdif_cmd_unk
Version |
NID
|
3.60 |
0xb83f7518
|
int sdif_cmd_unk(int sd_ctx_index, output_24* result);
sdif_cmd0_cmd16
Version |
NID
|
3.60 |
0xb32776c7
|
int sdif_cmd0_cmd16(sd_context_part* ctx, int num_200);
sdif_cmd0_cmd16
Version |
NID
|
3.60 |
0xaf702fe7
|
int sdif_cmd0_cmd16(sd_context_part* ctx, int num_200);