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

Через DeviceIoControl отправляется не то сообщение

23.11.2016, 16:23. Показов 1607. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, уважаемые форумчане! Такой вопрос:

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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
/*заголовки*/
#define TOC_DATA_TRACK          0x04
 
HANDLE dir_handle;
OBJECT_ATTRIBUTES object_attributes_g;
UNICODE_STRING device_dir_name;
PDRIVER_OBJECT pDriverObjectGen;
 
/*прототипы функций*/
 
#pragma code_seg("INIT")
 
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,IN PUNICODE_STRING pRegistryPath)
{
    UNREFERENCED_PARAMETER(pRegistryPath);
    NTSTATUS status;
    pDriverObjectGen = pDriverObject;
 
    RtlInitUnicodeString(&device_dir_name, DEVICE_DIR_NAME);
 
    ///
    InitializeObjectAttributes(
        &object_attributes_g,
        &device_dir_name,
        OBJ_PERMANENT,
        NULL,
        NULL
    );
    status = ZwCreateDirectoryObject(
        &dir_handle,
        DIRECTORY_ALL_ACCESS,
        &object_attributes_g
    );
 
    if (!NT_SUCCESS(status))
    {
        return status;
    }
 
    ZwMakeTemporaryObject(dir_handle);
    status = FileDiskCreateNullDevice(pDriverObject, 0, FILE_DEVICE_DISK);
    if (!NT_SUCCESS(status))
    {
        return STATUS_UNSUCCESSFUL;
    }
    ////
    pDriverObject->MajorFunction[IRP_MJ_CREATE] = FileDiskCreateClose;
    pDriverObject->MajorFunction[IRP_MJ_CLOSE] = FileDiskCreateClose;
    pDriverObject->MajorFunction[IRP_MJ_READ] = FileDiskReadWrite;
    pDriverObject->MajorFunction[IRP_MJ_WRITE] = FileDiskReadWrite;
    pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = FileDiskDeviceControl;
 
    pDriverObject->DriverUnload = FileDiskUnload;
 
    //DbgPrint("Loading driver\n");
    return STATUS_SUCCESS;
}
 
NTSTATUS FileDiskCreateDevice(IN PDRIVER_OBJECT DriverObject,IN ULONG Number,IN DEVICE_TYPE DeviceType)
{
    UNICODE_STRING      device_name;
    NTSTATUS            status;
    PDEVICE_OBJECT      device_object;
    PDEVICE_EXTENSION   device_extension;
    UNICODE_STRING      sddl;
 
    ASSERT(DriverObject != NULL);
 
    device_name.Buffer = (PWCHAR)ExAllocatePoolWithTag(PagedPool, MAXIMUM_FILENAME_LENGTH * 2, FILE_DISK_POOL_TAG);
 
    if (device_name.Buffer == NULL)
    {
        return STATUS_INSUFFICIENT_RESOURCES;
    }
 
    device_name.Length = 0;
    device_name.MaximumLength = MAXIMUM_FILENAME_LENGTH * 2;
 
    if (DeviceType == FILE_DEVICE_CD_ROM)
    {
        RtlUnicodeStringPrintf(&device_name, DEVICE_NAME_PREFIX L"Cd" L"%u", Number);
    }
    else
    {
        RtlUnicodeStringPrintf(&device_name, DEVICE_NAME_PREFIX L"%u", Number);
    }
 
    RtlInitUnicodeString(&sddl, _T("D:P(A;;GA;;;SY)(A;;GA;;;BA)(A;;GA;;;BU)"));
 
    status = IoCreateDeviceSecure(
        DriverObject,
        sizeof(DEVICE_EXTENSION),
        &device_name,
        DeviceType,
        0,
        FALSE,
        &sddl,
        NULL,
        &device_object
    );
 
    if (!NT_SUCCESS(status))
    {
        ExFreePool(device_name.Buffer);
        return status;
    }
 
    device_object->Flags |= DO_DIRECT_IO;
 
    device_extension = (PDEVICE_EXTENSION)device_object->DeviceExtension;
 
    device_extension->media_in_device = FALSE;
 
    device_extension->device_name.Length = device_name.Length;
    device_extension->device_name.MaximumLength = device_name.MaximumLength;
    device_extension->device_name.Buffer = device_name.Buffer;
    device_extension->device_number = Number;
    device_extension->device_type = DeviceType;
 
    if (DeviceType == FILE_DEVICE_CD_ROM)
    {
        device_object->Characteristics |= FILE_READ_ONLY_DEVICE;
        device_extension->read_only = TRUE;
    }
    InitializeListHead(&device_extension->list_head);
 
    KeInitializeSpinLock(&device_extension->list_lock);
    // A spin lock can be used to protect shared data or resources from simultaneous access by routines 
    //that can execute concurrently and at IRQL >= DISPATCH_LEVEL in SMP machines.
    KeInitializeEvent(
        &device_extension->request_event,
        SynchronizationEvent,
        FALSE
    );
 
    device_extension->terminate_thread = FALSE;
 
    PIRP irp;
    PLIST_ENTRY request;
    PVOID Context;
    Context = device_object;
    device_object = (PDEVICE_OBJECT)Context;
    device_extension = (PDEVICE_EXTENSION)device_object->DeviceExtension;
 
    request = ExInterlockedRemoveHeadList(&device_extension->list_head, &device_extension->list_lock);
    irp = CONTAINING_RECORD(request, IRP, Tail.Overlay.ListEntry);
    FileDiskOpenFile(device_object, irp);
    return STATUS_SUCCESS;
}
 
NTSTATUS FileDiskCreateNullDevice(IN PDRIVER_OBJECT DriverObject,IN ULONG Number,IN DEVICE_TYPE DeviceType)
{
    UNICODE_STRING      device_name;
    NTSTATUS            status;
    PDEVICE_OBJECT      device_object;
    PDEVICE_EXTENSION   device_extension;
    UNICODE_STRING      sddl;
 
    ASSERT(DriverObject != NULL);
 
    device_name.Buffer = (PWCHAR)ExAllocatePoolWithTag(PagedPool, MAXIMUM_FILENAME_LENGTH * 2, FILE_DISK_POOL_TAG);
 
    if (device_name.Buffer == NULL)
    {
        return STATUS_INSUFFICIENT_RESOURCES;
    }
 
    device_name.Length = 0;
    device_name.MaximumLength = MAXIMUM_FILENAME_LENGTH * 2;
 
    if (DeviceType == FILE_DEVICE_CD_ROM)
    {
        RtlUnicodeStringPrintf(&device_name, DEVICE_NAME_PREFIX L"Cd" L"%u", Number);
    }
    else
    {
        RtlUnicodeStringPrintf(&device_name, DEVICE_NAME_PREFIX L"%u", Number);
    }
 
    RtlInitUnicodeString(&sddl, _T("D:P(A;;GA;;;SY)(A;;GA;;;BA)(A;;GA;;;BU)"));
 
    status = IoCreateDeviceSecure(
        DriverObject,
        sizeof(DEVICE_EXTENSION),
        &device_name,
        DeviceType,
        0,
        FALSE,
        &sddl,
        NULL,
        &device_object
    );
 
    if (!NT_SUCCESS(status))
    {
        ExFreePool(device_name.Buffer);
        return status;
    }
 
    device_object->Flags |= DO_DIRECT_IO;
 
    device_extension = (PDEVICE_EXTENSION)device_object->DeviceExtension;
 
    device_extension->media_in_device = FALSE;
 
    device_extension->device_name.Length = device_name.Length;
    device_extension->device_name.MaximumLength = device_name.MaximumLength;
    device_extension->device_name.Buffer = device_name.Buffer;
    device_extension->device_number = Number;
    device_extension->device_type = DeviceType;
 
    if (DeviceType == FILE_DEVICE_CD_ROM)
    {
        device_object->Characteristics |= FILE_READ_ONLY_DEVICE;
        device_extension->read_only = TRUE;
    }
    return STATUS_SUCCESS;
}
 
