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); } }
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)); }