Итак, я сейчас следую этому уроку: 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, появляется окно сообщения с сообщением «допустимое значение», но вместо этого появляется окно сообщения с сообщением «недопустимое значение», что означает дескриптор моего устройства неправильно. Буду очень признателен за помощь, спасибо.
Устройство успешно создано