Exemplo n.º 1
0
        } // end _Matches()

        protected override void ProcessRecord()
        {
            base.ProcessRecord();

            if (0 != Address)
            {
                WriteObject(Debugger.GetModuleByAddress(Address));
                return;
            }

            //
            // If you just ran something like "lm 123`456789ab", PS will interpret that
            // address as a string. If you use "-Address", the [AddressTransformation]
            // attribute will handle the conversion, but otherwise we'll have to do it
            // manually.
            //
            // Let's check if Name is actually an address:
            //

            if (!String.IsNullOrEmpty(Name))
            {
                object addrObj = AddressTransformationAttribute.Transform(null,   // EngineIntrinsics
                                                                          SessionState.Path.CurrentProviderLocation(DbgProvider.ProviderId).ProviderPath,
                                                                          true,   // skipGlobalSymbolTest
                                                                          false,  // throwOnFailure
                                                                          false,  // dbgMemoryPassThru
                                                                          false,  // allowList
                                                                          Name);

                if ((null != addrObj) && (addrObj is ulong))
                {
                    WriteObject(Debugger.GetModuleByAddress((ulong)addrObj));
                    return;
                }
            }

            IList <DbgModuleInfo> modules;

            if (Unloaded)
            {
                modules = Debugger.UnloadedModules;
            }
            else
            {
                modules = Debugger.Modules;
            }

            foreach (var mod in modules)
            {
                if (_Matches(mod))
                {
                    WriteObject(mod);
                }
            }
        } // end ProcessRecord()
        public override object Transform(EngineIntrinsics engineIntrinsics, object inputData)
        {
            object originalInputData = inputData;

            var pso = inputData as PSObject;

            if (null != pso)
            {
                inputData = pso.BaseObject;
            }

            if (inputData is string)
            {
                return(inputData);
            }

            if (inputData is DbgModuleInfo)
            {
                return(((DbgModuleInfo)inputData).ImageName);
            }

            string path     = engineIntrinsics.SessionState.Path.CurrentProviderLocation(DbgProvider.ProviderId).ProviderPath;
            var    debugger = DbgProvider.GetDebugger(path);

            Exception e = null;

            // Maybe it is an address?
            try
            {
                object addrObj = AddressTransformationAttribute.Transform(
                    engineIntrinsics,
                    null,
                    true,                  // skipGlobalSymbolTest
                    false,                 // throwOnFailure
                    originalInputData);
                if (null != addrObj)
                {
                    var mod = new DbgModuleInfo(debugger,
                                                (ulong)addrObj,
                                                debugger.GetCurrentTarget());
                    return(mod.Name);
                }
            }
            catch (DbgEngException dee)
            {
                e = dee;
            }

            throw CreateRecoverableAtme(e,
                                        "Could not convert '{0}' to a module name.",
                                        originalInputData);
        } // end Transform()
        private static bool _TryConvertToUint(EngineIntrinsics engineIntrinsics, object inputData, out uint val)
        {
            val = 0xffffffff;

            object originalInputData = inputData;

            var pso = inputData as PSObject;

            if (null != pso)
            {
                inputData = pso.BaseObject;
            }

            if (inputData is int)
            {
                val = (uint)(int)inputData;
                return(true);
            }
            else if (inputData is uint)
            {
                val = (uint)inputData;
                return(true);
            }

            // Maybe it was hex and got parsed as a string?
            try
            {
                object addrObj = AddressTransformationAttribute.Transform(
                    engineIntrinsics,
                    null,
                    true,                  // skipGlobalSymbolTest
                    false,                 // throwOnFailure
                    originalInputData);
                if (null != addrObj)
                {
                    ulong asAddr = (ulong)addrObj;
                    val = unchecked ((uint)asAddr);
                    return(true);
                }
            }
            catch (DbgEngException)
            {
            }

            return(false);
        } // end _TryConvertToUint()
        public override object Transform(EngineIntrinsics engineIntrinsics, object inputData)
        {
            object originalInputData = inputData;

            var pso = inputData as PSObject;

            if (null != pso)
            {
                inputData = pso.BaseObject;
            }

            if (inputData is DbgModuleInfo)
            {
                return(inputData);
            }

            if (null == inputData)
            {
                return(null);
            }

            string path     = engineIntrinsics.SessionState.Path.CurrentProviderLocation(DbgProvider.ProviderId).ProviderPath;
            var    debugger = DbgProvider.GetDebugger(path);

            Exception e   = null;
            string    str = inputData as string;

            if (null != str)
            {
                if (0 == str.Length)
                {
                    return(null);
                }

                try
                {
                    var foundMod = debugger.Modules.FirstOrDefault((m) => 0 == Util.Strcmp_OI(m.Name, str));
                    if (null != foundMod)
                    {
                        return(foundMod);
                    }
                }
                catch (DbgProviderException dpe)
                {
                    e = dpe;
                }
            }

            if (null == e)
            {
                // Maybe it was an address...
                try
                {
                    object addrObj = AddressTransformationAttribute.Transform(
                        engineIntrinsics,
                        null,
                        true,                  // skipGlobalSymbolTest
                        false,                 // throwOnFailure
                        originalInputData);
                    if (null != addrObj)
                    {
                        return(new DbgModuleInfo(debugger,
                                                 (ulong)addrObj,
                                                 debugger.GetCurrentTarget()));
                    }
                }
                catch (DbgEngException dee)
                {
                    e = dee;
                }
            }

            throw CreateRecoverableAtme(e,
                                        "Could not convert '{0}' to a module.",
                                        originalInputData);
        } // end Transform()
        public override object Transform(EngineIntrinsics engineIntrinsics, object inputData)
        {
            if (0 == ElementSize)
            {
                // Pointer size.
                dynamic debugger = engineIntrinsics.SessionState.PSVariable.GetValue("Debugger", null);
                if (null != debugger)
                {
                    ElementSize = debugger.TargetIs32Bit ? 4 : 8;
                }
                else
                {
                    Util.Fail("Could not get debugger?");
                    ElementSize = 8;
                }
            } // end if( 0 == ElementSize )

            object addrObj = AddressTransformationAttribute.Transform(engineIntrinsics,
                                                                      null,
                                                                      true,   // skipGlobalSymbolTest
                                                                      false,  // throwOnFailure
                                                                      inputData);

            if (null != addrObj)
            {
                return(_CreatePso((ulong)addrObj));
            }

            //
            // It must be in "range" syntax. ("L[?][0n|0x]\d+", ex. "L100")
            //

            var pso = inputData as PSObject;

            if (null != pso)
            {
                inputData = pso.BaseObject;
            }

            // Some commands do not require a range.
            if (null == inputData)
            {
                return(_CreatePso((ulong)0));
            }

            string str = inputData as string;

            if (null != str)
            {
                // TODO: Shoule we implement "n" command and "default radix" concept? Or
                // will that be too everlastingly confusing, given that we can't change
                // the "radix" concept for the rest of PowerShell?

                // Some commands do not require a range.
                if (0 == str.Length)
                {
                    return(_CreatePso((ulong)0));
                }

                bool sizeOverride    = false;
                bool negative        = false;
                bool hasLengthPrefix = false;

                if (('L' == str[0]) || ('l' == str[0]))
                {
                    hasLengthPrefix = true;
                    int numIdx = 1;
                    if (str.Length > 1)
                    {
                        if ('?' == str[1])
                        {
                            sizeOverride = true;
                            numIdx++;
                        }
                        else if ('-' == str[1])
                        {
                            negative = true;
                            numIdx++;
                        }
                    }
                    str = str.Substring(numIdx);
                } // end if( StartsWith( 'L' ) )

                NumberStyles ns = NumberStyles.AllowHexSpecifier;
                if (str.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
                {
                    str = str.Substring(2);
                }
                else if (str.StartsWith("0n", StringComparison.OrdinalIgnoreCase))
                {
                    ns  = NumberStyles.None;
                    str = str.Substring(2);
                }
                ulong rangeOrAddr;
                if (UInt64.TryParse(str, ns, CultureInfo.InvariantCulture, out rangeOrAddr))
                {
                    // 256 MB seems rather large... maybe I'll default to 256k without a size override.
                    const ulong maxRange = 1024 * 256;

                    // We only do a max size check if we know we are checking a range;
                    // otherwise it could be an end address.
                    if (hasLengthPrefix &&
                        ((rangeOrAddr > maxRange) || ((rangeOrAddr * (ulong)ElementSize) > maxRange)) &&
                        !sizeOverride)
                    {
                        throw new ArgumentTransformationMetadataException(
                                  Util.Sprintf("Requested size ({0} * {1}) is too large; probably a typo. If you really want a size that large, use the \"L?<size> syntax.",
                                               rangeOrAddr,
                                               ElementSize));
                    }
                    return(_CreatePso(rangeOrAddr, hasLengthPrefix, negative));
                }
            } // end if( it's a string )

            throw CreateRecoverableAtme("Could not convert '{0}' to a range or an address.",
                                        inputData);
        } // end Transform()