public static bool GetFixedIoIrqRange(uint range,
                                              out byte line,
                                              out byte size)
        {
            bool ret = false;

            line = 0;
            size = 0;

            IoConfig config = Thread.CurrentProcess.IoConfig;

            if (config != null && config.FixedRanges.Length > range)
            {
                IoIrqRange iir = config.FixedRanges[range] as IoIrqRange;
                if (iir != null)
                {
                    line = iir.Line;
                    size = iir.Size;
                    ret  = true;
                }
            }

            Tracing.Log(Tracing.Debug,
                        "DeviceService.GetFixedIoIrqRange(range={0}, out line={1:x2}, out size={2:x2})",
                        range, line, size);

            return(ret);
        }
        public static bool Create(byte irqNum,
                                  out InterruptHandle handle)
        {
            bool ret = false;

            handle = new InterruptHandle();

            //
            // Create an IoIrq, and a handle in the current process to hold it.
            //
            IoConfig config = Thread.CurrentProcess.IoConfig;

            for (int i = 0; i < config.DynamicRanges.Length; i++)
            {
                IoIrqRange iir = config.DynamicRanges[i] as IoIrqRange;
                if (iir != null && iir.Irq <= irqNum && irqNum < iir.Irq + iir.Size)
                {
                    IoIrq irq = iir.IrqAtOffset((byte)(irqNum - iir.Irq));

                    handle = new InterruptHandle(
                        Thread.CurrentProcess.AllocateHandle(irq));
                    irq.RegisterInterrupt();
                    ret = true;
                    break;
                }
            }

            Tracing.Log(Tracing.Debug,
                        "InterruptHandle.Create(irq={0:x2}, out id={0:x8})",
                        irqNum, handle.id);
            return(ret);
        }
 // CTR will create the rest of this class:
 public TimerResources(IoConfig config)
 {
     // dynamic resources
     registers = (IoMemoryRange)config.DynamicRanges[0];
     irq       = (IoIrqRange)config.DynamicRanges[1];
 }