Форум программистов, компьютерный форум, киберфорум
Программирование драйверов
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/40: Рейтинг темы: голосов - 40, средняя оценка - 4.73
75 / 9 / 1
Регистрация: 07.06.2016
Сообщений: 132

Фильтрующий драйвер клавиатуры

07.08.2016, 21:46. Показов 9412. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь написать фильтрующий драйвер по известной книжке (код внизу). Хочу перехватывать IMJ_IRP_READ с клавиатуры и выводить в дебагерское окно скан-коды нажатых клавиш. Для контроля, установился ли драйвер и куда он установился использую Device Tree v2.30. Пытаюсь встать поверх KeyboardClass0. Драйвер устанавливается, но почему то не туда. Как я понимаю в Device Tree он должен отражаться как Attached к драйверу клавиатуры, а он отражается там просто как отдельный драйвер, хоть и с типом FILE_DEVICE_KEYBOARD. Ну и естественно, нажатия клавиш не перехватываются.

Функция включения драйвера в цепочку - InjectDriver. Вот тут WCHAR targetNameBuff[24] = L"\\Device\\KeyboardClass0" изначально было CCHAR, но компилятор ругался и выдавал ошибку двухбайтовой строки. Пришлось заменить на WCHAR. При сборке, правда, вот здесь RtlInitAnsiString (&ntNameString, targetNameBuff); выдавал предупреждение о конфликте типов WCHAR и PCSZ. Если передавать во так RtlInitAnsiString (&ntNameString, (PCSZ)targetNameBuff) - то предупреждений нет, но и толку нет. Может я действительно неправильно передаю название объекта устройства?

Еще есть предположение о неправильной установке флагов. В книге написано, что флаги должны быть установлены точь-в-точь, как и в нижнем устройстве. По Device Tree у KeyboardClass0 установлены флаги BUFFERED_IO, DEVICE_HAS_NAME,DRVO_LEGACY_RESOURSES,DO _POWER_PAGABLE. В InjectDriver я установил только BUFFERED_IO, DO_POWER_PAGABLE и DRVO_LEGACY_DRIVER. А вот этих флагов DEVICE_HAS_NAME,DRVO_LEGACY_RESOURSES компилятор вообще не видит, поэтому я установил хотя бы DRVO_LEGACY_DRIVER - очень похоже, что это одно и тоже. Но DEVICE_HAS_NAME все равно не установлен - может из-за этого ошибка?

IoCreateDevice и IoAttachDevice ошибок не выдают. Служба запускается, драйвер устанавливается. Система 64-бит 10-я винда. Пишу в VS2015.


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <wdm.h>
#include <ntddk.h>
#include <Ntdef.h>
#include <Ntddkbd.h>
int numPendingIrps = 0;
 
VOID Unload(DRIVER_OBJECT* pDriverObj)
{
};
 
typedef struct _DEVICE_EXTENSION
{
    PDEVICE_OBJECT pKeyboardDevice;
    PETHREAD pThreadObj;
    BOOLEAN pThreadTerminate;
    LIST_ENTRY QueuelistHead;
}DEVICE_EXTENSION, *PDEVICE_EXTENSION;
 
NTSTATUS OnStubDispatch (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
    Irp->IoStatus.Status = STATUS_SUCCESS;
     IoCompleteRequest(Irp,IO_NO_INCREMENT);
      DbgPrint("IRP WorkSpace");
       return STATUS_SUCCESS;
};
NTSTATUS OnReadCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp, IN PVOID Context)
{
    PDEVICE_EXTENSION pKeyboardDeviceExtention = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
    if (pIrp->IoStatus.Status == STATUS_SUCCESS)
    {
        PKEYBOARD_INPUT_DATA keys = (PKEYBOARD_INPUT_DATA)pIrp->AssociatedIrp.SystemBuffer;
        int numkeys = pIrp->IoStatus.Information / sizeof(PKEYBOARD_INPUT_DATA);
        for (int i = 0; i < numkeys;i++)
            DbgPrint("Scancode: %x/n", keys[i].MakeCode);
            numPendingIrps--;
    };
        return pIrp->IoStatus.Status;
    
};
NTSTATUS ReadIntercept(IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp)
{
    IoCopyCurrentIrpStackLocationToNext(pIrp);
     IoSetCompletionRoutine(pIrp, OnReadCompletion, DeviceObject, TRUE, TRUE, TRUE);
      numPendingIrps++;
    NTSTATUS ntStatus = IoCallDriver(((PDEVICE_EXTENSION)DeviceObject->DeviceExtension)->pKeyboardDevice, pIrp);
     return ntStatus;
 
};
 
 
NTSTATUS InjectDriver(IN PDRIVER_OBJECT pDriverObj)
{
    PDEVICE_OBJECT targetDevice;
      NTSTATUS ntStatus = IoCreateDevice(pDriverObj, sizeof(DEVICE_EXTENSION), NULL, FILE_DEVICE_KEYBOARD, 0, TRUE, &targetDevice);
    if (!NT_SUCCESS(ntStatus)) {
        KdPrint (("Error IoCreateDevice:", ntStatus)); return ntStatus;
    } else KdPrint(("IoCreate success!"));
      targetDevice->Flags = targetDevice->Flags = (DO_BUFFERED_IO | DO_POWER_PAGABLE | DRVO_LEGACY_DRIVER);
       targetDevice->Flags = targetDevice->Flags &= ~DO_DEVICE_INITIALIZING;
    KdPrint(("Flags set"));
     RtlZeroMemory(targetDevice->DeviceExtension, sizeof(DEVICE_EXTENSION));
       PDEVICE_EXTENSION pKBDdeviceExt = (PDEVICE_EXTENSION)targetDevice->DeviceExtension;
     WCHAR targetNameBuff[24] = L"\\Device\\KeyboardClass0";
       STRING ntNameString;
       UNICODE_STRING uKBDname;
      RtlInitAnsiString (&ntNameString, targetNameBuff);
    if (!NT_SUCCESS(ntStatus)) 
        KdPrint(("Error Ansi String Init:", ntStatus));
      RtlAnsiStringToUnicodeString(&uKBDname, &ntNameString, TRUE);
    if (!NT_SUCCESS(ntStatus)) 
        KdPrint(("Error Ansi to Unicode:", ntStatus));
      IoAttachDevice(targetDevice, &uKBDname, &pKBDdeviceExt->pKeyboardDevice);
    if (!NT_SUCCESS(ntStatus)) {
        KdPrint(("Error Attaching device:", ntStatus)); return ntStatus;
    }
     RtlFreeUnicodeString(&uKBDname);
    return STATUS_SUCCESS;
};
 
const WCHAR DeviceNameBuff[] = L"\\Device\\FilterDevice18";
PDEVICE_OBJECT glDevice;
 
NTSTATUS DriverEntry(DRIVER_OBJECT* pDriverObj, UNICODE_STRING* pRegPath)
{
    NTSTATUS ntStatus;
    UNICODE_STRING deviceNameUS;
      RtlInitUnicodeString(&deviceNameUS, DeviceNameBuff);
        ntStatus = IoCreateDevice(pDriverObj,0, &deviceNameUS,00001234,0,TRUE,&glDevice);
         if (!NT_SUCCESS(ntStatus))
     {
         KdPrint(("Error create device:\n", ntStatus)); return ntStatus;
     }
     else KdPrint(("Device create successfull!\n"));
      
 
    pDriverObj->DriverUnload = Unload;
    for (int i = 0;i<IRP_MJ_MAXIMUM_FUNCTION; i++)
        pDriverObj->MajorFunction[i] = OnStubDispatch;
    pDriverObj->MajorFunction[IRP_MJ_READ] = ReadIntercept;
    InjectDriver(pDriverObj);
 
    
 
    return STATUS_SUCCESS;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.08.2016, 21:46
Ответы с готовыми решениями:

Драйвер usb-клавиатуры
Здравствуйте. Я не понимаю, как правильно написать драйвер. Предполагаю, что сначала с помощью in-out найти USB, определить, что это...

Фильтрующий запрос
Друзья, не хочется городить огород, поэтому прошу совета – как можно лаконично сформулировать SQL запрос, в результате...

Драйвер ММ-клавиатуры
Захотелось написать свой драйвер, точнее обычную программу, которая организует работу мультимедия клавы... По сути надо: 1. перехватить...

30
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
30.08.2016, 08:12
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от NatiF Посмотреть сообщение
Только через INF? Простого прописывания в реестр недостаточно?
INF - самый простой способ.
Но можно, если хочешь, ручками повторить всю последовательность установки,
которую выполняет система, только это будет долго и нудно.

Цитата Сообщение от NatiF Посмотреть сообщение
INF вызовет диалоговые окна с юзером, я правильно понимаю?
Насколько я помню, при установке фильтра класса клавиатуры или мыши окно с
предупреждением вылазит только на XP и Server 2003, а на Vista и выше все тихо.
0
75 / 9 / 1
Регистрация: 07.06.2016
Сообщений: 132
31.08.2016, 20:53  [ТС]
Убежденный, вот переписал код с учетом переваренного:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <wdm.h>
#include <ntddk.h>
#include <Ntdef.h>
#include <Ntddkbd.h>
 
VOID Unload(DRIVER_OBJECT* pDriverObj)
{
};
 
typedef struct _DEVICE_EXTENSION
{
    PDEVICE_OBJECT deviceObject;
    PDEVICE_OBJECT lowerDevice;
    PDEVICE_OBJECT Pdo;
}DEVICE_EXTENSION, *PDEVICE_EXTENSION;
 
NTSTATUS DispatchPower(IN PDEVICE_OBJECT Fido, IN PIRP Irp)
{
    
    PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)Fido->DriverObject;
    PoStartNextPowerIrp(Irp);
    IoSkipCurrentIrpStackLocation(Irp);
    NTSTATUS ntStatus = IoCallDriver(pdx->lowerDevice, Irp);
    return ntStatus;
}
 
