Windows дескриптор устройства разработки ядра Неверное значение дескриптора - PullRequest
0 голосов
/ 10 февраля 2020

Итак, я сейчас следую этому уроку: https://www.youtube.com/watch?v=VaIMgJz05wI&t=2s по разработке ядра. Когда я пытаюсь нажать «открыть устройство» в моей программе пользовательского режима, дескриптор устройства возвращает недопустимое значение дескриптора, хотя я правильно сопоставил свой драйвер, и моя ссылка на устройство такая же.

Код режима пользователя:

HANDLE devicehandle = NULL;

void CKMDFDriverTut1userDlg::OnBnClickedButton1()
{
    // TODO: Add your control notification handler code here
    devicehandle = CreateFile(L"\\\\.\\myDeviceLink123", GENERIC_ALL, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, 0);
    if (devicehandle == INVALID_HANDLE_VALUE) {
        MessageBox(L"not valid value", 0, 0);
        return;
    }
    //do your ting if valid
    MessageBox(L"valid value", 0, 0);
}

KernelMode:

DRIVER_INITIALIZE DriverEntry;

UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Device\\myDevice123");
UNICODE_STRING SymLinkName = RTL_CONSTANT_STRING(L"\\??\\myDeviceLink123");

PDEVICE_OBJECT DeviceObject = NULL;

VOID Unload(PDRIVER_OBJECT DriverObject) 
{
    IoDeleteSymbolicLink(&SymLinkName);
    IoDeleteDevice(DeviceObject);
    KdPrint(("Driver Unload \r\n"));
}

NTSTATUS DispatchPassThru(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
    PIO_STACK_LOCATION irpsp = IoGetCurrentIrpStackLocation(Irp);
    NTSTATUS status = STATUS_SUCCESS;

    switch (irpsp->MajorFunction)
    {
    case IRP_MJ_CREATE:
        KdPrint(("create request \r\n"));
        break;
    case IRP_MJ_CLOSE:
        KdPrint(("close resuest \r\n"));
        break;
    case IRP_MJ_READ:
        KdPrint(("read request \r\n"));
        break;
    case IRP_MJ_WRITE:
        KdPrint(("write resuest \r\n"));
        break;
    default:
        break;
    }

    Irp->IoStatus.Information = 0;
    Irp->IoStatus.Status = status;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);
    return status;
}

NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath
)
{

    NTSTATUS status = STATUS_SUCCESS;
    int i;
    DriverObject->DriverUnload = Unload;

    status = IoCreateDevice(DriverObject, 0, &DeviceName, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &DeviceObject);

    if (!NT_SUCCESS(status)) {
        KdPrint(("Creating device failed \r\n"));
        return status;
    }

    status = IoCreateSymbolicLink(&SymLinkName, &DeviceName);

    if (!NT_SUCCESS(status)) {
        KdPrint(("creating symbolic link failed \r\n"));
        IoDeleteDevice(DeviceObject);
        return status;
    }

    for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) {
        DriverObject->MajorFunction[i] = DispatchPassThru;
    }

    //DriverObject->MajorFunction[IRP_MJ_READ] = DispatchCustom;
    //DriverObject->MajorFunction[IRP_MJ_WRITE] = DispatchCustom1;

    KdPrint(("Driver load \r\n"));

    return status;
}

Ожидаемый вывод: когда я нажимаю кнопку 1, появляется окно сообщения с сообщением «допустимое значение», но вместо этого появляется окно сообщения с сообщением «недопустимое значение», что означает дескриптор моего устройства неправильно. Буду очень признателен за помощь, спасибо.

Устройство успешно создано

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

Когда вы получаете доступ к устройству в \\. \ Area, это означает доступ по имени DosDevice. Поэтому в области DosDevice на стороне водителя должна быть создана символьная ссылка c.

Следующая ссылка поможет вам.

https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/introduction-to-ms-dos-device-names

0 голосов
/ 10 февраля 2020

В качестве первого шага при устранении проблемы такого типа я предлагаю проверить и подтвердить, что ваше устройство было успешно создано как объект и видно в пространстве имен. Один из способов сделать это - использовать инструмент Microsoft: WinObj. Этот инструмент доступен на https://docs.microsoft.com/en-us/sysinternals/downloads/winobj

...