Добрый день. Подскажите мне В чем загвоздка: написал драйвер запустил работает, но вот пытаясь послать ему ioctl от консольки не отрабатывает CreateFile("\\\\.\\mydriverd",...);(функцию запуска с разными параметрами владения и атрибутами) error code 2. Хотя в диспетчере устройств весит и запущен?
Здравствуйте, okman, Вы писали:
O>Dispatch-функции зарегистрировали ? IRP_MJ_CREATE правильно обрабатываете (в общем случае там
O>нужно завершить IRP с кодом STATUS_SUCCESS — это как минимум) ? И что за драйвер ?
O>В общем, дайте больше информации.
Это обычный LegasyDriver. Но вот IRP_MJ_CREATE у меня STATUS_SUCCESS не завершался. Добавил обработку
irp.IoStatus.Status = STATUS_SUCCESS;
irp.IoStatus.Information = 0;
IoComplateRequest(irp, IO_NO_INCREMENT);
Но увы все та же ошибка
Здравствуйте, Konstantinchik.
Вот минимальный рабочий пример (обработка ошибок опущена):
static
NTSTATUS DispatchAny(DEVICE_OBJECT *pDevice, IRP *pIrp)
{
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = 0;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
NTSTATUS DriverEntry(DRIVER_OBJECT *pDriver, UNICODE_STRING *pRegPath)
{
UNICODE_STRING DeviceName;
UNICODE_STRING SymLinkName;
DEVICE_OBJECT pDevice;
RtlInitUnicodeString(&DeviceName, L"\\Device\\MyDevice");
IoCreateDevice(pDriver,
0,
&DeviceName,
FILE_DEVICE_UNKNOWN,
0,
FALSE,
&pDevice);
RtlInitUnicodeString(&SymLinkName, L"\\??\\MyDeviceSymlink");
IoCreateSymbolicLink(&SymLinkName, &DeviceName);
pDriver->MajorFunction[IRP_MJ_CREATE] = DispatchAny;
pDriver->MajorFunction[IRP_MJ_CLEANUP] = DispatchAny;
pDriver->MajorFunction[IRP_MJ_CLOSE] = DispatchAny;
return STATUS_SUCCESS;
}
Обращаю внимание на работу со строками (UNICODE_STRING) и имена устройств/символьных ссылок в
ядре и в режиме пользователя (\Device\..., \??\..., \\.\...).
Все, этот драйвер нужно скомпилировать и запустить, после чего в user mode
устройство можно будет открывать по имени \\.\MyDeviceSymlink, т.е.
HANDLE hDevice = CreateFileW(L"\\\\.\\MyDeviceSymlink",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
Ищите несоответствие.