Re: RtlAllocateHeap
- From
- Alex Fedotov ()
- To
- Alexey Nevolin
- Date
- 2001-03-17T02:02Z
- Area
- SU.WINDOWS.NT.PROG
From: "Alex Fedotov" <alexf@3cube.com>
Alexey Nevolin wrote:
> Тут вот что: если посмотреть hiew'ом kernel32.dll, то все функции
> блокировки/разблокировки ссылаются (рано или поздно, но однозначно) в
> недокументированную RtlLockHeap. Которой передается КУЧА параметров.
> (Куча слабо сказанно).
>
> .77f119d0 - entrypoint от GlobalLock'а. Считаем push'ы. 9 штук =) Все
> остальные Global/Local Lock'и, Unlock'и, и т.д. Сходятся в итоге сюда.
Не-а, не сертифицированный ты дизассемблер. Большая часть этих push-ей
относится к сохранению регистров и установке фрейма обработки исключений.
Можно я свой вариант приведу? У меня Win2K и отладочные символы установлены.
; это настройка стекового фрейма
001B:77E895E1 PUSH EBP
001B:77E895E2 MOV EBP,ESP
; это настройка фрейма обработки исключений
001B:77E895E4 PUSH FF
001B:77E895E6 PUSH 77E89688
001B:77E895EB PUSH __except_handler3
001B:77E895F0 MOV EAX,FS:[00000000]
001B:77E895F6 PUSH EAX
001B:77E895F7 MOV FS:[00000000],ESP
; выделение места под локальные переменные
; (даже не спрашивай почему они SUB ESP,14 не сделали,
; компилятор у них такой)
001B:77E895FE PUSH ECX
001B:77E895FF PUSH ECX
001B:77E89600 SUB ESP,0C
; сохранение регистров
001B:77E89603 PUSH EBX
001B:77E89604 PUSH ESI
001B:77E89605 PUSH EDI
; проверяем бит в HGLOBAL. Видимо, он отличает FIXED блоки от MOVEABLE
001B:77E89606 MOV [EBP-18],ESP
001B:77E89609 MOV EBX,[EBP+08]
001B:77E8960C TEST BL,04
001B:77E8960F JZ 77E84C1B
; функция RtlLockHeap имеет ОДИН параметр -- базовый адрес кучи,
; насколько я понимаю она захватывает критическую секцию, связанную
; с кучей
001B:77E89615 PUSH DWORD PTR [_BaseHeap]
001B:77E8961B CALL [__imp__RtlLockHeap]
; это основной код для GlobalLock; мне не очень интересно в нем
; разбираться
001B:77E89621 XOR EDI,EDI
001B:77E89623 MOV [EBP-04],EDI
001B:77E89626 LEA ESI,[EBX-04]
001B:77E89629 MOV [EBP-20],ESI
001B:77E8962C PUSH ESI
001B:77E8962D PUSH _BaseHeapHandleTable
001B:77E89632 CALL [__imp__RtlIsValidHandle]
001B:77E89638 TEST AL,AL
001B:77E8963A JZ 77EB0461
001B:77E89640 MOV EDI,[ESI+04]
001B:77E89643 MOV [EBP-1C],EDI
001B:77E89646 TEST EDI,EDI
001B:77E89648 JZ 77E81C0C
001B:77E8964E MOV CX,[ESI+02]
001B:77E89652 LEA EAX,[ECX+01]
001B:77E89655 MOV [ESI+02],AX
001B:77E89659 CMP CX,00FF
001B:77E8965E JZ 77EB0470
001B:77E89664 OR DWORD PTR [EBP-04],-01
; освободить критическую секцию
001B:77E89668 PUSH DWORD PTR [_BaseHeap]
001B:77E8966E CALL [__imp__RtlUnlockHeap]
; восстановление фрейма исключений, регистров и выход
001B:77E89674 MOV EAX,EDI
001B:77E89676 MOV ECX,[EBP-10]
001B:77E89679 MOV FS:[00000000],ECX
001B:77E89680 POP EDI
001B:77E89681 POP ESI
001B:77E89682 POP EBX
001B:77E89683 LEAVE
001B:77E89684 RET 0004
> AF> Какая книжка?
> Книжка с описанием Native API =) Их куча на амазоне.
Я вот хочу "Windows NT/2000 Native API Reference" by Gary Nebbett купить.
А еще какие в этой куче?
--
Alex Fedotov
--- ifmail v.2.15dev5
* Origin: Fidolook Express 2.000 www.fidolook.da.ru (2:5020/400)