Код Юзер мода(сокр.): hHandle = CreateFile(driverName.c_str(), 0, FILE_SHARE_READ | FILE_SHARE_WRIT, NULL, OPEN_EXISTING, 0, NULL ); DeviceIoControl(hHandle, GetUsbIoCtlCode(5), NULL, 0, &outBuff, sizeof(outBuff), &bytesReturned, (LPOVERLAPPED)NULL)); Код драйвера: Код (Text): NTSTATUS irpCreate(IN PDEVICE_OBJECT tdo, IN PIRP irp) { PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(irp); #if DBG DbgPrint("=Test= IRP = Create"); #endif return irpComplete(irp, STATUS_SUCCESS, 0); }; NTSTATUS irpClose(IN PDEVICE_OBJECT tdo, PIRP irp) { #if DBG DbgPrint("=Test= IRP = Close"); #endif return irpComplete(irp, STATUS_SUCCESS, 0); }; NTSTATUS DeviceControl(IN PDEVICE_OBJECT tdo, IN PIRP irp) { #if DBG DbgPrint("=Test= Enter in DeviceControl function"); #endif NTSTATUS status = STATUS_SUCCESS; ULONG ioBytesCount = 0; PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(irp); PEXAMPLE_DEVICE_EXTENSION dx = (PEXAMPLE_DEVICE_EXTENSION)tdo->DeviceExtension; ULONG ioctlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode; ULONG method = ioctlCode & 0x03; KIRQL irql, currentIrql = KeGetCurrentIrql(); DbgBreakPoint(); KeAcquireSpinLock(&MySpinLock, &irql); if (ioctlCode == GetUsbIoCtlCode(5)) { ULONG InputLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength; ULONG OutputLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength; if (OutputLength < 1) { status = STATUS_INVALID_PARAMETER; } UCHAR *buff; if (method == METHOD_BUFFERED) { buff = (PUCHAR)irp->AssociatedIrp.SystemBuffer; } else { status = STATUS_INVALID_DEVICE_REQUEST; } *buff = 0x33; ioBytesCount = 1; } else { status = STATUS_INVALID_DEVICE_REQUEST; #if DBG DbgPrint("=Test= Invalid IoCtl Code!"); #endif } return irpComplete(irp, status, ioBytesCount); }; irpCreate и irpClose срабатывают, DeviceControl нет. Ошибка в DeviceIoControl - 1, ERROR_INVALID_FUNCTION
Где GetUsbIoCtlCode(): int GetUsbIoCtlCode(int code) { return (((0x22) << 16) | ((FILE_ANY_ACCESS) << 14) | ((0xff + code) << 2) | METHOD_BUFFERED); }
может ты забыл DeviceControl добавить в DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] ? А не проще ли IOCTL коды собирать через макрос CTL_CODE ? Тогда и более понятнее будет если где-то сделал ошибку при сборке в твоем случае будет это: CTL_CODE(FILE_DEVICE_UNKNOWN, code, METHOD_BUFFERED, FILE_ALL_ACCESS) что будет более понятным И зачем делаешь + 0xFF ? Если хочешь использовать свое коды (отличные от MS) то 0x000 — 0x7FF — зарезервировано Microsoft 0x800 — 0xFFF — определяется пользователем К томуже в CreateFile ты не указал как именно ты открываешь GENERIC_READ | GENERIC_WRITE
И с этими флагами пробовал. В SDK, в примере с DeviceIoControl, CreateFile юзается с этими параметрами, поэтому тут она в таком виде...SDK было последним местом в котором я пытался что то выяснить. Потом плюнул и пошел сюда..
DeviceControl добавлен в DriverObject. Попробовал через CTL_CODE - такая же херня. Драйвер нормально юзает irpCreate и irpClose, а вот в DeviceControl не заходит. Значит все таки в драйвере косяк.
"=Test= Enter in DeviceControl function" Сообщения появилось? Если да, тогда дальше трайс. Если нет тогда заполняешь что то не так. Короче просай сорсы..
Думаю надо корочь переписать все к чертям. Через syser'овский лоадер когда гружу драйвер - "=Test= Enter in DeviceControl function" выскакивает...когда через свой - ничего. Но млин када через сусер - после посылки IOctL DeviceControl следует молниеносный ребут