NTSTATUS FileDiskDeviceControl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
    PDEVICE_EXTENSION   device_extension;
    PIO_STACK_LOCATION  io_stack;
    NTSTATUS            status;
 
    device_extension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
 
    io_stack = IoGetCurrentIrpStackLocation(Irp);
 
    if (!device_extension->media_in_device &&
        io_stack->Parameters.DeviceIoControl.IoControlCode != IOCTL_FILE_DISK_OPEN_FILE)
    {
        Irp->IoStatus.Status = STATUS_NO_MEDIA_IN_DEVICE;
        Irp->IoStatus.Information = 0;
 
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
        return STATUS_NO_MEDIA_IN_DEVICE;
    }
 
    switch (io_stack->Parameters.DeviceIoControl.IoControlCode)
    {
    case IOCTL_FILE_DISK_OPEN_FILE:
    {
        SECURITY_QUALITY_OF_SERVICE security_quality_of_service;
 
        if (device_extension->media_in_device)
        {
            KdPrint(("FileDisk: IOCTL_FILE_DISK_OPEN_FILE: Media already opened.\n"));
 
            status = STATUS_INVALID_DEVICE_REQUEST;
            Irp->IoStatus.Information = 0;
            break;
        }
 
        if (io_stack->Parameters.DeviceIoControl.InputBufferLength < sizeof(OPEN_FILE_INFORMATION))
        {
            status = STATUS_INVALID_PARAMETER;
            Irp->IoStatus.Information = 0;
            break;
        }
 
        if (io_stack->Parameters.DeviceIoControl.InputBufferLength <
            sizeof(OPEN_FILE_INFORMATION) +
            ((POPEN_FILE_INFORMATION)Irp->AssociatedIrp.SystemBuffer)->FileNameLength -
            sizeof(UCHAR))
        {
            status = STATUS_INVALID_PARAMETER;
            Irp->IoStatus.Information = 0;
            break;
        }
 
        if (device_extension->security_client_context != NULL)
        {
            SeDeleteClientSecurity(device_extension->security_client_context);
        }
        else
        {
            device_extension->security_client_context =
                ExAllocatePoolWithTag(NonPagedPool, sizeof(SECURITY_CLIENT_CONTEXT), FILE_DISK_POOL_TAG);
        }
 
        RtlZeroMemory(&security_quality_of_service, sizeof(SECURITY_QUALITY_OF_SERVICE));
 
        security_quality_of_service.Length = sizeof(SECURITY_QUALITY_OF_SERVICE);
        security_quality_of_service.ImpersonationLevel = SecurityImpersonation;
        security_quality_of_service.ContextTrackingMode = SECURITY_STATIC_TRACKING;
        security_quality_of_service.EffectiveOnly = FALSE;
 
        SeCreateClientSecurity(
            PsGetCurrentThread(),
            &security_quality_of_service,
            FALSE,
            device_extension->security_client_context
        );
        /////Тут было открытие директории
        status = FileDiskCreateDevice(pDriverObjectGen, 1, FILE_DEVICE_DISK);
        if (!NT_SUCCESS(status))
        {
            ZwClose(dir_handle);
            return status;
        }
        break;
    }
 
    case IOCTL_FILE_DISK_CLOSE_FILE:
    {
        IoMarkIrpPending(Irp);
 
        ExInterlockedInsertTailList(
            &device_extension->list_head,
            &Irp->Tail.Overlay.ListEntry,
            &device_extension->list_lock
        );
 
        KeSetEvent(
            &device_extension->request_event,
            (KPRIORITY)0,
            FALSE
        );
 
        status = STATUS_PENDING;
 
        break;
    }
    /*Тут идет описание всех действий на нужные IOCTL*/
    default:
    {
        KdPrint((
            "FileDisk: Unknown IoControlCode %#x\n",
            io_stack->Parameters.DeviceIoControl.IoControlCode
            ));
 
        status = STATUS_INVALID_DEVICE_REQUEST;
        Irp->IoStatus.Information = 0;
    }
    }
 
    if (status != STATUS_PENDING)
    {
        Irp->IoStatus.Status = status;
 
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
    }
 
    return status;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.11.2016, 16:23
Ответы с готовыми решениями:

Не отправляется email сообщение через sendmail
Помогите пожалуйста! Работаю на фреймворке Codegniter, локальный сервер xampp. Никак не получается отправить email сообщение, пишет ошибку:...

Отправка устройству информации через DeviceIoControl
Теперь пытаюсь разобраться с DeviceIoControl. В прошлой программе с помощью SetupDiGetDeviceInterfaceDetail нашел символьную ссылку на...

Можно ли отправлять через DeviceIOControl команды мышке?
Вопрос в том, можно ли эмулировать движения и клики мышью, без фильтр драйвера, и тем более без API функций? И желательно чтобы это была...

