コード例 #1
0
        public object Sleep(bool startRepl = true)
        {
            Sleeping = true;
            Module stdIn;

            return(NativeModules.TryGetValue("stdin", out stdIn) ? stdIn.Exports : null);
        }
コード例 #2
0
        public void AddNativeModule(string name, object exports)
        {
            if (NativeModules.ContainsKey(name))
            {
                throw new InvalidOperationException("A native module with the same name already exists.");
            }

            NativeModules[name] = new NativeModule(name, loader, exports);
        }
コード例 #3
0
        private RemoteModule FetchModule(string moduleName)
        {
            if (!Path.HasExtension(moduleName))
            {
                moduleName += ".dll";
            }
            var nativeMod = NativeModules.FirstOrDefault(m => m.ModuleName.Equals(moduleName, StringComparison.OrdinalIgnoreCase));

            return(nativeMod == null ? null : new RemoteModule(m_Process, nativeMod));
        }
コード例 #4
0
ファイル: ModuleManager.cs プロジェクト: lulzzz/MemoryLib
        private InjectedModule InternalInject(string module, bool mustBeDisposed)
        {
            var thread = m_Process.Threads.CreateAndJoin(this["kernel32"]["LoadLibraryA"].BaseAddress, module);

            if (thread.GetExitCode <IntPtr>() == IntPtr.Zero)
            {
                return(null);
            }
            var native = NativeModules.FirstOrDefault(m => m.ModuleName.Equals(Path.GetFileName(module), StringComparison.OrdinalIgnoreCase));

            return(native == null ? null : new InjectedModule(m_Process, native, mustBeDisposed));
        }
コード例 #5
0
        public string Resolve(string request, Module requester)
        {
            Module module;

            if (NativeModules.TryGetValue(request, out module))
            {
                return(module.FileName);
            }

            var virtualPath = PathResolver.Resolve(request, requester);

            return(virtualPath?.ResolvePath());
        }
コード例 #6
0
        public Module Load(string request, Module parent, bool isMain)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            if (parent != null && parent.Loader != this)
            {
                throw new InvalidOperationException("Parent module is initialized from a different loader.");
            }

            Module module;

            if (NativeModules.TryGetValue(request, out module))
            {
                return(module);
            }

            var virtualPath = PathResolver.Resolve(request, parent);
            var identifier  = virtualPath?.Identifier;

            if (identifier == null)
            {
                throw new InvalidOperationException($"Module '{request}' not found.");
            }

            if (LoadedModules.TryGetValue(identifier, out module))
            {
                return(module);
            }

            module = new Module(identifier, virtualPath, parent, this);
            var oldMain = MainModule;

            if (isMain)
            {
                MainModule = module;
            }

            var extension = virtualPath.ResolveExtension();

            IModuleCompiler compiler;

            if (!Compilers.TryGetValue(extension, out compiler))
            {
                throw new InvalidOperationException($"Invalid file extension {extension}.");
            }

            LoadedModules[identifier] = module;
            try
            {
                compiler.Compile(module);
            }
            catch
            {
                LoadedModules.Remove(identifier);
                if (isMain)
                {
                    MainModule = oldMain;
                }

                throw;
            }

            return(module);
        }