Ошибка в DeviceIoControl

Тема в разделе "WASM.NT.KERNEL", создана пользователем fadday, 30 сен 2010.

  1. fadday

    fadday New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2009
    Сообщения:
    63
    Код Юзер мода(сокр.):

    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):
    1. NTSTATUS irpCreate(IN PDEVICE_OBJECT tdo, IN PIRP irp)
    2. {
    3.     PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(irp);
    4.    
    5.     #if DBG
    6.         DbgPrint("=Test= IRP = Create");
    7.     #endif
    8.    
    9.     return irpComplete(irp, STATUS_SUCCESS, 0);
    10. };
    11.  
    12. NTSTATUS irpClose(IN PDEVICE_OBJECT tdo, PIRP irp)
    13. {
    14.     #if DBG
    15.         DbgPrint("=Test= IRP = Close");
    16.     #endif
    17.    
    18.     return irpComplete(irp, STATUS_SUCCESS, 0);
    19. };
    20.  
    21. NTSTATUS DeviceControl(IN PDEVICE_OBJECT tdo, IN PIRP irp)
    22. {
    23.     #if DBG
    24.         DbgPrint("=Test= Enter in DeviceControl function");
    25.     #endif
    26.    
    27.     NTSTATUS status = STATUS_SUCCESS;
    28.     ULONG ioBytesCount = 0;
    29.     PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(irp);
    30.    
    31.     PEXAMPLE_DEVICE_EXTENSION dx = (PEXAMPLE_DEVICE_EXTENSION)tdo->DeviceExtension;
    32.     ULONG ioctlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;
    33.     ULONG method   = ioctlCode & 0x03;
    34.    
    35.     KIRQL irql, currentIrql = KeGetCurrentIrql();
    36.        
    37.     DbgBreakPoint();
    38.    
    39.     KeAcquireSpinLock(&MySpinLock, &irql);
    40.    
    41.     if (ioctlCode == GetUsbIoCtlCode(5))
    42.     {
    43.         ULONG InputLength  = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
    44.         ULONG OutputLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
    45.            
    46.         if (OutputLength < 1)
    47.         {
    48.             status = STATUS_INVALID_PARAMETER;
    49.         }
    50.            
    51.         UCHAR *buff;
    52.            
    53.         if (method == METHOD_BUFFERED)
    54.         {
    55.             buff = (PUCHAR)irp->AssociatedIrp.SystemBuffer;
    56.         }
    57.         else
    58.         {
    59.             status = STATUS_INVALID_DEVICE_REQUEST;
    60.         }
    61.            
    62.         *buff = 0x33;
    63.         ioBytesCount = 1;
    64.     }
    65.        
    66.     else
    67.     {
    68.         status = STATUS_INVALID_DEVICE_REQUEST;
    69.        
    70.         #if DBG
    71.             DbgPrint("=Test= Invalid IoCtl Code!");
    72.         #endif
    73.     }
    74.     return irpComplete(irp, status, ioBytesCount);
    75. };
    irpCreate и irpClose срабатывают, DeviceControl нет. Ошибка в DeviceIoControl - 1, ERROR_INVALID_FUNCTION
     
  2. fadday

    fadday New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2009
    Сообщения:
    63
    Где GetUsbIoCtlCode():

    int GetUsbIoCtlCode(int code)
    {
    return (((0x22) << 16) | ((FILE_ANY_ACCESS) << 14) | ((0xff + code) << 2) | METHOD_BUFFERED);
    }
     
  3. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    может ты забыл 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
     
  4. fadday

    fadday New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2009
    Сообщения:
    63
    И с этими флагами пробовал. В SDK, в примере с DeviceIoControl, CreateFile юзается с этими параметрами, поэтому тут она в таком виде...SDK было последним местом в котором я пытался что то выяснить. Потом плюнул и пошел сюда..
     
  5. fadday

    fadday New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2009
    Сообщения:
    63
    DeviceControl добавлен в DriverObject.
    Попробовал через CTL_CODE - такая же херня.

    Драйвер нормально юзает irpCreate и irpClose, а вот в DeviceControl не заходит. Значит все таки в драйвере косяк.
     
  6. IceCrashLdr

    IceCrashLdr New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2010
    Сообщения:
    193
    "=Test= Enter in DeviceControl function"
    Сообщения появилось?

    Если да, тогда дальше трайс.
    Если нет тогда заполняешь что то не так.
    Короче просай сорсы..
     
  7. rav

    rav New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2004
    Сообщения:
    159
    Адрес:
    Москва
    Захватываешь свой спинлок? Непонятно, вообще, зачем, но освобождать ты его собираешься где?
     
  8. fadday

    fadday New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2009
    Сообщения:
    63
    Думаю надо корочь переписать все к чертям. Через syser'овский лоадер когда гружу драйвер - "=Test= Enter in DeviceControl function" выскакивает...когда через свой - ничего. Но млин када через сусер - после посылки IOctL DeviceControl следует молниеносный ребут
     
  9. fadday

    fadday New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2009
    Сообщения:
    63
    Да, согласен
     
  10. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    fadday
    А что CreateService возвращает?

    с syser-ом - бывает.