6
0 / 0 / 0
Регистрация: 22.12.2015
Сообщений: 11
23.11.2016, 16:24  [ТС]
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
NTSTATUS FileDiskOpenFile(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
    PDEVICE_EXTENSION               device_extension;
    POPEN_FILE_INFORMATION          open_file_information;
    UNICODE_STRING                  ufile_name;
    NTSTATUS                        status;
    OBJECT_ATTRIBUTES               object_attributes;
    FILE_END_OF_FILE_INFORMATION    file_eof;
    FILE_BASIC_INFORMATION          file_basic;
    FILE_STANDARD_INFORMATION       file_standard;
    FILE_ALIGNMENT_INFORMATION      file_alignment;
 
    PAGED_CODE();
 
    ASSERT(DeviceObject != NULL);
    ASSERT(Irp != NULL);
 
    device_extension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
 
    open_file_information = (POPEN_FILE_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
    if (DeviceObject->DeviceType != FILE_DEVICE_CD_ROM)
    {
        device_extension->read_only = open_file_information->ReadOnly;
    }
 
    device_extension->file_name.Length = open_file_information->FileNameLength;
    device_extension->file_name.MaximumLength = open_file_information->FileNameLength;
    device_extension->file_name.Buffer = ExAllocatePoolWithTag(NonPagedPool, open_file_information->FileNameLength, FILE_DISK_POOL_TAG);
 
    if (device_extension->file_name.Buffer == NULL)
    {
        return STATUS_INSUFFICIENT_RESOURCES;
    }
 
    RtlCopyMemory(
        device_extension->file_name.Buffer,
        open_file_information->FileName,
        open_file_information->FileNameLength
    );
 
    status = RtlAnsiStringToUnicodeString(
        &ufile_name,
        &device_extension->file_name,
        TRUE
    );
 
    if (!NT_SUCCESS(status))
    {
        ExFreePool(device_extension->file_name.Buffer);
        Irp->IoStatus.Status = status;
        Irp->IoStatus.Information = 0;
        return status;
    }
 
    InitializeObjectAttributes(
        &object_attributes,
        &ufile_name,
        OBJ_CASE_INSENSITIVE,
        NULL,
        NULL
    );
 
    status = ZwCreateFile(//создаем открытый файл(а вдруг существует)
        &device_extension->file_handle,
        device_extension->read_only ? GENERIC_READ : GENERIC_READ | GENERIC_WRITE,
        &object_attributes,
        &Irp->IoStatus,
        NULL,
        FILE_ATTRIBUTE_NORMAL,
        device_extension->read_only ? FILE_SHARE_READ : 0,
        FILE_OPEN,
        FILE_NON_DIRECTORY_FILE |
        FILE_RANDOM_ACCESS |
        FILE_NO_INTERMEDIATE_BUFFERING |
        FILE_SYNCHRONOUS_IO_NONALERT,
        NULL,
        0
    );
 
    if (NT_SUCCESS(status))
    {
        KdPrint(("FileDisk: File %.*S opened.\n", ufile_name.Length / 2, ufile_name.Buffer));
    }
 
    if (status == STATUS_OBJECT_NAME_NOT_FOUND || status == STATUS_NO_SUCH_FILE)
    {
        if (device_extension->read_only || open_file_information->FileSize.QuadPart == 0)
        {
            DbgPrint("FileDisk: File %.*S not found.\n", ufile_name.Length / 2, ufile_name.Buffer);
            ExFreePool(device_extension->file_name.Buffer);
            RtlFreeUnicodeString(&ufile_name);
 
            Irp->IoStatus.Status = STATUS_NO_SUCH_FILE;
            Irp->IoStatus.Information = 0;
 
            return STATUS_NO_SUCH_FILE;
        }
        else
        {
            status = ZwCreateFile(
                &device_extension->file_handle,
                GENERIC_READ | GENERIC_WRITE,
                &object_attributes,
                &Irp->IoStatus,
                NULL,
                FILE_ATTRIBUTE_NORMAL,
                0,
                FILE_OPEN_IF,
                FILE_NON_DIRECTORY_FILE |
                FILE_RANDOM_ACCESS |
                FILE_NO_INTERMEDIATE_BUFFERING |
                FILE_SYNCHRONOUS_IO_NONALERT,
                NULL,
                0
            );
 
            if (!NT_SUCCESS(status))
            {
                DbgPrint("FileDisk: File %.*S could not be created.\n", ufile_name.Length / 2, ufile_name.Buffer);
                ExFreePool(device_extension->file_name.Buffer);
                RtlFreeUnicodeString(&ufile_name);
                return status;
            }
 
            if (Irp->IoStatus.Information == FILE_CREATED)
            {
                KdPrint(("FileDisk: File %.*S created.\n", ufile_name.Length / 2, ufile_name.Buffer));
                status = ZwFsControlFile(               //sends a control code directly to a specified file system or 
                    device_extension->file_handle,      //file system filter driver, causing the corresponding driver 
                    NULL,                               //to perform the specified action.
                    NULL,                               //прикрипление файла к файловой системе
                    NULL,
                    &Irp->IoStatus,
                    FSCTL_SET_SPARSE,
                    NULL,
                    0,
                    NULL,
                    0
                );
 
                if (NT_SUCCESS(status))
                {
                    KdPrint(("FileDisk: File attributes set to sparse.\n"));
                }
 
                file_eof.EndOfFile.QuadPart = open_file_information->FileSize.QuadPart;///VOT blyat
 
                status = ZwSetInformationFile(
                    device_extension->file_handle,
                    &Irp->IoStatus,
                    &file_eof,
                    sizeof(FILE_END_OF_FILE_INFORMATION),
                    FileEndOfFileInformation
                );
 
                if (!NT_SUCCESS(status))
                {
                    DbgPrint("FileDisk: eof could not be set.\n");
                    ExFreePool(device_extension->file_name.Buffer);
                    RtlFreeUnicodeString(&ufile_name);
                    ZwClose(device_extension->file_handle);
                    return status;
                }
                KdPrint(("FileDisk: eof set to %I64u.\n", file_eof.EndOfFile.QuadPart));
            }
        }
    }
    else if (!NT_SUCCESS(status))
    {
        DbgPrint("FileDisk: File %.*S could not be opened.\n", ufile_name.Length / 2, ufile_name.Buffer);
        ExFreePool(device_extension->file_name.Buffer);
        RtlFreeUnicodeString(&ufile_name);
        return status;
    }
 
    RtlFreeUnicodeString(&ufile_name);
 
    status = ZwQueryInformationFile(
        device_extension->file_handle,
        &Irp->IoStatus,
        &file_basic,
        sizeof(FILE_BASIC_INFORMATION),
        FileBasicInformation
    );
 
    if (!NT_SUCCESS(status))
    {
        ExFreePool(device_extension->file_name.Buffer);
        ZwClose(device_extension->file_handle);
        return status;
    }
 
    if (file_basic.FileAttributes & (FILE_ATTRIBUTE_COMPRESSED | FILE_ATTRIBUTE_ENCRYPTED))
    {
        DbgPrint("FileDisk: Warning: File is compressed or encrypted. File attributes: %#x.\n", file_basic.FileAttributes);
    }
 
    status = ZwQueryInformationFile(
        device_extension->file_handle,
        &Irp->IoStatus,
        &file_standard,
        sizeof(FILE_STANDARD_INFORMATION),
        FileStandardInformation
    );
 
    if (!NT_SUCCESS(status))
    {
        ExFreePool(device_extension->file_name.Buffer);
        ZwClose(device_extension->file_handle);
        return status;
    }
 
    device_extension->file_size.QuadPart = file_standard.EndOfFile.QuadPart;
 
    status = ZwQueryInformationFile(
        device_extension->file_handle,
        &Irp->IoStatus,
        &file_alignment,
        sizeof(FILE_ALIGNMENT_INFORMATION),
        FileAlignmentInformation
    );
 
    if (!NT_SUCCESS(status))
    {
        ExFreePool(device_extension->file_name.Buffer);
        ZwClose(device_extension->file_handle);
        return status;
    }
 
    DeviceObject->AlignmentRequirement = file_alignment.AlignmentRequirement;
 
    if (device_extension->read_only)
    {
        DeviceObject->Characteristics |= FILE_READ_ONLY_DEVICE;
    }
    else
    {
        DeviceObject->Characteristics &= ~FILE_READ_ONLY_DEVICE;
    }
 
    device_extension->media_in_device = TRUE;
 
    Irp->IoStatus.Status = STATUS_SUCCESS;
    Irp->IoStatus.Information = 0;
 
    return STATUS_SUCCESS;
}
В коде выше: в DriverEntry создаю девайс для общения из юзер мода. Далее в юзермодной программе:
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
int
FileDiskMount(int DeviceNumber,POPEN_FILE_INFORMATION OpenFileInformation,BOOLEAN CdImage)
{
    char    VolumeName[] = "\\\\.\\ :";
    char    DriveName[] = " :";
    char    DeviceName[255];
    HANDLE  Device;
    DWORD   BytesReturned;
 
    VolumeName[4] = OpenFileInformation->DriveLetter;
    DriveName[0] = OpenFileInformation->DriveLetter;
 
    Device = CreateFile(
        VolumeName,
        GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL,
        OPEN_EXISTING,
        FILE_FLAG_NO_BUFFERING,
        NULL
        );
 
    if (CdImage)
    {
        sprintf(DeviceName, DEVICE_NAME_PREFIX "Cd" "%u", DeviceNumber);
    }
    else
    {
        sprintf(DeviceName, DEVICE_NAME_PREFIX "%u", DeviceNumber);
    }
DefineDosDevice(//Defines, redefines, or deletes MS-DOS device names.
        DDD_RAW_TARGET_PATH,
        &VolumeName[4],
        DeviceName
        );
 
    Device = CreateFile(
        VolumeName,
        GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL,
        OPEN_EXISTING,
        FILE_FLAG_NO_BUFFERING,
        NULL
        );
 
    DeviceIoControl(
        Device,
        IOCTL_FILE_DISK_OPEN_FILE,
        OpenFileInformation,
        sizeof(OPEN_FILE_INFORMATION) + OpenFileInformation->FileNameLength - 1,
        NULL,
        0,
        &BytesReturned,
        NULL
        );
    CloseHandle(Device);
    SHChangeNotify(SHCNE_DRIVEADD, SHCNF_PATH, DriveName, NULL);
    return 0;
}
отправляю сообщение(#define IOCTL_FILE_DISK_OPEN_FILE CTL_CODE(FILE_DEVICE_DISK, 0x800, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)),где в OpenFileInformation лежит полная информация о диске, который нам нужно создать. Но при дебаге, видно, что сообщение, которое приходит - IOCTL_DISK_GET_LENGTH_INFO(то есть не заходит в нужную ветвь кейса и не создаются вольюмы, которые в дальнейшем должны отображаться). Не понимаю почему. Благодарю всех за внимание!
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
24.11.2016, 08:52
Можно понатыкать везде DbgPrint/KdPrint и узнать, в каком именно месте "поезд сходит с рельс".
1
0 / 0 / 0
Регистрация: 22.12.2015
Сообщений: 11
24.11.2016, 18:30  [ТС]
Спасибо большое! Вопрос теперь более точен и локален:
Как соединить интерфейс с драйвером(Что же все таки в том опенсоурснике)

в этом исходнике, если переделать его следующим образом:
------
в DriverEntry создается лишь одно устройство а затем по мере необходимости создаются остальные, куда нужно добавить подобную строку(создание девайса)
C++
1
FileDiskCreateDevice(pDriverObjectGen, n, FILE_DEVICE_DISK);
(pDriverObjectGen = pDriverObject(из DriverEntry), pDriverObjectGen лежит в глобальной области)?

Я добавляю ее в обрабочик в потоке:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
VOID FileDiskThread(IN PVOID Context)
{
...
            switch (io_stack->MajorFunction)
            {
            ...
            case IRP_MJ_DEVICE_CONTROL:
                switch (io_stack->Parameters.DeviceIoControl.IoControlCode)
                {
                case IOCTL_FILE_DISK_OPEN_FILE:
                    DbgPrint("Going into IRP_MJ_DEV_CONT(thread) : IOCTL_DISK_OPEN\n");
                    SeImpersonateClient(device_extension->security_client_context, NULL);
                    irp->IoStatus.Status = FileDiskOpenFile(device_object, irp);
                    PsRevertToSelf();
                    ////
                    FileDiskCreateDevice(pDriverObjectGen, n, FILE_DEVICE_DISK);///вот сюда добавляю
                    n++;
                    break;
....}}
}
Но так не работает(по сути, как только закончилось формирование одного девайса создается другой).

И если можно, меня весьма интересует создание вольюмов через windows drivers, посоветуйте какую-нибудь литературу или какой-нибудь ресурс, где описано как создавать вольюмы(желательно, чтоб описано поподробнее), регистрировать их в системе и т.д..
Большое спасибо за внимание!
0
0 / 0 / 0
Регистрация: 22.12.2015
Сообщений: 11
24.11.2016, 18:37  [ТС]
Тут файл с кодом, на всякий случай. Изначально пытался создать нулевой девайс и потом через него создавать устройства, но ничего не вышло
Вложения
Тип файла: rar DriverTest.rar (6.8 Кб, 4 просмотров)
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
25.11.2016, 08:56
Цитата Сообщение от arch3r Посмотреть сообщение
Но так не работает
Цитата Сообщение от arch3r Посмотреть сообщение
но ничего не вышло
Ждем детального и внятного описания проблемы.
"Не работает", "не вышло" - это не подходит.
У меня нет времени разбираться в этом исходнике, компилировать его,
запускать на виртуальной машине, а затем додумывать, что именно там
идет не так, как задумано. Это слишком долго и сложно.

Напиши подробнее, что именно не получается, какие коды ошибок в
каких местах, и т.д.

У меня пока только одно подозрение - что ты пытаешься с управляющим
девайсом работать через объект-volume, т.е. у тебя в IRP_MJ_DEVICE_CONTROL
и других обработчиках нет разделения, где запросы на том (volume), а где
на твой управляющий девайс. Но могу ошибаться.
1
0 / 0 / 0
Регистрация: 22.12.2015
Сообщений: 11
28.11.2016, 00:16  [ТС]
Во-первых, приношу извинения за действительно некорректно поставленный вопрос.
Во-вторых, сама проблема:
В DriverEntry создаю нулевой девайс(
C++
1
FileDiskCreateDevice(DriverObject, n, FILE_DEVICE_NULL);
). Далее в функции создания девайса создаю девайс(IoCreateDeviceSecure) и заполняю device_extension. Создаю символьную ссылку на девайс(пока не дописан драйвер и в функции создаются сим.ссылки только на нулевой девайс и первый примаунченный). Затем создаю поток для обработки инфы поступающей этому девайсу(хотя это лишнее, с нулевым девайсом можно работать в однопоточном режиме) попутно инициализируя все созданные средства синхронизации. На всякий случай вот функция:
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
NTSTATUS FileDiskCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG Number, IN DEVICE_TYPE DeviceType)
{
    UNICODE_STRING      device_name;
    NTSTATUS            status;
    PDEVICE_OBJECT      device_object;
    PMDEVICE_EXTENSION  mdevice_extension;
    HANDLE              thread_handle;
    UNICODE_STRING      sddl;
 
    device_name.Buffer = (PWCHAR)ExAllocatePoolWithTag(PagedPool, MAXIMUM_FILENAME_LENGTH * 2, FILE_DISK_POOL_TAG);
    device_name.Length = 0;
    device_name.MaximumLength = MAXIMUM_FILENAME_LENGTH * 2;
 
    RtlInitUnicodeString(&sddl, _T("D:P(A;;GA;;;SY)(A;;GA;;;BA)(A;;GA;;;BU)"));
 
    RtlUnicodeStringPrintf(&device_name, DEVICE_NAME_PREFIX L"%u", Number);
 
    status = IoCreateDeviceSecure(
        DriverObject,
        sizeof(MDEVICE_EXTENSION),
        &device_name,
        DeviceType,
        0,
        FALSE,
        &sddl,
        NULL,
        &device_object
    );
    if (!NT_SUCCESS(status))
    {
        ExFreePool(device_name.Buffer);
        return status;
    }
 
    if (n == 0)
    {
        RtlInitUnicodeString(&gSymbolicLinkName, SYMBLINK0);//формирование имени симв.ссылки
        status = IoCreateSymbolicLink(&gSymbolicLinkName, &device_name);
        if (status != STATUS_SUCCESS)
            return status;
    }
    else
    {
        RtlInitUnicodeString(&gSymbolicLinkName1, SYMBLINK1);//формирование имени симв.ссылки
        status = IoCreateSymbolicLink(&gSymbolicLinkName1, &device_name);
        if (status != STATUS_SUCCESS)
            return status;
    }
    device_object->Flags |= DO_DIRECT_IO;
        mdevice_extension = (PMDEVICE_EXTENSION)device_object->DeviceExtension;
 
        mdevice_extension->mstruct.device_name.Length = device_name.Length;
        mdevice_extension->mstruct.device_name.MaximumLength = device_name.MaximumLength;
        mdevice_extension->mstruct.device_name.Buffer = device_name.Buffer;
        mdevice_extension->number = Number;
        mdevice_extension->mstruct.device_type = DeviceType;
    InitializeListHead(&mdevice_extension->mstruct.list_head);
    KeInitializeSpinLock(&mdevice_extension->mstruct.list_lock);
    KeInitializeEvent(&mdevice_extension->mstruct.request_event, SynchronizationEvent, FALSE);
 
    mdevice_extension->mstruct.terminate_thread = FALSE;
 
    status = PsCreateSystemThread(
        &thread_handle,
        (ACCESS_MASK)0L,
        NULL,
        NULL,
        NULL,
        FileDiskThread,
        device_object);
    if (!NT_SUCCESS(status))
    {
        IoDeleteDevice(device_object);
        ExFreePool(device_name.Buffer);
        return status;
    }
 
    status = ObReferenceObjectByHandle(
        thread_handle,
        THREAD_ALL_ACCESS,
        NULL,
        KernelMode,
        &mdevice_extension->mstruct.thread_pointer,
        NULL
    );
    n++;//номер девайса, глоб.переменная
    ZwClose(thread_handle);
    return STATUS_SUCCESS;
}
Это все лежит в
C++
1
#pragma code_seg("PAGE")
.


В функции
C++
1
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = FileDiskDeviceControl;
в сообщении отвечающем за маунт собираю SECURITY_QUALITY_OF_SERVICE и сетлю ивент для того, чтобы заработал обрабатывающий поток и помечаю IRP как pending. Если нужно, вот:
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
switch (io_stack->Parameters.DeviceIoControl.IoControlCode)
    {
    case IOCTL_FILE_DISK_OPEN_FILE:
    {
        SECURITY_QUALITY_OF_SERVICE security_quality_of_service;
        if (mdevice_extension->mstruct.security_client_context != NULL)
        {
            SeDeleteClientSecurity(mdevice_extension->mstruct.security_client_context);
        }
        else
        {
            mdevice_extension->mstruct.security_client_context =
                ExAllocatePoolWithTag(NonPagedPool, sizeof(SECURITY_CLIENT_CONTEXT), FILE_DISK_POOL_TAG);
        }
        RtlZeroMemory(&security_quality_of_service, sizeof(SECURITY_QUALITY_OF_SERVICE));
 
        security_quality_of_service.Length = sizeof(SECURITY_QUALITY_OF_SERVICE);
        security_quality_of_service.ImpersonationLevel = SecurityImpersonation;
        security_quality_of_service.ContextTrackingMode = SECURITY_STATIC_TRACKING;
        security_quality_of_service.EffectiveOnly = FALSE;
 
        SeCreateClientSecurity(
            PsGetCurrentThread(),
            &security_quality_of_service,
            FALSE,
            mdevice_extension->mstruct.security_client_context);
        IoMarkIrpPending(Irp);
 
        ExInterlockedInsertTailList(
            &mdevice_extension->mstruct.list_head,
            &Irp->Tail.Overlay.ListEntry,
            &mdevice_extension->mstruct.list_lock);
 
        KeSetEvent(&mdevice_extension->mstruct.request_event, (KPRIORITY)0, FALSE);
        status = STATUS_PENDING;
        break;
Ну а в самом потоке в новом свиче создаю новый девайс(FILE_DEVICE_DISK).
C++
1
2
3
4
5
6
7
8
case IOCTL_FILE_DISK_OPEN_FILE:
                    SeImpersonateClient(mdevice_extension->mstruct.security_client_context, NULL);
 
                    irp->IoStatus.Status = FileDiskCreateDevice(device_object->DriverObject, n, FILE_DEVICE_DISK);
 
                    PsRevertToSelf();
 
                    break;

И после всего этого, когда в юзер моде когда отправляю команду нулевому девайсу(именно ему по сим.ссылке) он его создает, НО(!!!!):
а)
C++
1
SHChangeNotify(SHCNE_DRIVEADD, SHCNF_PATH, DriveName, NULL);
- не отображается девайс в Мой Компьютер
б)При попытке через
C++
1
Device = CreateFile(...);
достучаться до смаунченного девайса(первого) выдает INVALID_HANDLE
в) в WinObj отображаются и нулевой девайс(FileDisk0) и первый смаунченный(FileDisk1), но при (ПКМ->Свойства) на нулевом девайсе - показывает свойства, а при (ПКМ->Свойства) на смаунченном - выдает (Error Opening: \Device\FileDisk1 - не удается найти указанный файл).

