Esempio n. 1
0
 private static IoRange ProcessExceptions(string deviceId, IoRange resource)
 {
     // Some Dells like the Dell Precision 490 make the HPET range
     // read-only - but it needs to be read-write.
     if (deviceId == "/pnp/PNP0103" && resource is IoMemoryRange &&
         !((IoMemoryRange)resource).Writable)
     {
         IoMemoryRange resourceMemoryRange = (IoMemoryRange)resource;
         return(new IoMemoryRange(resourceMemoryRange.RangeBase, resourceMemoryRange.RangeLength,
                                  true /*readable*/, true /*writable*/));
     }
     else
     {
         return(resource);
     }
 }
Esempio n. 2
0
        private IoConfig !ResourceDescriptorsToIoConfig(string deviceId, ResourceDescriptor[] resourceDescriptors)
        {
            ArrayList resourceList = new ArrayList();

            string[] !ids = new string[1];
            ids[0]        = deviceId;

            foreach (ResourceDescriptor resourceDescriptor in resourceDescriptors)
            {
                if (resourceDescriptor is MemoryRangeDescriptor)
                {
                    MemoryRangeDescriptor descriptor = (MemoryRangeDescriptor)resourceDescriptor;
                    if (descriptor.ConsumerProducer == ConsumerProducer.Consumes)
                    {
                        // The resource can take on any base address in the range descriptor.Minimum -
                        // descriptor.Maximum. Just use the minimum for now.
                        resourceList.Add(new IoMemoryRange(descriptor.Minimum, descriptor.Length,
                                                           true /*readable*/, descriptor.Writable));
                    }
                }
                else if (resourceDescriptor is IoRangeDescriptor)
                {
                    IoRangeDescriptor descriptor = (IoRangeDescriptor)resourceDescriptor;
                    if (descriptor.ConsumerProducer == ConsumerProducer.Consumes)
                    {
                        // The resource can take on any base address in the range descriptor.Minimum -
                        // descriptor.Maximum. Just use the minimum for now. We use Access.ReadWrite
                        // since ACPI supplies no information about whether it's writable.
                        resourceList.Add(new IoPortRange((ushort)descriptor.Minimum, (ushort)descriptor.Length,
                                                         Access.ReadWrite));
                    }
                }
                else if (resourceDescriptor is IrqDescriptor)
                {
                    IrqDescriptor descriptor = (IrqDescriptor)resourceDescriptor;
                    foreach (int interruptNumber in descriptor.InterruptNumbers)
                    {
                        resourceList.Add(new IoIrqRange((byte)interruptNumber, 1));
                    }
                }
                else if (resourceDescriptor is DmaDescriptor)
                {
                    DmaDescriptor descriptor = (DmaDescriptor)resourceDescriptor;
                    foreach (int dmaChannelNumber in descriptor.DmaChannelNumbers)
                    {
                        resourceList.Add(new IoDmaRange((byte)dmaChannelNumber, 1));
                    }
                }
            }

            ArrayList processedResourceList = new ArrayList();

            foreach (object obj in resourceList)
            {
                IoRange newResource = (IoRange)ProcessExceptions(deviceId, (IoRange)obj);
                if (newResource != null)
                {
                    processedResourceList.Add(newResource);
                }
            }

            return(new PnpConfig(ids, processedResourceList));
        }