Как сменить pid в драйвере

Обновлено: 07.07.2024

Данный вид установки драйверов практически всегда помогает в том случае, когда драйвер для устройства не устанавливается простым запуском установочного файла 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.

Минимальный пакет настроек для смены Serial у SMI DISK

И даже больше, для старой модели SM3252C, можно вообще оставить только одну птичку Write CID.

Полная же перепрошивка достигается путём дополнительного включения опций: Pretest и Format(FAT32).

Отдельно рассмотрим Serial Number, т.к. он наиболее сложный, а уже потом все прочие параметры.

При первом знакомстве может показаться что благодаря ручной правке, можно устанавливать длину серийника SMI-флешки ниже 13-символов, заложенных в производственную утилиту SMIMPTool. Но как такового нижнего ограничения в 13 байт не существует в приложении, не смотря на имеющийся параметр SN Length.

Элементы отвечающие за генерацию и придания вида SMI SerialNumber

Если хотите жестко задать определённый серийный номер, то просто укажите его в графе Serial Mask.

SN Length: значение длины, от 13 до 32 символов. Без опции Chk SN Len, жестко контролирующей длину указанного серийника, параметр SN Length ограничивает ваши аппетиты лишь по максимальной длине.

Т.е. символы AA и USBDEVRU остались, остальные произвольно сменились.

Объяснять процедуру изменения VID-PID, REV, VENDOR-PRODUCT нету особого смысла, лишь коротко поясню где что. Будем называть элементы SMI MPTool так, как это принято в приложении ChipGenius.

Как сменить вид-пид флешки SMI UDISK SM3257EN

VID и PID и без меня понятно, вбиваем свои значения, если это того требуется.

(название в SMI MPTool) = (в ChipGenius)

USB Vendor Str = Device Vendor
USB Product Str = Device Name

Inquiry Vendor = Manufacturer
Inquiry Product = Product Model

Является компактным портативным инструментом, который идеально подходит совсем неподготовленным юзерам.

Достаточно активировать снизу птички тех параметров, которые следует изменить и затем перебить их в верхней части программы.

Китайские приложение SMIRefixInfo для модификации vidpid

К сожалению утилита устаревшая и несовместима с актуальными чипами. Предположительно работает с моделями не старше SMI SM3257AA, который с конца 2000-ых годов, днём с огнём не сыщешь.

К тому же не позволяет сменить серинный номер устройства, а это вполне существенный недостаток. Позволяет модифицировать следующие параметры: VID, PID, Device Vendor, Device Name, Device Revision, Manufacturer и Product Model.

Имеет куча особенностей и заковырок, советую обходить утилиты Dyna Mass Storage Production Tool стороной по возможности.

Для тех, кто как-то запорол флешку и хочет прошить её уже с нужными данными, покажу на скринах соответствующие пункты настроек программы.

: OpenCard Config :

Выбор режима форматирования SMI Flash для Serial No

: Device Config :

Набор конфигов для изменения SMI Serial в DYNAMPTool

Учитывая то, что с DYNA-шитыми флешками вообще много проблем, лучшее для них решение будет ручное редактирование данных через инструмент SMI Debug.

Есть ещё такой вариант как использование утилиты SMI QCTool I1027, но это всё же слишком экзотический вариант.

Точно сказать не могу с какими моделями чипов совместима эта утилита, но уж точно мало с какими и все они старые. Например, совместима с моей флешкой на SMI SM3252C.

Рассматривать в данном материале вопрос применения приложения SMIQCTool мы не будем и вам не советую с ним связываться. Скажу лишь, что в графы Vendor, Product, Label находящиеся в главном окне утилиты, нужно вбить значения вашей флешки, чтобы она не выдавала красным цветом ошибки типа: Label error, SCSI Vendor error и SCSI Product error.

Ну и приведу пару скриншотов настроек утилиты, а дальше уже сами, если захотите.

Приложение SMI QCTool Setting TAB поможет с редактирования данных производителя

Установка оборудования часто сопровождается трудностями. Больше всего времени занимает поиск драйвера для установки оборудования. В этот этап многие пользователи заходят в тупик – казалось бы, драйвер скачан с официального сайта производителя, но нет, они упорно не хотят устанавливаться.

Все дело в том, что одна и та же модель оборудования (например, веб-камера) на самом деле может быть собрана на совершенно разных микрочипах. А производитель иногда предоставляет программное обеспечение только для одного чипа.

В этом случае выручают драйвера от другого производителя схожего вида компьютерной периферии, или драйвера от производителя серии микросхем, на которых собрано оборудование.

Иногда нужно изменить драйвера под конкретное свое оборудование. Изменение драйвера сводится к редактированию файла сведений (это файлы с расширением *.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 сохраняем и устанавливаем только что измененный драйвер. Звук заработает!

Точно по такому же принципу можно редактировать драйвера для веб-камеры, видеокарты, модема и так далее. Но помните, что оно не гарантирует вам стопроцентного результата.

Читайте также: