Подскажите, пожалуйста, почему не работает такой код: Код (Text): FiDO_DispatchPassThrough proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP mov eax, pDeviceObject .if eax == KeyDeviceObject invoke killirp, pIrp .else push ebx mov ebx, (DEVICE_OBJECT ptr [eax]).DeviceExtension lea eax, (FiDO_DEVICE_EXTENSION ptr [ebx]).RemoveLock invoke IoAcquireRemoveLockEx, eax, pIrp, 0, 0, sizeof IO_REMOVE_LOCK mov edx, pIrp assume edx:ptr _IRP ;;;;.if eax == NT_SUCCESS test eax, eax jl kiipp inc [edx].CurrentLocation add [edx].Tail.Overlay.CurrentStackLocation, sizeof IO_STACK_LOCATION ;;;;IoSkipCurrentIrpStackLocation [esp+upIrp] mov ecx, (FiDO_DEVICE_EXTENSION ptr [ebx]).TopOfStack call IofCallDriver push edi mov edi, eax lea eax, (FiDO_DEVICE_EXTENSION ptr [ebx]).RemoveLock invoke IoReleaseRemoveLockEx, eax, pIrp, sizeof IO_REMOVE_LOCK mov eax, edi pop edi pop ebx ret ;;;;.else kiipp: mov [edx].IoStatus.Status, eax and [edx].IoStatus.Information, 0 fastcall IofCompleteRequest, pIrp, IO_NO_INCREMENT ;;;;;.endif assume edx:nothing pop ebx .endif ret FiDO_DispatchPassThrough endp Винда просто перестаёт загружаться. А без IoAcquireRemoveLockEx и IoReleaseRemoveLockEx код работает. И ещё маленький вопросик. Как нормально перевести на MASM Код (Text): if (!NT_SUCCESS(status)) ? Ведь по-моему в MASM`е даже константы NT_SUCCESS нет
Llirik Нужно оставить. Вообще можно использовать проверку на STATUS_SUCCESS, обычно этого достаточно, информационные коды возвращаются редко и немногими апи. Док хотя старый, но годный - ничего не изменилось, ну разве за исключением NtQueryStatusCode(), теперь это функция RtlFindMessage() для ресурса RT_MESSAGETABLE.
klzlk, спасибо, но это был не главный вопрос. Главный вопрос: почему не работает IoAcquireRemoveLockEx?
Llirik Сами разбирайтесь, код ваш. У меня совершенно нет желания переписывать его(а "почему не работает код" это значит что нужно его мысленно переписать, разобрать). Обычно приводят конкретную причину или ошибку как частный случай. Выложив кучу кода - в нём никто не будет ковыряться, во первых проще свой нормальный запилить.
Хорошо, вот вам полный пример из DDK с не много изменёной функцией KbFilter_DispatchPassThrough. почему он не работает? В архиве исходник и сам драйвер
Взять дубину и бить больно-пребольно. Пока даже перед тем как посрать дампы кишков не начнёшь выкладывать. Инициализировать remove lock не пробовал, например?
x64, )))))))))))))))))). Нужно ещё решением суда запретить к компьютеру приближаться ближе чем на 15 метров!
Слушайте, вроде бы с и REMOVE LOCK уже разобрался, а устройство по-прежнему удаляться не хочет( Код (Text): KbFilter_PnP proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP local event:KEVENT local status:NTSTATUS push edi push esi push ebx mov eax, pDeviceObject mov ebx, (DEVICE_OBJECT ptr [eax]).DeviceExtension mov esi, pIrp assume esi:ptr _IRP mov edi,DWORD PTR [esi+96] assume edi:ptr IO_STACK_LOCATION .if [edi].MinorFunction == IRP_MN_REMOVE_DEVICE lea eax, (FiDO_DEVICE_EXTENSION ptr [ebx]).RemoveLock invoke IoAcquireRemoveLockEx, eax, pIrp, 0, 0, sizeof IO_REMOVE_LOCK test eax, eax jl kiippy dec gr lea eax, (FiDO_DEVICE_EXTENSION ptr [ebx]).RemoveLock invoke IoReleaseRemoveLockAndWaitEx, eax, pIrp, sizeof IO_REMOVE_LOCK mov edx, pIrp assume edx:ptr _IRP inc [edx].CurrentLocation add [edx].Tail.Overlay.CurrentStackLocation, sizeof IO_STACK_LOCATION ;;;;IoSkipCurrentIrpStackLocation [esp+upIrp] mov ecx, (FiDO_DEVICE_EXTENSION ptr [ebx]).TopOfStack call IofCallDriver mov status, eax invoke IoDetachDevice, (FiDO_DEVICE_EXTENSION ptr [ebx]).TopOfStack invoke IoDeleteDevice, pDeviceObject Экрана смерти нет, просто не удаляется. Устройство имеет своё имя Код (Text): g_usDeviceName dw "\","D","e","v","i","c","e","\","K","e","y","M","o","u","s","e" gr dw "1" gu dw 0 gg_usDeviceName UNICODE_STRING {sizeof g_usDeviceName +2, sizeof g_usDeviceName +4, offset g_usDeviceName} Что делать?
Хорошо. Вот вам исходник на вашем любимом С. Почему при отключении USB-клавиатуры устройство keymouse1 или keymouse2 (смотря сколько клавиатур) не удаляется?