DRIVER_IRQL_NOT_LESS_OR_EQUAL

Тема в разделе "WASM.NT.KERNEL", создана пользователем WaterGhost, 24 сен 2009.

  1. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    Возникает ошибка DRIVER_IRQL_NOT_LESS_OR_EQUAL при обращении к драйверу. Происходит это не всегда. На Windows XP такого не наблюдалось никогда. В Windows 7 32bit появляется изредка. Помогите, пожалуйста решить проблему...

    Код (Text):
    1. NTSTATUS IoctlDataRequest(IN PDEVICE_OBJECT DeviceObject,
    2.                           IN PIRP           Irp)
    3. {
    4.     NTSTATUS           ntStatus;
    5.     PIO_STACK_LOCATION pIrpStack;
    6.     PDEVICE_EXTENSION  pDeviceExtension;
    7.     PMY_OPERATION_INFO pOperationInfo;
    8.     PLIST_ITEM         pOperationsList;
    9.     PVOID              pOutputBuffer;
    10.     ULONG              nOutputBufferLength;
    11.     ULONG              nCount = 0;
    12.     KIRQL              oldIrql;
    13.  
    14.     pIrpStack           = IoGetCurrentIrpStackLocation( Irp );
    15.     pDeviceExtension    = DeviceObject->DeviceExtension;
    16.     nOutputBufferLength = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;
    17.     pOutputBuffer       = Irp->AssociatedIrp.SystemBuffer;
    18.  
    19.     // Проверяем хватает ли выделенноо размера буфера для записи имеющегося листа
    20.     if( pOutputBuffer == NULL || nOutputBufferLength % sizeof( MY_OPERATION_INFO ) != 0 )
    21.     {
    22.         ntStatus = STATUS_INVALID_BUFFER_SIZE;
    23.         goto done;                
    24.     }
    25.  
    26.     KeAcquireSpinLock( &pDeviceExtension->ListSpinLock, &oldIrql );
    27.  
    28.     pOperationsList = pDeviceExtension->OperationsList;
    29.     pOperationInfo  = (PMY_OPERATION_INFO)pOutputBuffer;
    30.  
    31.     while( pOperationsList )
    32.     {
    33.         if ( nCount >= nOutputBufferLength )
    34.         {
    35.             DPRINT("[DNtL]: 'IoctlDataRequest' insufficient buffer length 0x%08x\n", nOutputBufferLength);
    36.             ntStatus = STATUS_BUFFER_TOO_SMALL;
    37.             goto release;    
    38.         }
    39.  
    40.         pOperationInfo[nCount / sizeof( MY_OPERATION_INFO )] = *(PMY_OPERATION_INFO)pOperationsList->Item;
    41.  
    42.         nCount += sizeof( MY_OPERATION_INFO );
    43.         pOperationsList = pOperationsList->Next;
    44.     }
    45.  
    46.     ListClear( &pDeviceExtension->OperationsList );
    47.  
    48.     Irp->IoStatus.Information = nCount;
    49.     ntStatus = STATUS_SUCCESS;
    50.  
    51. release:
    52.     KeReleaseSpinLock( &pDeviceExtension->ListSpinLock, oldIrql );
    53.  
    54. done:
    55.     return ntStatus;
    56. }
    57. //-------------------------------------------------------------------------
    58. NTSTATUS IoctlUserModeRequest(IN PDEVICE_OBJECT DeviceObject,
    59.                               IN PIRP           Irp)
    60. {
    61.     NTSTATUS           ntStatus;
    62.     PDEVICE_EXTENSION  pDeviceExtension;
    63.     PULONG             pOutputBuffer;
    64.     ULONG              nOutputBufferLength;
    65.     PIO_STACK_LOCATION pIrpStack;
    66.     ULONG              CurrProcId = GetCurrentProcId();
    67.    
    68.     pIrpStack           = IoGetCurrentIrpStackLocation( Irp );
    69.     pDeviceExtension    = DeviceObject->DeviceExtension;
    70.     nOutputBufferLength = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;
    71.     pOutputBuffer       = Irp->AssociatedIrp.SystemBuffer;
    72.  
    73.     // Проверяем хватает ли выделенноо размера буфера для записи имеющегося значения
    74.     if( pOutputBuffer == NULL || nOutputBufferLength % sizeof(ULONG) != 0 )
    75.     {
    76.         DPRINT("[DNtL]: 'IoctlDataRequest' invalid buffer size 0x%08x\n", nOutputBufferLength);
    77.         ntStatus = STATUS_INVALID_BUFFER_SIZE;
    78.         goto done;                
    79.     }
    80.  
    81.     *pOutputBuffer = CurrProcId;
    82.     Irp->IoStatus.Information = sizeof(ULONG);
    83.     ntStatus = STATUS_SUCCESS;
    84.  
    85. done:
    86.     return ntStatus;
    87. }
    88. //-------------------------------------------------------------------------
    89. NTSTATUS DispatchCreateClose( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
    90. {
    91.     Irp->IoStatus.Status = STATUS_SUCCESS;
    92.     Irp->IoStatus.Information = 0;
    93.     IoCompleteRequest( Irp, IO_NO_INCREMENT );
    94.     return STATUS_SUCCESS;
    95. }
    96. //-------------------------------------------------------------------------
    97. NTSTATUS DispatchIoctl(IN PDEVICE_OBJECT DeviceObject,
    98.                        IN PIRP           Irp)
    99. {
    100.     NTSTATUS           ntStatus;
    101.     PIO_STACK_LOCATION pIrpStack;
    102.  
    103.     Irp->IoStatus.Information = 0;
    104.     ntStatus = STATUS_UNSUCCESSFUL;
    105.  
    106.     pIrpStack = IoGetCurrentIrpStackLocation( Irp );
    107.    
    108.     switch( pIrpStack->Parameters.DeviceIoControl.IoControlCode )
    109.     {
    110.         case IOCTL_DATA_REQUEST:
    111.             {
    112.                 ntStatus = IoctlDataRequest( DeviceObject, Irp );
    113.                 break;
    114.             }
    115.  
    116.         case IOCTL_USERMODE_REQUEST:
    117.             {
    118.                 ntStatus = IoctlUserModeRequest( DeviceObject, Irp );
    119.                 break;
    120.             }
    121.  
    122.         case IOCTL_CHECKHOOKS_REQUEST:
    123.             {
    124.                 //ntStatus = IoctlExeOnly( DeviceObject );
    125.                 break;
    126.             }
    127.     }
    128.  
    129.     Irp->IoStatus.Status = ntStatus;
    130.     IoCompleteRequest( Irp, IO_NO_INCREMENT );
    131.  
    132.     return ntStatus;
    133. }
     
  2. cpplamo

    cpplamo New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2009
    Сообщения:
    38
    анализ крашдампа давай
     
  3. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    Вот MiniDump. Как их анализировать вообще не знаю =\
     
  4. cpplamo

    cpplamo New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2009
    Сообщения:
    38
    dntldriver32+1e44
    учитесь отладке:)
     
  5. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    эммм... Буду :) А что это значит?) Это смещение в файле драйвера? Как узнать что там находится? Дизассемблером?
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    WaterGhost
    это смещение в образе в памяти.
    возьми, например, IDA. оно умеет делать так, как будто файл загружен в память
     
  7. Ox8BFF55

    Ox8BFF55 New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2009
    Сообщения:
    181
    Не вишу ListClear....

    Есть ли в ListClear KeAcquireSpinLock????
    Делай проверки на IRQL level(GetCurrentIRQL) перед вызовам функций которые зависят от него......
    P.S.
    Скорее всего вызов какой то функции происходит как раз с неправельным IRQL. Может сделать тест и всегда устанавливать валидный IRQL(ручками)????
     
  8. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    Ок, сделаю. А насчет ListClear, при вызове этой функции я занимаю СпинЛок, в самой ListClear я этого не делаю
     
  9. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    Кстати насколько я знаю KeAcquireSpinLock сам выставляет IRQL в DISPATCH_LEVEL, а только потом занимает замок. Зачем мне ручками выставлять если он и так это делает?
     
  10. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Я, конечно, ничего нового не скажу, но мне кажется, вот такие вопросы нужно либо удалять сразу либо переносить в раздел для начинающих. Никакого желания отвечать что-то у меня лично не возникает, потому что всё это так или иначе можно прочитать/додумать из документации к WDK (который, заметьте, сегодня раздаётся абсолютно бесплатно). Нет, ну серьёзно - что этот топик делает здесь? Явно же видно, что для тех, кто уже не бегинер, тут ничего интересного или нового быть не может. И автор явно бегинер из бегинеров... Почему он считает нормальным тратить время форумчан на то, что можно усвоить из документации? Изволь прочитать сначала доку (раза 2-3, не меньше!), и только потом, если что-то действительно не понятно, - спроси у людей. Модераторы, что за дела, почему не реагируем?
     
  11. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    x64 доку я прочитал и всё правильно сделал. То что я не понял о том и спрашиваю. А тебе подавай только "интересненькое" для тебя? Это не совсем уж и нубский вопрос, я считаю. О работе спинлоков в Win Vista\7 во всем инете говорят и толкового ответа я там и не нашёл. А всё из-за того что ПРО повсюду, флудят и ответов от них не дождёшься
     
  12. cpplamo

    cpplamo New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2009
    Сообщения:
    38
    Родной, ну посмотри же ты наконец, САМ, что у тебя по смещению там :) Фиксить твои баги тут никто не собирается. Вот ты же за свой античит бабки получаешь, а мы что?
     
  13. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    Я за него деньги не получил ни копейки.. и не собираюсь его продавать