Форум программистов, компьютерный форум, киберфорум
Программирование драйверов
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 1
Регистрация: 21.06.2012
Сообщений: 14

Вывод результата функции из драйвера в приложение

21.03.2017, 23:03. Показов 2246. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, прошу помочь с выводом результата функции в драйвере(cpuCount) в приложение.
Вот код самого драйвера:
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#include <ntddk.h>
#include <ntstrsafe.h>
 
#include "..\FirstDrv\PublicData.h"
 
typedef struct _MyDEVICE_EXTENTIONAL {
    UCHAR  BufSize[TheBufferLenght]; 
} DeviceExtentional;
 
 
#ifdef _DEBUG
    #define DBG_BREAK   __debugbreak();
#else
    #define DBG_BREAK   {}
#endif
 
NTSTATUS 
DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
 
NTSTATUS
FirstDrvCreate(IN PDEVICE_OBJECT DeviceObject,
                IN IRP *pIrp);
 
NTSTATUS 
FirstDrvClose(IN PDEVICE_OBJECT DeviceObject,
               IN IRP *pIrp);
 
NTSTATUS 
FirstDrvIoDeviceControl(IN PDEVICE_OBJECT DeviceObject,
                                 IN IRP *pIrp);
 
//#ifdef ALLOC_PRAGMA
//#pragma alloc_text( INIT, DriverEntry )
//#pragma alloc_text( PAGE, CreateClose ) 
//#pragma alloc_text( PAGE, IoDeviceControl)
//#endif
 
//Процедура инициализации драйвера
NTSTATUS
DriverEntry(IN PDRIVER_OBJECT DriverObject,
            IN PUNICODE_STRING RegistryPath)
{
    NTSTATUS ntStatus;
    UNICODE_STRING DosDeviceName, ntDevName;
    
    PDEVICE_OBJECT fdo = NULL; //указатель на объект драйвера
 
#ifdef _DEBUG
    __debugbreak();
#endif
    DBG_BREAK
 
    
    RtlInitUnicodeString(&ntDevName, NT_DEVICE_NAME);
    RtlInitUnicodeString(&DosDeviceName, L"\\DosDevices\\MyDosDevice");
    
    
    //
    //создание объекта устройства
    //
    
 
        ntStatus  = IoCreateDevice(
        DriverObject,       //объект драйвера
        sizeof(DeviceExtentional),                  //device extension size
        &ntDevName,         //имя устройства
        FILE_DEVICE_UNKNOWN,    //тип устройства
        FILE_DEVICE_SECURE_OPEN,    //характеристики устройства
        FALSE,
        &fdo);      //указывает на область памяти, в которой функция сохраняет адрес созданного объекта устройства
 
    if (ntStatus!=STATUS_SUCCESS)
    {
        DbgPrint("Error, cannot create ntDevName.\n");
        return STATUS_FAILED_DRIVER_ENTRY;
    }
    
    DbgPrint("Create ntDevName successfully.\n");
 
    ntStatus = IoCreateSymbolicLink(&DosDeviceName,&ntDevName);
 
    if (ntStatus!= STATUS_SUCCESS){
        DbgPrint("Do not create symbolic link of device: %d\n", ntStatus);
        return STATUS_FAILED_DRIVER_ENTRY;
    }
    
    DbgPrint("Symbolic link create successfully\n");
 
    DriverObject->MajorFunction[IRP_MJ_CREATE] = FirstDrvCreate;
    DriverObject->MajorFunction[IRP_MJ_CLOSE] = FirstDrvClose;
    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = FirstDrvIoDeviceControl;
 
    return ntStatus;
}
 
NTSTATUS FirstDrvCreate(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
    Irp->IoStatus.Status = STATUS_SUCCESS;
    Irp->IoStatus.Information = 0;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
    return STATUS_SUCCESS;
 
}
 
NTSTATUS FirstDrvClose(IN PDEVICE_OBJECT DeviceObject,
               IN PIRP Irp)
{
    Irp->IoStatus.Status = STATUS_SUCCESS;
    Irp->IoStatus.Information = 0;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);
    return STATUS_SUCCESS;
 
}
 
NTSTATUS 
FirstDrvIoDeviceControl(IN PDEVICE_OBJECT DeviceObject,
                        IN PIRP Irp)
{
 
 
    KAFFINITY           CurrentAffinity;
    ULONG               cpuCount;
    NTSTATUS            ntStatus = STATUS_NOT_IMPLEMENTED;
    DWORD               dwReturnSize = 0;
    PIO_STACK_LOCATION  CurrentLocation = IoGetCurrentIrpStackLocation(Irp);
    ULONG               InputBufLenght= CurrentLocation->Parameters.DeviceIoControl.InputBufferLength;
    ULONG               OutputBufLenght= CurrentLocation->Parameters.DeviceIoControl.OutputBufferLength;
    ULONG               mapSize;
    
 
    if( MY_IOCTL_QUERY_ACTIVE_PROC == CurrentLocation->Parameters.DeviceIoControl.IoControlCode)
    {
        PVOID   pdwOutBuff = Irp->AssociatedIrp.SystemBuffer;  //получение адреса буфера
        CurrentAffinity = KeQueryActiveProcessors();
         mapSize = sizeof(CurrentAffinity);
         cpuCount = 0;
     while (mapSize--)
     {
         if(CurrentAffinity & 1)
             ++cpuCount;
         CurrentAffinity >>=1;
 
     }
     if(cpuCount ==0)
         return 1;
     return cpuCount;
    
     DbgPrint("%d", cpuCount);
    
        if(OutputBufLenght)
        {
            pdwOutBuff = Irp->AssociatedIrp.SystemBuffer;   //получаем адрес буфера
            RtlCopyBytes(pdwOutBuff, &cpuCount, OutputBufLenght);
            Irp->IoStatus.Information = (OutputBufLenght < sizeof(dwReturnSize) ? OutputBufLenght: sizeof(dwReturnSize));
 
 
            ntStatus = STATUS_SUCCESS;
            dwReturnSize = sizeof(DWORD);
        }
            //*pdwOutBuff = &cpucount;
    }
 
    Irp->IoStatus.Status = ntStatus;
    Irp->IoStatus.Information = dwReturnSize;//количество переданных байт
    IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
    return ntStatus;
 
}
А вот код моего приложения:
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <windows.h>
#include <winioctl.h>
#include <stdio.h>
#include <stdlib.h>
#include <strsafe.h> 
 
#include "..\App\PublicData.h"
 
//
//Процедура управлением драйвером. 
//
 BOOLEAN ManageDriver(
    _In_ LPCTSTR DriverName,//Имя драйвера
    _In_ LPTSTR ServiceName,//Адрес драйвера
    _In_ USHORT Function    //Код функции, которую нужно выполнить
    );
 
 
 //
 //Процедура установки имени драйвера
 //
 BOOLEAN SetupDriverName(
 
     __inout PWCHAR DriverLocation,
     __in ULONG BufferLenght     );
 
 //
 //Основная функция, точка входа в программу
 //
 VOID _cdecl main(ULONG argc,
                  PCHAR argv[] )
 {
     HANDLE hDevice;
     HANDLE hout;
     ULONG  bytesReturned;
     BOOL   getdrdata;
     DWORD  errNum=0;
 
     BYTE   dbOutputBuff[0x20] = {0};
     WCHAR  DriverLocation[MAX_PATH] = {0};
 
     UNREFERENCED_PARAMETER (argc);
     UNREFERENCED_PARAMETER (argv);
 
     //
     //Открытие устройства
     //
     printf("\n Try CreateFile by NTDevice name\n");
     hDevice = CreateFile(USER_MODE_NT_DEVICE_NAME, 
         GENERIC_READ| GENERIC_WRITE,
         0,
         NULL,
         OPEN_EXISTING,
         FILE_ATTRIBUTE_NORMAL,
         NULL);
 
     if ( INVALID_HANDLE_VALUE == hDevice )
     {
         errNum = GetLastError();
         printf("Error in created file: %d\n", errNum);
     }
 
     if ( INVALID_HANDLE_VALUE == hDevice )
     {
         printf("\n Try CreateFile by Symbolic Link DosDevice\n");
         hDevice = CreateFile(L"\\\\.\\MyDosDevice",    //формат символьной ссылки в режиме пользователя
             GENERIC_READ | GENERIC_WRITE,                  //определение способа передачи данных
             0,             //режим совместного использования
             NULL,                                          //позволяет задать атрибуты защиты для связанного с устройством объекта ядра.
             OPEN_EXISTING,               
             FILE_ATTRIBUTE_NORMAL,
             NULL);
     }
 
     if (hDevice == INVALID_HANDLE_VALUE)
     {
         printf("Error in CreateFile: %d\n", GetLastError());
         getchar();
         return;
     }
     getchar();
     
     //
     //Получение данных из драйвера
     //
 
     getdrdata= DeviceIoControl(                //Отправляет управляющий код непосредственно указанному драйверу устройства
         hDevice,                               //Идентификатор устройства
         MY_IOCTL_QUERY_ACTIVE_PROC,            //Управляющий код для операции
         NULL,                                  //Указатель на буфер ввода данных
         (DWORD)NULL,                           //Размер буфера ввода данных
          dbOutputBuff,                             //Указатель на буфер вывода данных, который должен получить данные, возвращенные операцией.
          sizeof(dbOutputBuff),                     //Размер буфера вывода данных
          &bytesReturned,                       //Размер данных , сохраненных в буфере вывода данных
          NULL);
 
     if(!getdrdata){
         printf("Error in DeviceIoControl: %d \n", GetLastError());
         getchar();
         return;
     }
 
     CloseHandle(hDevice);
     //Создание бинарного файла
     hout = CreateFile(
         L"drvdata.bin",
         GENERIC_WRITE,
         0,
         NULL,
         CREATE_ALWAYS,
         FILE_ATTRIBUTE_NORMAL,
         NULL);
 
     if (hout == INVALID_HANDLE_VALUE)
     {
         printf("Error in CreateFile: %d \n", GetLastError());
         getchar();
         return;
     }
     
     WriteFile(hout, dbOutputBuff, sizeof(dbOutputBuff),&errNum, NULL);
 
     // Close handle file
     CloseHandle(hout);
 
        printf("Successfully. \n");
        getchar();
}
Строго не судить, это мой первый драйвер, очень надеюсь на вашу помощь. Заранее спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.03.2017, 23:03
Ответы с готовыми решениями:

Вывод результата функции
Приветствую всех! Изучал и тщательно исследовал функции и процедуры, на консоли все окейно выходит, вот решил я проэксперементировать...

Вывод результата функции
В общем, задание такое: Сформировать двумерный массив A размером 3 x 2 с помощью генератора случайных чисел и вывести элементы массива на...

Вывод результата функции
Здравствуйте. Почему функция повторяется 1 раз при присваивание результатов функции: int numbers(int high,int low); int main() ...

10
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
22.03.2017, 08:49
Сначала замечания по коду:

C
1
2
3
4
5
#ifdef _DEBUG
    #define DBG_BREAK   __debugbreak();
#else
    #define DBG_BREAK   {}
#endif
Вместо этого можно использовать готовый макрос:

KdBreakPoint function
https://msdn.microsoft.com/en-... s.85).aspx



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
    //
    //создание объекта устройства
    //
    
 
        ntStatus  = IoCreateDevice(
        DriverObject,       //объект драйвера
        sizeof(DeviceExtentional),                  //device extension size
        &ntDevName,         //имя устройства
        FILE_DEVICE_UNKNOWN,    //тип устройства
        FILE_DEVICE_SECURE_OPEN,    //характеристики устройства
        FALSE,
        &fdo);      //указывает на область памяти, в которой функция сохраняет адрес созданного объекта устройства
 
    if (ntStatus!=STATUS_SUCCESS)
    {
        DbgPrint("Error, cannot create ntDevName.\n");
        return STATUS_FAILED_DRIVER_ENTRY;
    }
    
    DbgPrint("Create ntDevName successfully.\n");
 
    ntStatus = IoCreateSymbolicLink(&DosDeviceName,&ntDevName);
 
    if (ntStatus!= STATUS_SUCCESS){
        DbgPrint("Do not create symbolic link of device: %d\n", ntStatus);
        return STATUS_FAILED_DRIVER_ENTRY;
    }
Здесь если IoCreateSymbolicLink вернет ошибку, то будет утечка DEVICE_OBJECT (который fdo).