PS я попробовал переделать проэкт http://www.acc.umu.se/~bosse/ под свой - абсолютно все также(обработка в
C++
1
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = FileDiskDeviceControl;
только тех же сообщений что и у меня И реализованный все функции также, КРОМЕ того, что у нех все диски создаются в DriverEntry, а в потоке уже связываются с файлами(на диске)) и тогда работает - отображается нормально диск в "Мой Компьютер".


Что я делаю не так?

И в-третьих - спасибо за внимание!)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.11.2016, 00:16
Помогаю со студенческими работами здесь

Не отправляется CAN сообщение
Всем добрый день. Прошу помощи, помочь разобраться почему не отправляется CAN сообщение, все ли правильно я написал и настроил? ...

Не отправляется сообщение
Я пишу простенький чат на php+mysql. Почему не видно в таблице сообщение после того как нажал отправить? Регистрация и вход работают...

Не отправляется форма через Ajax
Привет всем. Полночи не могу понять, что делаю не так. Делаю форму, которую нужно отправлять на сервер с помощью аякса. Вот форма: ...

Не отправляется JSON через AJAX
Здравствуйте,проблема такая: отправляю post запросом json через ajax,почему то дело до php скрипта не доходит,запрос не выполняется,но как...

Письмо не отправляется (через SMTP)
Все привет, очень нужна помощь!У меня в программе есть главная форма MainForm. На самой форме есть кнопка, при нажатии на которую должно...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru