Возникает ошибка DRIVER_IRQL_NOT_LESS_OR_EQUAL при обращении к драйверу. Происходит это не всегда. На Windows XP такого не наблюдалось никогда. В Windows 7 32bit появляется изредка. Помогите, пожалуйста решить проблему... Код (Text): NTSTATUS IoctlDataRequest(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { NTSTATUS ntStatus; PIO_STACK_LOCATION pIrpStack; PDEVICE_EXTENSION pDeviceExtension; PMY_OPERATION_INFO pOperationInfo; PLIST_ITEM pOperationsList; PVOID pOutputBuffer; ULONG nOutputBufferLength; ULONG nCount = 0; KIRQL oldIrql; pIrpStack = IoGetCurrentIrpStackLocation( Irp ); pDeviceExtension = DeviceObject->DeviceExtension; nOutputBufferLength = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength; pOutputBuffer = Irp->AssociatedIrp.SystemBuffer; // Проверяем хватает ли выделенноо размера буфера для записи имеющегося листа if( pOutputBuffer == NULL || nOutputBufferLength % sizeof( MY_OPERATION_INFO ) != 0 ) { ntStatus = STATUS_INVALID_BUFFER_SIZE; goto done; } KeAcquireSpinLock( &pDeviceExtension->ListSpinLock, &oldIrql ); pOperationsList = pDeviceExtension->OperationsList; pOperationInfo = (PMY_OPERATION_INFO)pOutputBuffer; while( pOperationsList ) { if ( nCount >= nOutputBufferLength ) { DPRINT("[DNtL]: 'IoctlDataRequest' insufficient buffer length 0x%08x\n", nOutputBufferLength); ntStatus = STATUS_BUFFER_TOO_SMALL; goto release; } pOperationInfo[nCount / sizeof( MY_OPERATION_INFO )] = *(PMY_OPERATION_INFO)pOperationsList->Item; nCount += sizeof( MY_OPERATION_INFO ); pOperationsList = pOperationsList->Next; } ListClear( &pDeviceExtension->OperationsList ); Irp->IoStatus.Information = nCount; ntStatus = STATUS_SUCCESS; release: KeReleaseSpinLock( &pDeviceExtension->ListSpinLock, oldIrql ); done: return ntStatus; } //------------------------------------------------------------------------- NTSTATUS IoctlUserModeRequest(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { NTSTATUS ntStatus; PDEVICE_EXTENSION pDeviceExtension; PULONG pOutputBuffer; ULONG nOutputBufferLength; PIO_STACK_LOCATION pIrpStack; ULONG CurrProcId = GetCurrentProcId(); pIrpStack = IoGetCurrentIrpStackLocation( Irp ); pDeviceExtension = DeviceObject->DeviceExtension; nOutputBufferLength = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength; pOutputBuffer = Irp->AssociatedIrp.SystemBuffer; // Проверяем хватает ли выделенноо размера буфера для записи имеющегося значения if( pOutputBuffer == NULL || nOutputBufferLength % sizeof(ULONG) != 0 ) { DPRINT("[DNtL]: 'IoctlDataRequest' invalid buffer size 0x%08x\n", nOutputBufferLength); ntStatus = STATUS_INVALID_BUFFER_SIZE; goto done; } *pOutputBuffer = CurrProcId; Irp->IoStatus.Information = sizeof(ULONG); ntStatus = STATUS_SUCCESS; done: return ntStatus; } //------------------------------------------------------------------------- NTSTATUS DispatchCreateClose( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest( Irp, IO_NO_INCREMENT ); return STATUS_SUCCESS; } //------------------------------------------------------------------------- NTSTATUS DispatchIoctl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { NTSTATUS ntStatus; PIO_STACK_LOCATION pIrpStack; Irp->IoStatus.Information = 0; ntStatus = STATUS_UNSUCCESSFUL; pIrpStack = IoGetCurrentIrpStackLocation( Irp ); switch( pIrpStack->Parameters.DeviceIoControl.IoControlCode ) { case IOCTL_DATA_REQUEST: { ntStatus = IoctlDataRequest( DeviceObject, Irp ); break; } case IOCTL_USERMODE_REQUEST: { ntStatus = IoctlUserModeRequest( DeviceObject, Irp ); break; } case IOCTL_CHECKHOOKS_REQUEST: { //ntStatus = IoctlExeOnly( DeviceObject ); break; } } Irp->IoStatus.Status = ntStatus; IoCompleteRequest( Irp, IO_NO_INCREMENT ); return ntStatus; }
эммм... Буду А что это значит?) Это смещение в файле драйвера? Как узнать что там находится? Дизассемблером?
WaterGhost это смещение в образе в памяти. возьми, например, IDA. оно умеет делать так, как будто файл загружен в память
Не вишу ListClear.... Есть ли в ListClear KeAcquireSpinLock???? Делай проверки на IRQL level(GetCurrentIRQL) перед вызовам функций которые зависят от него...... P.S. Скорее всего вызов какой то функции происходит как раз с неправельным IRQL. Может сделать тест и всегда устанавливать валидный IRQL(ручками)????
Ок, сделаю. А насчет ListClear, при вызове этой функции я занимаю СпинЛок, в самой ListClear я этого не делаю
Кстати насколько я знаю KeAcquireSpinLock сам выставляет IRQL в DISPATCH_LEVEL, а только потом занимает замок. Зачем мне ручками выставлять если он и так это делает?
Я, конечно, ничего нового не скажу, но мне кажется, вот такие вопросы нужно либо удалять сразу либо переносить в раздел для начинающих. Никакого желания отвечать что-то у меня лично не возникает, потому что всё это так или иначе можно прочитать/додумать из документации к WDK (который, заметьте, сегодня раздаётся абсолютно бесплатно). Нет, ну серьёзно - что этот топик делает здесь? Явно же видно, что для тех, кто уже не бегинер, тут ничего интересного или нового быть не может. И автор явно бегинер из бегинеров... Почему он считает нормальным тратить время форумчан на то, что можно усвоить из документации? Изволь прочитать сначала доку (раза 2-3, не меньше!), и только потом, если что-то действительно не понятно, - спроси у людей. Модераторы, что за дела, почему не реагируем?
x64 доку я прочитал и всё правильно сделал. То что я не понял о том и спрашиваю. А тебе подавай только "интересненькое" для тебя? Это не совсем уж и нубский вопрос, я считаю. О работе спинлоков в Win Vista\7 во всем инете говорят и толкового ответа я там и не нашёл. А всё из-за того что ПРО повсюду, флудят и ответов от них не дождёшься
Родной, ну посмотри же ты наконец, САМ, что у тебя по смещению там Фиксить твои баги тут никто не собирается. Вот ты же за свой античит бабки получаешь, а мы что?