C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
NTSTATUS 
FirstDrvIoDeviceControl(IN PDEVICE_OBJECT DeviceObject,
                        IN PIRP Irp)
{
 
  // ...
  
        if(OutputBufLenght)
        {
            pdwOutBuff = Irp->AssociatedIrp.SystemBuffer;   //получаем адрес буфера
            RtlCopyBytes(pdwOutBuff, &cpuCount, OutputBufLenght);
            Irp->IoStatus.Information = (OutputBufLenght < sizeof(dwReturnSize) ? OutputBufLenght: sizeof(dwReturnSize));
 
 
            ntStatus = STATUS_SUCCESS;
            dwReturnSize = sizeof(DWORD);
        }
Так делать нельзя.
Если драйвер обрабатывает данные от пользователя, т.е. от недоверенной среды, то он
должен максимально "придирчиво" проверять все входные данные. Если запрос
MY_IOCTL_QUERY_ACTIVE_PROC использует Buffered I/O, то в драйвере, как минимум,
необходимо проверять следующее:

1. Irp->AssociatedIrp.SystemBuffer не равен NULL.

2. Размер данных, которые ты читаешь (CurrentLocation->Parameters.DeviceIoControl.
InputBufferLength) или пишешь (CurrentLocation->Parameters.DeviceIoControl.OutputBuffer Length),
должен быть достаточно большим, чтобы вместить всю нужную информацию. Например, если ты
собираешься писать в буфер данные размером DWORD, то должен проверить, что OutputBufferLength
больше, либо равен sizeof (DWORD).

3. Если буфер содержит указатели на память в режиме пользователя, то данные по
соответствующим адресам необходимо обрабатывать особым образом; эта техника называется
'probe and capture' (т.е. точно также, как для запросов типа Neither I/O):

- код, который трогает данные, помещаем в блок __try/__except;
- внутри __try/__except проверяем, что адрес не залезает в ядерную память, что он
имеет правильные атрибуты защиты и выравнивание - ProbeForRead/ProbeForWrite;
- копируем буфер себе в системную память (копирование все еще внутри
__try/__except) и дальше работаем только с ним.

--------

Цитата Сообщение от ИльяМартынов Посмотреть сообщение
прошу помочь с выводом результата функции в драйвере(cpuCount) в приложение.
Так что именно не получается?
1
0 / 0 / 1
Регистрация: 21.06.2012
Сообщений: 14
22.03.2017, 15:12  [ТС]
Не получается передать приложению значение cpuCount. В windbg оно у меня прекрасно вычисляется и показывает его, а сделать вывод этого значения в приложение я не могу.
За замечание огромное спасибо, исправлю.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
22.03.2017, 16:04
У тебя в FirstDrvIoDeviceControl написано буквально следующее:
C
1
2
3
     if(cpuCount ==0)
         return 1;
     return cpuCount;
Из dispatch-функции нельзя просто вернуть код и все (за исключением
некоторых специфических случаев типа STATUS_PENDING).

Тебе нужно получить указатель на буфер, записать в него cpuCount, а
затем завершить IRP с помощью IoCompleteRequest, указав в IRP.IoStatus.Status
значение STATUS_SUCCESS, а в IRP.IoStatus.Information - к-во байт, которые
будут скопированы в приложение. Только так диспетчер ввода-вывода сможет
понять, что какие-то данные были переданы, а запрос ввода-вывода обработан.

Покажи, как у тебя определен MY_IOCTL_QUERY_ACTIVE_PROC.
1
0 / 0 / 1
Регистрация: 21.06.2012
Сообщений: 14
22.03.2017, 16:28  [ТС]
Спасибо за подсказку.
C++
1
#define MY_IOCTL_QUERY_ACTIVE_PROC   CTL_CODE(FILE_DEVICE_UNKNOWN, 0x100, METHOD_BUFFERED, FILE_READ_ACCESS)
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
22.03.2017, 16:34
0x100 - это не по фэншую
MSDN пишет, что следует использовать значения от 0x800 и выше, а
все, что до этого, зарезервировано Microsoft:
FunctionCode

Identifies the function to be performed by the driver. Values of less than 0x800 are reserved for Microsoft. Values of 0x800 and higher can be used by vendors. Note that the vendor-assigned values set the Custom bit.
1
0 / 0 / 1
Регистрация: 21.06.2012
Сообщений: 14
23.03.2017, 00:56  [ТС]
Сделал по "фэншую", поставил значение 0x801.
Если я правильно Вас понял, то сделать надо следующее:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
if(OutputBufLenght)
        {
            pdwOutBuff = Irp->AssociatedIrp.SystemBuffer;   //получаем адрес буфера
            RtlCopyMemory(pdwOutBuff, &cpuCount, OutputBufLenght);
            dwReturnSize = sizeof(DWORD);
            Irp->IoStatus.Information = (OutputBufLenght < sizeof(dwReturnSize) ? OutputBufLenght: sizeof(dwReturnSize));
            ntStatus=STATUS_SUCCESS;
        }
           else ntStatus=STATUS_UNSUCCESSEFUL;
}
Irp.IoStatus.Status=ntStatus;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return ntStatus;
Поправьте, если что не так.
Но, думаю что надо дополнить что-то и в коде самого приложения, чтобы выводилось значение cpuCount в приложение.
Заранее огромное спасибо за помощь!
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
23.03.2017, 08:18
Я бы сделал как-то так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
PVOID Buffer;
ULONG BuffSize;
ULONG const SizeRequired = sizeof (cpuCount);
 
