|
|
| Посл.отвђт | Сообщен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 Нет конечно! |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.141 |