· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› IoInitializeRemoveLock и так далее ?

. 1 . 2 . 3 . >>

Посл.отвђт Сообщенiе


Дата: Июл 30, 2004 20:49:53

У кого - нибудь есть для Masm макросы IoAcquireRemoveLock, IoInitializeRemoveLock, IoReleaseRemoveLockandWait, IoReleaseRemoveLock ?


Дата: Июл 31, 2004 01:45:16

IoAcquireRemoveLock и IoInitializeRemoveLock есть у меня. Я вот только не помню в каком они состоянии :) Имя файла и номер строки как-то не получилось прикрутить. Попробуй, но я ничего не гарантирую.
IoInitializeRemoveLock MACRO _Lock:REQ, Tag:REQ, Maxmin:REQ, HighWater:REQ
local SegName, a, t, reax, line

    ;;IoInitializeRemoveLockEx (Lock, Tag, Maxmin, HighWater, sizeof (IO_REMOVE_LOCK))

    reax = 0

    push sizeof IO_REMOVE_LOCK
    push HighWater
    push Maxmin

    IF $IsImm(Tag)
        SegName TEXTEQU @CurSeg
        .const
            t dd Tag
            db 0
        @CurSeg ENDS
        SegName SEGMENT
        lea eax, t
        reax = 1
    ELSEIF $IsAddr(Tag)
        a SUBSTR <Tag>, 6
        IF $IsStack(a)              ;; Is relative to SS
            lea eax, a
            reax = 1
        ELSE
            mov eax, offset a
            reax = 1
        ENDIF
    ELSEIF $IsReg(Tag)
        IFDIFI <Tag>, <eax> ;; don't move eax onto itself
            mov eax, Tag
            reax = 1
        ENDIF
    ELSEIF $IsStack(Tag)
        mov eax, Tag
        reax = 1
    ELSE
        .ERR
    ENDIF
    push eax


    IF $IsAddr(_Lock)
        a SUBSTR <_Lock>, 6
        IF $IsStack(a)              ;; Is relative to SS
            lea eax, a
        ELSE
            mov eax, offset a
        ENDIF
    ELSEIF $IsReg(_Lock)
        IFDIFI <_Lock>, <eax>   ;; don't move eax onto itself
            mov eax, _Lock
        ELSE
            IF reax EQ 1
                line TEXTEQU %@Line
                % ECHO @FileCur(line) : ERROR! Register value overwritten by IoInitializeRemoveLock macro.
                .ERR
            ENDIF
        ENDIF
    ELSEIF $IsStack(_Lock)
        mov eax, _Lock
    ELSE
        .ERR
    ENDIF

    push eax    
    call IoInitializeRemoveLockEx
ENDM

IoAcquireRemoveLock MACRO RemoveLock:REQ, Tag:REQ
local a

    ;; IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK))

    push sizeof IO_REMOVE_LOCK
    push 0
    push 0
    push Tag

    IF $IsAddr(RemoveLock)
        a SUBSTR <RemoveLock>, 6
        IF $IsStack(a)              ;; Is relative to SS
            lea eax, a
        ELSE
            mov eax, offset a
        ENDIF
    ELSEIF $IsReg(RemoveLock)
        IFDIFI <RemoveLock>, <eax>  ;; don't move eax onto itself
            mov eax, RemoveLock
        ENDIF
    ELSEIF $IsStack(RemoveLock)
        mov eax, RemoveLock
    ELSE
        .ERR
    ENDIF

    push eax
    call IoAcquireRemoveLockEx
ENDM


Дата: Июл 31, 2004 22:36:36

Не помнишь, где должна располагаться структура IO_REMOVE_LOCK ?


Дата: Июл 31, 2004 23:18:11

Самое правильное все ассоциированные с девайсом данные хранить в девайс екстеншн. Там и должна быть IO_REMOVE_LOCK. Но думаю ничего страшнго не случиться если сделать её просто глобальной переменной.


Дата: Авг 1, 2004 00:59:18

Есть структура DEVICE_EXTENSION STRUCT

...

pRemoveLock PIO_REMOVE_LOCK ?


DEVICE_EXTENSION ends

есть структура IO_REMOVE_LOCK STRUCT

RemoveLock DWORD ? ;
IO_REMOVE_LOCK ends

PIO_REMOVE_LOCK typedef PTR IO_REMOVE_LOCK

