/title/00000001/00000002/data/play rec.dat: Difference between revisions

From WiiBrew
Jump to navigation Jump to search
added play_rec documentation and sample code
 
m cnp error
Line 36: Line 36:
         gprintf("destroying playtime\n");
         gprintf("destroying playtime\n");


        res = ISFS_Initialize();
        if (res) {
                ISFS_Deinitialize();
                gprintf("error initializing isfs (%d)\n", res);
                return;
        }
        pt_fd = IOS_Open(_playtime_path, IPC_OPEN_RW);
        if(pt_fd < 0) {
         res = ISFS_Initialize();
         res = ISFS_Initialize();
         if (res) {
         if (res) {

Revision as of 09:21, 2 May 2010


This file is generated by the System Menu before it launches a title.

typedef union {
        struct {
                u32 checksum;
                u16 name[0x28];
                u32 _pad1;
                u64 ticks_boot;
                u64 ticks_last;
                u32 title_id;
                u32 _pad2[5];
        };
        struct {
                u32 _checksum;
                u32 data[0x1f];
        };
} __attribute__((packed)) playtime_t;

SDK-based titles update this periodically with the current timestamp and on clean shutdown. The next time the System Menu starts, it checks for this file, and if it finds a valid play_rec.dat file it adds this entry to the "playtime log" in /title/00000001/00000002/data/cdb.vff and deletes this file.

In order to prevent strange effects that arise from not updating the timestamps correctly, the Homebrew Channel writes a corrupted entry to this file. This causes the System Menu to discard it upon the next boot.

static char _playtime_path[] __attribute__((aligned(32))) =
        "/title/00000001/00000002/data/play_rec.dat";

void playtime_destroy(void) {
        s32 res;
        s32 pt_fd = -1;
        static u8 pt_buf[4] __attribute__((aligned(32)));

        gprintf("destroying playtime\n");

        res = ISFS_Initialize();
        if (res) {
                ISFS_Deinitialize();
                gprintf("error initializing isfs (%d)\n", res);
                return;
        }

        pt_fd = IOS_Open(_playtime_path, IPC_OPEN_RW);
        if(pt_fd < 0) {
                ISFS_Deinitialize();
                gprintf("playtime open failed: %d\n", pt_fd);
                return;
        }

        memset(pt_buf, 0, sizeof(pt_buf));

        res = IOS_Write(pt_fd, &pt_buf, sizeof(pt_buf));
        if (res != sizeof(pt_buf)) {
                IOS_Close(pt_fd);
                ISFS_Deinitialize();
                gprintf("error destroying playtime (%d)\n", res);
                return;
        }

        IOS_Close(pt_fd);
        ISFS_Deinitialize();

        return;
}