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)