Как сменить pid в драйвере
Данный вид установки драйверов практически всегда помогает в том случае, когда драйвер для устройства не устанавливается простым запуском установочного файла setup, с расширениями *.exe или *.msi.
Но главным условием для успешной установки драйвера в этом случае является то, что драйвер должен быть полностью распакован и файл с расширением *.inf должен быть доступен. Зачастую производители оборудования упаковывают свои драйвера не только стандартными ZIP-архиваторами, но и используя замысловатые программы собственного изготовления. Здесь для распаковки весьма полезной может оказаться программка Universal Extractor, которой можно распаковать практически любой инсталлятор драйвера.
Также перед установкой драйвера желательно отключить Контроль учетных записей.
Рассмотрим, как принудительно установить драйвер в Windows 7 на примере веб-камеры Defender AV-W2035. Имеется скачанный с просторов Интернета драйвер AV-W2035_VISTA.zip, который мы успешно распаковали в папку C:/AW-0350-MIC-VISTA. Для начала нам нужно просмотреть, где же находится у нас файл с расширением *.inf. Для этого в свойствах папок Windows нужно включить отображение расширений файлов, чтобы название файлов писались с их расширениями. Либо использовать весьма полезную программу Total Commander или схожий файловый менеджер. Просмотрев папки (можно воспользоваться поиском файла) мы нашли файл snpstd2.inf
Следует запомнить весь путь до этого файла, чтобы потом было легче найти его в Проводнике. Подключаем камеру к компьютеру, и дожидаемся, когда Windows завершит все свои операции по определению нового оборудования.
Открываем Диспетчер устройств (Пуск –> Панель Управления –> Диспетчер устройств)
Сразу видно устройство USB camera без установленных драйверов. Правой кнопкой мыши нажимаем на камере и в контекстном меню выбираем пункт Обновить драйверы…
в открывшемся окне нажимаем Выполнить поиск драйвером на этом компьютере
и далее выбираем Выбрать драйвер из списка уже установленных драйверов и кнопку Далее
Откроется окно со списков категорий оборудования.
Чтобы даром время не терять и не ломать голову, просто указываем на первую строчку Показать все устройства и жмем кнопку Далее
В следующем окне у нас откроется список имеющихся драйверов в системе (если они есть). Но так как мы знаем, что у нас есть папка с драйвером, то ничего не выбирая из списка, нажимаем на кнопку Установить с диска…
Нажимаем кнопку Обзор…
и с помощью Проводника ищем наш файл с расширением *.inf, выделяем его мышкой и следуем по кнопке Открыть
и, конечно же, кнопочку ОК
Теперь в окне со списком имеющихся драйверов появиться наш драйвер (если драйвер не подходит для оборудования, то система выдаст ошибку).
Здесь следует обратить внимание на галочку Только совместимые устройства. Дело в том, что если подключаемое оборудование не тестировалось на совместимость с установленной версией Windows, то драйвер для него не найдется, несмотря на то, что он может быть вполне рабочим. Поэтому в некоторых случаях эту галочку следует убрать и повторить поиск драйвера снова.
Итак, после того как файл с драйвером найден, выделяем в списке мышкой наш драйвер и нажимаем кнопку ДалееНачнется установка драйвера
Может появиться предупреждение Windows о том, что устанавливаемый драйвер не имеет цифровой подписи либо не проверялся на совместимость. Если уверены, что драйвер взят с надежного источника и точно предназначен для устанавливаемого оборудования, то такого предупреждения абсолютно не стоит бояться, а следует согласиться на дальнейшую установку драйвера. По окончании установки система выведет окно о завершении.
В успешной установке драйвера можно убедиться в Диспетчере устройств, где подключаемое устройство уже не будет иметь вопросика, а его название поменяется на правильное, созданное производителем. В нашем случае с камерой это будет появившееся устройство с названием USB PC Camera (SN9C103)
Установка закончена, можно спокойно начать пользоваться новым оборудованием!
В этой статье мы попытаемся создать модуль ядра, способный изменить PID уже запущенного процесса в ОС Linux, а так же поэкспериментировать с процессами, получившими измененный PID.
Предупреждение: смена PID — нестандартный процесс, и при определенных обстоятельствах может привести к панике ядра.
Наш тестовый модуль будет реализовывать символьное устройство /dev/test, при чтении с которого процессу будет изменен PID. За пример реализации символьного устройства спасибо этой статье. Полный код модуля приведен в конце статьи. Конечно, самым правильным решением было добавить системный вызов в само ядро, однако это потребует перекомпиляцию ядра.
Окружение
Все действия по тестированию модуля выполнялись в виртуальной машине VirtualBox с 64 битным дистрибутивомLInux и версией ядра 4.14.4-1. Связь с машиной осуществлялась с помощью SSH.
Пару слов о current: переменная current указывает на структуру task_struct с описанием процесса в ядре(PID, UID, GID, cmdline, namespaces и т.д)
Первой идеей было просто поменять параметр current->pid из модуля ядра на нужный.
Для проверки работоспособности модуля я написал программу на C++:
Загрузим модуль коммандой insmod, создадим /dev/test и попробуем.
PID не изменился. Возможно, это не единственное место, где указывается PID.
Если не current->pid является идентификатором процесса, то что является? Быстрый просмотр кода getpid() навел на структуру task_struct, описывающую процесс Linux и файл pid.c в исходном коде ядра. Нужная функция — __task_pid_nr_ns. В коде функции встречается обращение task->pids[type].pid, этот параметр мы и изменим
Так как тестировал я по SSH, мне удалось получить вывод программы до падения ядра:
Первый результат, уже что-то. Но PID все равно не изменился.
Более внимательное изучение pid.c дало функцию, которая делает то, что нам нужно
static void __change_pid(struct task_struct *task, enum pid_type type,
struct pid *new)
Функция принимает задачу, для которой надо изменить PID, тип PID и, собственно, новый PID. Созданием нового PID занимается функция
struct pid *alloc_pid(struct pid_namespace *ns)
Эта функция принимает только пространство имен, в котором будет находиться новый PID, это пространство можно получить с помощью task_active_pid_ns .
Но есть одна проблема: эти символы ядра не экспортируются ядром и не могут использоваться в модулях. В решении этой проблемы мне помогла замечательная статья. Код функции find_sym взят оттуда.
PID изменен! Ядро автоматически выделило нашей программе свободный PID. Но можно ли использовать PID, который занял другой процесс, например PID 1? Добавим после аллокации код
Получаем настоящий PID 1!
Bash выдал ошибку, из-за которой не будет работать переключение задач по комманде %n, но все остальные функции работают отлично.
Интересные особенности процессов с измененным PID
PID 0: войти нельзя выйти
Вернемся к коду и изменим PID на 0.
newpid->numbers[0].nr = 0;
Комплируем, запускаем
Выходит PID 0 не такой и особенный? Радуемся, пишм exit и…
Ядро падает! Ядро определило нашу задачу как IDLE TASK и, увидев завершение, просто упало. Видимо, перед завершением наша программа должна вернуть себе «нормальный» PID.
Процесс-невидимка
Вернемся к коду и выставим PID, гарантированно не занятый
newpid->numbers[0].nr = 12345;
Посмотрим, что находится в /proc
Как видим /proc не определяет наш процесс, даже если мы заняли свободный PID. Предыдущего PID тоже нет в /proc, и это весьма странно. Возможно, мы находимся в другом пространстве имен и поэтому не видны основному /proc. Смонтируем новый /proc, и посмотрим что там
По прежнему нашего процесса нет, а значит мы в обычном пространстве имен. Проверим
ps -e | grep bash
296 pts/0 00:00:00 bash
Только один bash, с которого мы и запускали программу. Ни предыдущего PID, ни текущего в списке нет.
В них описаны методики смены таких данных, которые нельзя изменить обычным редактированием настроек программы. Короче, применён нестандартный подход к решению задачи.
Чем хороши контроллеры SMI, так тем, что их шить совсем не обязательно, чтобы изменить серийный номер и большинство прочей инфы. Это в свою очередь, снижает риски, получения на выходе мёртвой флешки.
Но расслабляться всё равно не надо, использование любого из методов может повлечь, как необходимость дополнительного форматирования, так и зависания. В основном это связанно с глюками некоторых дистрибутивов утилиты SMI MPTool. Так в одной версии, почему-то идентификационная инфа не хочет обновляться, в другой после перебивки серийника, требует форматирования и т.д. Иногда, просто необходимо нащупать полностью совместимый дистрибутив со своей флешкой и уже смело извращаться по полной.
Ниже я разместил небольшую табличку, в которой сделал наглядное сравнение возможностей различных методов изменения идентификационной информации. Как видно из неё, универсального способа нету и комбинация отдельных элементов — это тот самый выход, который напрашивается самим собой.
Как я уже написал в введении, шить совсем не обязательно для решения задачи смены данных. Достаточно на первой странице настроек в правой части оставить активными галочки Write CID и Download ISP.
И даже больше, для старой модели SM3252C, можно вообще оставить только одну птичку Write CID.
Полная же перепрошивка достигается путём дополнительного включения опций: Pretest и Format(FAT32).
Отдельно рассмотрим Serial Number, т.к. он наиболее сложный, а уже потом все прочие параметры.
При первом знакомстве может показаться что благодаря ручной правке, можно устанавливать длину серийника SMI-флешки ниже 13-символов, заложенных в производственную утилиту SMIMPTool. Но как такового нижнего ограничения в 13 байт не существует в приложении, не смотря на имеющийся параметр SN Length.
Если хотите жестко задать определённый серийный номер, то просто укажите его в графе Serial Mask.
SN Length: значение длины, от 13 до 32 символов. Без опции Chk SN Len, жестко контролирующей длину указанного серийника, параметр SN Length ограничивает ваши аппетиты лишь по максимальной длине.
Т.е. символы AA и USBDEVRU остались, остальные произвольно сменились.
Объяснять процедуру изменения VID-PID, REV, VENDOR-PRODUCT нету особого смысла, лишь коротко поясню где что. Будем называть элементы SMI MPTool так, как это принято в приложении ChipGenius.
VID и PID и без меня понятно, вбиваем свои значения, если это того требуется.
(название в SMI MPTool) = (в ChipGenius)
USB Vendor Str = Device Vendor
USB Product Str = Device Name
Inquiry Vendor = Manufacturer
Inquiry Product = Product Model
Является компактным портативным инструментом, который идеально подходит совсем неподготовленным юзерам.
Достаточно активировать снизу птички тех параметров, которые следует изменить и затем перебить их в верхней части программы.
К сожалению утилита устаревшая и несовместима с актуальными чипами. Предположительно работает с моделями не старше SMI SM3257AA, который с конца 2000-ых годов, днём с огнём не сыщешь.
К тому же не позволяет сменить серинный номер устройства, а это вполне существенный недостаток. Позволяет модифицировать следующие параметры: VID, PID, Device Vendor, Device Name, Device Revision, Manufacturer и Product Model.
Имеет куча особенностей и заковырок, советую обходить утилиты Dyna Mass Storage Production Tool стороной по возможности.
Для тех, кто как-то запорол флешку и хочет прошить её уже с нужными данными, покажу на скринах соответствующие пункты настроек программы.
: OpenCard Config :
: Device Config :
Учитывая то, что с DYNA-шитыми флешками вообще много проблем, лучшее для них решение будет ручное редактирование данных через инструмент SMI Debug.
Есть ещё такой вариант как использование утилиты SMI QCTool I1027, но это всё же слишком экзотический вариант.
Точно сказать не могу с какими моделями чипов совместима эта утилита, но уж точно мало с какими и все они старые. Например, совместима с моей флешкой на SMI SM3252C.
Рассматривать в данном материале вопрос применения приложения SMIQCTool мы не будем и вам не советую с ним связываться. Скажу лишь, что в графы Vendor, Product, Label находящиеся в главном окне утилиты, нужно вбить значения вашей флешки, чтобы она не выдавала красным цветом ошибки типа: Label error, SCSI Vendor error и SCSI Product error.
Ну и приведу пару скриншотов настроек утилиты, а дальше уже сами, если захотите.
Установка оборудования часто сопровождается трудностями. Больше всего времени занимает поиск драйвера для установки оборудования. В этот этап многие пользователи заходят в тупик – казалось бы, драйвер скачан с официального сайта производителя, но нет, они упорно не хотят устанавливаться.
Все дело в том, что одна и та же модель оборудования (например, веб-камера) на самом деле может быть собрана на совершенно разных микрочипах. А производитель иногда предоставляет программное обеспечение только для одного чипа.
В этом случае выручают драйвера от другого производителя схожего вида компьютерной периферии, или драйвера от производителя серии микросхем, на которых собрано оборудование.
Иногда нужно изменить драйвера под конкретное свое оборудование. Изменение драйвера сводится к редактированию файла сведений (это файлы с расширением *.inf) и последующей установки модернизированного драйвера.
Обычно нужно изменить или дописать только тот раздел файла *.inf, в котором перечисляются Коды экземпляров оборудования, поддерживаемые драйвером. Надо вписать ИД оборудования для своего устройства.
Рассмотрим наглядный пример (реальный случай был рассмотрен на Форуме). На ноутбуке eMachines E728 под Windows XP не устанавливается звуковая карта. Ид оборудования звуковой карты имеет вид:
Код:
HDAUDIO/FUNC_01&VEN_14F1&DEV_5051&SUBSYS_1025049B |
Поиск драйверов именно с точно таким же ИД не дал результатов. Но к счастью имеется драйвер звуковой карты Conexant от ноутбука eMachines D725, который поддерживает звуковые карты, у которых следующие Коды экземпляров:
Код:
HDAUDIO/FUNC_01&VEN_14F1&DEV_5051&SUBSYS_10250214 HDAUDIO/FUNC_01&VEN_14F1&DEV_5051&SUBSYS_10250215 HDAUDIO/FUNC_01&VEN_14F1&DEV_5051&SUBSYS_10250219 HDAUDIO/FUNC_01&VEN_14F1&DEV_5051&SUBSYS_1025021A HDAUDIO/FUNC_01&VEN_14F1&DEV_5051&SUBSYS_1025021C HDAUDIO/FUNC_01&VEN_14F1&DEV_5051&SUBSYS_1025021D HDAUDIO/FUNC_01&VEN_14F1&DEV_5051&SUBSYS_10250253 |
В ИД оборудования очень важна именно первая часть кода VEN_14F1&DEV_5051 , которая определяет производителя чипа и точную модель чипа. Как видно у найденного драйвера она совпадает с кодом звуковой карты.
Как изменить драйвер?
Для редактирования драйвера, все файлы должны быть распакованы в любую папку. Среди распакованных папок и файлов находим файл с расширением *.inf. В нашем случае – это файл WAUHER5a.inf.
Откроем его в обычном Блокноте для редактирования.
В начале файла увидим следующие строчки:
Код:
%HdAudioFunctionDriver.Hermosa5051.DeviceDesc% = HdAudModelSJ,HDAUDIO/FUNC_01&VEN_14F1&DEV_5051& SUBSYS_1025049B |
После этого файл WAUHER5a.inf сохраняем и устанавливаем только что измененный драйвер. Звук заработает!
Точно по такому же принципу можно редактировать драйвера для веб-камеры, видеокарты, модема и так далее. Но помните, что оно не гарантирует вам стопроцентного результата.
Читайте также: