/****************************************************************** * MiniDumpWriteDump (DEBUGHLP.@) * */ BOOL WINAPI MiniDumpWriteDump(HANDLE hProcess, DWORD pid, HANDLE hFile, MINIDUMP_TYPE DumpType, PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, PMINIDUMP_CALLBACK_INFORMATION CallbackParam) { MINIDUMP_HEADER mdHead; MINIDUMP_DIRECTORY mdDir; DWORD i, nStreams, idx_stream; struct dump_context dc; dc.hProcess = hProcess; dc.hFile = hFile; dc.pid = pid; dc.module = NULL; dc.num_module = 0; dc.cb = CallbackParam; dc.type = DumpType; dc.mem = NULL; dc.num_mem = 0; dc.rva = 0; if (!fetch_process_info(&dc)) return FALSE; fetch_module_info(&dc); /* 1) init */ nStreams = 6 + (ExceptionParam ? 1 : 0) + (UserStreamParam ? UserStreamParam->UserStreamCount : 0); if (DumpType & MiniDumpWithDataSegs) FIXME("NIY MiniDumpWithDataSegs\n"); if (DumpType & MiniDumpWithFullMemory) FIXME("NIY MiniDumpWithFullMemory\n"); if (DumpType & MiniDumpWithHandleData) FIXME("NIY MiniDumpWithHandleData\n"); if (DumpType & MiniDumpFilterMemory) FIXME("NIY MiniDumpFilterMemory\n"); if (DumpType & MiniDumpScanMemory) FIXME("NIY MiniDumpScanMemory\n"); /* 2) write header */ mdHead.Signature = MINIDUMP_SIGNATURE; mdHead.Version = MINIDUMP_VERSION; mdHead.NumberOfStreams = nStreams; mdHead.StreamDirectoryRva = sizeof(mdHead); mdHead.u.TimeDateStamp = time(NULL); mdHead.Flags = DumpType; append(&dc, &mdHead, sizeof(mdHead)); /* 3) write stream directories */ dc.rva += nStreams * sizeof(mdDir); idx_stream = 0; /* 3.1) write data stream directories */ mdDir.StreamType = ThreadListStream; mdDir.Location.Rva = dc.rva; dump_threads(&dc); mdDir.Location.DataSize = dc.rva - mdDir.Location.Rva; writeat(&dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir), &mdDir, sizeof(mdDir)); mdDir.StreamType = ModuleListStream; mdDir.Location.Rva = dc.rva; dump_modules(&dc, FALSE); mdDir.Location.DataSize = dc.rva - mdDir.Location.Rva; writeat(&dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir), &mdDir, sizeof(mdDir)); mdDir.StreamType = 0xfff0; /* FIXME: this is part of MS reserved streams */ mdDir.Location.Rva = dc.rva; dump_modules(&dc, TRUE); mdDir.Location.DataSize = dc.rva - mdDir.Location.Rva; writeat(&dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir), &mdDir, sizeof(mdDir)); mdDir.StreamType = MemoryListStream; mdDir.Location.Rva = dc.rva; dump_memory_info(&dc); mdDir.Location.DataSize = dc.rva - mdDir.Location.Rva; writeat(&dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir), &mdDir, sizeof(mdDir)); mdDir.StreamType = SystemInfoStream; mdDir.Location.Rva = dc.rva; dump_system_info(&dc); mdDir.Location.DataSize = dc.rva - mdDir.Location.Rva; writeat(&dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir), &mdDir, sizeof(mdDir)); mdDir.StreamType = MiscInfoStream; mdDir.Location.Rva = dc.rva; dump_misc_info(&dc); mdDir.Location.DataSize = dc.rva - mdDir.Location.Rva; writeat(&dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir), &mdDir, sizeof(mdDir)); /* 3.2) write exception information (if any) */ if (ExceptionParam) { mdDir.StreamType = ExceptionStream; mdDir.Location.Rva = dc.rva; dump_exception_info(&dc, ExceptionParam); mdDir.Location.DataSize = dc.rva - mdDir.Location.Rva; writeat(&dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir), &mdDir, sizeof(mdDir)); } /* 3.3) write user defined streams (if any) */ if (UserStreamParam) { for (i = 0; i < UserStreamParam->UserStreamCount; i++) { mdDir.StreamType = UserStreamParam->UserStreamArray[i].Type; mdDir.Location.DataSize = UserStreamParam->UserStreamArray[i].BufferSize; mdDir.Location.Rva = dc.rva; writeat(&dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir), &mdDir, sizeof(mdDir)); append(&dc, UserStreamParam->UserStreamArray[i].Buffer, UserStreamParam->UserStreamArray[i].BufferSize); } } HeapFree(GetProcessHeap(), 0, dc.pcs_buffer); HeapFree(GetProcessHeap(), 0, dc.mem); HeapFree(GetProcessHeap(), 0, dc.module); return TRUE; }
/* Display possible modules and select one */ bool select_module() { s32b k, sel, max; /* Hack */ use_color = TRUE; /* Init some lua */ init_lua(); /* Some ports need to separate the module scripts from the installed mods, so we need to check for these in two different places */ if(!tome_dofile_anywhere(ANGBAND_DIR_CORE, "mods_aux.lua", FALSE)) tome_dofile_anywhere(ANGBAND_DIR_MODULES, "mods_aux.lua", TRUE); if(!tome_dofile_anywhere(ANGBAND_DIR_CORE, "modules.lua", FALSE)) tome_dofile_anywhere(ANGBAND_DIR_MODULES, "modules.lua", TRUE); /* Grab the savefiles */ call_lua("max_modules", "()", "d", &max); /* No need to bother the player if there is only one module */ sel = -1; if (force_module) call_lua("find_module", "(s)", "d", force_module, &sel); if (max == 1) sel = 0; if (sel != -1) { cptr tmp; /* Process the module */ call_lua("init_module", "(d)", "", sel); call_lua("get_module_name", "(d)", "s", sel, &tmp); game_module = string_make(tmp); activate_module(); return FALSE; } sel = 0; /* Preprocess the basic prefs, we need them to have movement keys */ process_pref_file("pref.prf"); while (TRUE) { /* Clear screen */ Term_clear(); /* Let the user choose */ c_put_str(TERM_YELLOW, "Welcome to ToME, you must select a module to play,", 1, 12); c_put_str(TERM_YELLOW, "either ToME official module or third party ones.", 2, 13); put_str("Press 8/2/4/6 to move, Return to select and Esc to quit.", 4, 3); dump_modules(sel, max); k = inkey(); if (k == ESCAPE) { quit(NULL); } if (k == '6') { sel++; if (sel >= max) sel = 0; continue; } else if (k == '4') { sel--; if (sel < 0) sel = max - 1; continue; } else if (k == '2') { sel += 4; if (sel >= max) sel = sel % max; continue; } else if (k == '8') { sel -= 4; if (sel < 0) sel = (sel + max - 1) % max; continue; } else if (k == '\r') { if (sel < 26) k = I2A(sel); else k = toupper(I2A(sel)); } { int x; cptr tmp; if (islower(k)) x = A2I(k); else x = A2I(tolower(k)) + 26; if ((x < 0) || (x >= max)) continue; /* Process the module */ call_lua("init_module", "(d)", "", x); call_lua("get_module_name", "(d)", "s", x, &tmp); game_module = string_make(tmp); activate_module(); return (FALSE); } } /* Shouldnt happen */ return (FALSE); }