Q:
How do I determine if the Power Macintosh has PCI expansion slots?
A The only way to do this is to use the Name Registry. Use the
RegistryEntrySearch routine to search for entries whose "device_type" value
is "pci." If an entry is found (RegistryEntrySearch returns noErr and done
is false), there is at least one PCI bus. The Name Registry is documented
in Chapter 8 of "Designing PCI Cards and Drivers for Power Macintosh
Computers".
To allow your program to run on machines that don't have the Name Registry,
you should weak link to "NameRegistryLib." You can then determine whether
the Name Registry is available by testing the address of a symbol in the
library against kUnresolvedCFragSymbolAddress . This technique is
documented in
Inside Macintosh: PowerPC System Software, p1-25.
The following snippet demonstrates both techniques:
static Boolean HasPCISlots(void)
// Returns true if the machine has any PCI slots. Guards against the
// absence of NameRegistryLib, so you can run this function on any PPC
// computer.
{
Boolean result;
RegEntryIter myIterator;
OSStatus err;
Boolean done;
RegEntryID foundEntry;
// Assume the worst.
result = false;
// Check that the link to NameRegistryLib was successful.
if (RegistryEntryIterateCreate != kUnresolvedCFragSymbolAddress) {
// Create an iterator
if (RegistryEntryIterateCreate(&myIterator) == noErr) {
// Search for a node of type "pci".
(void) RegistryEntryIDInit(&foundEntry);
err = RegistryEntrySearch(&myIterator, kRegIterContinue,
&foundEntry, &done,
"device_type",
"pci", sizeof("pci"));
// See whether we found one.
if (err == noErr && !done) {
result = true;
(void) RegistryEntryIDDispose(&foundEntry);
}
(void) RegistryEntryIterateDispose(&myIterator);
}
}
return (result);
}
|
|