1. В IoInitializeRemolock первым параметром задается указатель на структуру IO_REMOVE_LOCK, а не на переменную в ней ?
2. Допустим в edx есть адрес DEVICE_EXTENSION,
IoInitializeRemoveLock (DEVICE_EXTENSION ptr [edx]).pRemoveLock , 0, 0, 255 выдает
error A2052: forced error
IoInitializeRemoveLock(23): Macro Called From.
Есть где - нибудь описания таких ошибок и описание макроязыка и вызовов макросов ?

Он что, не совсем так вызывается ?


Дата: Авг 1, 2004 19:33:21

Проблема в том, что подобные макросы для масм писАть чрезвычайно геморройно, в отличие от си, где можно буквально несколькими строчками. Почти любой параметр может передаваться в глобальной переменной, переменной в стеке, в регистре, с составе структуры, быть непосредственным значением. И все эти ситуации приходится обрабатывать. Например, для часто используемого макроса InitializeObjectAttributes, я это сделал. Посмотри его определение в ntdef.inc и сравни с оригиналом. Не правда ли, есть "небольшая" разница.

Ты второй человек, которому потребовались эти макросы. Поэтому тратить 2-3 часа на макрос слишком расточительно. В случае с IoInitializeRemoveLock я не обрабатываю ситуацию, когда первый параметр передается как член структуры, а просто генерю ошибку. Обойди так:
mov ecx, (DEVICE_EXTENSION ptr [edx]).pRemoveLock
IoInitializeRemoveLock ecx, 0, 0, 255


А лучше вообще не связывайся с ними. Они очень сырые. Лучше забей все в процедуру или руками если по времени критично.


Описание кодов ошибок и макроязыка есть в документации по масм.

http://webster.cs.ucr.edu/Page_TechDocs/MASMDoc/
http://cs.uns.edu.ar/~jechaiz/organizacion/TechDocs/
http://www.visualassembler.com/


Дата: Авг 1, 2004 23:45:15

Вроде IoInitializeRemoveLock работает (когда ставишь один этот макрос без остальных) , как только в dispatch ставишь IoAcquireRemoveLock, при прохождении IRPs, синий экран.

Вот такой участок кода:

В edx указатель на DeviceExtension

mov ecx, (DEVICE_EXTENSION ptr [edx]).pRemoveLock
IoAcquireRemoveLock ecx, 0

IoSkipCurrentIrpStackLocation pIrp

invoke IoCallDriver, (DEVICE_EXTENSION ptr [edx]).dDeviceObjectExt, pIrp

Если стоит IoAcquireRemoveLock ecx, 0
то до invoke IoCallDriver, (DEVICE_EXTENSION ptr [edx]).dDeviceObjectExt, pIrp
не доходит исполнение кода и синий экран с ошибкой в ntoskrnl.exe, если IoAcquireRemoveLock нет, то все работает.

Без них не работает корректно выгрузка (динамическая) драйвера.


Дата: Авг 1, 2004 23:50:18

Или IoAcquireRemoveLock ecx, pIRP


Дата: Авг 2, 2004 19:41:33

[ bd04: ...и синий экран... ]

