示例#1
0
        private void Marshal()
        {
            if (typeof(T) == typeof(string))
            {
                var text = Value.ToString();
                Allocated = m_Process.Memory.Allocate(text.Length + 1);
                Allocated.WriteString(0, text);
                Reference = Allocated.BaseAddress;
            }
            else
            {
                var byteArray = MarshalType <T> .ObjectToByteArray(Value);

                if (MarshalType <T> .CanBeStoredInRegisters)
                {
                    Reference = MarshalType <IntPtr> .ByteArrayToObject(byteArray);
                }
                else
                {
                    Allocated = m_Process.Memory.Allocate(MarshalType <T> .Size);
                    Allocated.Write(0, Value);
                    Reference = Allocated.BaseAddress;
                }
            }
        }
示例#2
0
        /// <summary>
        /// Marshals the value into the remote process.
        /// </summary>
        private void Marshal()
        {
            // If the type is string, it's a special case
            if (typeof(T) == typeof(string))
            {
                var text = Value.ToString();
                // Allocate memory in the remote process (string + '\0')
                Allocated = MemorySharp.Memory.Allocate(text.Length + 1);
                // Write the value
                Allocated.WriteString(0, text);
                // Get the pointer
                Reference = Allocated.BaseAddress;
            }
            else
            {
                // For all other types
                // Convert the value into a byte array
                var byteArray = MarshalType <T> .ObjectToByteArray(Value);

                // If the value can be stored directly in registers
                if (MarshalType <T> .CanBeStoredInRegisters)
                {
                    // Convert the byte array into a pointer
                    Reference = MarshalType <IntPtr> .ByteArrayToObject(byteArray);
                }
                else
                {
                    // It's a bit more complicated, we must allocate some space into
                    // the remote process to store the value and get its pointer

                    // Allocate memory in the remote process
                    Allocated = MemorySharp.Memory.Allocate(MarshalType <T> .Size);
                    // Write the value
                    Allocated.Write(0, Value);
                    // Get the pointer
                    Reference = Allocated.BaseAddress;
                }
            }
        }