NTSTATUS DispatchPNP(IN PDEVICE_OBJECT Fido, IN PIRP Irp)
{
 
    PIO_STACK_LOCATION stackLOCATE = IoGetCurrentIrpStackLocation(Irp);
    ULONG bigudi = stackLOCATE->MinorFunction;
    NTSTATUS ntStatus;
    PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)Fido->DeviceExtension;
     
        if (bigudi == IRP_MN_REMOVE_DEVICE)
     {
         Irp->IoStatus.Status = STATUS_SUCCESS;
         IoSkipCurrentIrpStackLocation(Irp);
         ntStatus = IoCallDriver(pdx->lowerDevice, Irp);
         IoDetachDevice(pdx->lowerDevice);
         IoDeleteDevice(Fido);
         return ntStatus;
 
    };
    
    IoSkipCurrentIrpStackLocation(Irp);
     ntStatus = IoCallDriver(pdx->lowerDevice, Irp);
      return ntStatus;
}
 
NTSTATUS OnStubDispatch (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
    DbgPrint("IRP WorkSpace\n");
    PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
    IoSkipCurrentIrpStackLocation(Irp);
    NTSTATUS ntStatus = IoCallDriver(pdx->lowerDevice, Irp);
    return ntStatus;
};
 
NTSTATUS AddDevice(IN PDRIVER_OBJECT pDriverObj, PDEVICE_OBJECT pdo)
{
    PDEVICE_OBJECT sourceDevice,fdo;
    
    NTSTATUS ntStatus = IoCreateDevice(pDriverObj, sizeof(DEVICE_EXTENSION), NULL, FILE_DEVICE_KEYBOARD, 0, FALSE, &sourceDevice);
    if (!NT_SUCCESS(ntStatus)) {
        KdPrint (("Error IoCreateDevice:", ntStatus)); return ntStatus;
    } else KdPrint(("IoCreate success!\n"));
    PDEVICE_EXTENSION pKBDdeviceExt = (PDEVICE_EXTENSION)sourceDevice->DeviceExtension;
      do
        {
            pKBDdeviceExt->deviceObject = sourceDevice;
            pKBDdeviceExt->Pdo = pdo;
             fdo = IoAttachDeviceToDeviceStack(sourceDevice,pdo);
            pKBDdeviceExt->lowerDevice = pdo;
             sourceDevice->Flags = fdo->Flags & (DO_BUFFERED_IO | DO_POWER_PAGABLE | DO_DIRECT_IO);
             sourceDevice->Flags = fdo->Flags &= ~DO_DEVICE_INITIALIZING;
             
      } while (FALSE);
      if (fdo==0)
          KdPrint(("Error Attaching device", ntStatus));
      KdPrint(("Device attached!\n"));
    
    return ntStatus;
};
 
 
NTSTATUS DriverEntry(DRIVER_OBJECT* pDriverObj, UNICODE_STRING* pRegPath)
{
    pDriverObj->DriverUnload = Unload;
    pDriverObj->DriverExtension->AddDevice = AddDevice;
    for (int i = 0;i<=IRP_MJ_MAXIMUM_FUNCTION; i++)
        pDriverObj->MajorFunction[i] = OnStubDispatch;
    pDriverObj->MajorFunction[IRP_MJ_POWER] = DispatchPower;
    pDriverObj->MajorFunction[IRP_MJ_PNP] = DispatchPNP;
        
    return STATUS_SUCCESS;
}
Теперь обрабатывается только IRP_MJ_POWER и IRP_MJ_PNP с кодом IRP_MN_REMOVE_DEVICE. В последнем после передачи IRP вниз вставил IoDetachDevice(pdx->lowerDevice) и IoDeleteDevice(Fido). Решил не вставлять PoCallDriver, так как пока это не нужно.

