Здравствуйте, 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);
Ищите несоответствие.