Доброго дня. Пишу библиотеку, перехватывающую запуск процессов через CreateProcessNotify. В скомпилированном виде - больше 400 кило. Работает, проверено на XP/Vista/7... И всё бы хорошо, но вот именно на семёрке (32 бита) вдруг обнаружилось что невозможно запустить любое приложение, название которого начинается на "ADBERDR"! Я это понял когда не смог поставить Adobe reader Прекращена работа программы ADBERDR.exe, Имя модуля - либо моя библиотека, либо ntdll Код исключения - c0000005 Если выгрузить библиотеку - всё нормально. Изменить одну букву в названии exe - всё нормально. Система пять-минут-назад-установленная, антивирус отсутствует. Но это ещё не всё. Самое интересное что код библиотеки при этом не выполняется. Вообще. Сразу после загрузки, ещё до входа в процедуру CreateProcessNotify, библиотека посылает сообщение, но в случае с ADBERDR я его не получаю. Пробовал просто стирать код, строчка за строчкой. В итоге стёр абсолютно всё и ошибка исчезла. Вес при этом уменьшился до 41 кб. Не могу понять - в чём фишка? Откуда эти буквы? (код не привожу, потому что до него дело не доходит, да и ObjectPascal тут не любят).
логично было бы предположить, что ошибка в вашем коде. но так как кода вы не даете, нужно дождатся месных телепатов для получения ответа.
Ой, не надо телепатов!)) Я просто думал - дело в размере. Потому как до выполнения кода дело не доходит, валится сразу, не выполнив кода ни байта.... Сейчас выложу.
Чёрт... начал вырезать места, которые не хотелось бы афишировать, и чтобы подсократить код - так он, гад, заработал! 0_0 Вернул всё на место - опять проблема. Поэтому выкладываю как есть...
Это конечно не Си, но всё равно очень надеюсь на вашу помощь... Где ещё искать системных программистов, как не здесь)) Code (Text):
Попробовал. Всё равно эта строка не отрабатывает, вылетает где-то раньше. Вот только где... Showmessage тут просто для наглядности, раньше была отправка сообщения (sendmessage).
Delphi было бы неплохо для начала проапгрейдить. Хотя бы для того, чтобы Code (Text): ExtractFileDir ExtractFileDrive ExtractFileExt ExtractFileName ExtractFilePath заново не изобретать. Не говоря уже о том, что кодировка ANSI сейчас вообще не в моде, и правильный образ жизни требует использования Unicode. Ну и из заголовка пару-тройку явно лишних модулей вроде Forms надо бы вынести.
Делфи 7-й, какой уж тут юникод))) А современные версии какие-то все страшные.. И вылетали частенько без всякого предупреждения. Forms нужен - он создаёт окно с картинкой и тремя кнопками. К тому же, CreateMessageDialog тоже использует forms, а он тянет за собой windows, classes, messages... итого 300 кб. Variants можно убрать, да и всё, пожалуй.
В новых, говорят, любой "просто String" - юникодный. Так что при необходимости проще будет банально перекомпилировать уже имеющийся код, чем сейчас приписывать везде wide- ... Да и проблема вряд ли исчезнет. Все символы из набора ADBERDR - обычная латиница, я проверял.
Postscripter Ну не знаю как вы запускаете, но у меня ваша dll показала эти мессаги: rundll32.exe ADBERDR.dll,CreateProcessNotify Тестил на Win7 SP1 x64 и x86
Не библиотека, а подопытный экзешник должен называться ADBERDR. А запускаю я через ключ реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\AppCertDlls Тогда библиотека получает уведомления о запуске приложений и может дать добро. А может и не дать. Вот как раз при запуске приложения ADBERDR.exe оно и сбоит. Ситуация осложняется тем, что у меня самого XP и всё работает, а чтобы проверить приходится бегать к соседу за ноутом с Win7.