Все никак не пойму, надо ли еще что-то добавлять? Нужно ли регистрировать интерфейс устройства? В Уолтера нет указания, что это обязательно. Только если драйвер будет с приложениями общаться через IOCTL, мне тут такого вроде бы не надо.

По порядку регистрации драйвера.
1. Пишем INF по типу такого:
[INF]
[Version]
Signature=NatiF
[Defaultlnstall]
CopyFiles=CopyClassFilters AddReg=FilterAddReg
[Defaultlnstall.Services]
AddService^MyDriver,.FilterAddService
[SourceDisksFiles] MyDriver.sys-l
[SourceDisksNames]
T="Filter install disk"
[DestinationDirs]
DefaultDestDir-12
[CopyClassFiIters] MyDriver.sys,,tZ
[FilterAddService]
ServiceType-1
ErrorContrcfWl
StartType=3
ServiceBinary=%12%\ MyDriver. sys [FilterAddReg]
HKLM,*CLASSKEY*,UpperFi1ters,REG_EXPAND_ SZ,MyDriver
[Strings]
CLASSKEY-HKLM\SYSTEM\CurrentControlSet\Control\Cl ass\{4d36e96b-e325-11ce-bfc1-08002be10318}
[/INF]

2. Пишем инсталятор, где вызываем InstallHinfSection с полным адресом INF-файла. Он запускает INF, который регистрирует драйвер. После чего происходит перестройка стека драйверов и драйвер начинает работать.

Правильно?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
01.09.2016, 09:14
Цитата Сообщение от NatiF Посмотреть сообщение
Все никак не пойму, надо ли еще что-то добавлять? Нужно ли регистрировать интерфейс устройства?
Это не требуется. У тебя же фильтрующий драйвер, ему это не нужно.
Интерфейс устройства регистрируют драйверы ниже по стеку.

Цитата Сообщение от NatiF Посмотреть сообщение
Пишем инсталятор, где вызываем InstallHinfSection с полным адресом INF-файла. Он запускает INF, который регистрирует драйвер. После чего происходит перестройка стека драйверов и драйвер начинает работать.
Чуть не так. Перестроение стека, насколько я помню, нужно делать самому.
Я уже не помню деталей, т.к. устанавливаю такие драйверы обычно через WiX Toolset
(элемент называется Difxapp:Driver).
0
75 / 9 / 1
Регистрация: 07.06.2016
Сообщений: 132
01.09.2016, 16:49  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Я уже не помню деталей
Но INF и инсталлятор с InstallHinfSection писать точно нужно?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
01.09.2016, 17:24
Да.
Для PnP-драйверов, в том числе и таких фильтров, как верхний фильтрующий
драйвер класса клавиатуры, INF-файл - это единственный легальный и
документированный способ установки.
1
18 / 18 / 7
Регистрация: 20.03.2012
Сообщений: 585
08.09.2016, 16:11
Цитата Сообщение от NatiF Посмотреть сообщение
Пытаюсь написать фильтрующий драйвер по известной книжке
Скажите, пожалуйста, о какой книжке речь?
0
75 / 9 / 1
Регистрация: 07.06.2016
Сообщений: 132
08.09.2016, 16:17  [ТС]
Цитата Сообщение от znseday Посмотреть сообщение
Скажите, пожалуйста, о какой книжке речь?
"Руткиты: внедрение в ядро Windows" (Хоглунд Г., Батлер Дж.) - изначально было по ней.
"Использование microsoft windows driver model" (Уолтер Они) - это куда более фундаментальная книжка, по ней более правильно учиться.
1
75 / 9 / 1
Регистрация: 07.06.2016
Сообщений: 132
13.09.2016, 15:49  [ТС]
Убежденный, а где лучше посмотреть как пишется inf-файл для драйвера?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
13.09.2016, 15:56
В сэмплах WDK.
0
75 / 9 / 1
Регистрация: 07.06.2016
Сообщений: 132
13.09.2016, 19:08  [ТС]
Убежденный, поковырялся в MSDN, вот что написал в INF, исходя из вышеизложенного:

[Version]
Signature = "$WINDOWS NT$"
Class = "Keyboard"
ClassGuid = {4d36e96b-e325-11ce-bfc1-08002be10318}
Provider = %Apple%
DriverVer = 06/07/20016,1.0.0.1

[DestinationDirs]
DefaultDestDir = 12

[SourceDisksNames]
1 = %InstDisk%

[SourceDiskFiles]
KbdFilterDRV.sys = 1

[DefaultInstall]
CopyFiles = KbdFilterDRV.sys

[DefaultInstall.Services]
AddService=%DRVServiceName%,,DRV.Service

[DRV.Service]
DisplayName = %DRVServiceName%
Description = %DRVdesctiprion%
ServiceBinary = %12%\KbdFilterDRV.sys
ServiceType = 1
StartType = 3
ErrorControl = 1
AddReg = DRV.AddRegistry

[DRV.AddRegistry]
HKLM,%CLASSKEY%,UpperFilters,0x00020000, 1

[Strings]
CLASSKEY = "SYSTEM\CurrentControlSet\Control\Class\ {4d36e96b-e325-11ce-bfc1-08002be10318}"
Apple = "Apples"
InstDisk = "Source disk"
DRVServiceName = "KBD Filter serivce"
Description = "Test"

Похоже на правду или чего-то не хватает?

Добавлено через 43 минуты
[SourceDisksNames] там вот определяется диск через 1. Это текущий диск или какой-то другой?

В CopyFiles указываем ведь только файл в данном случае? Cat не указываем, ибо драйвер без подписи.

CLASSKEY = "SYSTEM\CurrentControlSet\Control\Class\ {4d36e96b-e325-11ce-bfc1-08002be10318}" - тут не пишем HLKM, ибо он уже есть в AddRegistry?

В AddRegistry порядок параметров правильный HKLM,%CLASSKEY%,UpperFilters,0x00020000, 1? Тут под 1 подразумевается имя файла, которое выше было определено, так можно делать?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
13.09.2016, 20:02
Цитата Сообщение от NatiF Посмотреть сообщение
Похоже на правду или чего-то не хватает?
"Спрашивай" не у меня, а у inf2cat.exe


Цитата Сообщение от NatiF Посмотреть сообщение
[SourceDisksNames] там вот определяется диск через 1. Это текущий диск или какой-то другой?
В CopyFiles указываем ведь только файл в данном случае? Cat не указываем, ибо драйвер без подписи.
CLASSKEY = "SYSTEM\CurrentControlSet\Control\Class\ {4d36e96b-e325-11ce-bfc1-08002be10318}" - тут не пишем HLKM, ибо он уже есть в AddRegistry?
Извини, но я тебя просто отправлю в MSDN, там есть все ответы:

Overview of INF Files
https://msdn.microsoft.com/en-... -inf-files
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.09.2016, 20:02

Макрос, фильтрующий по дате
Здравствуйте! Есть код, в котором нужно чтобы дата выбиралась не текущая (сегодняшняя, а предыдушая) как это исправить? спасибо...

Драйвер стандартной клавиатуры
Доброе время дня. Я уже обращался с похожим делом, но тогда я не знал причины. Сейчас это произошло опять... Но я засек причину -...

Драйвер клавиатуры и мыши.
Здравствуйте! Может кто-нибудь дать исходники на драйвер клавиатуры и мыши с подробным описанием строк. Или любой небольшой исходник...

Помогите написать драйвер клавиатуры!
1)Издающий писк только при вводе цифр на дополнительной клавиатуре 2)Издающий писк, если слово оканчивается буквой &quot;в&quot; ...

Драйвер для миди клавиатуры
требуется написать драйвер для миди клавиатуры. подскажите как это сделать или если есть у кого программа киньте буду очень благодарен. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru