Pathoswithin wrote:
Значит я должен вызвать CreateEvent -> WaitEventTimeout, ecx=300 -> DestroyEvent, а в обработчике прерывания - RaiseEvent с глобальными переменными.
В принципе, да, но можно и без глобальных переменных: добавить нужные поля в структуру IDE_DATA, при регистрации attach_int_handler последним параметром передать указатель на IDE_DATA для обработчика, в обработчике достать указатель на IDE_DATA как [esp+4]. Но пока там глобальная блокировка ide_mutex на операции со всеми IDE-дисками, работать будет и с глобальными переменными. Только перед DestroyEvent обнули переменные, а в обработчике прерывания пропусти RaiseEvent, если переменные нулевые - чтобы ничего не сломалось, если прерывание всё-таки придёт после 3s.
Pathoswithin wrote:
Нужна ли переменная IDE_common_irq_param ?
Кажется, IDE_common_irq_handler в зависимости от неё выбирает, какие порты читать.
Pathoswithin wrote:
Вот вызывается обработчик, проверяет его ли это прерывание. А если не его, то чьё? И что за параметр в al ?
На одном прерывании может висеть несколько устройств - на все PCI-устройства выделено всего 4 IRQ, а устройств обычно больше 4. pcidev покажет распределение по прерываниям. При возникновении прерывания система вызывает все обработчики, зарегистрированные на этом прерывании, потому что у неё нет данных, какое именно устройство сгенерировало прерывание. Возвращаемое значение обработчика 0, если это не его прерывание, и что угодно ненулевое, если его.