//Does the platform-specific equivalent of this in nsswitch.conf: // hosts: files dns DWORD DJConfigureHostsEntry(const char *testPrefix) { DWORD ceError = ERROR_SUCCESS; NsswitchConf conf; DistroInfo distro; int line; const char *hostsByFile; const char *hostsByDns; int moduleIndex; if(testPrefix == NULL) testPrefix = ""; memset(&distro, 0, sizeof(distro)); memset(&conf, 0, sizeof(conf)); GCE(ceError = DJGetDistroInfo(testPrefix, &distro)); ceError = ReadNsswitchConf(&conf, testPrefix, TRUE); GCE(ceError); hostsByFile = GetNameOfHostsByFile(&conf, &distro); hostsByDns = GetNameOfHostsByDns(&conf, &distro); line = FindEntry(&conf, 0, "hosts"); if(line == -1) { DJ_LOG_INFO("Adding hosts line"); GCE(ceError = AddEntry(&conf, &distro, &line, "hosts")); GCE(ceError = InsertModule(&conf, &distro, line, 0, hostsByDns)); GCE(ceError = InsertModule(&conf, &distro, line, 0, hostsByFile)); } moduleIndex = FindModuleOnLine(&conf, line, hostsByFile); if(moduleIndex > 0) { /* The local module exists on the line, but it is not the first * entry. */ GCE(ceError = RemoveModule(&conf, line, moduleIndex)); } if(moduleIndex != 0) { GCE(ceError = InsertModule(&conf, &distro, line, 0, hostsByFile)); } if(conf.modified) WriteNsswitchConfiguration(testPrefix, &conf); else DJ_LOG_INFO("nsswitch not modified"); cleanup: FreeNsswitchConfContents(&conf); DJFreeDistroInfo(&distro); return ceError; }
static void HandleLoadDll( struct TDebug *obj, struct TLoadDllEvent *event ) { struct TDebugModule *dm; dm = (struct TDebugModule *)malloc( sizeof( struct TDebugModule ) ); InitDllDebugModule( dm, event ); InsertModule( obj, dm); }
static void HandleCreateProcess( struct TDebug *obj, struct TCreateProcessEvent *event ) { struct TDebugThread *dt; struct TDebugModule *dm; dt = (struct TDebugThread *)malloc( sizeof( struct TDebugThread ) ); InitProcessDebugThread( dt, event ); InsertThread( obj, dt ); dm = (struct TDebugModule *)malloc( sizeof( struct TDebugModule ) ); InitProcessDebugModule( dm, event ); InsertModule( obj, dm); }
void UpdateModules( struct TDebug *obj ) { struct TDebugModule *m; int model; model = GetThreadMemoryModel( obj->CurrentThread ); if (model != obj->FMemoryModel) { obj->FMemoryModel = model; obj->FConfigChange = TRUE; } if ( obj->FMemoryModel != DEBUG_MEMORY_MODEL_FLAT ) { if ( !FindModule( obj, obj->CurrentThread->Cs ) ) { m = (struct TDebugModule *)malloc( sizeof( struct TDebugModule ) ); InitKernelDebugModule( m, obj->CurrentThread->Cs ); if (m->Handle) { InsertModule( obj, m ); obj->FModuleChanged = TRUE; } else free( m ); } } }
DWORD UpdateNsswitchConf(NsswitchConf *conf, BOOLEAN enable) { DWORD ceError = ERROR_SUCCESS; DistroInfo distro; int line; int lwiIndex; static const char* moduleName = "lsass"; static const char* oldModule = "lwidentity"; GCE(ceError = DJGetDistroInfo(NULL, &distro)); line = FindEntry(conf, 0, "passwd"); if(enable && line == -1) { DJ_LOG_INFO("Adding passwd line"); GCE(ceError = AddEntry(conf, &distro, &line, "passwd")); GCE(ceError = InsertModule(conf, &distro, line, -1, "files")); } lwiIndex = FindModuleOnLine(conf, line, moduleName); if(enable && lwiIndex == -1) { GCE(ceError = InsertModule(conf, &distro, line, -1, moduleName)); } if(!enable && lwiIndex != -1) { GCE(ceError = RemoveModule(conf, line, lwiIndex)); } lwiIndex = FindModuleOnLine(conf, line, oldModule); if(lwiIndex != -1) { GCE(ceError = RemoveModule(conf, line, lwiIndex)); } // If lwidentity was the only entry // and we removed that now, don't write // an empty entry into the file if(!enable && line != -1 && GetEntry(conf, line)->modules.size == 0) { GCE(ceError = InsertModule(conf, &distro, line, -1, "files")); } line = FindEntry(conf, 0, "group"); if(line == -1) { line = FindEntry(conf, 0, "groups"); } if(enable && line == -1) { /* The nsswitch file doesn't have an existing groups line. We have to * guess based on platform whether it uses 'group' or 'groups'. */ const char *groupName = "group"; if(distro.os == OS_AIX || distro.os == OS_DARWIN) { groupName = "groups"; } DJ_LOG_INFO("Adding %s line", groupName); GCE(ceError = AddEntry(conf, &distro, &line, groupName)); GCE(ceError = InsertModule(conf, &distro, line, -1, "files")); } lwiIndex = FindModuleOnLine(conf, line, moduleName); if(enable && lwiIndex == -1) { GCE(ceError = InsertModule(conf, &distro, line, -1, moduleName)); } if(!enable && lwiIndex != -1) { GCE(ceError = RemoveModule(conf, line, lwiIndex)); } lwiIndex = FindModuleOnLine(conf, line, oldModule); if(lwiIndex != -1) { GCE(ceError = RemoveModule(conf, line, lwiIndex)); } // If lwidentity was the only entry // and we removed that now, don't write // an empty entry into the file if(!enable && line != -1 && GetEntry(conf, line)->modules.size == 0) { GCE(ceError = InsertModule(conf, &distro, line, -1, "files")); } cleanup: DJFreeDistroInfo(&distro); return ceError; }
static QueryResult RemoveCompat(NsswitchConf *conf, PSTR *description, LWException **exc) { DistroInfo distro; int compatLine; int noncompatLine; int compatModIndex; BOOLEAN passwdNeedUpdate = FALSE; BOOLEAN groupNeedUpdate = FALSE; QueryResult result = FullyConfigured; memset(&distro, 0, sizeof(distro)); /* The default configuration on FreeBSD is: * passwd: compat * passwd_compat: nis * group: compat * group_compat: nis * * The nsswitch man page says that compat must be the only module on the * line if it is used. Unfortunately, if a module is listed on the compat * line, it goes through a different interface which LSASS does not * understand. So this configuration must first be transformed into: * * passwd: files nis * group: files nis * * If the user is using compat mode with a non-default configuration, show * an error message instead. */ LW_CLEANUP_CTERR(exc, DJGetDistroInfo(NULL, &distro)); compatLine = FindEntry(conf, 0, "passwd_compat"); if(compatLine != -1) { const NsswitchEntry *lineEntry = GetEntry(conf, compatLine); passwdNeedUpdate = TRUE; if(lineEntry->modules.size != 1) { result = CannotConfigure; goto done_configuring; } if(FindModuleOnLine(conf, compatLine, "nis") == -1) { result = CannotConfigure; goto done_configuring; } noncompatLine = FindEntry(conf, 0, "passwd"); if(noncompatLine == -1) { result = CannotConfigure; goto done_configuring; } lineEntry = GetEntry(conf, noncompatLine); if(lineEntry->modules.size != 1) { result = CannotConfigure; goto done_configuring; } compatModIndex = FindModuleOnLine(conf, noncompatLine, "compat"); if(compatModIndex == -1) { result = CannotConfigure; goto done_configuring; } result = NotConfigured; LW_CLEANUP_CTERR(exc, InsertModule(conf, &distro, noncompatLine, -1, "files")); LW_CLEANUP_CTERR(exc, InsertModule(conf, &distro, noncompatLine, -1, "nis")); LW_CLEANUP_CTERR(exc, RemoveModule(conf, noncompatLine, compatModIndex)); LW_CLEANUP_CTERR(exc, RemoveLine(conf, compatLine)); } compatLine = FindEntry(conf, 0, "group_compat"); if(compatLine != -1) { const NsswitchEntry *lineEntry = GetEntry(conf, compatLine); groupNeedUpdate = TRUE; if(lineEntry->modules.size != 1) { result = CannotConfigure; goto done_configuring; } if(FindModuleOnLine(conf, compatLine, "nis") == -1) { result = CannotConfigure; goto done_configuring; } noncompatLine = FindEntry(conf, 0, "group"); if(noncompatLine == -1) { result = CannotConfigure; goto done_configuring; } lineEntry = GetEntry(conf, noncompatLine); if(lineEntry->modules.size != 1) { result = CannotConfigure; goto done_configuring; } compatModIndex = FindModuleOnLine(conf, noncompatLine, "compat"); if(compatModIndex == -1) { result = CannotConfigure; goto done_configuring; } result = NotConfigured; LW_CLEANUP_CTERR(exc, InsertModule(conf, &distro, noncompatLine, -1, "files")); LW_CLEANUP_CTERR(exc, InsertModule(conf, &distro, noncompatLine, -1, "nis")); LW_CLEANUP_CTERR(exc, RemoveModule(conf, noncompatLine, compatModIndex)); LW_CLEANUP_CTERR(exc, RemoveLine(conf, compatLine)); } done_configuring: if(result == CannotConfigure && description != NULL) { LW_CLEANUP_CTERR(exc, CTStrdup("Remove the passwd_compat and/or group_compat lines and use passwd and group instead. This cannot be done automatically because your system has a non-default nsswitch configuration.\n", description)); } else if((passwdNeedUpdate || groupNeedUpdate) && description != NULL) { LW_CLEANUP_CTERR(exc, CTStrdup("Remove the passwd_compat and/or group_compat lines and use passwd and group instead.\n", description)); result = NotConfigured; } else if(description != NULL) { LW_CLEANUP_CTERR(exc, CTStrdup("Fully Configured.", description)); } cleanup: DJFreeDistroInfo(&distro); return result; }
DWORD UpdateNsswitchConf(NsswitchConf *conf, BOOLEAN enable) { DWORD ceError = ERROR_SUCCESS; LwDistroInfo distro; int line; int lwiIndex; static const char* moduleName = "lsass"; static const char* oldModule = "lwidentity"; const char* pszModule = NULL; CHAR szCommand[2 * PATH_MAX + 1] = {}; GCE(ceError = DJGetDistroInfo(NULL, &distro)); line = FindEntry(conf, 0, "passwd"); if(enable && line == -1) { DJ_LOG_INFO("Adding passwd line"); GCE(ceError = AddEntry(conf, &distro, &line, "passwd")); GCE(ceError = InsertModule(conf, &distro, line, -1, "files")); } lwiIndex = FindModuleOnLine(conf, line, moduleName); if(enable && lwiIndex == -1) { GCE(ceError = InsertModule(conf, &distro, line, -1, moduleName)); } if(!enable && lwiIndex != -1) { GCE(ceError = RemoveModule(conf, line, lwiIndex)); } lwiIndex = FindModuleOnLine(conf, line, oldModule); if(lwiIndex != -1) { GCE(ceError = RemoveModule(conf, line, lwiIndex)); } // If lwidentity was the only entry // and we removed that now, don't write // an empty entry into the file if(!enable && line != -1 && GetEntry(conf, line)->modules.size == 0) { GCE(ceError = InsertModule(conf, &distro, line, -1, "files")); } line = FindEntry(conf, 0, "group"); if(line == -1) { line = FindEntry(conf, 0, "groups"); } if(enable && line == -1) { /* The nsswitch file doesn't have an existing groups line. We have to * guess based on platform whether it uses 'group' or 'groups'. */ const char *groupName = "group"; if(distro.os == OS_AIX || distro.os == OS_DARWIN) { groupName = "groups"; } DJ_LOG_INFO("Adding %s line", groupName); GCE(ceError = AddEntry(conf, &distro, &line, groupName)); GCE(ceError = InsertModule(conf, &distro, line, -1, "files")); } lwiIndex = FindModuleOnLine(conf, line, moduleName); if(enable && lwiIndex == -1) { GCE(ceError = InsertModule(conf, &distro, line, -1, moduleName)); } if(!enable && lwiIndex != -1) { GCE(ceError = RemoveModule(conf, line, lwiIndex)); } lwiIndex = FindModuleOnLine(conf, line, oldModule); if(lwiIndex != -1) { GCE(ceError = RemoveModule(conf, line, lwiIndex)); } // If lwidentity was the only entry // and we removed that now, don't write // an empty entry into the file if(!enable && line != -1 && GetEntry(conf, line)->modules.size == 0) { GCE(ceError = InsertModule(conf, &distro, line, -1, "files")); } // If initgroups is present, it overrides the groups line // and has different semantics. // As soon as a module reports success, processing stops. We don't want // that so we need to add '[SUCCESS=continue]' // We are not adding initgroups if it is not present. line = FindEntry(conf, 0, "initgroups"); lwiIndex = FindModuleOnLine(conf, line, moduleName); if(enable && line != -1 && lwiIndex == -1) { GCE(ceError = InsertModule(conf, &distro, line, -1, moduleName)); lwiIndex = FindModuleOnLine(conf, line, moduleName); if (lwiIndex > 0) { ceError = InsertModule(conf, &distro, line, lwiIndex, "[SUCCESS=continue]"); if (ceError) { RemoveModule(conf, line, lwiIndex - 1); GCE(ceError); } } } if (!enable && line != -1 && lwiIndex != -1) { if (lwiIndex > 0) { pszModule = GetModule(conf, line, lwiIndex - 1); if (pszModule && *pszModule == '[') { GCE(ceError = RemoveModule(conf, line, lwiIndex - 1)); lwiIndex = lwiIndex - 1; } } GCE(ceError = RemoveModule(conf, line, lwiIndex)); } if(!enable && line != -1 && GetEntry(conf, line)->modules.size == 0) { GCE(ceError = InsertModule(conf, &distro, line, -1, "files")); } if(distro.os == OS_SUNOS) { if(strcmp("5.11", distro.version) == 0) { if(enable) { sprintf(szCommand, "svccfg -s name-service/switch setprop config/password=\\\"files %s\\\"", moduleName); if(system(szCommand) < 0) { goto cleanup; } memset(szCommand, 0, sizeof(szCommand)); sprintf(szCommand, "svccfg -s name-service/switch setprop config/group=\\\"files %s\\\"", moduleName); if(system(szCommand) < 0) { goto cleanup; } memset(szCommand, 0, sizeof(szCommand)); sprintf(szCommand, "svcadm refresh name-service/switch"); if(system(szCommand) < 0) { goto cleanup; } } else { memset(szCommand, 0, sizeof(szCommand)); sprintf(szCommand, "svccfg -s name-service/switch setprop config/password=files"); if(system(szCommand) < 0) { goto cleanup; } memset(szCommand, 0, sizeof(szCommand)); sprintf(szCommand, "svccfg -s name-service/switch setprop config/group=files"); if(system(szCommand) < 0) { goto cleanup; } memset(szCommand, 0, sizeof(szCommand)); sprintf(szCommand, "svcadm refresh name-service/switch"); if(system(szCommand) < 0) { goto cleanup; } } } else { goto cleanup; } } cleanup: DJFreeDistroInfo(&distro); return ceError; }
int main(int argc, char **argv) { // Exit after 10 seconds if there is an error __exception_setreload(10); // u64 timeout = 0; CheckForGecko(); DCInvalidateRange(loader_stub, 0x1800); memcpy(loader_stub, (void*)0x80001800, 0x1800); RAMInit(); //Meh, doesnt do anything anymore anyways //STM_RegisterEventHandler(HandleSTMEvent); Initialise(); // Checking for storage devices... ShowMessageScreen("Checking storage devices..."); u32 u; //Disables MEMPROT for patches write16(MEM_PROT, 0); //Patches FS access for( u = 0x93A00000; u < 0x94000000; u+=2 ) { if( memcmp( (void*)(u), FSAccessPattern, sizeof(FSAccessPattern) ) == 0 ) { // gprintf("FSAccessPatch:%08X\r\n", u ); memcpy( (void*)u, FSAccessPatch, sizeof(FSAccessPatch) ); DCFlushRange((void*)u, sizeof(FSAccessPatch)); break; } } //for BT.c CONF_GetPadDevices((conf_pads*)0x932C0000); DCFlushRange((void*)0x932C0000, sizeof(conf_pads)); *(vu32*)0x932C0490 = CONF_GetIRSensitivity(); *(vu32*)0x932C0494 = CONF_GetSensorBarPosition(); DCFlushRange((void*)0x932C0490, 8); if(LoadKernel() < 0) { ClearScreen(); gprintf("Failed to load kernel from NAND!\r\n"); ShowMessageScreenAndExit("Failed to load kernel from NAND!", 1); } InsertModule((char*)kernel_bin, kernel_bin_size); memset( (void*)0x92f00000, 0, 0x100000 ); DCFlushRange( (void*)0x92f00000, 0x100000 ); DCInvalidateRange( (void*)0x939F02F0, 0x20 ); memcpy( (void*)0x939F02F0, Boot2Patch, sizeof(Boot2Patch) ); DCFlushRange( (void*)0x939F02F0, 0x20 ); //libogc still has that, lets close it __ES_Close(); s32 fd = IOS_Open( "/dev/es", 0 ); memset( STATUS, 0xFFFFFFFF, 0x20 ); DCFlushRange( STATUS, 0x20 ); memset( (void*)0x91000000, 0xFFFFFFFF, 0x20 ); DCFlushRange( (void*)0x91000000, 0x20 ); *(vu32*)0xD3003420 = 0; //make sure kernel doesnt reload raw_irq_handler_t irq_handler = BeforeIOSReload(); IOS_IoctlvAsync( fd, 0x1F, 0, 0, &IOCTL_Buf, NULL, NULL ); AfterIOSReload( irq_handler, FoundVersion ); while(1) { DCInvalidateRange( STATUS, 0x20 ); if((STATUS_LOADING > 0 || abs(STATUS_LOADING) > 1) && STATUS_LOADING < 20) { gprintf("Kernel sent signal\n"); break; } } /* For slow USB HDDs */ time_t timeout = time(NULL); while(time(NULL) - timeout < 10) { if(__io_custom_usbstorage.startup() && __io_custom_usbstorage.isInserted()) break; usleep(50000); } fatInitDefault(); gprintf("Nintendont at your service!\r\n%s\r\n", NIN_BUILD_STRING); KernelLoaded = 1; char* first_slash = strrchr(argv[0], '/'); if (first_slash != NULL) strncpy(launch_dir, argv[0], first_slash-argv[0]+1); gprintf("launch_dir = %s\r\n", launch_dir); FPAD_Init(); FPAD_Update(); /* Read IPL Font before doing any patches */ void *fontbuffer = memalign(32, 0x50000); __SYS_ReadROM((void*)fontbuffer,0x50000,0x1AFF00); memcpy((void*)0xD3100000, fontbuffer, 0x50000); DCInvalidateRange( (void*)0x93100000, 0x50000 ); free(fontbuffer); //gprintf("Font: 0x1AFF00 starts with %.4s, 0x1FCF00 with %.4s\n", (char*)0x93100000, (char*)0x93100000 + 0x4D000); // Simple code to autoupdate the meta.xml in Nintendont's folder FILE *meta = fopen("meta.xml", "w"); if(meta != NULL) { fprintf(meta, "%s\r\n<app version=\"1\">\r\n\t<name>%s</name>\r\n", META_XML, META_NAME); fprintf(meta, "\t<coder>%s</coder>\r\n\t<version>%d.%d</version>\r\n", META_AUTHOR, NIN_VERSION>>16, NIN_VERSION&0xFFFF); fprintf(meta, "\t<release_date>20150531000000</release_date>\r\n"); fprintf(meta, "\t<short_description>%s</short_description>\r\n", META_SHORT); fprintf(meta, "\t<long_description>%s\r\n\r\n%s</long_description>\r\n", META_LONG1, META_LONG2); fprintf(meta, "\t<ahb_access/>\r\n</app>"); fclose(meta); }