Примечание: Это не проблема, которую я испытываю, но это то, что я хотел бы
хотел бы понять (только потому, что я
хочу быть лучшим человеком и
дальше горизонт человека
понимание).
В бонусной главе Раймонд Чен книга ,
Раймонд приводит пример ошибки в драйвере звуковой карты:
Исходная функция, вызываемая в
время аппаратного прерывания выглядит
это в DDK:
void FAR PASCAL midiCallback(NPPORTALLOC pPortAlloc, WORD msg,
DWORD dwParam1, DWORD dwParm2) {
if (pPostAlloc->dwCallback)
DriverCallBack(pPortalloc->dwCallback, HIWORD(pPortalloc->dwFlags),
pPortalloc->hMidi, msg, dwParam1, dwParam2);
}
Их версия функции выглядела
как это:
void FAR PASCAL midiCallback(NPPORTALLOC pPortAlloc, WORD msg,
DWORD dwParam1, DWORD dwParm2) {
char szBuf[80];
if (pPostAlloc->dwCallback) {
wsprintf(szBuf, " Dc(hMidi=%X,wMsg=%X)", pPortalloc->hMidi, msg);
#ifdef DEBUG
OutputDebugString(szBuf);
#endif
DriverCallBack(pPortalloc->dwCallback, HIWORD(pPortalloc->dwFlags),
pPortalloc->hMidi, msg, dwParam1, dwParam2);
}
}
Мало того, что в розничном коде есть остатки отладочной информации, но это
вызов бесперебойно-безопасной функции
во время аппаратного прерывания. Если
wsprintf
функция когда-либо получает
Отказаться, система займет
сегментный недостаток внутри
аппаратное прерывание, которое приводит к
довольно быстрая смерть.
Теперь, если бы я посмотрел на этот код, я бы не догадался, что вызов библиотечной функции wsprintf будет проблемой. Что произойдет, если мой код драйвера должен использовать Win32 API?
Что такое ошибка сегмента ? Я понимаю концепцию сбоя страницы : код, который мне нужен, находится на странице, которая была выгружена на жесткий диск, и мне нужно будет вернуться с жесткого диска, прежде чем выполнение кода сможет Продолжить. Что такое ошибка сегмента , когда мы находимся внутри прерывания драйвера устройства?
Является ли ошибка страницы эквивалентом защищенного режима ошибка сегмента ? Как избежать ошибок сегмента? Windows когда-нибудь выменяет код драйвера устройства? Как мне остановить " wsprintf от отбрасывания "? Что может привести к тому, что wsprintf будет "отброшен"? Что такое "выброшенный"? В чем достоинство отбрасывания? Когда это что-то un отбрасывается
Почему вызов API-интерфейса изнутри драйвера плох и как его можно обойти?