Хитрости.

Персональный блог одноименного форумчанина. Человека и парохода, не побоюсь этого сравнения :)

Модератор: tyomitch

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Хитрости.

Сообщение tyomitch » 14.05.2006 (Вс) 0:43

Решил проапгрейдить рассеянные мной по форуму за последние два дня мысли до очередного внеочередного поста.

* По умолчанию локальные массивы фиксированного размера создаются VB6 в куче; в стеке лежит лишь 24-байтный дескриптор (типа SAFEARRAY). Это позволяет использовать громадные локальные массивы, не опасаясь переполнения стека.

Намного эффективнее, когда это возможно, размещать массив целиком в стеке. Для этого его надо обрамить UDT-обёрткой:

Код: Выделить всё
Option Explicit

Private Type a
    b(10) As Long
End Type

Sub Main()
    Dim a As a, b(10) As Long, sp As Long
    Debug.Print Hex(VarPtr(sp))     'стек
    Debug.Print Hex(VarPtr(b(0)))   'куча
    Debug.Print Hex(VarPtr(a.b(0))) 'стек
End Sub


В этом случае дескриптор (который типа SAFEARRAY) не создаётся вовсе. Тем более удивительно, что удаётся успешно скастовать такой обёрнутый массив к типу Variant.


* Вроде бы не общеизвестно, что в виндовых прогах сегмент fs: указывает не в безвоздушное пространство, а на TEB (Thread Environment Block). В частности, fs:0 указывает на начало цепочки обработчиков SEH, fs:1Ch -- на окружение, fs:20h -- содержит PID, fs:24h -- TID и т.д.

fs:18h указывает на адрес этого TEB в основном адресном пространстве. В частности, чтобы не вызывать ассемблерную вставку для каждого обращения к полям TEB, достаточно прочитать адрес из поля fs:18h и скопировать данные с этого адреса в соответствующим образом объявленную UDT.

В TEB (и PEB, на который тот ссылается), хранится уйма полезной информации, доступной для чтения и записи. Например, записью в PEB можно переопределить стандартные хендлы. (Кому-то на форуме этого очень хотелось, не могу сейчас найти тот пост.)


* И теперь, собственно, возникает вопрос: где взять объявления структур PEB и TEB, если их нет даже в DDK? Вот из этой ссылки и развился данный пост :-)

Бесценный ресурс для всех, кто любит ковыряться в кишках Винды: http://www.acc.umu.se/~bosse/ntifs.h
Последний раз редактировалось tyomitch 15.05.2006 (Пн) 17:38, всего редактировалось 2 раз(а).
Изображение

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 14.05.2006 (Вс) 3:12

tyomitch`y - звание " патологоанатом". с синтаксисом разберёмся потом.
Последний раз редактировалось Sebas 17.05.2006 (Ср) 0:04, всего редактировалось 1 раз.
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.05.2006 (Пн) 17:39

ап!грейд
Изображение

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 16.05.2006 (Вт) 21:55

Темыч, за ссылочкуогромное мерси.
А я все практикую лечение травами...


Вернуться в Tyomitch

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList