В общем, она имеет такой прототип: BOOLEAN HalTranslateBusAddress( IN INTERFACE_TYPE InterfaceType, IN ULONG BusNumber, IN PHYSICAL_ADDRESS BusAddress, IN OUT PULONG AddressSpace, OUT PPHYSICAL_ADDRESS TranslatedAddress ); Объясните кто-нибудь, пожалуйста, откуда нужно брать параметры InterfaceType и BusNumber.
Я в IceExt юзал функцию HalGetInterruptVector(). Там устанавливал эти параметры, соответственно, таким образом: InterfaceType = PCIBus BusNumber = 0 Но я четко знал чего я хочу - мне нужно было выполнить маппинг номера хардверного IRQ в номер софтверного прерывания для кодека AC97, который встроен прямо в материнскую плату. В твоем случае, предполагается что ты тем или иным образом знаешь правильные параметры. P.S. Ну и разумеется, HalTranslateBusAddress() функция устаревшая, и MS ее юзать не рекомендует.
INTERFACE_TYPE enum type: Elements InterfaceTypeUndefined Undefined interface type. Internal System or microprocessor bus. Isa Industry Standard Architecture (ISA) bus. Eisa Extended ISA bus. MicroChannel Micro channel bus interface. TurboChannel Turbo channel bus interface. PCIBus PCI bus interface. VMEBus VME bus interface. NuBus NuBus bus interface. PCMCIABus PCMCIA bus interface. CBus C bus interface. MPIBus MPI bus interface. MPSABus MPSA bus interface. ProcessorInternal Internal processor interface. InternalPowerBus Internal power bus interface. PNPISABus Plug and Play ISA bus interface. PNPBus Plug and Play bus interface. MaximumInterfaceType Maximum interface value.
2 Sten: /*******HalTranslateBusAddress() функция устаревшая, и MS ее юзать не рекомендует.********/ А чем же тогда пользоваться? Если тебе ПнП манагер выдает портбасе по отношению к шине, а не в абсолютных единицах? 2 Shama: А номер шины откуда взять? А вообще-то я думаю, что это где-то в ResourceList должно находится... Не, я чиста ваще в шоке... В примерах к моей любимой книге ВЕЗДЕ пишется pDevExt->portBase = (PUCHAR) pPartialDescriptor->u.Port.Start.LowPart; И далее используются эти значения... А я уже двое суток сношаюсь, не могу заставить LPT порт хоть как-то заработать... Почитав другую книжку, узнал, что оказывается эти адреса всегда в абсолютные переводить надо... Только написал pDevExt->portBase = 0x378 - все прекрасно заработало.
Я опять в шоке Там так и надо брать QuadPart, так даже в ddk написано... Там в проге, короче, цикл есть: for (i=0; i<(int)pPartialList->Count; i++) { pPartialDescriptor = &pPartialList->PartialDescriptors; switch (pPartialDescriptor->Type) { case CmResourceTypeInterrupt: pDevExt->IRQL = (KIRQL) pPartialDescriptor->u.Interrupt.Level; pDevExt->Vector = pPartialDescriptor->u.Interrupt.Vector; pDevExt->Affinity = pPartialDescriptor->u.Interrupt.Affinity; break; case CmResourceTypePort: pDevExt->portBase = (PUCHAR) pPartialDescriptor->u.Port.Start.QuadPart; pDevExt->portLength = pPartialDescriptor->u.Port.Length; break; case CmResourceTypeMemory: // We don't do memory usage break; } } Так оказывается, что там в ресурсах есть 2 области портов, причем та, которая нужна - первая => В Device Extension попадает вторая => нихера не работает) Зачем вообше нужна эта область(778-77c)?
ubil Блин, ты в аську почаще выходи )))) 778-77c - покапай доки, а что если порт работает в режимах отличных от SPP ? вот для этого эти порты и нужны ))