|
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557
|
|
Зачем нужен драйвер и как написать простейший драйвер23.09.2012, 14:50. Показов 89092. Ответов 38
Метки нет (Все метки)
Хотя в интернете и есть на русском языке некоторые обяснения что такое драйвер для его програмирования считаю это довольно узко. Рускоязычные книги тоже не совсем понятно написаны. Вобщем мои рассуждения ( правильны ли они). Расссматриваю написания драйверов под виндовс. Для стабильности ОС програмисты разделиль функционирование ОС на две части - пользовательский режим и режим ядра, так как в пользовательском режиме возможности малы, то и испортить систему меньше шансов разным софтом. Драйвера работают в режиме ядра. Соответственно есть уже готовые функции API которые реализуют низкоуровневые операции и с помощью которых в основном и пишутся драйвера. Думаю что почти любой драйвер можна написать на основании этих функций + некоторые созданные собственно + асемблерные вставки. Соответственно драйвер считаю - это добавка до кода ОС, которая обясняяет как ей общаться с ОС. А как это делается ? Предполагаю что драйвер указывает какие низкоуровневые функции мы можем применить по отношению до даного устройства, указать какой приоритет у даного устройства. Неукладывается в голове что конкретно он делает. Вот подключаем мы какое-то неизвестное устройство до ПК. Оно подает какие то сигналы, и должно обрабатывать входящие. Для того чтобы просто работать с устройством ( ближе до человеческого языка) думаю что драйвер - это "образ" устройства в програмной форме - что то наподобе применения обектов в пользовательских приложениях (ООП). Тоесть мы создаем клас даного устройства, который описывает функции которые имеет даный обект и его свойства - не знаю какие. Кто как понимает - что делает драйвер. С чего начинается создание драйвера. Если допустим управлять внешним контроллером как выключателем. Почему написания драйверов кардинально отличается от написания пользовательського кода. Эсть ли какая то аналогичность. Очень хотелось бы чтобы человек который уже писал драйвера и четко все себе уяснил постарался по простому тезисно обяснить суть, самые важные аспекты по написанию драйверов.
2
|
|
| 23.09.2012, 14:50 | |
|
Ответы с готовыми решениями:
38
Как написать драйвер для COM-порта Как написать драйвер для флешки, шифрующий данные Помогите написать драйвер клавиатуры! |
|
Ушел с форума
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
|
||||||||||||||||
| 22.10.2012, 12:53 | ||||||||||||||||
|
Доступ к командам In/Out через изменение карты IOPM Драйвер scp08 написан на основе драйвера режима ядра UserPort 1.1 by Tomas Franzon изменение адреса начала IOPM в TSS расширяет размер TSS до 2FFFh работает с гипертрейдинговыми и многопроцессорными системами. Полнофункциональный драйвер. Далее исходный текст драйвера scp08.sys
Первый вариант user-mode приложения, которое запускает драйвер scp08.sys user-mode приложение, которое запускает scp08.sys драйвер, используя API-функции Service Control Manager'a: OpenSCManager, CreateService, StartService, CloseServiceHandle и DeleteService. Этот способ очень прост и хорошо документирован, он подходит для постоянной установки драйверов.
Второй вариант user-mode приложения, которое запускает драйвер scp08.sys Предварительно прописываем драйвер scp08.sys в реестре "вручную" (используем функции RegOpenKey, RegCreateKey, RegSetValue) и загружаем драйвер scp08.sys с помощью функции ZwLoadDriver. В реестре создается минимум необходимых записей, запускаем драйвер, выгружаем драйвер функцией ZwUnloadDriver и удаляем его раздел из реестра (используем функции RegCloseKey, SHDeleteKey). Этот способ позволяет запускать драйвер быстро и незаметно и подходит для маленьких программ не требующих установки, но требующих запуска своего драйвера.
________________________________________ __________________________________
© Mikl___ 2011
8
|
||||||||||||||||
|
Ушел с форума
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 22.10.2012, 13:50 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Доступ к командам In/Out через установку user-mode приложению IOPL=3 Теория В процессорах Intel, начиная с i286, реализован четырехуровневый механизм защиты. Соответственно, имеется четыре уровня привилегий. Код или данные могут обладать каким-либо уровнем привилегии. Предполагалось, что прикладные программы, системные программы, ядро и т.д. будут работать на своих уровнях, и не будут иметь возможность произвольного доступа к более привилегированному коду или данным. На практике, ни одна ОС для Intel процессоров не использует все четыре уровня. Windows NT не является исключением, используются два уровня (кольца) привилегий. Уровень привилегий 0 (наиболее привилегированный уровень ― уровень супервизора) используется в режиме ядра с полным доступом (full-access kernel mode), и 3 уровень (наименее привилегированный) для более ограниченного режима пользователя (user mode). Текущий уровень привилегий ― Current Privilege Level (CPL) процессора хранится в двух младших битах регистра CS. CPU определяет уровень привилегий ввода/вывода ― I/O Privilege Level (IOPL), значение которого сравнивается с CPL чтобы узнать могут ли использоваться команды In/Out. IOPL хранится в двух битах регистра EFLAGS (биты 12, 13). Любой процесс с CPL большим, чем IOPL должен пройти через механизм защиты портов ввода/вывода. Так как IOPL не может быть меньше 0, программы, исполняющиеся на уровне привилегий 0 (kernel-mode драйвера устройств) будут всегда иметь прямой доступ к портам ввода/вывода. Windows NT устанавливает IOPL в 0. Код user-mode режима всегда имеет CPL равный 3, что больше чем IOPL. Следовательно, доступ к портам ввода/вывода в режиме user-mode должен проходить через механизм защиты. Определение того, что CPL меньше чем IOPL ― это первый этап в механизме защиты. Еще раз вернемся к псевдокоду команд IN/OUT
Внимание, вопрос ― а что нам мешает сделать IOPL равным 3? CPL = IOPL и обращение к портам, согласно псевдокоду, переходит в разряд непривилегированных операций, доступных для user-mode приложений Практика Программа делает CPL = IOPL из user-mode режима, драйвер не нужен.
Для того, что бы эта программа работала требуется для аккаунта разрешить привилегию "Действовать как часть операционной системы" ("Act as part of the operating system"), она же SeTcbPrivilege, но не обязательно активный. Аккаунт SYSTEM имеет эту привилегию включенной и активной. По умолчанию эта привилегия отключена даже для админского аккаунта. Описание привилегии "Работа в режиме операционной системы" Это право пользователя позволяет процессу олицетворять любого пользователя без подтверждения подлинности. Таким образом, процесс может получить доступ к тем же локальным ресурсам, что и пользователь. Процессы, которым необходима эта привилегия, должны использовать локальную учетную запись, уже включающую данную привилегию, а не отдельную учетную запись пользователя, которой эта привилегия была назначена специально. Если в организации используются только операционные системы семейства Windows Server 2003, предоставлять эту привилегию нет необходимости. Однако если в организации используются серверы под управлением Windows 2000 или Windows NT 4.0, может потребоваться предоставление этой привилегии программам, обменивающимся паролями в текстовом виде. По умолчанию данной привилегией обладает пользователь "Локальный компьютер". Предостережение! Назначение этой привилегии связано с риском для безопасности компьютера. Предоставляйте эту привилегию только надежным пользователям! Три способа получения привилегии SeTcbPrivilege:
После повышения текущей привелегии до SeTcbPrivilege запускается функция ZwSetInformationProcess, которая имеет четыре параметра:
Далее исходный текст
Разберем нашу программу по шагам. Сначала мы передаем функции LookupPrivilegeValue указатель на структуру LUID_AND_ATTRIBUTES и функция LookupPrivilegeValue заполняет эту структуру текущими значениями привилегии SeTcbPrivilege, далее, на основании данных из структуры LUID_AND_ATTRIBUTES заполняем структуру TOKEN_PRIVILEGES и передаем указатель на структуру TOKEN_PRIVILEGES функции AdjustTokenPrivileges. Но структура TOKEN_PRIVILEGES уже содержит внутри себя структуру LUID_AND_ATTRIBUTES!
при старте нашего приложения на вершине стека лежит адрес функции kernel32.TerminateProcess, а именно ее вызывает функция ExitProcess, поэтому заменяем вызов ExitProcess на команду retn, которая извлечет из стека адрес функции TerminateProcess и передаст на нее управление.
________________________________________ ____
© Mikl___ 2011
6
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Ушел с форума
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
|
||||||
| 23.10.2012, 04:28 | ||||||
|
Доступ к командам In/Out через установку user-mode приложению IOPL=3 Доступ к портам ввода-вывода из user-mode приложения без драйвера Код выполняется с правами SYSTEM, что можно сделать, если работать как сервис, то есть с привилегией "Действовать как часть операционной системы" ("Act as part of the operating system"), она же SeTcbPrivilege. Далее вызывается функция ZwSetInformationProcess (-1, 16, 0, 0) и устанавливаем IOPL=3. Проверено под WinXP SP3. Идея взята здесь. Далее исходный текст scp13
________________________________________ ___
© Mikl___ 2011
5
|
||||||
|
Ушел с форума
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
|
||||||||||||||||
| 23.10.2012, 06:32 | ||||||||||||||||
|
Доступ к командам In/Out через установку user-mode приложению IOPL=3 scp09 при открытии драйвера через CreateFile("\\.\scp09") получаем адрес процесса через IoGetCurrentProcess. Устанавливаем поле KPROCESS.Iopl равным TRUE, в user-mode приложении создаем и запускаем поток, содержащий команды In/Out, для этого нового потока IOPL обновится, следом, после переключения задач, обновится EFLAGS. Полнофункциональный драйвер. Далее исходный текст драйвера scp09.sys
Первый вариант user-mode приложения, которое запускает драйвер scp09.sys user-mode приложение, которое запускает scp09.sys драйвер, используя API-функции Service Control Manager'a: OpenSCManager, CreateService, StartService, CloseServiceHandle и DeleteService. Этот способ очень прост и хорошо документирован, он подходит для постоянной установки драйверов.
Второй вариант user-mode приложения, которое запускает драйвер scp09.sys Предварительно прописываем драйвер scp09.sys в реестре "вручную" (используем функции RegOpenKey, RegCreateKey, RegSetValue) и загружаем драйвер scp08.sys с помощью функции ZwLoadDriver. В реестре создается минимум необходимых записей, запускаем драйвер, выгружаем драйвер функцией ZwUnloadDriver и удаляем его раздел из реестра (используем функции RegCloseKey, SHDeleteKey). Этот способ позволяет запускать драйвер быстро и незаметно и подходит для маленьких программ не требующих установки, но требующих запуска своего драйвера.
________________________________________ ___
© Mikl___ 2011
6
|
||||||||||||||||
|
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557
|
|
| 23.10.2012, 19:21 [ТС] | |
|
Где находятся функции используемые при написанни драйвера? Это системные функции ОС запакованые в dll? Какой нитерфейс предоставляет ОС и драйвер для взаимодействия?
Добавлено через 26 минут Где прочитать все функции используемые в драйверах и описание их? MSDN?
1
|
|
|
Ушел с форума
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
|
||||||||||||||||||||||
| 25.10.2012, 04:25 | ||||||||||||||||||||||
набираешь имя функции в строке поиска MSDN и там будет всё об этой функции, правда на английском, но есть Гугл-переводчик... Добавлено через 6 часов 47 минут Доступ к командам In/Out через установку user-mode приложению IOPL=3 Драйвер scp10 идентификатор процесса ProcessId получает через DeviceIoControl или из реестра или через WriteFile("\\.\scp10"). В функцию PsLookupProcessByProcessId передаем ProcessId и получаем указатель на KPROCESS. Устанавливаем поле KPROCESS.Iopl равным TRUE, в user-mode приложении создаем и запускаем поток, содержащий команды In/Out. Далее исходный текст драйвера scp10.sys
Первый вариант user-mode приложения, которое запускает драйвер scp10.sys user-mode приложение, которое запускает scp10.sys драйвер, используя API-функции Service Control Manager'a: OpenSCManager, CreateService, StartService, CloseServiceHandle и DeleteService. Этот способ очень прост и хорошо документирован, он подходит для постоянной установки драйверов.
Второй вариант user-mode приложения, которое запускает драйвер scp10.sys Предварительно прописываем драйвер scp10.sys в реестре "вручную" (используем функции RegOpenKey, RegCreateKey, RegSetValue) и загружаем драйвер scp10.sys с помощью функции ZwLoadDriver. В реестре создается минимум необходимых записей, запускаем драйвер, выгружаем драйвер функцией ZwUnloadDriver и удаляем его раздел из реестра (используем функции RegCloseKey, SHDeleteKey). Этот способ позволяет запускать драйвер быстро и незаметно и подходит для маленьких программ не требующих установки, но требующих запуска своего драйвера.
________________________________________
© Mikl___ 2011
5
|
||||||||||||||||||||||
|
Ушел с форума
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
|
||||||||||||||||
| 26.10.2012, 03:49 | ||||||||||||||||
|
Доступ к командам In/Out через установку user-mode приложению IOPL=3 В драйвере scp11.sys получаем текущий поток и процесс, функция PsGetContextThread извлекает из стека ядра KTRAP_FRAME и преобразует его в структуру CONTEXT. В поле CONTEXT.RegEFlags устанавливаем флаги IOPL=3 и функция PsSetContextThread копирует переданный CONTEXT в KTRAP_FRAME. В user-mode приложении создаем и запускаем поток, содержащий команды In/Out. Полнофункциональный драйвер. Далее исходный текст драйвера scp11.sys
Первый вариант user-mode приложения, которое запускает драйвер scp11.sys user-mode приложение, которое запускает scp11.sys драйвер, используя API-функции Service Control Manager'a: OpenSCManager, CreateService, StartService, CloseServiceHandle и DeleteService. Этот способ очень прост и хорошо документирован, он подходит для постоянной установки драйверов.
Второй вариант user-mode приложения, которое запускает драйвер scp11.sys Предварительно прописываем драйвер scp11.sys в реестре "вручную" (используем функции RegOpenKey, RegCreateKey, RegSetValue) и загружаем драйвер scp11.sys с помощью функции ZwLoadDriver. В реестре создается минимум необходимых записей, запускаем драйвер, выгружаем драйвер функцией ZwUnloadDriver и удаляем его раздел из реестра (используем функции RegCloseKey, SHDeleteKey). Этот способ позволяет запускать драйвер быстро и незаметно и подходит для маленьких программ не требующих установки, но требующих запуска своего драйвера.
________________________________________ _____
© Mikl___ 2011
5
|
||||||||||||||||
|
Ушел с форума
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
|
||||||||||||||||
| 26.10.2012, 04:31 | ||||||||||||||||
|
Доступ к командам In/Out через установку user-mode приложению IOPL=3 Далее исходный текст драйвера scp12.sys
Первый вариант user-mode приложения, которое запускает драйвер scp12.sys user-mode приложение, которое запускает scp12.sys драйвер, используя API-функции Service Control Manager'a: OpenSCManager, CreateService, StartService, CloseServiceHandle и DeleteService. Этот способ очень прост и хорошо документирован, он подходит для постоянной установки драйверов.
Второй вариант user-mode приложения, которое запускает драйвер scp12.sys Предварительно прописываем драйвер scp12.sys в реестре "вручную" (используем функции RegOpenKey, RegCreateKey, RegSetValue) и загружаем драйвер scp12.sys с помощью функции ZwLoadDriver. В реестре создается минимум необходимых записей, запускаем драйвер, выгружаем драйвер функцией ZwUnloadDriver и удаляем его раздел из реестра (используем функции RegCloseKey, SHDeleteKey). Этот способ позволяет запускать драйвер быстро и незаметно и подходит для маленьких программ не требующих установки, но требующих запуска своего драйвера.
________________________________________ __
© Mikl___ 2011
6
|
||||||||||||||||
|
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557
|
|
| 28.10.2012, 22:26 [ТС] | |
|
Думаю для человека знающего на среднем уровне С++, C# идеальным вариантом для начала изучения драйверов будет => Новая модель драйвера книга "Windows Driver Foundation. ... Автор: Пенни Орвик, Гай Смит. Почитал содержание этой книги и обрадовался. Очень бы хотелось ее достать. В электронном варианте пока не нашел ( на русском языке). Если в кого есть дайте (111000110010@mail.ru)
1
|
|
|
Ушел с форума
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
|
|||||||||||
| 29.10.2012, 06:49 | |||||||||||
|
Доступ к командам In/Out через CallGate scp14-00 для доступа к портам создает CallGate. К сожалению, не на всех машинах с WinXP SP3 псевдоустройство \Device\PhysicalMemory можно открыть с атрибутом SECTION_MAP_WRITE даже с правами Администратора (версия 5.1 сборка 2600.xpsp_sp3_qfe.080423-1303 service pack 3 позволяет, а версия 5.1 сборка 2600.xpsp.080413-2111 service pack 3 ― нет), но там, где открывается ― код работает. Идея калгейта взята у Ms-Rem из статьи «Перехват API функций в Windows NT (часть 3). Нулевое кольцо». Еще один способ, который позволяет перейти в нулевое кольцо и работать в нем не используя драйвер вообще. Способ этот основывается на открытии секции \Device\PhysicalMemory и модификации глобальной таблицы дескрипторов (GDT). В GDT добавляется дескриптор шлюза вызова CallGate, который указывает на наш код выполняющийся в нулевом кольце. После чего производится вызов шлюза командой дальнего вызова CALL FAR, которая изменяет привилегии кода и передает управление нашему коду
Следует обратить внимание на то, что нужную нам секцию нельзя сразу открыть на запись, так как полный доступ к ней имеет только система, нужно сначала изменить атрибуты безопасности секции разрешив текущему пользователю открывать её на запись, после чего секцию можно открыть и установить старые атрибуты безопасности обратно (для большей незаметности). Естественно все эти действия можно проделать только имея права администратора. В этом коде Ring0CallProc - адрес кода который может быть вызван через установленный шлюз и будет выполнен в нулевом кольце защиты. Селектор установленного шлюза будет равен DWORD(CurrentGate) - DWORD(ptrGDT) - offset, смещение неважно. Теперь для вызова нашего кода достаточно выполнить дальний вызов FAR CALL на установленный шлюз. Когда необходимость в шлюзе отпадет, его необходимо убрать. Далее исходный текст scp14
_________________________________
© Mikl___ 2011
4
|
|||||||||||
|
Ушел с форума
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
|
|||||||||||
| 29.10.2012, 07:16 | |||||||||||
|
Доступ к командам In/Out. Ответ ajak от Indy/Clerk'а Вопрос ― Как модифицировать IOPM?Ответ ― Логически подумать никак не получается? Если смещение карты IOPM находится за пределами сегмента TSS, то карта IOPM не используется, а доступ к портам определятся содержимым 12 и 13 битов в регистре флагов (поле IOPL). Если карта IOPM находится в пределах сегмента, то доступ к порту определяется соответствующим битом в ней. Так как VDM процессов может быть несколько, а карта IOPM для них только и используется (то есть для user-mode VDM процессов), значит смещение карты IOPM в TSS для этих процессов изменяется. Изменяться смещение может только шедулером, следовательно, где-то в информации связанной с процессом это смещение должно храниться. Известно, что описатель процесса (непосредственно объект) ― это структура EPROCESS. Взглянув на нее, сразу находим нужное поле:
Для подтверждения можно загрузить IOPM в TSS и установить смещение её в KPROCESS, после чего подождать, пока не произойдет свопинг посредством функции NtYieldExecution. После этого окажется что порт доступен, так как смещение будет загружено в TSS (разумеется на текущем процессоре). Ведь так просто ![]() ________________________________________ ______
© Mikl___ 2011
4
|
|||||||||||
|
Ушел с форума
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 06.11.2012, 09:42 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Доступ к портам ввода/вывода через прерывание Вызовем код, содержащий команды in/out через какое-нибудь прерывание. При этом оно (и это вполне естественно) не должно использоваться системой. Пусть его номер будет, допустим, 99h. Содержимое дескрипторной таблицы прерываний (Interrupt Descriptor Table ― IDT) можно посмотреть утилитой IdtDump, написанной Four-F и входящей в KmdKit. Теория ― мать склероза
Далее индексируемся на описатель 99h прерывания в таблице IDT и меняем его так, чтобы управление передалось на нашу подпрограмму Дескрипторная таблица прерываний (Interrupt Descriptor Table, IDT), состоит из 8-ми байтных дескрипторов для каждого прерывания, которые могут содержать шлюзы задачи, прерывания и ловушки. Формат IDT напоминает дескриптор из GDT/LDT. Первое и последнее слова дескриптора шлюза прерывания содержат 32-х разрядный адрес обработчика прерывания (зеленое поле "смещение" на картинке). Второе слово содержит селектор сегмента кода, где находится код обработчика.
Практика ― сестра шизофрении
Далее исходный текст драйвера scp16.sys
______________________________
© Mikl___ 2012
6
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Ушел с форума
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
|
|
| 30.01.2014, 11:53 | |
|
системный динамик играет не «Марш клоунов» Нино Ротта, а "Марш гладиаторов" (Opus 68 march (Vjezd gladiátorů)) чешского композитора Julius Fučík (1872-1916), написан марш в 1897 году
0
|
|
|
Ушел с форума
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
|
|
| 30.01.2014, 12:47 | |
|
А вот это "Марш клоунов" Нино Ротта
1
|
|
|
110 / 41 / 0
Регистрация: 30.09.2013
Сообщений: 575
|
||
| 19.03.2014, 18:47 | ||
|
0
|
||
|
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557
|
|
| 19.03.2014, 18:53 [ТС] | |
|
Уолтер Они Windows Driver Model 2-е издание
1
|
|
|
45 / 44 / 1
Регистрация: 11.07.2012
Сообщений: 1,024
|
|
| 30.06.2017, 08:16 | |
|
0
|
|
|
Модератор
|
|
| 30.06.2017, 18:08 | |
|
Как и многое другое из мира прошлого - в webarchive http://web.archive.org/web/201... hp?list=21
2
|
|
|
45 / 44 / 1
Регистрация: 11.07.2012
Сообщений: 1,024
|
||||
| 04.07.2017, 14:22 | ||||
|
Добавлено через 29 минут Добавлено через 8 минут
0
|
||||
| 04.07.2017, 14:22 | |
|
Помогаю со студенческими работами здесь
39
Написать драйвер для мышки Можно ли написать свой драйвер для мышки? Как скорректировать драйвер принтера Как установить свой драйвер? Как работает драйвер swapBuffers Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер.
Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
|
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта
Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
|
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром.
возможно получится прикрутить интерпретатор питон для кастомизации игровой логики.
что есть на текущий момент:. . .
|
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2.
Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
|
|
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
|
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2.
Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
|
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2.
Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом.
В. . .
|
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2.
Задача: отобразить спецтехнику, которая на данный момент находится в ремонте.
Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
|