Lang: Include missing label (fpPS4 Updater: Status), MemoryJS: Update plugin, CSS: Minor changes

This commit is contained in:
TemmieHeartz 2023-01-18 13:21:05 -03:00
parent 41b49a1a78
commit 0a23e825e0
38 changed files with 3549 additions and 162 deletions

View file

@ -137,12 +137,12 @@ img {
}
.DIV_GAME_OPTIONS {
width: 268px;
bottom: 60px;
bottom: 68px;
font-size: 14px;
overflow: auto;
position: absolute;
text-align: center;
height: calc(100% - 120px);
height: calc(100% - 128px);
}
.DIV_HACK_LIST {
text-align: left;
@ -288,8 +288,9 @@ img {
border-radius: 6px 0px 0px 0px;
}
.DIV_RUN_BTN {
bottom: 4px;
bottom: 8px;
position: absolute;
text-align: center;
width: calc(100% - 12px);
}
.DIV_GAME_DETAILS {
@ -590,12 +591,15 @@ img {
background-image: linear-gradient(180deg, #05050ee8, #010114c7);
}
.BTN_RUN {
left: 8px;
width: 100%;
bottom: 18px;
height: 50px;
border: none;
font-size: 18px;
margin-top: 2px;
border-radius: 6px;
width: calc(100% - 6px);
background-image: linear-gradient(180deg, #fff, #ccc);
}
.BTN_RUN:active {
background-image: linear-gradient(0deg, #fff, #ccc);
}
.BTN_STOP {
margin: 0px 4px 0px 4px;

View file

@ -55,7 +55,7 @@ temp_LANGUAGE = {
"emuStatusRunning": "Running",
"logWindowTitle": "Running fpPS4",
"killEmuStatus": "Main process closed - close fpPS4 log window to go back",
"logCleared": "INFO - Previous log was cleared!\n ",
"logCleared": "INFO - Previous log was cleared!",
"about": "fpPS4 Temmie\'s Launcher - Version: %VARIABLE_0%\nCreated by TemmieHeartz\n(https://twitter.com/themitosan)\n\nfpPS4 is created by red-prig\n(https://github.com/red-prig/fpPS4)\n\nPlugin memoryjs is created by Rob--\n(https://github.com/rob--/memoryjs)\n\nPlugin node-stream-zip is created by antelle\n(https://github.com/antelle/node-stream-zip)\n\nSVG icons were obtained from https://www.svgrepo.com/",
"mainLog": 'fpPS4 Temmie\'s Launcher - Version: %VARIABLE_0%\nRunning on nw.js (node-webkit) version %VARIABLE_1% [%VARIABLE_2%]',
"settingsErrorCreatePath": "ERROR - Unable to create path!\n(%VARIABLE_0%)\n%VARIABLE_1%",

View file

@ -8,7 +8,7 @@
******************************************************************************
*/
var APP = {
const APP = {
// Import nw modules
fs: require('fs'),

10
App/node_modules/memoryjs/.gitignore generated vendored Normal file
View file

@ -0,0 +1,10 @@
build
test.js
npm-debug.log
.vscode
.vs
node_modules
test/vcxproj/Debug
test/vcxproj/Release
test/*.exe
test/.vs

10
App/node_modules/memoryjs/.npmignore generated vendored Normal file
View file

@ -0,0 +1,10 @@
build
test.js
npm-debug.log
.vscode
.vs
node_modules
test/vcxproj/Debug
test/vcxproj/Release
test/*.exe
test/.vs

117
App/node_modules/memoryjs/README.md generated vendored
View file

@ -25,6 +25,7 @@
- List all open processes
- List all modules associated with a process
- Close process/file handles
- Find a specific module within a process
- Read and write process memory (w/big-endian support)
- Read and write buffers (arbitrary structs)
@ -34,11 +35,11 @@
- Pattern scanning
- Execute a function within a process
- Hardware breakpoints (find out what accesses/writes to this address, etc)
- Inject & Unload DLLs
- Inject & unload DLLs
- Read memory mapped files
TODO:
- WriteFile support (for driver interactions)
- BigInt64 support for memory addresses
- Async/await support
# Getting Started
@ -102,7 +103,7 @@ memoryjs.getProcesses((error, processes) => {});
// close a process (release handle)
memoryjs.closeProcess(handle);
memoryjs.closeHandle(handle);
```
See the [Documentation](#user-content-process-object) section of this README to see what a process object looks like.
@ -135,7 +136,6 @@ See the [Documentation](#user-content-module-object) section of this README to s
- Write buffer to memory
- Fetch memory regions
Read from memory:
``` javascript
// sync: read data type from memory
const value = memoryjs.readMemory(handle, address, dataType);
@ -168,6 +168,30 @@ memoryjs.getRegions(handle, (regions) => {});
See the [Documentation](#user-content-documentation) section of this README to see what values `dataType` can be.
## Memory Mapped Files
- Open a named file mapping object
- Map a view of a file into a specified process
- Close handle to the file mapping object
```javascript
// sync: open a named file mapping object
const fileHandle = memoryjs.openFileMapping(fileName);
// sync: map entire file into a specified process
const baseAddress = memoryjs.mapViewOfFile(processHandle, fileName);
// sync: map portion of a file into a specified process
const baseAddress = memoryjs.mapViewOfFile(processHandle, fileName, offset, viewSize, pageProtection);
// sync: close handle to a file mapping object
const success = memoryjs.closeHandle(fileHandle);
```
See the [Documentation](#user-content-documentation) section of this README to see details on the parameters and return values for these functions.
## Protection
- Change/set the protection on a region of memory
@ -229,7 +253,7 @@ Click [here](#user-content-function-execution-1) for details about how to format
// sync: inject a DLL
const success = memoryjs.injectDll(handle, dllPath);
// async: inject a dLL
// async: inject a DLL
memoryjs.injectDll(handle, dllPath, (error, success) => {});
@ -257,10 +281,10 @@ memoryjs.unloadDll(handle, moduleName, (error, success) => {});
``` javascript
// sync: attach debugger
const success = memoryjs.attatchDebugger(processId, exitOnDetatch);
const success = memoryjs.attachDebugger(processId, exitOnDetach);
// sync: detach debugger
const success = memoryjs.detatchDebugger(processId);
const success = memoryjs.detachDebugger(processId);
// sync: wait for debug event
const success = memoryjs.awaitDebugEvent(hardwareRegister, millisTimeout);
@ -338,8 +362,9 @@ When using the write or read functions, the data type (dataType) parameter shoul
Notes:
- all functions that accept an address also accept the address as a BigInt
- pointer will be 4 bytes in a 32 bit build, and 8 bytes in a 64 bit build.
- to read in bid-endian mode, append `_BE` to the data type. For example: `memoryjs.DOUBLE_BE`.
- to read in big-endian mode, append `_BE` to the data type. For example: `memoryjs.DOUBLE_BE`.
- when writing 64 bit integers (`INT64`, `UINT64`, `INT64_BE`, `UINT64_BE`) you will need to supply a [BigInt](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt). When reading a 64 bit integer, you will receive a BigInt.
These data types are to used to denote the type of data being read or written.
@ -354,13 +379,13 @@ memoryjs.writeMemory(handle, address, value + 1n, memoryjs.INT64);
Vector3 is a data structure of three floats:
```javascript
const vector3 = { x: 0.0, y: 0.0, z: 0.0 };
memoryjs.writeMemory(address, vector3);
memoryjs.writeMemory(handle, address, vector3, memoryjs.VEC3);
```
Vector4 is a data structure of four floats:
```javascript
const vector4 = { w: 0.0, x: 0.0, y: 0.0, z: 0.0 };
memoryjs.writeMemory(address, vector4);
memoryjs.writeMemory(handle, address, vector4, memoryjs.VEC4);
```
## Generic Structures
@ -426,7 +451,7 @@ infinite loop, it will stop reading if it has not found a null-terminator after
One way to bypass this limitation in the future would be to allow a parameter to let users set the maximum
character count.
### Signature Type:
### Signature Type
When pattern scanning, flags need to be raised for the signature types. The signature type parameter needs to be one of the following:
@ -438,6 +463,64 @@ When pattern scanning, flags need to be raised for the signature types. The sign
To raise multiple flags, use the bitwise OR operator: `memoryjs.READ | memoryjs.SUBTRACT`.
## Memory Mapped Files
The library exposes functions to map obtain a handle to and read a memory mapped file.
**openFileMapping(fileName)**
- *fileName*: name of the file mapping object to be opened
- returns: handle to the file mapping object
Refer to [MSDN's OpenFileMappingA](https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-openfilemappinga) documentation for more information.
**mapViewOfFile(processHandle, fileName)**
- *processHandle*: the target process to map the file to
- *fileHandle*: handle of the file mapping object, obtained by `memoryjs.openFileMapping`
- Description: maps the entire file to target process' memory. Page protection defaults to `constants.PAGE_READONLY`.
- Returns: the base address of the mapped file
**mapViewOfFile(processHandle, fileName, offset, viewSize, pageProtection)**
- *processHandle*: the target process to map the file to
- *fileHandle*: handle of the file mapping object, obtained by `memoryjs.openFileMapping`
- *offset* (`number` or `bigint`): the offset from the beginning of the file (has to be multiple of 64KB)
- *viewSize* (`number` or `bigint`): the number of bytes to map (if `0`, the entire file will be read, regardless of offset)
- *pageProtection*: desired page protection
- Description: maps a view of the file to the target process' memory
- Returns: the base address of the mapped file
Refer to [MSDN's MapViewOfFile2](https://learn.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-mapviewoffile2) documentation for more information.
See [Protection Type](#user-content-protection-type) for page protection types.
### Example
We have a process that creates a file mapping:
```c++
HANDLE fileHandle = CreateFileA("C:\\foo.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE fileMappingHandle = CreateFileMappingA(fileHandle, NULL, PAGE_READONLY, 0, 0, "MappedFooFile");
```
We can map the file to a specified target process and read the file with `memoryjs`:
```javascript
const processObject = memoryjs.openProcess("example.exe");
const fileHandle = memoryjs.openFileMapping("MappedFooFile");
// read entire file
const baseAddress = memoryjs.mapViewOfFile(processObject.handle, fileHandle.handle);
const data = memoryjs.readMemory(processObject.handle, baseAddress, memoryjs.STR);
// read 10 bytes after 64KB
const baseAddress = memoryjs.mapViewOfFile(processObject.handle, fileHandle.handle, 65536, 10, constants.PAGE_READONLY);
const buffer = memoryjs.readBuffer(processObject.handle, baseAddress, 10);
const data = buffer.toString();
const success = memoryjs.closeHandle(fileHandle);
```
If you want to read a memory mapped file without having a target process to map the file to, you can map it to the current Node process with global variable `process.pid`:
```javascript
const processObject = memoryjs.openProcess(process.pid);
```
## Function Execution
Remote function execution works by building an array of arguments and dynamically generating shellcode that is injected into the target process and executed, for this reason crashes may occur.
@ -519,9 +602,9 @@ To summarise:
- `setHardwareBreakpoint` returns a boolean stating whether the operation as successful
For more reading about debugging and hardware breakpoints, checkout the following links:
- [DebugActiveProcess](https://msdn.microsoft.com/en-us/library/windows/desktop/ms679295(v=vs.85).aspx) - attatching the debugger
- [DebugSetProcessKillOnExit](https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-debugsetprocesskillonexit) - kill the process when detatching
- [DebugActiveProcessStop](https://msdn.microsoft.com/en-us/library/windows/desktop/ms679296(v=vs.85).aspx) - detatching the debugger
- [DebugActiveProcess](https://msdn.microsoft.com/en-us/library/windows/desktop/ms679295(v=vs.85).aspx) - attaching the debugger
- [DebugSetProcessKillOnExit](https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-debugsetprocesskillonexit) - kill the process when detaching
- [DebugActiveProcessStop](https://msdn.microsoft.com/en-us/library/windows/desktop/ms679296(v=vs.85).aspx) - detaching the debugger
- [WaitForDebugEvent](https://msdn.microsoft.com/en-us/library/windows/desktop/ms681423(v=vs.85).aspx) - waiting for the breakpoint to be triggered
- [ContinueDebugEvent](https://msdn.microsoft.com/en-us/library/windows/desktop/ms679285(v=vs.85).aspx) - handling the event
@ -531,8 +614,8 @@ The Debugger wrapper contains these functions you should use:
``` javascript
class Debugger {
attatch(processId, killOnDetatch = false);
detatch(processId);
attach(processId, killOnDetach = false);
detach(processId);
setHardwareBreakpoint(processId, address, trigger, dataType);
removeHardwareBreakpoint(processId, register);
}
@ -569,7 +652,7 @@ hardwareDebugger.on(register, (event) => {
### When Manually Debugging:
1. Attatch the debugger
1. Attach the debugger
``` javascript
const hardwareDebugger = memoryjs.Debugger;
hardwareDebugger.attach(processId);

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,2 +1,2 @@
#TargetFrameworkVersion=v4.0:PlatformToolSet=v141:EnableManagedIncrementalBuild=false:VCToolArchitecture=Native64Bit:WindowsTargetPlatformVersion=10.0.17763.0
Release|x64|C:\Users\TemmieHeartz\Desktop\teste\node_modules\memoryjs\build\|
Release|x64|C:\Users\TemmieHeartz\Desktop\memoryjs\build\|

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,6 +1,6 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2015
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "memoryjs", "memoryjs.vcxproj", "{4CE2F0D5-2C15-0CB7-9DCE-6BDE0CB7A351}"
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "memoryjs", "memoryjs.vcxproj", "{FA64D7D0-E6BD-17F1-3308-0B2F6267B059}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -8,10 +8,10 @@ Global
Debug|x64 = Debug|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{4CE2F0D5-2C15-0CB7-9DCE-6BDE0CB7A351}.Release|x64.ActiveCfg = Release|x64
{4CE2F0D5-2C15-0CB7-9DCE-6BDE0CB7A351}.Release|x64.Build.0 = Release|x64
{4CE2F0D5-2C15-0CB7-9DCE-6BDE0CB7A351}.Debug|x64.ActiveCfg = Debug|x64
{4CE2F0D5-2C15-0CB7-9DCE-6BDE0CB7A351}.Debug|x64.Build.0 = Debug|x64
{FA64D7D0-E6BD-17F1-3308-0B2F6267B059}.Release|x64.ActiveCfg = Release|x64
{FA64D7D0-E6BD-17F1-3308-0B2F6267B059}.Release|x64.Build.0 = Release|x64
{FA64D7D0-E6BD-17F1-3308-0B2F6267B059}.Debug|x64.ActiveCfg = Debug|x64
{FA64D7D0-E6BD-17F1-3308-0B2F6267B059}.Debug|x64.Build.0 = Debug|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View file

@ -11,7 +11,6 @@
},
"variables": {
"asan": 0,
"build_v8_with_gn": "false",
"coverage": "false",
"dcheck_always_on": 0,
"debug_nghttp2": "false",
@ -22,20 +21,317 @@
"error_on_warn": "false",
"force_dynamic_crt": 0,
"host_arch": "x64",
"icu_data_in": "..\\..\\deps\\icu-tmp\\icudt67l.dat",
"icu_data_in": "..\\..\\deps\\icu-tmp\\icudt71l.dat",
"icu_endianness": "l",
"icu_gyp_path": "tools/icu/icu-generic.gyp",
"icu_path": "deps/icu-small",
"icu_small": "false",
"icu_ver_major": "67",
"icu_ver_major": "71",
"is_debug": 0,
"napi_build_version": "7",
"nasm_version": "2.14",
"libdir": "lib",
"llvm_version": "0.0",
"napi_build_version": "8",
"nasm_version": "2.15",
"node_byteorder": "little",
"node_debug_lib": "false",
"node_enable_d8": "false",
"node_fipsinstall": "false",
"node_install_corepack": "true",
"node_install_npm": "true",
"node_module_version": 83,
"node_library_files": [
"lib/_http_agent.js",
"lib/_http_client.js",
"lib/_http_common.js",
"lib/_http_incoming.js",
"lib/_http_outgoing.js",
"lib/_http_server.js",
"lib/_stream_duplex.js",
"lib/_stream_passthrough.js",
"lib/_stream_readable.js",
"lib/_stream_transform.js",
"lib/_stream_wrap.js",
"lib/_stream_writable.js",
"lib/_tls_common.js",
"lib/_tls_wrap.js",
"lib/assert.js",
"lib/assert/strict.js",
"lib/async_hooks.js",
"lib/buffer.js",
"lib/child_process.js",
"lib/cluster.js",
"lib/console.js",
"lib/constants.js",
"lib/crypto.js",
"lib/dgram.js",
"lib/diagnostics_channel.js",
"lib/dns.js",
"lib/dns/promises.js",
"lib/domain.js",
"lib/events.js",
"lib/fs.js",
"lib/fs/promises.js",
"lib/http.js",
"lib/http2.js",
"lib/https.js",
"lib/inspector.js",
"lib/internal/abort_controller.js",
"lib/internal/assert.js",
"lib/internal/assert/assertion_error.js",
"lib/internal/assert/calltracker.js",
"lib/internal/assert/snapshot.js",
"lib/internal/async_hooks.js",
"lib/internal/blob.js",
"lib/internal/blocklist.js",
"lib/internal/bootstrap/browser.js",
"lib/internal/bootstrap/loaders.js",
"lib/internal/bootstrap/node.js",
"lib/internal/bootstrap/switches/does_not_own_process_state.js",
"lib/internal/bootstrap/switches/does_own_process_state.js",
"lib/internal/bootstrap/switches/is_main_thread.js",
"lib/internal/bootstrap/switches/is_not_main_thread.js",
"lib/internal/buffer.js",
"lib/internal/child_process.js",
"lib/internal/child_process/serialization.js",
"lib/internal/cli_table.js",
"lib/internal/cluster/child.js",
"lib/internal/cluster/primary.js",
"lib/internal/cluster/round_robin_handle.js",
"lib/internal/cluster/shared_handle.js",
"lib/internal/cluster/utils.js",
"lib/internal/cluster/worker.js",
"lib/internal/console/constructor.js",
"lib/internal/console/global.js",
"lib/internal/constants.js",
"lib/internal/crypto/aes.js",
"lib/internal/crypto/certificate.js",
"lib/internal/crypto/cfrg.js",
"lib/internal/crypto/cipher.js",
"lib/internal/crypto/diffiehellman.js",
"lib/internal/crypto/ec.js",
"lib/internal/crypto/hash.js",
"lib/internal/crypto/hashnames.js",
"lib/internal/crypto/hkdf.js",
"lib/internal/crypto/keygen.js",
"lib/internal/crypto/keys.js",
"lib/internal/crypto/mac.js",
"lib/internal/crypto/pbkdf2.js",
"lib/internal/crypto/random.js",
"lib/internal/crypto/rsa.js",
"lib/internal/crypto/scrypt.js",
"lib/internal/crypto/sig.js",
"lib/internal/crypto/util.js",
"lib/internal/crypto/webcrypto.js",
"lib/internal/crypto/x509.js",
"lib/internal/debugger/inspect.js",
"lib/internal/debugger/inspect_client.js",
"lib/internal/debugger/inspect_repl.js",
"lib/internal/dgram.js",
"lib/internal/dns/callback_resolver.js",
"lib/internal/dns/promises.js",
"lib/internal/dns/utils.js",
"lib/internal/dtrace.js",
"lib/internal/encoding.js",
"lib/internal/error_serdes.js",
"lib/internal/errors.js",
"lib/internal/event_target.js",
"lib/internal/fixed_queue.js",
"lib/internal/freelist.js",
"lib/internal/freeze_intrinsics.js",
"lib/internal/fs/cp/cp-sync.js",
"lib/internal/fs/cp/cp.js",
"lib/internal/fs/dir.js",
"lib/internal/fs/promises.js",
"lib/internal/fs/read_file_context.js",
"lib/internal/fs/rimraf.js",
"lib/internal/fs/streams.js",
"lib/internal/fs/sync_write_stream.js",
"lib/internal/fs/utils.js",
"lib/internal/fs/watchers.js",
"lib/internal/heap_utils.js",
"lib/internal/histogram.js",
"lib/internal/http.js",
"lib/internal/http2/compat.js",
"lib/internal/http2/core.js",
"lib/internal/http2/util.js",
"lib/internal/idna.js",
"lib/internal/inspector_async_hook.js",
"lib/internal/js_stream_socket.js",
"lib/internal/legacy/processbinding.js",
"lib/internal/linkedlist.js",
"lib/internal/main/check_syntax.js",
"lib/internal/main/environment.js",
"lib/internal/main/eval_stdin.js",
"lib/internal/main/eval_string.js",
"lib/internal/main/inspect.js",
"lib/internal/main/mksnapshot.js",
"lib/internal/main/print_help.js",
"lib/internal/main/prof_process.js",
"lib/internal/main/repl.js",
"lib/internal/main/run_main_module.js",
"lib/internal/main/test_runner.js",
"lib/internal/main/watch_mode.js",
"lib/internal/main/worker_thread.js",
"lib/internal/modules/cjs/helpers.js",
"lib/internal/modules/cjs/loader.js",
"lib/internal/modules/esm/assert.js",
"lib/internal/modules/esm/create_dynamic_module.js",
"lib/internal/modules/esm/fetch_module.js",
"lib/internal/modules/esm/formats.js",
"lib/internal/modules/esm/get_format.js",
"lib/internal/modules/esm/handle_process_exit.js",
"lib/internal/modules/esm/initialize_import_meta.js",
"lib/internal/modules/esm/load.js",
"lib/internal/modules/esm/loader.js",
"lib/internal/modules/esm/module_job.js",
"lib/internal/modules/esm/module_map.js",
"lib/internal/modules/esm/package_config.js",
"lib/internal/modules/esm/resolve.js",
"lib/internal/modules/esm/translators.js",
"lib/internal/modules/package_json_reader.js",
"lib/internal/modules/run_main.js",
"lib/internal/net.js",
"lib/internal/options.js",
"lib/internal/per_context/domexception.js",
"lib/internal/per_context/messageport.js",
"lib/internal/per_context/primordials.js",
"lib/internal/perf/event_loop_delay.js",
"lib/internal/perf/event_loop_utilization.js",
"lib/internal/perf/nodetiming.js",
"lib/internal/perf/observe.js",
"lib/internal/perf/performance.js",
"lib/internal/perf/performance_entry.js",
"lib/internal/perf/resource_timing.js",
"lib/internal/perf/timerify.js",
"lib/internal/perf/usertiming.js",
"lib/internal/perf/utils.js",
"lib/internal/policy/manifest.js",
"lib/internal/policy/sri.js",
"lib/internal/priority_queue.js",
"lib/internal/process/esm_loader.js",
"lib/internal/process/execution.js",
"lib/internal/process/per_thread.js",
"lib/internal/process/policy.js",
"lib/internal/process/pre_execution.js",
"lib/internal/process/promises.js",
"lib/internal/process/report.js",
"lib/internal/process/signal.js",
"lib/internal/process/task_queues.js",
"lib/internal/process/warning.js",
"lib/internal/process/worker_thread_only.js",
"lib/internal/promise_hooks.js",
"lib/internal/querystring.js",
"lib/internal/readline/callbacks.js",
"lib/internal/readline/emitKeypressEvents.js",
"lib/internal/readline/interface.js",
"lib/internal/readline/promises.js",
"lib/internal/readline/utils.js",
"lib/internal/repl.js",
"lib/internal/repl/await.js",
"lib/internal/repl/history.js",
"lib/internal/repl/utils.js",
"lib/internal/socket_list.js",
"lib/internal/socketaddress.js",
"lib/internal/source_map/prepare_stack_trace.js",
"lib/internal/source_map/source_map.js",
"lib/internal/source_map/source_map_cache.js",
"lib/internal/stream_base_commons.js",
"lib/internal/streams/add-abort-signal.js",
"lib/internal/streams/buffer_list.js",
"lib/internal/streams/compose.js",
"lib/internal/streams/destroy.js",
"lib/internal/streams/duplex.js",
"lib/internal/streams/duplexify.js",
"lib/internal/streams/end-of-stream.js",
"lib/internal/streams/from.js",
"lib/internal/streams/lazy_transform.js",
"lib/internal/streams/legacy.js",
"lib/internal/streams/operators.js",
"lib/internal/streams/passthrough.js",
"lib/internal/streams/pipeline.js",
"lib/internal/streams/readable.js",
"lib/internal/streams/state.js",
"lib/internal/streams/transform.js",
"lib/internal/streams/utils.js",
"lib/internal/streams/writable.js",
"lib/internal/structured_clone.js",
"lib/internal/test/binding.js",
"lib/internal/test/transfer.js",
"lib/internal/test_runner/harness.js",
"lib/internal/test_runner/runner.js",
"lib/internal/test_runner/tap_stream.js",
"lib/internal/test_runner/test.js",
"lib/internal/test_runner/utils.js",
"lib/internal/timers.js",
"lib/internal/tls/secure-context.js",
"lib/internal/tls/secure-pair.js",
"lib/internal/trace_events_async_hooks.js",
"lib/internal/tty.js",
"lib/internal/url.js",
"lib/internal/util.js",
"lib/internal/util/colors.js",
"lib/internal/util/comparisons.js",
"lib/internal/util/debuglog.js",
"lib/internal/util/inspect.js",
"lib/internal/util/inspector.js",
"lib/internal/util/iterable_weak_map.js",
"lib/internal/util/parse_args/parse_args.js",
"lib/internal/util/parse_args/utils.js",
"lib/internal/util/types.js",
"lib/internal/v8/startup_snapshot.js",
"lib/internal/v8_prof_polyfill.js",
"lib/internal/v8_prof_processor.js",
"lib/internal/validators.js",
"lib/internal/vm/module.js",
"lib/internal/wasm_web_api.js",
"lib/internal/watch_mode/files_watcher.js",
"lib/internal/watchdog.js",
"lib/internal/webstreams/adapters.js",
"lib/internal/webstreams/compression.js",
"lib/internal/webstreams/encoding.js",
"lib/internal/webstreams/queuingstrategies.js",
"lib/internal/webstreams/readablestream.js",
"lib/internal/webstreams/transfer.js",
"lib/internal/webstreams/transformstream.js",
"lib/internal/webstreams/util.js",
"lib/internal/webstreams/writablestream.js",
"lib/internal/worker.js",
"lib/internal/worker/io.js",
"lib/internal/worker/js_transferable.js",
"lib/module.js",
"lib/net.js",
"lib/os.js",
"lib/path.js",
"lib/path/posix.js",
"lib/path/win32.js",
"lib/perf_hooks.js",
"lib/process.js",
"lib/punycode.js",
"lib/querystring.js",
"lib/readline.js",
"lib/readline/promises.js",
"lib/repl.js",
"lib/stream.js",
"lib/stream/consumers.js",
"lib/stream/promises.js",
"lib/stream/web.js",
"lib/string_decoder.js",
"lib/sys.js",
"lib/test.js",
"lib/timers.js",
"lib/timers/promises.js",
"lib/tls.js",
"lib/trace_events.js",
"lib/tty.js",
"lib/url.js",
"lib/util.js",
"lib/util/types.js",
"lib/v8.js",
"lib/vm.js",
"lib/wasi.js",
"lib/worker_threads.js",
"lib/zlib.js"
],
"node_module_version": 108,
"node_no_browser_globals": "false",
"node_prefix": "/usr/local",
"node_release_urlbase": "https://nodejs.org/download/release/",
@ -45,6 +341,8 @@
"node_shared_http_parser": "false",
"node_shared_libuv": "false",
"node_shared_nghttp2": "false",
"node_shared_nghttp3": "false",
"node_shared_ngtcp2": "false",
"node_shared_openssl": "false",
"node_shared_zlib": "false",
"node_tag": "",
@ -58,18 +356,23 @@
"node_use_v8_platform": "true",
"node_with_ltcg": "true",
"node_without_node_options": "false",
"openssl_fips": "",
"openssl_is_fips": "false",
"openssl_quic": "true",
"ossfuzz": "false",
"shlib_suffix": "so.83",
"shlib_suffix": "so.108",
"target_arch": "x64",
"v8_enable_31bit_smis_on_64bit_arch": 0,
"v8_enable_gdbjit": 0,
"v8_enable_hugepage": 0,
"v8_enable_i18n_support": 1,
"v8_enable_inspector": 1,
"v8_enable_javascript_promise_hooks": 1,
"v8_enable_lite_mode": 0,
"v8_enable_object_print": 1,
"v8_enable_pointer_compression": 0,
"v8_enable_shared_ro_heap": 1,
"v8_enable_short_builtin_calls": 1,
"v8_enable_webassembly": 1,
"v8_no_strict_aliasing": 1,
"v8_optimized_debug": 1,
"v8_promise_internal_field_count": 1,

View file

@ -19,7 +19,7 @@
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{4CE2F0D5-2C15-0CB7-9DCE-6BDE0CB7A351}</ProjectGuid>
<ProjectGuid>{FA64D7D0-E6BD-17F1-3308-0B2F6267B059}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>memoryjs</RootNamespace>
<IgnoreWarnCompileDuplicatedFilename>true</IgnoreWarnCompileDuplicatedFilename>
@ -60,7 +60,7 @@
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<AdditionalIncludeDirectories>C:\Users\TemmieHeartz\.nw-gyp\0.70.1\include\node;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\src;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\uv\include;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\v8\include;C:\Users\TemmieHeartz\Desktop\teste\node_modules\node-addon-api;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>C:\Users\TemmieHeartz\.nw-gyp\0.70.1\include\node;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\src;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\uv\include;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\v8\include;C:\Users\TemmieHeartz\Desktop\memoryjs\node_modules\node-addon-api;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>/Zc:__cplusplus -std:c++17 /bigobj /d2FastFail /Zc:dllexportInlines- /Zc:sizedDealloc- /Zc:threadSafeInit- %(AdditionalOptions)</AdditionalOptions>
<BufferSecurityCheck>true</BufferSecurityCheck>
<CompileAsWinRT>false</CompileAsWinRT>
@ -90,13 +90,13 @@
<TargetMachine>MachineX64</TargetMachine>
</Link>
<ResourceCompile>
<AdditionalIncludeDirectories>C:\Users\TemmieHeartz\.nw-gyp\0.70.1\include\node;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\src;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\uv\include;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\v8\include;C:\Users\TemmieHeartz\Desktop\teste\node_modules\node-addon-api;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>C:\Users\TemmieHeartz\.nw-gyp\0.70.1\include\node;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\src;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\uv\include;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\v8\include;C:\Users\TemmieHeartz\Desktop\memoryjs\node_modules\node-addon-api;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>NODE_GYP_MODULE_NAME=memoryjs;USING_UV_SHARED=1;USING_V8_SHARED=1;V8_DEPRECATION_WARNINGS=1;V8_DEPRECATION_WARNINGS;V8_REVERSE_JSARGS;_GLIBCXX_USE_CXX11_ABI=1;_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS;V8_COMPRESS_POINTERS;V8_COMPRESS_POINTERS_IN_ISOLATE_CAGE;V8_VIRTUAL_MEMORY_CAGE;V8_31BIT_SMIS_ON_64BIT_ARCH;WIN32;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_HAS_EXCEPTIONS=1;OPENSSL_NO_PINSHARED;OPENSSL_THREADS;OPENSSL_NO_ASM;NAPI_DISABLE_CPP_EXCEPTIONS;BUILDING_NODE_EXTENSION;DEBUG;_DEBUG;V8_ENABLE_CHECKS;_HAS_ITERATOR_DEBUGGING=0;%(PreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<AdditionalIncludeDirectories>C:\Users\TemmieHeartz\.nw-gyp\0.70.1\include\node;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\src;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\uv\include;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\v8\include;C:\Users\TemmieHeartz\Desktop\teste\node_modules\node-addon-api;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>C:\Users\TemmieHeartz\.nw-gyp\0.70.1\include\node;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\src;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\uv\include;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\v8\include;C:\Users\TemmieHeartz\Desktop\memoryjs\node_modules\node-addon-api;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>/Zc:__cplusplus -std:c++17 /bigobj /d2FastFail /Zc:dllexportInlines- /Zc:sizedDealloc- /Zc:threadSafeInit- %(AdditionalOptions)</AdditionalOptions>
<BufferSecurityCheck>true</BufferSecurityCheck>
<CompileAsWinRT>false</CompileAsWinRT>
@ -126,13 +126,13 @@
<TargetMachine>MachineX64</TargetMachine>
</Link>
<ResourceCompile>
<AdditionalIncludeDirectories>C:\Users\TemmieHeartz\.nw-gyp\0.70.1\include\node;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\src;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\uv\include;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\v8\include;C:\Users\TemmieHeartz\Desktop\teste\node_modules\node-addon-api;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>C:\Users\TemmieHeartz\.nw-gyp\0.70.1\include\node;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\src;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\uv\include;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\v8\include;C:\Users\TemmieHeartz\Desktop\memoryjs\node_modules\node-addon-api;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>NODE_GYP_MODULE_NAME=memoryjs;USING_UV_SHARED=1;USING_V8_SHARED=1;V8_DEPRECATION_WARNINGS=1;V8_DEPRECATION_WARNINGS;V8_REVERSE_JSARGS;_GLIBCXX_USE_CXX11_ABI=1;_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS;V8_COMPRESS_POINTERS;V8_COMPRESS_POINTERS_IN_ISOLATE_CAGE;V8_VIRTUAL_MEMORY_CAGE;V8_31BIT_SMIS_ON_64BIT_ARCH;WIN32;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_HAS_EXCEPTIONS=1;OPENSSL_NO_PINSHARED;OPENSSL_THREADS;OPENSSL_NO_ASM;NAPI_DISABLE_CPP_EXCEPTIONS;BUILDING_NODE_EXTENSION;DEBUG;_DEBUG;V8_ENABLE_CHECKS;_HAS_ITERATOR_DEBUGGING=0;%(PreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<AdditionalIncludeDirectories>C:\Users\TemmieHeartz\.nw-gyp\0.70.1\include\node;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\src;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\uv\include;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\v8\include;C:\Users\TemmieHeartz\Desktop\teste\node_modules\node-addon-api;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>C:\Users\TemmieHeartz\.nw-gyp\0.70.1\include\node;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\src;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\uv\include;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\v8\include;C:\Users\TemmieHeartz\Desktop\memoryjs\node_modules\node-addon-api;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>/Zc:__cplusplus -std:c++17 /bigobj /d2FastFail /Zc:dllexportInlines- /Zc:sizedDealloc- /Zc:threadSafeInit- %(AdditionalOptions)</AdditionalOptions>
<BufferSecurityCheck>true</BufferSecurityCheck>
<CompileAsWinRT>false</CompileAsWinRT>
@ -166,13 +166,13 @@
<TargetMachine>MachineX64</TargetMachine>
</Link>
<ResourceCompile>
<AdditionalIncludeDirectories>C:\Users\TemmieHeartz\.nw-gyp\0.70.1\include\node;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\src;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\uv\include;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\v8\include;C:\Users\TemmieHeartz\Desktop\teste\node_modules\node-addon-api;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>C:\Users\TemmieHeartz\.nw-gyp\0.70.1\include\node;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\src;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\uv\include;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\v8\include;C:\Users\TemmieHeartz\Desktop\memoryjs\node_modules\node-addon-api;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>NODE_GYP_MODULE_NAME=memoryjs;USING_UV_SHARED=1;USING_V8_SHARED=1;V8_DEPRECATION_WARNINGS=1;V8_DEPRECATION_WARNINGS;V8_REVERSE_JSARGS;_GLIBCXX_USE_CXX11_ABI=1;_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS;V8_COMPRESS_POINTERS;V8_COMPRESS_POINTERS_IN_ISOLATE_CAGE;V8_VIRTUAL_MEMORY_CAGE;V8_31BIT_SMIS_ON_64BIT_ARCH;WIN32;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_HAS_EXCEPTIONS=1;OPENSSL_NO_PINSHARED;OPENSSL_THREADS;OPENSSL_NO_ASM;NAPI_DISABLE_CPP_EXCEPTIONS;BUILDING_NODE_EXTENSION;%(PreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<AdditionalIncludeDirectories>C:\Users\TemmieHeartz\.nw-gyp\0.70.1\include\node;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\src;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\uv\include;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\v8\include;C:\Users\TemmieHeartz\Desktop\teste\node_modules\node-addon-api;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>C:\Users\TemmieHeartz\.nw-gyp\0.70.1\include\node;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\src;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\uv\include;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\v8\include;C:\Users\TemmieHeartz\Desktop\memoryjs\node_modules\node-addon-api;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>/Zc:__cplusplus -std:c++17 /bigobj /d2FastFail /Zc:dllexportInlines- /Zc:sizedDealloc- /Zc:threadSafeInit- %(AdditionalOptions)</AdditionalOptions>
<BufferSecurityCheck>true</BufferSecurityCheck>
<CompileAsWinRT>false</CompileAsWinRT>
@ -206,7 +206,7 @@
<TargetMachine>MachineX64</TargetMachine>
</Link>
<ResourceCompile>
<AdditionalIncludeDirectories>C:\Users\TemmieHeartz\.nw-gyp\0.70.1\include\node;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\src;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\uv\include;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\v8\include;C:\Users\TemmieHeartz\Desktop\teste\node_modules\node-addon-api;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>C:\Users\TemmieHeartz\.nw-gyp\0.70.1\include\node;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\src;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\uv\include;C:\Users\TemmieHeartz\.nw-gyp\0.70.1\deps\v8\include;C:\Users\TemmieHeartz\Desktop\memoryjs\node_modules\node-addon-api;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>NODE_GYP_MODULE_NAME=memoryjs;USING_UV_SHARED=1;USING_V8_SHARED=1;V8_DEPRECATION_WARNINGS=1;V8_DEPRECATION_WARNINGS;V8_REVERSE_JSARGS;_GLIBCXX_USE_CXX11_ABI=1;_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS;V8_COMPRESS_POINTERS;V8_COMPRESS_POINTERS_IN_ISOLATE_CAGE;V8_VIRTUAL_MEMORY_CAGE;V8_31BIT_SMIS_ON_64BIT_ARCH;WIN32;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_HAS_EXCEPTIONS=1;OPENSSL_NO_PINSHARED;OPENSSL_THREADS;OPENSSL_NO_ASM;NAPI_DISABLE_CPP_EXCEPTIONS;BUILDING_NODE_EXTENSION;%(PreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
</ItemDefinitionGroup>

40
App/node_modules/memoryjs/index.js generated vendored
View file

@ -4,6 +4,13 @@ const Debugger = require('./src/debugger');
const constants = require('./src/consts');
const { STRUCTRON_TYPE_STRING } = require('./src/utils');
/* TODO:
* - remove callbacks from all functions and implement promise support using Napi
* - validate argument types in JS space instead of C++
* - refactor read/write memory functions to use buffers instead?
* - remove `closeProcess` in favour of `closeHandle`
*/
function openProcess(processIdentifier, callback) {
if (arguments.length === 1) {
return memoryjs.openProcess(processIdentifier);
@ -13,7 +20,7 @@ function openProcess(processIdentifier, callback) {
}
function closeProcess(handle) {
return memoryjs.closeProcess(handle);
return memoryjs.closeHandle(handle);
}
function getProcesses(callback) {
@ -292,6 +299,33 @@ function unloadDll(handle, module, callback) {
return memoryjs.unloadDll(handle, module, callback);
}
function openFileMapping(fileName) {
if (arguments.length !== 1 || typeof fileName !== 'string') {
throw new Error('invalid arguments!');
}
return memoryjs.openFileMapping(fileName);
}
function mapViewOfFile(processHandle, fileHandle, offset, viewSize, pageProtection) {
const validArgs = [
['number', 'number'],
['number', 'number', 'number', 'number', 'number'],
['number', 'number', 'bigint', 'bigint', 'number']
];
const receivedArgs = Array.from(arguments).map(arg => typeof arg);
if (!validArgs.some(args => args.join(",") == receivedArgs.join(","))) {
throw new Error('invalid arguments!');
}
if (arguments.length == 2) {
return memoryjs.mapViewOfFile(processHandle, fileHandle, 0, 0, constants.PAGE_READONLY);
}
return memoryjs.mapViewOfFile(processHandle, fileHandle, offset, viewSize, pageProtection);
}
const library = {
openProcess,
closeProcess,
@ -310,8 +344,10 @@ const library = {
virtualQueryEx,
injectDll,
unloadDll,
openFileMapping,
mapViewOfFile,
attachDebugger: memoryjs.attachDebugger,
detatchDebugger: memoryjs.detatchDebugger,
detachDebugger: memoryjs.detachDebugger,
awaitDebugEvent: memoryjs.awaitDebugEvent,
handleDebugEvent: memoryjs.handleDebugEvent,
setHardwareBreakpoint: memoryjs.setHardwareBreakpoint,

View file

@ -12,6 +12,7 @@
#include "debugger.h"
#pragma comment(lib, "psapi.lib")
#pragma comment(lib, "onecore.lib")
process Process;
@ -104,21 +105,10 @@ Napi::Value openProcess(const Napi::CallbackInfo& args) {
}
}
Napi::Value closeProcess(const Napi::CallbackInfo& args) {
Napi::Value closeHandle(const Napi::CallbackInfo& args) {
Napi::Env env = args.Env();
if (args.Length() != 1) {
Napi::Error::New(env, "requires 1 argument").ThrowAsJavaScriptException();
return env.Null();
}
if (!args[0].IsNumber()) {
Napi::Error::New(env, "first argument must be a number").ThrowAsJavaScriptException();
return env.Null();
}
Process.closeProcess((HANDLE)args[0].As<Napi::Number>().Int64Value());
return env.Null();
BOOL success = CloseHandle((HANDLE)args[0].As<Napi::Number>().Int64Value());
return Napi::Boolean::New(env, success);
}
Napi::Value getProcesses(const Napi::CallbackInfo& args) {
@ -326,7 +316,14 @@ Napi::Value readMemory(const Napi::CallbackInfo& args) {
Napi::Value retVal = env.Null();
HANDLE handle = (HANDLE)args[0].As<Napi::Number>().Int64Value();
DWORD64 address = args[1].As<Napi::Number>().Int64Value();
DWORD64 address;
if (args[1].As<Napi::BigInt>().IsBigInt()) {
bool lossless;
address = args[1].As<Napi::BigInt>().Uint64Value(&lossless);
} else {
address = args[1].As<Napi::Number>().Int64Value();
}
if (!strcmp(dataType, "int8") || !strcmp(dataType, "byte") || !strcmp(dataType, "char")) {
@ -468,7 +465,15 @@ Napi::Value readBuffer(const Napi::CallbackInfo& args) {
}
HANDLE handle = (HANDLE)args[0].As<Napi::Number>().Int64Value();
DWORD64 address = args[1].As<Napi::Number>().Int64Value();
DWORD64 address;
if (args[1].As<Napi::BigInt>().IsBigInt()) {
bool lossless;
address = args[1].As<Napi::BigInt>().Uint64Value(&lossless);
} else {
address = args[1].As<Napi::Number>().Int64Value();
}
SIZE_T size = args[2].As<Napi::Number>().Int64Value();
// To fix the memory leak problem that was happening here, we need to release the
@ -511,7 +516,14 @@ Napi::Value writeMemory(const Napi::CallbackInfo& args) {
const char* dataType = dataTypeArg.c_str();
HANDLE handle = (HANDLE)args[0].As<Napi::Number>().Int64Value();
DWORD64 address = args[1].As<Napi::Number>().Int64Value();
DWORD64 address;
if (args[1].As<Napi::BigInt>().IsBigInt()) {
bool lossless;
address = args[1].As<Napi::BigInt>().Uint64Value(&lossless);
} else {
address = args[1].As<Napi::Number>().Int64Value();
}
if (!strcmp(dataType, "int8") || !strcmp(dataType, "byte") || !strcmp(dataType, "char")) {
@ -539,15 +551,21 @@ Napi::Value writeMemory(const Napi::CallbackInfo& args) {
} else if (!strcmp(dataType, "int64")) {
Napi::BigInt bigInt = args[2].As<Napi::BigInt>();
bool lossless;
Memory.writeMemory<int64_t>(handle, address, bigInt.Int64Value(&lossless));
if (args[2].As<Napi::BigInt>().IsBigInt()) {
bool lossless;
Memory.writeMemory<int64_t>(handle, address, args[2].As<Napi::BigInt>().Int64Value(&lossless));
} else {
Memory.writeMemory<int64_t>(handle, address, args[2].As<Napi::Number>().Int64Value());
}
} else if (!strcmp(dataType, "uint64")) {
Napi::BigInt bigInt = args[2].As<Napi::BigInt>();
bool lossless;
Memory.writeMemory<uint64_t>(handle, address, bigInt.Uint64Value(&lossless));
if (args[2].As<Napi::BigInt>().IsBigInt()) {
bool lossless;
Memory.writeMemory<int64_t>(handle, address, args[2].As<Napi::BigInt>().Uint64Value(&lossless));
} else {
Memory.writeMemory<int64_t>(handle, address, args[2].As<Napi::Number>().Int64Value());
}
} else if (!strcmp(dataType, "float")) {
@ -559,36 +577,36 @@ Napi::Value writeMemory(const Napi::CallbackInfo& args) {
} else if (!strcmp(dataType, "ptr") || !strcmp(dataType, "pointer")) {
Napi::BigInt bigInt = args[2].As<Napi::BigInt>();
Napi::BigInt valueBigInt = args[2].As<Napi::BigInt>();
if (sizeof(intptr_t) == 8 && !bigInt.IsBigInt()) {
if (sizeof(intptr_t) == 8 && !valueBigInt.IsBigInt()) {
std::string error = "Writing memoryjs.PTR or memoryjs.POINTER on 64 bit target build requires you to supply a BigInt.";
error += " Rebuild the library with `npm run build32` to target 32 bit applications.";
Napi::Error::New(env, error).ThrowAsJavaScriptException();
return env.Null();
}
if (bigInt.IsBigInt()) {
if (valueBigInt.IsBigInt()) {
bool lossless;
Memory.writeMemory<intptr_t>(handle, address, bigInt.Int64Value(&lossless));
Memory.writeMemory<intptr_t>(handle, address, valueBigInt.Int64Value(&lossless));
} else {
Memory.writeMemory<intptr_t>(handle, address, args[2].As<Napi::Number>().Int32Value());
}
} else if (!strcmp(dataType, "uptr") || !strcmp(dataType, "upointer")) {
Napi::BigInt bigInt = args[2].As<Napi::BigInt>();
Napi::BigInt valueBigInt = args[2].As<Napi::BigInt>();
if (sizeof(uintptr_t) == 8 && !bigInt.IsBigInt()) {
if (sizeof(uintptr_t) == 8 && !valueBigInt.IsBigInt()) {
std::string error = "Writing memoryjs.PTR or memoryjs.POINTER on 64 bit target build requires you to supply a BigInt.";
error += " Rebuild the library with `npm run build32` to target 32 bit applications.";
Napi::Error::New(env, error).ThrowAsJavaScriptException();
return env.Null();
}
if (bigInt.IsBigInt()) {
if (valueBigInt.IsBigInt()) {
bool lossless;
Memory.writeMemory<uintptr_t>(handle, address, bigInt.Uint64Value(&lossless));
Memory.writeMemory<uintptr_t>(handle, address, valueBigInt.Uint64Value(&lossless));
} else {
Memory.writeMemory<uintptr_t>(handle, address, args[2].As<Napi::Number>().Uint32Value());
}
@ -650,7 +668,15 @@ Napi::Value writeBuffer(const Napi::CallbackInfo& args) {
}
HANDLE handle = (HANDLE)args[0].As<Napi::Number>().Int64Value();
DWORD64 address = args[1].As<Napi::Number>().Int64Value();
DWORD64 address;
if (args[1].As<Napi::BigInt>().IsBigInt()) {
bool lossless;
address = args[1].As<Napi::BigInt>().Uint64Value(&lossless);
} else {
address = args[1].As<Napi::Number>().Int64Value();
}
SIZE_T length = args[2].As<Napi::Buffer<char>>().Length();
char* data = args[2].As<Napi::Buffer<char>>().Data();
Memory.writeMemory<char*>(handle, address, data, length);
@ -813,7 +839,15 @@ Napi::Value findPatternByAddress(const Napi::CallbackInfo& args) {
}
HANDLE handle = (HANDLE)args[0].As<Napi::Number>().Int64Value();
DWORD64 baseAddress = args[1].As<Napi::Number>().Int64Value();
DWORD64 baseAddress;
if (args[1].As<Napi::BigInt>().IsBigInt()) {
bool lossless;
baseAddress = args[1].As<Napi::BigInt>().Uint64Value(&lossless);
} else {
baseAddress = args[1].As<Napi::Number>().Int64Value();
}
std::string pattern(args[2].As<Napi::String>().Utf8Value());
short flags = args[3].As<Napi::Number>().Uint32Value();
uint32_t patternOffset = args[4].As<Napi::Number>().Uint32Value();
@ -902,7 +936,14 @@ Napi::Value callFunction(const Napi::CallbackInfo& args) {
HANDLE handle = (HANDLE)args[0].As<Napi::Number>().Int64Value();
functions::Type returnType = (functions::Type) args[2].As<Napi::Number>().Uint32Value();
DWORD64 address = args[3].As<Napi::Number>().Int64Value();
DWORD64 address;
if (args[3].As<Napi::BigInt>().IsBigInt()) {
bool lossless;
address = args[3].As<Napi::BigInt>().Uint64Value(&lossless);
} else {
address = args[3].As<Napi::Number>().Int64Value();
}
char* errorMessage = "";
Call data = functions::call<int>(handle, parsedArgs, returnType, address, &errorMessage);
@ -1208,7 +1249,7 @@ Napi::Value attachDebugger(const Napi::CallbackInfo& args) {
return Napi::Boolean::New(env, success);
}
Napi::Value detatchDebugger(const Napi::CallbackInfo& args) {
Napi::Value detachDebugger(const Napi::CallbackInfo& args) {
Napi::Env env = args.Env();
DWORD processId = args[0].As<Napi::Number>().Uint32Value();
@ -1455,6 +1496,55 @@ Napi::Value unloadDll(const Napi::CallbackInfo& args) {
}
}
Napi::Value openFileMapping(const Napi::CallbackInfo& args) {
Napi::Env env = args.Env();
std::string fileName(args[0].As<Napi::String>().Utf8Value());
HANDLE fileHandle = OpenFileMappingA(FILE_MAP_ALL_ACCESS, FALSE, fileName.c_str());
if (fileHandle == NULL) {
Napi::Error::New(env, Napi::String::New(env, "Error opening handle to file!")).ThrowAsJavaScriptException();
return env.Null();
}
return Napi::Value::From(env, (uintptr_t) fileHandle);
}
Napi::Value mapViewOfFile(const Napi::CallbackInfo& args) {
Napi::Env env = args.Env();
HANDLE processHandle = (HANDLE)args[0].As<Napi::Number>().Int64Value();
HANDLE fileHandle = (HANDLE)args[1].As<Napi::Number>().Int64Value();
uint64_t offset;
if (args[2].As<Napi::BigInt>().IsBigInt()) {
bool lossless;
offset = args[2].As<Napi::BigInt>().Uint64Value(&lossless);
} else {
offset = args[2].As<Napi::Number>().Int64Value();
}
size_t viewSize;
if (args[3].As<Napi::BigInt>().IsBigInt()) {
bool lossless;
viewSize = args[3].As<Napi::BigInt>().Uint64Value(&lossless);
} else {
viewSize = args[3].As<Napi::Number>().Int64Value();
}
ULONG pageProtection = args[4].As<Napi::Number>().Int64Value();
LPVOID baseAddress = MapViewOfFile2(fileHandle, processHandle, offset, NULL, viewSize, 0, pageProtection);
if (baseAddress == NULL) {
Napi::Error::New(env, Napi::String::New(env, "Error mapping file to process!")).ThrowAsJavaScriptException();
return env.Null();
}
return Napi::Value::From(env, (uintptr_t) baseAddress);
}
// https://stackoverflow.com/a/17387176
std::string GetLastErrorToString() {
DWORD errorMessageID = ::GetLastError();
@ -1485,7 +1575,6 @@ std::string GetLastErrorToString() {
Napi::Object init(Napi::Env env, Napi::Object exports) {
exports.Set(Napi::String::New(env, "openProcess"), Napi::Function::New(env, openProcess));
exports.Set(Napi::String::New(env, "closeProcess"), Napi::Function::New(env, closeProcess));
exports.Set(Napi::String::New(env, "getProcesses"), Napi::Function::New(env, getProcesses));
exports.Set(Napi::String::New(env, "getModules"), Napi::Function::New(env, getModules));
exports.Set(Napi::String::New(env, "findModule"), Napi::Function::New(env, findModule));
@ -1502,13 +1591,15 @@ Napi::Object init(Napi::Env env, Napi::Object exports) {
exports.Set(Napi::String::New(env, "getRegions"), Napi::Function::New(env, getRegions));
exports.Set(Napi::String::New(env, "virtualQueryEx"), Napi::Function::New(env, virtualQueryEx));
exports.Set(Napi::String::New(env, "attachDebugger"), Napi::Function::New(env, attachDebugger));
exports.Set(Napi::String::New(env, "detatchDebugger"), Napi::Function::New(env, detatchDebugger));
exports.Set(Napi::String::New(env, "detachDebugger"), Napi::Function::New(env, detachDebugger));
exports.Set(Napi::String::New(env, "awaitDebugEvent"), Napi::Function::New(env, awaitDebugEvent));
exports.Set(Napi::String::New(env, "handleDebugEvent"), Napi::Function::New(env, handleDebugEvent));
exports.Set(Napi::String::New(env, "setHardwareBreakpoint"), Napi::Function::New(env, setHardwareBreakpoint));
exports.Set(Napi::String::New(env, "removeHardwareBreakpoint"), Napi::Function::New(env, removeHardwareBreakpoint));
exports.Set(Napi::String::New(env, "injectDll"), Napi::Function::New(env, injectDll));
exports.Set(Napi::String::New(env, "unloadDll"), Napi::Function::New(env, unloadDll));
exports.Set(Napi::String::New(env, "openFileMapping"), Napi::Function::New(env, openFileMapping));
exports.Set(Napi::String::New(env, "mapViewOfFile"), Napi::Function::New(env, mapViewOfFile));
return exports;
}

View file

@ -64,10 +64,6 @@ process::Pair process::openProcess(DWORD processId, char** errorMessage) {
};
}
void process::closeProcess(HANDLE hProcess){
CloseHandle(hProcess);
}
std::vector<PROCESSENTRY32> process::getProcesses(char** errorMessage) {
// Take a snapshot of all processes.
HANDLE hProcessSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);

2877
App/node_modules/memoryjs/package-lock.json generated vendored Normal file

File diff suppressed because it is too large Load diff

View file

@ -1,44 +1,23 @@
{
"_from": "memoryjs",
"_id": "memoryjs@3.5.1",
"_inBundle": false,
"_integrity": "sha512-xSdgCVwjtpGr6GvC0h2gYnhno/8/cFFGa3PiDE4D3MlutWEtBO8LEYSB4sk5kfxZ2t6alHT+H76QJfWBoZWnlQ==",
"_location": "/memoryjs",
"_phantomChildren": {},
"_requested": {
"type": "tag",
"registry": true,
"raw": "memoryjs",
"name": "memoryjs",
"escapedName": "memoryjs",
"rawSpec": "",
"saveSpec": null,
"fetchSpec": "latest"
},
"_requiredBy": [
"#USER",
"/"
],
"_resolved": "https://registry.npmjs.org/memoryjs/-/memoryjs-3.5.1.tgz",
"_shasum": "9156412cf18ad4ee0f6e57aa9753cc593884ff89",
"_spec": "memoryjs",
"_where": "C:\\Users\\TemmieHeartz\\Desktop\\teste",
"author": {
"name": "Rob--"
},
"bugs": {
"url": "https://github.com/Rob--/memoryjs/issues"
},
"bundleDependencies": false,
"dependencies": {
"eslint": "^8.5.0",
"eslint-config-airbnb-base": "^12.1.0",
"node-addon-api": "^3.2.1"
},
"deprecated": false,
"name": "memoryjs",
"version": "3.5.1",
"description": "Node add-on for memory reading and writing!",
"gypfile": true,
"homepage": "https://github.com/Rob--/memoryjs#readme",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"install": "npm run build",
"build": "node ./scripts/install.js",
"build32": "node-gyp clean configure build --arch=ia32",
"build64": "node-gyp clean configure build --arch=x64",
"buildtest": "cd test && MSBuild.exe project.sln //p:Configuration=Release",
"debug": "node ./scripts/debug.js",
"debug32": "node-gyp configure rebuild --debug --arch=xia32",
"debug64": "node-gyp configure rebuild --debug --arch=x64"
},
"repository": {
"type": "git",
"url": "git+https://github.com/Rob--/memoryjs.git"
},
"keywords": [
"memory",
"reading",
@ -46,23 +25,16 @@
"management",
"addon"
],
"author": "Rob--",
"license": "MIT",
"main": "index.js",
"name": "memoryjs",
"repository": {
"type": "git",
"url": "git+https://github.com/Rob--/memoryjs.git"
"gypfile": true,
"bugs": {
"url": "https://github.com/Rob--/memoryjs/issues"
},
"scripts": {
"build": "node ./scripts/install.js",
"build32": "node-gyp clean configure build --arch=ia32",
"build64": "node-gyp clean configure build --arch=x64",
"buildtest": "cd test && MSBuild.exe project.sln //p:Configuration=Release",
"debug": "node ./scripts/debug.js",
"debug32": "node-gyp configure rebuild --debug --arch=xia32",
"debug64": "node-gyp configure rebuild --debug --arch=x64",
"install": "npm run build",
"test": "echo \"Error: no test specified\" && exit 1"
},
"version": "3.5.1"
"homepage": "https://github.com/Rob--/memoryjs#readme",
"dependencies": {
"eslint": "^8.5.0",
"eslint-config-airbnb-base": "^12.1.0",
"node-addon-api": "^3.2.1"
}
}

View file

@ -63,8 +63,8 @@ class Debugger extends EventEmitter {
this.intervals = [];
}
attach(processId, killOnDetatch = false) {
const success = this.memoryjs.attachDebugger(processId, killOnDetatch);
attach(processId, killOnDetach = false) {
const success = this.memoryjs.attachDebugger(processId, killOnDetach);
if (success) {
this.attached = true;
@ -73,9 +73,9 @@ class Debugger extends EventEmitter {
return success;
}
detatch(processId) {
detach(processId) {
this.intervals.map(({ id }) => clearInterval(id));
return this.memoryjs.detatchDebugger(processId);
return this.memoryjs.detachDebugger(processId);
}
removeHardwareBreakpoint(processId, register) {

View file

@ -7,7 +7,7 @@
"emuStatusRunning": "fonctionnement",
"logWindowTitle": "Exécution de fpPS4",
"killEmuStatus": "Le processus principal a été fermé - fermez la fenêtre des logs pour continuer",
"logCleared": "INFO - La liste des journaux a été effacée!\n ",
"logCleared": "INFO - La liste des journaux a été effacée!",
"about": "fpPS4 Lanceur de Temmie - Version: %VARIABLE_0%\nCréé par TemmieHeartz\n(https://twitter.com/themitosan)\n\nfpPS4 a été créé/développé par red-prig\n(https://github.com/red -prig/fpPS4)\n\nLe plugin memoryjs a été créé/développé par Rob--\n(https://github.com/rob--/memoryjs)\n\nLe plugin node-stream-zip a été créé/développé par antelle \n(https://github.com/antelle/node-stream-zip)\n\nLes icônes SVG ont été obtenues à partir de https://www.svgrepo.com/",
"mainLog": "Lanceur de fpPS4 Temmie - Version: %VARIABLE_0%\nUtilisation de nw.js (node-webkit) version %VARIABLE_1% [%VARIABLE_2%]",
"settingsErrorCreatePath": "ERREUR - Impossible de créer le dossier!\n(%VARIABLE_0%)\n%VARIABLE_1%",
@ -109,7 +109,8 @@
"LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG": "<label class=\"LABEL_settingsExperimental\">EXPERIMENTAL</label> Afficher la sortie de l'émulateur (<code>stdout</code> et <code>stderr</code>) dans le journal interne (Appuyez sur F12 --> Console)",
"DIV_SETTINGS_FPPS4_UPDATER": "Mises à jour fpPS4",
"LABEL_SETTINGS_ENABLE_LAUNCHER_FPPS4_UPDATES": "Activer le programme de mise à jour fpPS4",
"LABEL_SETTINGS_FPPS4_UPDATE_BRANCH": "Recevez les mises à jour de la branche"
"LABEL_SETTINGS_FPPS4_UPDATE_BRANCH": "Recevez les mises à jour de la branche",
"LABEL_FPPS4_UPDATER_STATUS_LANG": ""
},

View file

@ -7,7 +7,7 @@
"emuStatusRunning": "In esecuzione",
"logWindowTitle": "Eseguendo fpPS4",
"killEmuStatus": "Il processo principale è stato chiuso: chiudi la finestra del log per continuare",
"logCleared": "INFO - L'elenco dei log è stato cancellato!\n",
"logCleared": "INFO - L'elenco dei log è stato cancellato!",
"about": "fpPS4 Temmie's Launcher - Versione: %VARIABLE_0%\nCreato da TemmieHeartz\n(https://twitter.com/themitosan)\n\nfpPS4 è stato creato/sviluppato da red-prig\n(https://github.com/red-prig/fpPS4)\n\nIl plug-in memoryjs è stato creato/sviluppato da Rob--\n(https://github.com/rob--/memoryjs)\n\nIl plug-in node-stream-zip è stato creato/sviluppato da antelle \n(https://github.com/antelle/node-stream-zip)\n\nLe icone SVG sono state ottenute da https://www.svgrepo.com/",
"mainLog": "fpPS4 Temmie's Launcher - Versione: %VARIABLE_0%\nUsando nw.js (node-webkit) versione %VARIABLE_1% [%VARIABLE_2%]",
"settingsErrorCreatePath": "ERRORE - Impossibile creare la cartella!\n(%VARIABLE_0%)\n%VARIABLE_1%",
@ -109,7 +109,8 @@
"LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG": "<label class=\"LABEL_settingsExperimental\">SPERIMENTALE</label> Visualizza l'output dell'emulatore (<code>stdout</code> e <code>stderr</code>) nel log interno (premi F12 --> Console)",
"DIV_SETTINGS_FPPS4_UPDATER": "Aggiornamenti fpPS4",
"LABEL_SETTINGS_ENABLE_LAUNCHER_FPPS4_UPDATES": "Abilita aggiornamento fpPS4",
"LABEL_SETTINGS_FPPS4_UPDATE_BRANCH": "Ricevi gli aggiornamenti dal branch"
"LABEL_SETTINGS_FPPS4_UPDATE_BRANCH": "Ricevi gli aggiornamenti dal branch",
"LABEL_FPPS4_UPDATER_STATUS_LANG": ""
},

View file

@ -7,7 +7,7 @@
"emuStatusRunning": "Em execução",
"logWindowTitle": "Executando fpPS4",
"killEmuStatus": "Processo principal foi fechado - feche a janela do log para continuar",
"logCleared": "INFO - A lista de log foi limpa!\n ",
"logCleared": "INFO - A lista de log foi limpa!",
"about": "fpPS4 Temmie's Launcher - Versão: %VARIABLE_0%\nCriado por TemmieHeartz\n(https://twitter.com/themitosan)\n\nfpPS4 foi criado / desenvolvido por red-prig\n(https://github.com/red-prig/fpPS4)\n\nPlugin memoryjs foi criado / desenvolvido por Rob--\n(https://github.com/rob--/memoryjs)\n\nPlugin node-stream-zip foi criado / desenvolvido por antelle\n(https://github.com/antelle/node-stream-zip)\n\nÍcones SVG foram obtidos através do site https://www.svgrepo.com/",
"mainLog": "fpPS4 Temmie's Launcher - Versão: %VARIABLE_0%\nUsando nw.js (node-webkit) versão %VARIABLE_1% [%VARIABLE_2%]",
"settingsErrorCreatePath": "ERRO - Não foi possível criar a pasta!\n(%VARIABLE_0%)\n%VARIABLE_1%",
@ -109,7 +109,8 @@
"LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG": "<label class=\"LABEL_settingsExperimental\">EXPERIMENTAL</label> Exibir output do emulador (<code>stdout</code> e <code>stderr</code>) no log interno (Aperte F12 --> Console)",
"DIV_SETTINGS_FPPS4_UPDATER": "Atualizações do fpPS4",
"LABEL_SETTINGS_ENABLE_LAUNCHER_FPPS4_UPDATES": "Habilitar atualizador do fpPS4",
"LABEL_SETTINGS_FPPS4_UPDATE_BRANCH": "Obter atualizações da branch"
"LABEL_SETTINGS_FPPS4_UPDATE_BRANCH": "Obter atualizações da branch",
"LABEL_FPPS4_UPDATER_STATUS_LANG": "Status"
},

View file

@ -7,7 +7,7 @@
"emuStatusRunning": "Выполняется",
"logWindowTitle": "Запуск fpPS4",
"killEmuStatus": "Основной процесс был закрыт - закройте окно лога для продолжения работы",
"logCleared": "ИНФО - Список логов был очищен!\n ",
"logCleared": "ИНФО - Список логов был очищен!",
"about": "",
"mainLog": "fpPS4 Temmie's Launcher - Версия: %VARIABLE_0%\nИспользование nw.js (node-webkit) версия %VARIABLE_1% [%VARIABLE_2%]",
"settingsErrorCreatePath": "ОШИБКА - Папка не может быть создана!\n(%VARIABLE_0%)\n%VARIABLE_1%",
@ -109,7 +109,8 @@
"LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG": "",
"DIV_SETTINGS_FPPS4_UPDATER": "",
"LABEL_SETTINGS_ENABLE_LAUNCHER_FPPS4_UPDATES": "",
"LABEL_SETTINGS_FPPS4_UPDATE_BRANCH": ""
"LABEL_SETTINGS_FPPS4_UPDATE_BRANCH": "",
"LABEL_FPPS4_UPDATER_STATUS_LANG": ""
},

View file

@ -7,7 +7,7 @@
"emuStatusRunning": "模拟器运行中",
"logWindowTitle": "Running fpPS4",
"killEmuStatus": "主进程被关闭 - 关闭日志窗口以继续",
"logCleared": "INFO - 日志已被清除!\n ",
"logCleared": "INFO - 日志已被清除!",
"about": "fpPS4 Temmie's Launcher - 版本:%VARIABLE_0%\n由 TemmieHeartz 创建\n(https://twitter.com/themitosan)\n\nfpPS4 由 red-prig 创建\n(https://github.com/red-prig/fpPS4)\n\n插件 memoryjs 由 Rob-- 创建\n(https://github.com/rob--/memoryjs)\n\n插件 node-stream-zip 由 antelle 创建\n(https://github.com/antelle/node-stream-zip)\n\nSVG 图标来自 https://www.svgrepo.com/",
"mainLog": "fpPS4 Temmie's Launcher - 版本: %VARIABLE_0%\n运行中的 nw.js (node-webkit) 版本: %VARIABLE_1% [%VARIABLE_2%]",
"settingsErrorCreatePath": "ERROR - 无法创建文件夹!\n(%VARIABLE_0%)\n%VARIABLE_1%",
@ -109,7 +109,8 @@
"LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG": "<label class=\"LABEL_settingsExperimental\">实验性功能</label> 在内部控制台显示 fpPS4 进程日志 (<code>stdout</code> 和 <code>stderr</code>) (按 F12 --> Console)",
"DIV_SETTINGS_FPPS4_UPDATER": "fpPS4 更新程序",
"LABEL_SETTINGS_ENABLE_LAUNCHER_FPPS4_UPDATES": "启用 fpPS4 更新程序",
"LABEL_SETTINGS_FPPS4_UPDATE_BRANCH": "检测更新的分支"
"LABEL_SETTINGS_FPPS4_UPDATE_BRANCH": "检测更新的分支",
"LABEL_FPPS4_UPDATER_STATUS_LANG": ""
},