Ну в макросе у мя бага :( Вот, держи функции. Издержки будут на двойную передачу параметров, но они минимальны. Если для тебя это принципиально, то юзай сразу Io...Ex функции (см. закомментаренные строки). Параметр Tag используется только на проверочном выпуске винды. Так что ставь его просто в 0.


[ bd04: Или IoAcquireRemoveLock ecx, pIRP ]

Как я уже сказал, Tag только для checked build. Во free build на него никто не обращает внимания. Приведенный тобой вариант используется как доп. отладочный прием. Если IoAcquireRemoveLock и IoInitializeRemoveLock вызываются при обработке одного и того же IRP то теги (pIRP) у них будут одинаковы. Тогда всё ОК. Если же теги окажутся разными, то IoInitializeRemoveLock сгенерит BSOD.


В ntddk.inc закомментарь лишнее или выброси нах. И скажи мне работают функции или нет.
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
;                                    IoInitializeRemoveLock                                         
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::

IoInitializeRemoveLock proc RemoveLock:PIO_REMOVE_LOCK, Tag:DWORD, Maxmin:DWORD, HighWater:DWORD
	; WARNING: Only for FREE build of the Windows
	option PROLOGUE:NONE
	option EPILOGUE:NONE
	;invoke IoInitializeRemoveLockEx, RemoveLock, Tag, Maxmin, HighWater, sizeof IO_REMOVE_LOCK
	invoke IoInitializeRemoveLockEx, [esp+14h], [esp+14h], [esp+14h], [esp+14h], sizeof IO_REMOVE_LOCK
	ret 4 * (sizeof DWORD)
	option PROLOGUE:PROLOGUEDEF
	option EPILOGUE:EPILOGUEDEF
IoInitializeRemoveLock endp

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
;                                    IoAcquireRemoveLock                                            
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::

IoAcquireRemoveLock proc RemoveLock:PIO_REMOVE_LOCK, Tag:DWORD
	; WARNING: Only for FREE build of the Windows
	option PROLOGUE:NONE
	option EPILOGUE:NONE
	;invoke IoAcquireRemoveLockEx, RemoveLock, Tag, NULL, 0, sizeof IO_REMOVE_LOCK
	invoke IoAcquireRemoveLockEx, [esp+14h], [esp+14h], NULL, 0, sizeof IO_REMOVE_LOCK
	ret 2 * (sizeof DWORD)
	option PROLOGUE:PROLOGUEDEF
	option EPILOGUE:EPILOGUEDEF
IoAcquireRemoveLock endp

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
;                                   IoReleaseRemoveLock                                             
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::

IoReleaseRemoveLock proc RemoveLock:PIO_REMOVE_LOCK, Tag:DWORD
	; WARNING: Only for FREE build of the Windows
	option PROLOGUE:NONE
	option EPILOGUE:NONE
	;invoke IoReleaseRemoveLockEx, RemoveLock, Tag, sizeof IO_REMOVE_LOCK
	invoke IoReleaseRemoveLockEx, [esp+0Ch], [esp+0Ch], sizeof IO_REMOVE_LOCK
	ret 2 * (sizeof DWORD)
	option PROLOGUE:PROLOGUEDEF
	option EPILOGUE:EPILOGUEDEF
IoReleaseRemoveLock endp
        
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
;                                IoReleaseRemoveLockAndWait                                         
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
        
IoReleaseRemoveLockAndWait proc RemoveLock:PIO_REMOVE_LOCK, Tag:DWORD
	; WARNING: Only for FREE build of the Windows
	option PROLOGUE:NONE
	option EPILOGUE:NONE
	;invoke IoReleaseRemoveLockAndWaitEx, RemoveLock, Tag, sizeof IO_REMOVE_LOCK
	invoke IoReleaseRemoveLockAndWaitEx, [esp+0Ch], [esp+0Ch], sizeof IO_REMOVE_LOCK
	ret 2 * (sizeof DWORD)
	option PROLOGUE:PROLOGUEDEF
	option EPILOGUE:EPILOGUEDEF
IoReleaseRemoveLockAndWait endp


Дата: Авг 2, 2004 19:44:28

С макросами мож когда-нить в отдаленном будущем разберусь.


Дата: Авг 5, 2004 23:04:57

Где должна располагаться переменная RemoveLock вида PIO_REMOVE_LOCK, в драйвере, как глобальная, или в расширении устройства ?

Синий экран продолжается.


Дата: Авг 6, 2004 01:00:34

[ bd04: Где должна располагаться переменная RemoveLock вида PIO_REMOVE_LOCK, в драйвере, как глобальная, или в расширении устройства ? ]

Опять двадцать пять :) Если ты разместил IO_REMOVE_LOCK в девайс экстеншн, как и полагается по теории, то указатель на неё тебе не нужен, т.к. она является частью этого самого девайс экстеншн и ты обращаешься к ней как к члену структуры. Если она у тя в другом месте, то указатель, скорее всего, удобнее пихнуть в глобальную переменную. Нужно глянуть на код.


[ bd04: Синий экран продолжается. ]

Процедуры я проверял и сами по себе они работают. Покажи код или кусок, а то так хрен чего поймешь. И где бсодит и код какой?


Дата: Авг 6, 2004 21:20:10

[Опять двадцать пять :) Если ты разместил IO_REMOVE_LOCK в девайс экстеншн, как и полагается по теории, то указатель на неё тебе не нужен, т.к. она является частью этого самого девайс экстеншн и ты обращаешься к ней как к члену структуры. Если она у тя в другом месте, то указатель, скорее всего, удобнее пихнуть в глобальную переменную. Нужно глянуть на код. ]


У меня в структуре device_extension располагается переменная указатель на структуру IO_REMOVE_LOCK, а сама эта структура как и была, в ntddk.inc (улыбка) .


Вот состав device_extension:

ссылка на объект устройства, созданный этим драйвером PDEVICE_OBJECT
ссылка на объект устройства, которое прикрепилось PDEVICE_OBJECT
premovelock PIO_REMOVE_LOCK


Какой код тебе показать ?


Дата: Авг 6, 2004 21:21:52

Все эти функции должны располагаться в INIT секции или нет ?


Дата: Авг 6, 2004 21:42:59

Нет конечно!

. 1 . 2 . 3 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.141