Функция IoAcquireRemoveLockEx

Тема в разделе "WASM.NT.KERNEL", создана пользователем Llirik, 4 июл 2011.

  1. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Подскажите, пожалуйста, почему не работает такой код:
    Код (Text):
    1. FiDO_DispatchPassThrough proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
    2. mov eax, pDeviceObject
    3. .if eax == KeyDeviceObject
    4. invoke killirp, pIrp
    5. .else
    6. push ebx
    7. mov ebx, (DEVICE_OBJECT ptr [eax]).DeviceExtension
    8. lea eax, (FiDO_DEVICE_EXTENSION ptr [ebx]).RemoveLock
    9.     invoke IoAcquireRemoveLockEx, eax, pIrp, 0, 0, sizeof IO_REMOVE_LOCK
    10. mov edx, pIrp
    11.      assume edx:ptr _IRP
    12. ;;;;.if eax == NT_SUCCESS
    13.     test    eax, eax
    14.     jl kiipp
    15.     inc [edx].CurrentLocation
    16.     add [edx].Tail.Overlay.CurrentStackLocation, sizeof IO_STACK_LOCATION
    17. ;;;;IoSkipCurrentIrpStackLocation [esp+upIrp]
    18.     mov ecx, (FiDO_DEVICE_EXTENSION ptr [ebx]).TopOfStack
    19. call    IofCallDriver
    20. push edi
    21. mov edi, eax
    22. lea eax, (FiDO_DEVICE_EXTENSION ptr [ebx]).RemoveLock
    23.     invoke IoReleaseRemoveLockEx, eax, pIrp, sizeof IO_REMOVE_LOCK
    24. mov eax, edi
    25. pop edi
    26. pop ebx
    27. ret
    28. ;;;;.else
    29. kiipp:
    30.      mov [edx].IoStatus.Status, eax
    31.      and [edx].IoStatus.Information, 0
    32.      fastcall IofCompleteRequest, pIrp, IO_NO_INCREMENT
    33. ;;;;;.endif
    34.      assume edx:nothing
    35. pop ebx
    36. .endif
    37. ret
    38. FiDO_DispatchPassThrough endp
    Винда просто перестаёт загружаться. А без IoAcquireRemoveLockEx и IoReleaseRemoveLockEx код работает. И ещё маленький вопросик. Как нормально перевести на MASM
    Код (Text):
    1. if (!NT_SUCCESS(status))
    ? Ведь по-моему в MASM`е даже константы NT_SUCCESS нет
     
  2. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    См. аттач.
     
  3. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    klzlk, то есть придётся так и оставить
    Код (Text):
    1.     test    eax, eax
    2.     jl kiipp
    ?
     
  4. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    Llirik
    Нужно оставить. Вообще можно использовать проверку на STATUS_SUCCESS, обычно этого достаточно, информационные коды возвращаются редко и немногими апи. Док хотя старый, но годный - ничего не изменилось, ну разве за исключением NtQueryStatusCode(), теперь это функция RtlFindMessage() для ресурса RT_MESSAGETABLE.
     
  5. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    klzlk, спасибо, но это был не главный вопрос. Главный вопрос: почему не работает IoAcquireRemoveLockEx?
     
  6. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    Llirik
    Сами разбирайтесь, код ваш. У меня совершенно нет желания переписывать его(а "почему не работает код" это значит что нужно его мысленно переписать, разобрать). Обычно приводят конкретную причину или ошибку как частный случай. Выложив кучу кода - в нём никто не будет ковыряться, во первых проще свой нормальный запилить.
     
  7. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    klzlk, так залипите свой код) я на него гляну
     
  8. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Хорошо, вот вам полный пример из DDK с не много изменёной функцией KbFilter_DispatchPassThrough. почему он не работает?

    В архиве исходник и сам драйвер
     
  9. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Взять дубину и бить больно-пребольно.
    Пока даже перед тем как посрать дампы кишков не начнёшь выкладывать.

    Инициализировать remove lock не пробовал, например?
     
  10. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    x64, )))))))))))))))))). Нужно ещё решением суда запретить к компьютеру приближаться ближе чем на 15 метров!
     
  11. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Благодарю за подсказку)
     
  12. newbie

    newbie New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    1.246
    ошибся темой. ред.
     
  13. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    newbie
    Windows NT Status Code Specification.
     
  14. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Слушайте, вроде бы с и REMOVE LOCK уже разобрался, а устройство по-прежнему удаляться не хочет(
    Код (Text):
    1. KbFilter_PnP proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
    2. local event:KEVENT
    3. local status:NTSTATUS
    4. push edi
    5. push esi
    6. push ebx
    7.  
    8.     mov eax, pDeviceObject
    9.     mov ebx, (DEVICE_OBJECT ptr [eax]).DeviceExtension
    10.      mov esi, pIrp
    11.      assume esi:ptr _IRP
    12.  
    13.      mov edi,DWORD PTR [esi+96]
    14.      assume edi:ptr IO_STACK_LOCATION
    15.     .if  [edi].MinorFunction == IRP_MN_REMOVE_DEVICE
    16. lea eax, (FiDO_DEVICE_EXTENSION ptr [ebx]).RemoveLock
    17.     invoke IoAcquireRemoveLockEx, eax, pIrp, 0, 0, sizeof IO_REMOVE_LOCK
    18.     test    eax, eax
    19.     jl kiippy
    20.     dec gr
    21. lea eax, (FiDO_DEVICE_EXTENSION ptr [ebx]).RemoveLock
    22.     invoke IoReleaseRemoveLockAndWaitEx, eax, pIrp, sizeof IO_REMOVE_LOCK
    23. mov edx, pIrp
    24.      assume edx:ptr _IRP
    25.     inc [edx].CurrentLocation
    26.     add [edx].Tail.Overlay.CurrentStackLocation, sizeof IO_STACK_LOCATION
    27. ;;;;IoSkipCurrentIrpStackLocation [esp+upIrp]
    28.     mov ecx, (FiDO_DEVICE_EXTENSION ptr [ebx]).TopOfStack
    29. call    IofCallDriver
    30.   mov status, eax
    31.     invoke IoDetachDevice, (FiDO_DEVICE_EXTENSION ptr [ebx]).TopOfStack
    32.     invoke IoDeleteDevice, pDeviceObject
    Экрана смерти нет, просто не удаляется.
    Устройство имеет своё имя
    Код (Text):
    1. g_usDeviceName dw "\","D","e","v","i","c","e","\","K","e","y","M","o","u","s","e"
    2. gr dw "1"
    3. gu dw 0
    4. gg_usDeviceName UNICODE_STRING {sizeof g_usDeviceName +2, sizeof g_usDeviceName +4, offset g_usDeviceName}
    Что делать?
     
  15. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Хорошо. Вот вам исходник на вашем любимом С. Почему при отключении USB-клавиатуры устройство keymouse1 или keymouse2 (смотря сколько клавиатур) не удаляется?