Buffer = Irp->AssociatedIrp.SystemBuffer;
 
if (!Buffer)
{
    LOG_ERR("Buffer is NULL.");
    return (CompleteIrp(Irp, STATUS_INVALID_USER_BUFFER, 0));
}
 
BuffSize = CurrentLocation->Parameters.DeviceIoControl.OutputBufferLength;
 
if (BuffSize != SizeRequired)
{
    LOG_ERR("Invalid buffer size %lu.", BuffSize);
    return (CompleteIrp(Irp, STATUS_INVALID_BUFFER_SIZE, 0));
}
 
RtlCopyMemory(Buffer, &cpuCount, BuffSize);
return (CompleteIrp(Irp, STATUS_SUCCESS, BuffSize));
LOG_ERR - это обертка для DbgPrint/KdPrint/WPP/etc.
1
0 / 0 / 1
Регистрация: 21.06.2012
Сообщений: 14
24.03.2017, 12:28  [ТС]
Спасибо, сделал по вашему примеру, все заработало. Значение записывается в буфер, осталось сделать чтобы приложение считало из буфера эти данные и вывело на экран. Использую функцию ReadFile, подскажите, верно ли?
Огромное спасибо за помощь Вам
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
24.03.2017, 12:38
Цитата Сообщение от ИльяМартынов Посмотреть сообщение
Использую функцию ReadFile, подскажите, верно ли?
Читать данные из драйвера, используя ввод-вывод, можно двумя способами:
либо DeviceIoControl, либо ReadFile. В первом случае драйвер должен реализовать,
помимо стандартных обработчиков IRP_MJ_CREATE и IRP_MJ_CLEANUP/CLOSE,
также обработчик IRP_MJ_DEVICE_CONTROL, а во втором - IRP_MJ_READ.

Разница между этими способами небольшая, общий принцип обмена данными
один и тот же: из приложения в драйвер передается буфер, драйвер заполняет
этот буфер нужной информацией, а затем заполняет соответствующие поля IRP и
вызывает IoCompleteRequest, завершая запрос.

При этом тип передачи (Buffered I/O, Direct I/O или Neither I/O) определяется
по-разному: для DeviceIoControl он "закодирован" в IOCTL-коде (см. параметр
Method макроса CTL_CODE), а для ReadFile/WriteFile он определяется по наличию
или отсутствию флагов DO_BUFFERED_IO и DO_DIRECT_IO в DEVICE_OBJECT.

Ну то есть, ReadFile/WriteFile всегда используют один и тот же метод передачи -
тот, который был определен в DEVICE_OBJECT при его создании функцией IoCreateDevice.
А DeviceIoControl может использовать разные типы передачи, т.е. он немного гибче.
0
0 / 0 / 1
Регистрация: 21.06.2012
Сообщений: 14
25.03.2017, 00:50  [ТС]
Благодарю за исчерпывающий ответ. Разложили все "по полочкам", спасибо. Драйвер с приложением почти готовы.
Есть еще вопрос, он касается не совсем драйвера.
Я делаю отладку драйвера через WinDbg и VmWare. VmWare позволяет изменять количество используемых процессоров в настройках. Я тестирую драйвер при разных параметрах, однако он всегда показывает что активен только один процессор. В госте(Windows 7 x64) в диспетчере задач показывает тоже только один проц., хотя в диспетчере устройств отображается то количество, которое я задавал в настройках. p.s. На хосте стоит win10.
Если сталкивались с этим, то объясните возможно ли как то перенастроить VmWare или нельзя.
Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.03.2017, 00:50
Помогаю со студенческими работами здесь

Вывод результата функции в HTML
Привет! Подскажите пожалуйста одну нехитрую вещь. Вот у меня есть код, который по клику открывает модальное окно с информацией об отеле,...

Вывод результата работы функции
Привет! Подскажите пожалуйста. Есть такой код. &lt;body&gt; &lt;form&gt; &lt;input type=&quot;text&quot; id=&quot;testvar&quot;...

Табулирование функции и вывод результата в таблице
Помогите, пожалуйста, решить задачу. Протабулировать функцию с использованием оператора цикла с параметром. Сменная x с шагом h на...

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

Вывод результата функции в двух блоках
Здравствуйте. Есть функция change_sort('views') и есть change_sort('date'). Никак не получается чтоб на одной странице результат первой...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru