From a8dfb4d5d77f7180bb6e0325f6df00632ac33ab6 Mon Sep 17 00:00:00 2001 From: Maschell Date: Fri, 6 Sep 2019 17:02:09 +0200 Subject: [PATCH] first --- .gitignore | 2 + Makefile | 272 ++++++++++++ README.md | 18 + makefile.mk | 50 +++ meta - Kopie.xml | 140 ++++++ meta.xml | 140 ++++++ src/fs/CFile.cpp | 175 ++++++++ src/fs/CFile.hpp | 61 +++ src/fs/DirList.cpp | 218 +++++++++ src/fs/DirList.h | 106 +++++ src/fs/FSUtils.cpp | 142 ++++++ src/fs/FSUtils.h | 16 + src/main.cpp | 621 ++++++++++++++++++++++++++ src/sss.txt | 912 ++++++++++++++++++++++++++++++++++++++ src/utils/StringTools.cpp | 211 +++++++++ src/utils/StringTools.h | 80 ++++ src/utils/logger.c | 82 ++++ src/utils/logger.h | 38 ++ src/utils/utils.c | 41 ++ src/utils/utils.h | 35 ++ 20 files changed, 3360 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 README.md create mode 100644 makefile.mk create mode 100644 meta - Kopie.xml create mode 100644 meta.xml create mode 100644 src/fs/CFile.cpp create mode 100644 src/fs/CFile.hpp create mode 100644 src/fs/DirList.cpp create mode 100644 src/fs/DirList.h create mode 100644 src/fs/FSUtils.cpp create mode 100644 src/fs/FSUtils.h create mode 100644 src/main.cpp create mode 100644 src/sss.txt create mode 100644 src/utils/StringTools.cpp create mode 100644 src/utils/StringTools.h create mode 100644 src/utils/logger.c create mode 100644 src/utils/logger.h create mode 100644 src/utils/utils.c create mode 100644 src/utils/utils.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fb82516 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +build/* +*.mod \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..932d6fc --- /dev/null +++ b/Makefile @@ -0,0 +1,272 @@ +# You probably never need to adjust this Makefile. +# All changes can be done in the makefile.mk + +#--------------------------------------------------------------------------------- +# Clear the implicit built in rules +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- +ifeq ($(strip $(DEVKITPPC)),) +$(error "Please set DEVKITPPC in your environment. export DEVKITPPC=devkitPPC") +endif +ifeq ($(strip $(DEVKITPRO)),) +$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=devkitPRO") +endif + +export PATH := $(DEVKITPPC)/bin:$(PORTLIBS)/bin:$(PATH) +export PORTLIBS := $(DEVKITPRO)/portlibs/ppc +export WUPSDIR := $(DEVKITPRO)/wups +export GCC_VER := $(shell $(DEVKITPPC)/bin/powerpc-eabi-gcc -dumpversion) + +PREFIX := powerpc-eabi- + +export AS := $(PREFIX)as +export CC := $(PREFIX)gcc +export CXX := $(PREFIX)g++ +export LD := $(PREFIX)ld +export AR := $(PREFIX)ar +export OBJCOPY := $(PREFIX)objcopy + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# INCLUDES is a list of directories containing extra header files +#--------------------------------------------------------------------------------- +TARGET := $(notdir $(CURDIR)) +BUILD := build + +ifeq ($(notdir $(CURDIR)),$(BUILD)) + include ../makefile.mk +else + include makefile.mk +endif + +include $(WUPSDIR)/plugin_makefile.mk + + +#MAP ?= $(TARGET:.mod=.map) + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- + +MACHDEP = -DESPRESSO -mcpu=750 -meabi -mhard-float + +# -Os: optimise size +# -Wall: generate lots of warnings +# -D__wiiu__: define the symbol __wiiu__ (used in some headers) +# -mcpu=750: enable processor specific compilation +# -meabi: enable eabi specific compilation +# -mhard-float: enable hardware floating point instructions +# -nostartfiles: Do not use the standard system startup files when linking +# -ffunction-sections: split up functions so linker can garbage collect +# -fdata-sections: split up data so linker can garbage collect +COMMON_CFLAGS := -O2 -Wall $(MACHDEP) -ffunction-sections -fdata-sections -Wl,-q $(COMMON_CFLAGS) + +CFLAGS += -D__WIIU__ -D__WUT__ + +# -x c: compile as c code +# -std=c11: use the c11 standard +CFLAGS := $(COMMON_CFLAGS) -x c -std=gnu11 $(CFLAGS) + +# -x c++: compile as c++ code +# -std=gnu++11: use the c++11 standard +CXXFLAGS := $(COMMON_CFLAGS) -x c++ -std=gnu++11 $(CXXFLAGS) + +#--------------------------------------------------------------------------------- +# any extra ld flags +#-------------------------------------------------------------------------------- +# --gc-sections: remove unneeded symbols +# -Map: generate a map file +LDFLAGS += $(ARCH) -Wl,-Map,$(notdir $@).map,--gc-sections,-wrap,__gxx_personality_v0 + + +#--------------------------------------------------------------------------------- +Q := @ +MAKEFLAGS += --no-print-directory +#--------------------------------------------------------------------------------- +# any extra libraries we wish to link with the project +#--------------------------------------------------------------------------------- +LIBS += +# +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS += + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- +export PROJECTDIR := $(CURDIR) +export OUTPUT := $(CURDIR)/$(TARGETDIR)/$(TARGET) +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) +export DEPSDIR := $(CURDIR)/$(BUILD) + +#--------------------------------------------------------------------------------- +# automatically build a list of object files for our project +#--------------------------------------------------------------------------------- +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +sFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) +TTFFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.ttf))) +PNGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.png))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) + export REAL_LD := $(CC) +else + export REAL_LD := $(CXX) +endif + +export OFILES := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \ + $(sFILES:.s=.o) $(SFILES:.S=.o) \ + $(PNGFILES:.png=.png.o) $(addsuffix .o,$(BINFILES)) + +#--------------------------------------------------------------------------------- +# build a list of include paths +#--------------------------------------------------------------------------------- +export INCLUDE_FULL += $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + $(EXTERNAL_INCLUDE) + +#--------------------------------------------------------------------------------- +# build a list of library paths +#--------------------------------------------------------------------------------- +export LIBPATHS_FULL += $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \ + $(EXTERNAL_LIBPATHS) + + +export OUTPUT := $(CURDIR)/$(TARGET) +.PHONY: $(BUILD) clean install + +#--------------------------------------------------------------------------------- +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) $(OUTPUT).mod $(OUTPUT) + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +THIS_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) + +############################################################################### +# Rule to make everything. +PHONY += all + +all : $(OUTPUT) +############################################################################### +# Special build rules + + +# Rule to make the module file. +$(OUTPUT) : $(OFILES) + @echo "linking ... " $@ + @$(REAL_LD) $(OFILES) $(LDFLAGS) $(LIBS) $(LIBPATHS_FULL) -o $@ + +############################################################################### +# Standard build rules +#--------------------------------------------------------------------------------- +%.a: +#--------------------------------------------------------------------------------- + @echo $(notdir $@) + @rm -f $@ + @$(AR) -rc $@ $^ + +#--------------------------------------------------------------------------------- +%.o: %.cpp + @echo $(notdir $<) + @$(CXX) -MMD -MP -MF $(DEPSDIR)/$*.d $(CXXFLAGS) $(INCLUDE_FULL) -c $< -o $@ $(ERROR_FILTER) + +#--------------------------------------------------------------------------------- +%.o: %.c + @echo $(notdir $<) + @$(CC) -MMD -MP -MF $(DEPSDIR)/$*.d $(CFLAGS) $(INCLUDE_FULL) -c $< -o $@ $(ERROR_FILTER) + +#--------------------------------------------------------------------------------- +%.o: %.S + @echo $(notdir $<) + $(CC) -MMD -MP -MF $(DEPSDIR)/$*.d -x assembler-with-cpp $(INCLUDE_FULL) -c $< -o $@ $(ERROR_FILTER) + +#--------------------------------------------------------------------------------- +%.png.o : %.png + @echo $(notdir $<) + @bin2s -a 32 $< | $(AS) -o $(@) + +#--------------------------------------------------------------------------------- +%.jpg.o : %.jpg + @echo $(notdir $<) + @bin2s -a 32 $< | $(AS) -o $(@) + +#--------------------------------------------------------------------------------- +%.ttf.o : %.ttf + @echo $(notdir $<) + @bin2s -a 32 $< | $(AS) -o $(@) + +#--------------------------------------------------------------------------------- +%.bin.o : %.bin + @echo $(notdir $<) + @bin2s -a 32 $< | $(AS) -o $(@) + +#--------------------------------------------------------------------------------- +%.wav.o : %.wav + @echo $(notdir $<) + @bin2s -a 32 $< | $(AS) -o $(@) + +#--------------------------------------------------------------------------------- +%.mp3.o : %.mp3 + @echo $(notdir $<) + @bin2s -a 32 $< | $(AS) -o $(@) + +#--------------------------------------------------------------------------------- +%.ogg.o : %.ogg + @echo $(notdir $<) + @bin2s -a 32 $< | $(AS) -o $(@) + +############################################################################### +# Assembly listing rules + +# Rule to make assembly listing. +PHONY += list +list : $(LIST) + +# Rule to make the listing file. +%.list : $(TARGET) + $(LOG) + -$Qmkdir -p $(dir $@) + $Q$(OBJDUMP) -d $< > $@ + +############################################################################### +# Clean rule + +# Rule to clean files. +PHONY += clean +clean : + $Qrm -rf $(wildcard $(BUILD) $(BIN)) + +############################################################################### +# Phony targets + +.PHONY : $(PHONY) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- diff --git a/README.md b/README.md new file mode 100644 index 0000000..448a335 --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# VPAD Input viewer + +# Wii U Plugin System +This is a plugin for the [Wii U Plugin System (WUPS)](https://github.com/Maschell/WiiUPluginSystem/). To be able to use this plugin you have to place the resulting `.mod` file into the following folder: + +``` +sd:/wiiu/plugins +``` +When the file is placed on the SDCard you can load it with [plugin loader](https://github.com/Maschell/WiiUPluginSystem/). + +## Building + +For building you need: +- [wups](https://github.com/Maschell/WiiUPluginSystem) +- [wut](https://github.com/decaf-emu/wut) +- [libutilswut](https://github.com/Maschell/libutils/tree/wut) (WUT version) for common functions. + +Install them (in this order) according to their README's. Don't forget the dependencies of the libs itself. \ No newline at end of file diff --git a/makefile.mk b/makefile.mk new file mode 100644 index 0000000..f27792a --- /dev/null +++ b/makefile.mk @@ -0,0 +1,50 @@ +# Compiling the projects with libutils logging code? +DO_LOGGING := 1 + +# Target filename +TARGET := $(notdir $(CURDIR)).mod + +# Source directories +SOURCES := src src/utils src/fs + +# Data directories +DATA := + +# Include directories +INCLUDES := src + +#--------------------------------------------------------------------------------- +# options for code generation and linking +#--------------------------------------------------------------------------------- +# Extra C AND C++ compiler flags +COMMON_CFLAGS := +# Extra C compiler flags +CFLAGS := +# Extra C++ compiler flags +CXXFLAGS := +# Extra linking flags for all linking steps +LDFLAGS := + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(WUPSDIR) $(WUT_ROOT) + +#--------------------------------------------------------------------------------- +# any extra libraries we wish to link with the project +#--------------------------------------------------------------------------------- +LIBS := -lwups -lwut + +#--------------------------------------------------------------------------------- +# Will be added to the final lib paths +# example: +# -L$C:/library1/lib +#--------------------------------------------------------------------------------- +EXTERNAL_LIBPATHS := + +#--------------------------------------------------------------------------------- +# Will be added to the final include paths +# -IC:/library1/include +#--------------------------------------------------------------------------------- +EXTERNAL_INCLUDE := -I$(WUT_ROOT)/include/libutilswut diff --git a/meta - Kopie.xml b/meta - Kopie.xml new file mode 100644 index 0000000..9afd3c1 --- /dev/null +++ b/meta - Kopie.xml @@ -0,0 +1,140 @@ + + + 1 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB + CCCCCCCC + DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD + 2 + 00000003 + 00000004 + 00000005 + 00000006 + 00000007 + 00000008 + 00000009 + 10 + 11 + 00000000000000000C + 0000000D + 000000000000000E + 000000000000000F + 0000000000000010 + 0000000000000011 + 0000000000000012 + 0000000000000013 + 0000000000000014 + 21 + 00000016 + 0000000000000017 + 24 + 25 + 26 + 27 + 28 + 0000001D + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE + 52 + 53 + 54 + 55 + 56 + 00000039 + 0000003A + 0000003B + 0000003C + 0000003D + 0000003E + 0000003F + 00000040 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH + III + JJJ + KKK + LLL + MMM + NNN + OOO + PPP + QQQ + RRR + SSS + TTT + UUU + VVV + WWW + XXX + YYY + ZZZ + 111 + 222 + 333 + 444 + 555 + 666 + 777 + 888 + 999 + 1010 + 1212 + 1313 + 1414 + 1515 + 1616 + GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG + 00000041 + 00000042 + 00000043 + 00000044 + 00000045 + 00000046 + 00000047 + 00000048 + 00000049 + 0000004A + 0000004B + 0000004C + 0000004D + 0000004E + 0000004F + 00000050 + 00000051 + 00000052 + 00000053 + 00000054 + 00000055 + 00000056 + 00000057 + 00000058 + 00000059 + 0000005A + 0000005B + 0000005C + 0000005D + 0000005E + 0000005F + 00000060 + diff --git a/meta.xml b/meta.xml new file mode 100644 index 0000000..d14d8c7 --- /dev/null +++ b/meta.xml @@ -0,0 +1,140 @@ + + + 1 + WUP-P-HBLD + WUP + 0001 + + 0 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000004 + 00000000 + 1 + 0 + 0005000013374842 + 00003748 + 0000000000000000 + 000500101000400A + 0000000000000000 + 0000000001790000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0 + 00000000 + 0000000000000000 + 1 + 0 + 0 + 0 + 0 + FFFFFFFF + 128 + 128 + 192 + 128 + 128 + 192 + 128 + 128 + 128 + 128 + 128 + 128 + 192 + 192 + 192 + 192 + 1 + 0 + 1 + 0 + 1 + 0 + + 0 + 1 + 1 + 0 + 0 + 00010001 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000003 + 00000000 + Homebrew Launcher + Homebrew Launcher + Homebrew Launcher + Homebrew Launcher + Homebrew Launcher + Homebrew Launcher + Homebrew Launcher + Homebrew Launcher + Homebrew Launcher + Homebrew Launcher + Homebrew Launcher + Homebrew Launcher + Homebrew Launcher + Homebrew Launcher + Homebrew Launcher + Homebrew Launcher + Homebrew Launcher + Homebrew Launcher + Homebrew Launcher + Homebrew Launcher + Homebrew Launcher + Homebrew Launcher + Homebrew Launcher + Homebrew Launcher + dimok + dimok + dimok + dimok + dimok + dimok + dimok + dimok + dimok + dimok + dimok + dimok + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + diff --git a/src/fs/CFile.cpp b/src/fs/CFile.cpp new file mode 100644 index 0000000..c2a7ae6 --- /dev/null +++ b/src/fs/CFile.cpp @@ -0,0 +1,175 @@ + +#include +#include +#include +#include +#include + +CFile::CFile() { + iFd = -1; + mem_file = NULL; + filesize = 0; + pos = 0; +} + +CFile::CFile(const std::string & filepath, eOpenTypes mode) { + iFd = -1; + this->open(filepath, mode); +} + +CFile::CFile(const uint8_t * mem, int32_t size) { + iFd = -1; + this->open(mem, size); +} + +CFile::~CFile() { + this->close(); +} + +int32_t CFile::open(const std::string & filepath, eOpenTypes mode) { + this->close(); + int32_t openMode = 0; + + // This depend on the devoptab implementation. + // see https://github.com/devkitPro/wut/blob/master/libraries/wutdevoptab/devoptab_fs_open.c#L21 fpr reference + + switch(mode) { + default: + case ReadOnly: // file must exist + openMode = O_RDONLY; + break; + case WriteOnly: // file will be created / zerod + openMode = O_TRUNC | O_CREAT | O_WRONLY; + break; + case ReadWrite: // file must exist + openMode = O_RDWR; + break; + case Append: // append to file, file will be created if missing. write only + openMode = O_CREAT | O_APPEND | O_WRONLY; + break; + } + + //! Using fopen works only on the first launch as expected + //! on the second launch it causes issues because we don't overwrite + //! the .data sections which is needed for a normal application to re-init + //! this will be added with launching as RPX + iFd = ::open(filepath.c_str(), openMode); + if(iFd < 0) + return iFd; + + + filesize = ::lseek(iFd, 0, SEEK_END); + ::lseek(iFd, 0, SEEK_SET); + + return 0; +} + +int32_t CFile::open(const uint8_t * mem, int32_t size) { + this->close(); + + mem_file = mem; + filesize = size; + + return 0; +} + +void CFile::close() { + if(iFd >= 0) + ::close(iFd); + + iFd = -1; + mem_file = NULL; + filesize = 0; + pos = 0; +} + +int32_t CFile::read(uint8_t * ptr, size_t size) { + if(iFd >= 0) { + int32_t ret = ::read(iFd, ptr,size); + if(ret > 0) + pos += ret; + return ret; + } + + int32_t readsize = size; + + if(readsize > (int64_t) (filesize-pos)) + readsize = filesize-pos; + + if(readsize <= 0) + return readsize; + + if(mem_file != NULL) { + memcpy(ptr, mem_file+pos, readsize); + pos += readsize; + return readsize; + } + + return -1; +} + +int32_t CFile::write(const uint8_t * ptr, size_t size) { + if(iFd >= 0) { + size_t done = 0; + while(done < size) { + int32_t ret = ::write(iFd, ptr, size - done); + if(ret <= 0) + return ret; + + ptr += ret; + done += ret; + pos += ret; + } + return done; + } + + return -1; +} + +int32_t CFile::seek(long int offset, int32_t origin) { + int32_t ret = 0; + int64_t newPos = pos; + + if(origin == SEEK_SET) { + newPos = offset; + } else if(origin == SEEK_CUR) { + newPos += offset; + } else if(origin == SEEK_END) { + newPos = filesize+offset; + } + + if(newPos < 0) { + pos = 0; + } else { + pos = newPos; + } + + if(iFd >= 0) + ret = ::lseek(iFd, pos, SEEK_SET); + + if(mem_file != NULL) { + if(pos > filesize) { + pos = filesize; + } + } + + return ret; +} + +int32_t CFile::fwrite(const char *format, ...) { + char tmp[512]; + tmp[0] = 0; + int32_t result = -1; + + va_list va; + va_start(va, format); + if((vsprintf(tmp, format, va) >= 0)) { + result = this->write((uint8_t *)tmp, strlen(tmp)); + } + va_end(va); + + + return result; +} + + diff --git a/src/fs/CFile.hpp b/src/fs/CFile.hpp new file mode 100644 index 0000000..8816a49 --- /dev/null +++ b/src/fs/CFile.hpp @@ -0,0 +1,61 @@ +#ifndef CFILE_HPP_ +#define CFILE_HPP_ + +#include +#include +#include +#include +#include +#include + +class CFile { +public: + enum eOpenTypes { + ReadOnly, + WriteOnly, + ReadWrite, + Append + }; + + CFile(); + CFile(const std::string & filepath, eOpenTypes mode); + CFile(const uint8_t * memory, int32_t memsize); + virtual ~CFile(); + + int32_t open(const std::string & filepath, eOpenTypes mode); + int32_t open(const uint8_t * memory, int32_t memsize); + + BOOL isOpen() const { + if(iFd >= 0) + return true; + + if(mem_file) + return true; + + return false; + } + + void close(); + + int32_t read(uint8_t * ptr, size_t size); + int32_t write(const uint8_t * ptr, size_t size); + int32_t fwrite(const char *format, ...); + int32_t seek(long int offset, int32_t origin); + uint64_t tell() { + return pos; + }; + uint64_t size() { + return filesize; + }; + void rewind() { + this->seek(0, SEEK_SET); + }; + +protected: + int32_t iFd; + const uint8_t * mem_file; + uint64_t filesize; + uint64_t pos; +}; + +#endif diff --git a/src/fs/DirList.cpp b/src/fs/DirList.cpp new file mode 100644 index 0000000..450d4b6 --- /dev/null +++ b/src/fs/DirList.cpp @@ -0,0 +1,218 @@ +/**************************************************************************** + * Copyright (C) 2010 + * by Dimok + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any + * damages arising from the use of this software. + * + * Permission is granted to anyone to use this software for any + * purpose, including commercial applications, and to alter it and + * redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you + * must not claim that you wrote the original software. If you use + * this software in a product, an acknowledgment in the product + * documentation would be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and + * must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + * DirList Class + * for WiiXplorer 2010 + ***************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +DirList::DirList() { + Flags = 0; + Filter = 0; + Depth = 0; +} + +DirList::DirList(const std::string & path, const char *filter, uint32_t flags, uint32_t maxDepth) { + this->LoadPath(path, filter, flags, maxDepth); + this->SortList(); +} + +DirList::~DirList() { + ClearList(); +} + +BOOL DirList::LoadPath(const std::string & folder, const char *filter, uint32_t flags, uint32_t maxDepth) { + if(folder.empty()) + return false; + + Flags = flags; + Filter = filter; + Depth = maxDepth; + + std::string folderpath(folder); + uint32_t length = folderpath.size(); + + //! clear path of double slashes + StringTools::RemoveDoubleSlashs(folderpath); + + //! remove last slash if exists + if(length > 0 && folderpath[length-1] == '/') + folderpath.erase(length-1); + + //! add root slash if missing + if(folderpath.find('/') == std::string::npos) { + folderpath += '/'; + } + + return InternalLoadPath(folderpath); +} + +BOOL DirList::InternalLoadPath(std::string &folderpath) { + if(folderpath.size() < 3) + return false; + + struct dirent *dirent = NULL; + DIR *dir = NULL; + + dir = opendir(folderpath.c_str()); + if (dir == NULL) + return false; + + while ((dirent = readdir(dir)) != 0) { + BOOL isDir = dirent->d_type & DT_DIR; + const char *filename = dirent->d_name; + + if(isDir) { + if(strcmp(filename,".") == 0 || strcmp(filename,"..") == 0) + continue; + + if((Flags & CheckSubfolders) && (Depth > 0)) { + int32_t length = folderpath.size(); + if(length > 2 && folderpath[length-1] != '/') { + folderpath += '/'; + } + folderpath += filename; + + Depth--; + InternalLoadPath(folderpath); + folderpath.erase(length); + Depth++; + } + + if(!(Flags & Dirs)) + continue; + } else if(!(Flags & Files)) { + continue; + } + + if(Filter) { + char * fileext = strrchr(filename, '.'); + if(!fileext) + continue; + + if(StringTools::strtokcmp(fileext, Filter, ",") == 0) + AddEntrie(folderpath, filename, isDir); + } else { + AddEntrie(folderpath, filename, isDir); + } + } + closedir(dir); + + return true; +} + +void DirList::AddEntrie(const std::string &filepath, const char * filename, BOOL isDir) { + if(!filename) + return; + + int32_t pos = FileInfo.size(); + + FileInfo.resize(pos+1); + + FileInfo[pos].FilePath = (char *) malloc(filepath.size()+strlen(filename)+2); + if(!FileInfo[pos].FilePath) { + FileInfo.resize(pos); + return; + } + + sprintf(FileInfo[pos].FilePath, "%s/%s", filepath.c_str(), filename); + FileInfo[pos].isDir = isDir; +} + +void DirList::ClearList() { + for(uint32_t i = 0; i < FileInfo.size(); ++i) { + if(FileInfo[i].FilePath) { + free(FileInfo[i].FilePath); + FileInfo[i].FilePath = NULL; + } + } + + FileInfo.clear(); + std::vector().swap(FileInfo); +} + +const char * DirList::GetFilename(int32_t ind) const { + if (!valid(ind)) + return ""; + + return StringTools::FullpathToFilename(FileInfo[ind].FilePath); +} + +static BOOL SortCallback(const DirEntry & f1, const DirEntry & f2) { + if(f1.isDir && !(f2.isDir)) + return true; + if(!(f1.isDir) && f2.isDir) + return false; + + if(f1.FilePath && !f2.FilePath) + return true; + if(!f1.FilePath) + return false; + + if(strcasecmp(f1.FilePath, f2.FilePath) > 0) + return false; + + return true; +} + +void DirList::SortList() { + if(FileInfo.size() > 1) + std::sort(FileInfo.begin(), FileInfo.end(), SortCallback); +} + +void DirList::SortList(BOOL (*SortFunc)(const DirEntry &a, const DirEntry &b)) { + if(FileInfo.size() > 1) + std::sort(FileInfo.begin(), FileInfo.end(), SortFunc); +} + +uint64_t DirList::GetFilesize(int32_t index) const { + struct stat st; + const char *path = GetFilepath(index); + + if(!path || stat(path, &st) != 0) + return 0; + + return st.st_size; +} + +int32_t DirList::GetFileIndex(const char *filename) const { + if(!filename) + return -1; + + for (uint32_t i = 0; i < FileInfo.size(); ++i) { + if (strcasecmp(GetFilename(i), filename) == 0) + return i; + } + + return -1; +} diff --git a/src/fs/DirList.h b/src/fs/DirList.h new file mode 100644 index 0000000..b9559aa --- /dev/null +++ b/src/fs/DirList.h @@ -0,0 +1,106 @@ +/**************************************************************************** + * Copyright (C) 2010 + * by Dimok + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any + * damages arising from the use of this software. + * + * Permission is granted to anyone to use this software for any + * purpose, including commercial applications, and to alter it and + * redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you + * must not claim that you wrote the original software. If you use + * this software in a product, an acknowledgment in the product + * documentation would be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and + * must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + * DirList Class + * for WiiXplorer 2010 + ***************************************************************************/ +#ifndef ___DIRLIST_H_ +#define ___DIRLIST_H_ + +#include +#include +#include + +typedef struct { + char * FilePath; + BOOL isDir; +} DirEntry; + +class DirList { +public: + //!Constructor + DirList(void); + //!\param path Path from where to load the filelist of all files + //!\param filter A fileext that needs to be filtered + //!\param flags search/filter flags from the enum + DirList(const std::string & path, const char *filter = NULL, uint32_t flags = Files | Dirs, uint32_t maxDepth = 0xffffffff); + //!Destructor + virtual ~DirList(); + //! Load all the files from a directory + BOOL LoadPath(const std::string & path, const char *filter = NULL, uint32_t flags = Files | Dirs, uint32_t maxDepth = 0xffffffff); + //! Get a filename of the list + //!\param list index + const char * GetFilename(int32_t index) const; + //! Get the a filepath of the list + //!\param list index + const char *GetFilepath(int32_t index) const { + if (!valid(index)) + return ""; + else + return FileInfo[index].FilePath; + } + //! Get the a filesize of the list + //!\param list index + uint64_t GetFilesize(int32_t index) const; + //! Is index a dir or a file + //!\param list index + BOOL IsDir(int32_t index) const { + if(!valid(index)) + return false; + return FileInfo[index].isDir; + }; + //! Get the filecount of the whole list + int32_t GetFilecount() const { + return FileInfo.size(); + }; + //! Sort list by filepath + void SortList(); + //! Custom sort command for custom sort functions definitions + void SortList(BOOL (*SortFunc)(const DirEntry &a, const DirEntry &b)); + //! Get the index of the specified filename + int32_t GetFileIndex(const char *filename) const; + //! Enum for search/filter flags + enum { + Files = 0x01, + Dirs = 0x02, + CheckSubfolders = 0x08, + }; +protected: + // Internal parser + BOOL InternalLoadPath(std::string &path); + //!Add a list entrie + void AddEntrie(const std::string &filepath, const char * filename, BOOL isDir); + //! Clear the list + void ClearList(); + //! Check if valid pos is requested + inline BOOL valid(uint32_t pos) const { + return (pos < FileInfo.size()); + }; + + uint32_t Flags; + uint32_t Depth; + const char *Filter; + std::vector FileInfo; +}; + +#endif diff --git a/src/fs/FSUtils.cpp b/src/fs/FSUtils.cpp new file mode 100644 index 0000000..5a0579f --- /dev/null +++ b/src/fs/FSUtils.cpp @@ -0,0 +1,142 @@ +#include +#include +#include +#include +#include +#include "fs/FSUtils.h" +#include "fs/CFile.hpp" +#include "utils/logger.h" + +int32_t FSUtils::LoadFileToMem(const char *filepath, uint8_t **inbuffer, uint32_t *size) { + //! always initialze input + *inbuffer = NULL; + if(size) + *size = 0; + + int32_t iFd = open(filepath, O_RDONLY); + if (iFd < 0) + return -1; + + uint32_t filesize = lseek(iFd, 0, SEEK_END); + lseek(iFd, 0, SEEK_SET); + + uint8_t *buffer = (uint8_t *) malloc(filesize); + if (buffer == NULL) { + close(iFd); + return -2; + } + + uint32_t blocksize = 0x4000; + uint32_t done = 0; + int32_t readBytes = 0; + + while(done < filesize) { + if(done + blocksize > filesize) { + blocksize = filesize - done; + } + readBytes = read(iFd, buffer + done, blocksize); + if(readBytes <= 0) + break; + done += readBytes; + } + + close(iFd); + + if (done != filesize) { + free(buffer); + buffer = NULL; + return -3; + } + + *inbuffer = buffer; + + //! sign is optional input + if(size) { + *size = filesize; + } + + return filesize; +} + +int32_t FSUtils::CheckFile(const char * filepath) { + if(!filepath) + return 0; + + struct stat filestat; + + char dirnoslash[strlen(filepath)+2]; + snprintf(dirnoslash, sizeof(dirnoslash), "%s", filepath); + + while(dirnoslash[strlen(dirnoslash)-1] == '/') + dirnoslash[strlen(dirnoslash)-1] = '\0'; + + char * notRoot = strrchr(dirnoslash, '/'); + if(!notRoot) { + strcat(dirnoslash, "/"); + } + + if (stat(dirnoslash, &filestat) == 0) + return 1; + + return 0; +} + +int32_t FSUtils::CreateSubfolder(const char * fullpath) { + if(!fullpath) + return 0; + + int32_t result = 0; + + char dirnoslash[strlen(fullpath)+1]; + strcpy(dirnoslash, fullpath); + + int32_t pos = strlen(dirnoslash)-1; + while(dirnoslash[pos] == '/') { + dirnoslash[pos] = '\0'; + pos--; + } + + if(CheckFile(dirnoslash)) { + return 1; + } else { + char parentpath[strlen(dirnoslash)+2]; + strcpy(parentpath, dirnoslash); + char * ptr = strrchr(parentpath, '/'); + + if(!ptr) { + //!Device root directory (must be with '/') + strcat(parentpath, "/"); + struct stat filestat; + if (stat(parentpath, &filestat) == 0) + return 1; + + return 0; + } + + ptr++; + ptr[0] = '\0'; + + result = CreateSubfolder(parentpath); + } + + if(!result) + return 0; + + if (mkdir(dirnoslash, 0777) == -1) { + return 0; + } + + return 1; +} + +int32_t FSUtils::saveBufferToFile(const char * path, void * buffer, uint32_t size) { + CFile file(path, CFile::WriteOnly); + if (!file.isOpen()) { + DEBUG_FUNCTION_LINE("Failed to open %s\n",path); + return 0; + } + int32_t written = file.write((const uint8_t*) buffer, size); + file.close(); + return written; +} + diff --git a/src/fs/FSUtils.h b/src/fs/FSUtils.h new file mode 100644 index 0000000..9ee748a --- /dev/null +++ b/src/fs/FSUtils.h @@ -0,0 +1,16 @@ +#ifndef __FS_UTILS_H_ +#define __FS_UTILS_H_ + +#include + +class FSUtils { +public: + static int32_t LoadFileToMem(const char *filepath, uint8_t **inbuffer, uint32_t *size); + + //! todo: C++ class + static int32_t CreateSubfolder(const char * fullpath); + static int32_t CheckFile(const char * filepath); + static int32_t saveBufferToFile(const char * path, void * buffer, uint32_t size); +}; + +#endif // __FS_UTILS_H_ diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..73f75b1 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,621 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TARGET_WIDTH (854) +#define TARGET_HEIGHT (480) + + +void printVPADButtons(VPADStatus * buffer); + +WUPS_PLUGIN_NAME("Vpad input logger"); +WUPS_PLUGIN_DESCRIPTION("Prints information about vpad inputs and sensors"); +WUPS_PLUGIN_VERSION("v1.0"); +WUPS_PLUGIN_AUTHOR("Maschell"); +WUPS_PLUGIN_LICENSE("GPL"); +IOSHandle handles[100]; + + +struct WUT_PACKED _ACPMetaData{ + char bootmovie[80696]; + char bootlogo[28604]; + void * test; +}; + +struct WUT_PACKED _ACPMetaXml{ + uint64_t title_id; // 0x0C + uint64_t boss_id; // 0x0E + uint64_t os_version; // 0x0F + uint64_t app_size; // 0x10 + uint64_t common_save_size; // 0x11 + uint64_t account_save_size; // 0x12 + uint64_t common_boss_size; // 0x13 + uint64_t account_boss_size; // 0x14 + uint64_t join_game_mode_mask; // 0x17 + uint32_t version; // 0x01 + char product_code[32]; // AAAAA + char content_platform[32]; // BBBBB + char company_code[8]; // CCCCC + char mastering_date[32]; // DDDDD + uint32_t logo_type; // 0x02 + uint32_t app_launch_type; // 0x03 + uint32_t invisible_flag; // 0x04 + uint32_t no_managed_flag; // 0x05 + uint32_t no_event_log; // 0x06 + uint32_t no_icon_database; // 0x07 + uint32_t launching_flag; // 0x08 + uint32_t install_flag; // 0x09 + uint32_t closing_msg; // 0x0A + uint32_t title_version; // 0x0B + uint32_t group_id; // 0x0D + uint32_t save_no_rollback; // 0x15 + uint32_t bg_daemon_enable; //0x18 + uint32_t join_game_id; // 0x16 + uint32_t olv_accesskey; // 0x19 + uint32_t wood_tin; // 0x1A + uint32_t e_manual; // 0x1B + uint32_t e_manual_version; // 0x1C + uint32_t region; // 0x1D + uint32_t pc_cero; // 0x1E + uint32_t pc_esrb; // 0x1F + uint32_t pc_bbfc; // 0x20 + uint32_t pc_usk; // 0x21 + uint32_t pc_pegi_gen; // 0x22 + uint32_t pc_pegi_fin; // 0x23 + uint32_t pc_pegi_prt; // 0x24 + uint32_t pc_pegi_bbfc; // 0x25 + uint32_t pc_cob; // 0x26 + uint32_t pc_grb; // 0x27 + uint32_t pc_cgsrr; // 0x28 + uint32_t pc_oflc; // 0x29 + uint32_t pc_reserved0; // 0x2A + uint32_t pc_reserved1; // 0x2B + uint32_t pc_reserved2; // 0x2C + uint32_t pc_reserved3; // 0x2D + uint32_t ext_dev_nunchaku; // 0x2E + uint32_t ext_dev_classic; // 0x2F + uint32_t ext_dev_urcc; // 0x30 + uint32_t ext_dev_board; // 0x31 + uint32_t ext_dev_usb_keyboard; // 0x32 + uint32_t ext_dev_etc; // 0x33 + char ext_dev_etc_name[512]; // EEEE + uint32_t eula_version; // 0x34 + uint32_t drc_use; // 0x35 + uint32_t network_use; // 0x36 + uint32_t online_account_use; // 0x37 + uint32_t direct_boot; // 0x38 + uint32_t reserved_flag0; // 0x39 + uint32_t reserved_flag1; // 0x3A + uint32_t reserved_flag2; // 0x3B + uint32_t reserved_flag3; // 0x3C + uint32_t reserved_flag4; // 0x3D + uint32_t reserved_flag5; // 0x3E + uint32_t reserved_flag6; // 0x3F + uint32_t reserved_flag7; // 0x40 + char longname_ja[512]; // FF + char longname_en[512]; // HH + char longname_fr[512]; // II + char longname_de[512]; // JJ + char longname_it[512]; // KK + char longname_es[512]; // L + char longname_zhs[512]; // M + char longname_ko[512]; // N + char longname_nl[512]; // O + char longname_pt[512]; // P + char longname_ru[512]; // Q + char longname_zht[512]; // R + char shortname_ja[256]; // S + char shortname_en[256]; // T + char shortname_fr[256]; // U + char shortname_de[256]; // V + char shortname_it[256]; // W + char shortname_es[256]; // X + char shortname_zhs[256]; // Y + char shortname_ko[256]; // Z + char shortname_nl[256]; // 11 + char shortname_pt[256]; // 22 + char shortname_ru[256]; // 33 + char shortname_zht[256]; // 44 + char publisher_ja[256]; // 55 + char publisher_en[256]; // 66 + char publisher_fr[256]; // 77 + char publisher_de[256]; // 88 + char publisher_it[256]; // 99 + char publisher_es[256]; // 1010 + char publisher_zhs[256]; // 1212 + char publisher_ko[256]; // 1313 + char publisher_nl[256]; // 1414 + char publisher_pt[256]; // 1515 + char publisher_ru[256]; // 1616 + char publisher_zht[256]; // 1717 + uint32_t add_on_unique_id0; // 0x41 + uint32_t add_on_unique_id1; // 0x42 + uint32_t add_on_unique_id2; // 0x43 + uint32_t add_on_unique_id3; // 0x44 + uint32_t add_on_unique_id4; // 0x45 + uint32_t add_on_unique_id5; // 0x46 + uint32_t add_on_unique_id6; // 0x47 + uint32_t add_on_unique_id7; // 0x48 + uint32_t add_on_unique_id8; // 0x49 + uint32_t add_on_unique_id9; // 0x4A + uint32_t add_on_unique_id10; // 0x4B + uint32_t add_on_unique_id11; // 0x4C + uint32_t add_on_unique_id12; // 0x4D + uint32_t add_on_unique_id13; // 0x4E + uint32_t add_on_unique_id14; // 0x4F + uint32_t add_on_unique_id15; // 0x50 + uint32_t add_on_unique_id16; // 0x51 + uint32_t add_on_unique_id17; // 0x52 + uint32_t add_on_unique_id18; // 0x53 + uint32_t add_on_unique_id19; // 0x54 + uint32_t add_on_unique_id20; // 0x55 + uint32_t add_on_unique_id21; // 0x56 + uint32_t add_on_unique_id22; // 0x57 + uint32_t add_on_unique_id23; // 0x58 + uint32_t add_on_unique_id24; // 0x59 + uint32_t add_on_unique_id25; // 0x5A + uint32_t add_on_unique_id26; // 0x5B + uint32_t add_on_unique_id27; // 0x5C + uint32_t add_on_unique_id28; // 0x5D + uint32_t add_on_unique_id29; // 0x5E + uint32_t add_on_unique_id30; // 0x5F + uint32_t add_on_unique_id31; // 0x60 +}; +WUT_CHECK_OFFSET(_ACPMetaXml, 0x00, title_id); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x08, boss_id); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x10, os_version); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x18, app_size); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x20, common_save_size); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x28, account_save_size); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x30, common_boss_size); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x38, account_boss_size); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x40, join_game_mode_mask); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x48, version); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x4C, product_code); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x6C, content_platform); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x8C, company_code); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x94, mastering_date); +WUT_CHECK_OFFSET(_ACPMetaXml, 0xB4, logo_type); +WUT_CHECK_OFFSET(_ACPMetaXml, 0xB8, app_launch_type); +WUT_CHECK_OFFSET(_ACPMetaXml, 0xBC, invisible_flag); +WUT_CHECK_OFFSET(_ACPMetaXml, 0xC0, no_managed_flag); +WUT_CHECK_OFFSET(_ACPMetaXml, 0xC4, no_event_log); +WUT_CHECK_OFFSET(_ACPMetaXml, 0xC8, no_icon_database); +WUT_CHECK_OFFSET(_ACPMetaXml, 0xCC, launching_flag); +WUT_CHECK_OFFSET(_ACPMetaXml, 0xD0, install_flag); +WUT_CHECK_OFFSET(_ACPMetaXml, 0xD4, closing_msg); +WUT_CHECK_OFFSET(_ACPMetaXml, 0xD8, title_version); +WUT_CHECK_OFFSET(_ACPMetaXml, 0xDC, group_id); +WUT_CHECK_OFFSET(_ACPMetaXml, 0xE0, save_no_rollback); +WUT_CHECK_OFFSET(_ACPMetaXml, 0xE4, bg_daemon_enable); +WUT_CHECK_OFFSET(_ACPMetaXml, 0xE8, join_game_id); +WUT_CHECK_OFFSET(_ACPMetaXml, 0xEC, olv_accesskey); +WUT_CHECK_OFFSET(_ACPMetaXml, 0xF0, wood_tin); +WUT_CHECK_OFFSET(_ACPMetaXml, 0xF4, e_manual); +WUT_CHECK_OFFSET(_ACPMetaXml, 0xF8, e_manual_version); +WUT_CHECK_OFFSET(_ACPMetaXml, 0xFC, region); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x100, pc_cero); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x104, pc_esrb); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x108, pc_bbfc); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x10C, pc_usk); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x110, pc_pegi_gen); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x114, pc_pegi_fin); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x118, pc_pegi_prt); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x11C, pc_pegi_bbfc); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x120, pc_cob); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x124, pc_grb); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x128, pc_cgsrr); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x12C, pc_oflc); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x130, pc_reserved0); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x134, pc_reserved1); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x138, pc_reserved2); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x13C, pc_reserved3); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x140, ext_dev_nunchaku); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x144, ext_dev_classic); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x148, ext_dev_urcc); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x14C, ext_dev_board); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x150, ext_dev_usb_keyboard); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x154, ext_dev_etc); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x158, ext_dev_etc_name); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x358, eula_version); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x35C, drc_use); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x360, network_use); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x364, online_account_use); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x368, direct_boot); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x36C, reserved_flag0); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x370, reserved_flag1); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x374, reserved_flag2); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x378, reserved_flag3); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x37C, reserved_flag4); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x380, reserved_flag5); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x384, reserved_flag6); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x388, reserved_flag7); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x38C, longname_ja); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x58C, longname_en); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x78C, longname_fr); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x98C, longname_de); +WUT_CHECK_OFFSET(_ACPMetaXml, 0xB8C, longname_it); +WUT_CHECK_OFFSET(_ACPMetaXml, 0xD8C, longname_es); +WUT_CHECK_OFFSET(_ACPMetaXml, 0xF8C, longname_zhs); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x118C, longname_ko); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x138C, longname_nl); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x158C, longname_pt); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x178C, longname_ru); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x198C, longname_zht); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x1B8C, shortname_ja); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x1C8C, shortname_en); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x1D8C, shortname_fr); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x1E8C, shortname_de); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x1F8C, shortname_it); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x208C, shortname_es); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x218C, shortname_zhs); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x228C, shortname_ko); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x238C, shortname_nl); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x248C, shortname_pt); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x258C, shortname_ru); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x268C, shortname_zht); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x278C, publisher_ja); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x288C, publisher_en); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x298C, publisher_fr); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x2A8C, publisher_de); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x2B8C, publisher_it); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x2C8C, publisher_es); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x2D8C, publisher_zhs); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x2E8C, publisher_ko); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x2F8C, publisher_nl); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x308C, publisher_pt); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x318C, publisher_ru); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x328C, publisher_zht); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x338C, add_on_unique_id0); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x3394, add_on_unique_id2); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x3398, add_on_unique_id3); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x339C, add_on_unique_id4); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x33A0, add_on_unique_id5); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x33A4, add_on_unique_id6); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x33A8, add_on_unique_id7); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x33AC, add_on_unique_id8); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x33B0, add_on_unique_id9); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x33B4, add_on_unique_id10); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x33B8, add_on_unique_id11); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x33BC, add_on_unique_id12); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x33C0, add_on_unique_id13); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x33C4, add_on_unique_id14); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x33C8, add_on_unique_id15); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x33CC, add_on_unique_id16); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x33D0, add_on_unique_id17); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x33D4, add_on_unique_id18); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x33D8, add_on_unique_id19); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x33DC, add_on_unique_id20); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x33E0, add_on_unique_id21); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x33E4, add_on_unique_id22); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x33E8, add_on_unique_id23); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x33EC, add_on_unique_id24); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x33F0, add_on_unique_id25); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x33F4, add_on_unique_id26); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x33F8, add_on_unique_id27); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x33FC, add_on_unique_id28); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x3400, add_on_unique_id29); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x3404, add_on_unique_id30); +WUT_CHECK_OFFSET(_ACPMetaXml, 0x3408, add_on_unique_id31); +WUT_CHECK_SIZE(_ACPMetaXml,0x340C); + +extern "C" { + extern void __init_wut_malloc(); + extern void __fini_wut_malloc(); +} + +WUPS_FS_ACCESS() + +MCPTitleListType my[25] __attribute__((section(".data"))); +MCPTitleListType template_title; + +ON_APPLICATION_START(args) { + __init_wut_malloc(); + socket_lib_init(); + log_init(); + DEBUG_FUNCTION_LINE("###############\n"); +} + +ON_APPLICATION_ENDING(){ + __fini_wut_malloc(); + DEBUG_FUNCTION_LINE("###############\n"); +} + + +DECL_FUNCTION(int32_t, MCP_TitleList, uint32_t handle, uint32_t* outTitleCount, MCPTitleListType* titleList, uint32_t size) { + int32_t result = real_MCP_TitleList(handle, outTitleCount, titleList, size); + //DEBUG_FUNCTION_LINE("%08X %08X %08X %08X = %08X\n",handle,*outTitleCount,titleList,size,result); + + uint32_t titlecount = *outTitleCount; + + for(uint32_t i = 0;i