Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

RusFAQ.ru: программирование на языке Assembler

Выпуск № 632
от 03.09.2003, 01:20

Администратор:
Имя: Калашников О.А.
URL: Информационный ресурс
ICQ: 68951340
Россия, Москва
О рассылке:
Задано вопросов: 4076
Отправлено ответов: 12079
Активность: 296.3 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

ASMодей
Статус: Профессиональный
Общий рейтинг: 113.1
[Подробней >>]
Greys
Статус: Доверительный
Общий рейтинг: 122.56
[Подробней >>]
Bob Johnson
Статус: Профессиональный
Общий рейтинг: 152.34
URL: Программирование
[Подробней >>]
 
_vt
Статус: Профессиональный
Общий рейтинг: 121.48
[Подробней >>]
Евгений Иванов
Статус: Профессиональный
Общий рейтинг: 148.27
URL: Super Assembler Software
Телефон: НСС +7 831 3107039
[Подробней >>]
Gibbel
Статус: Профессиональный
Общий рейтинг: 107.35
URL: Savage Metal Club - жизнь в стиле рок-н-ролл
Телефон: +7 901 710 3146
[Подробней >>]
 
Илья
Статус: Опытный
Общий рейтинг: 102.86
[Подробней >>]
Hangatyr
Статус: Опытный
Общий рейтинг: 112.66
[Подробней >>]
masquer
Статус: Профессиональный
Общий рейтинг: 134.18
[Подробней >>]
 
St
Статус: Профессиональный
Общий рейтинг: 106.64
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 4036. Вообщем, пишу загрущик, там перехожу в защищенный режим, после перехода мне надо зделать прижок в уж... (ответов: 3)
Вопрос № 4037. Где найти хорошие статьи по созданию ОС?... (ответов: 3)
Вопрос № 4038. Извините за глупый вопрос , но что значит OEP Заранее спасибо.... (ответов: 2)
Вопрос № 4040. Приветствую вас товарищи эксперты =) Скиньте мне рабочий код для TASM 5.0 приложения под ВЫНь32 кото... (ответов: 2)
Вопрос № 4042. Hi! Есть на диске файл. Как можно его прочитать из Win9x, WinXP, без использования WinApi(ReadFile ... (ответов: 5)
Вопрос № 4043. Здравствуйте, Эксперты. Вопрос такой. Написал код (в приложении). Программа должна проверять наличие... (ответов: 4)
Вопрос № 4044. Доброе время суток, уважаемые эксперты! Просто ламерство какое-то меня одолело :( Проблема такая: ис... (ответов: 3)
Вопрос № 4045. Здравствуйте Bob Johnson. Большое спасибо за ответ на мой вопрос №4009. Ваш ответ оказался самым по... (ответов: 1)
Вопрос № 4046. Здраствуйте эксперты! Может ли Dll завершить приложение его вызвавшее(по другому-чтоб обрушить прогу... (ответов: 3)

Вопросов: 9, ответов: 26


 Вопрос № 4036

Вообщем, пишу загрущик, там перехожу в защищенный режим, после перехода мне надо зделать прижок в уже загруженое ядро системы, но после этого комп перезагружается. Прижок я делаю обычным образом, типа jmp 012345h



Вопрос отправлен: 28.08.2003, 23:59
Отправитель: pavel

[Следующий вопрос >>] [Список вопросов]

Отвечает ASMодей

Доброе время суток, pavel!
Причин может быть несколько, например выход за границы сегмента. Возможно ошибка не в переходе, а дальше в ядре ОС. Трудно сказать.
Вообще для отладки я советую написать зацикленную процедуру вывода на экран какой-нибудь строки. Тогда вызов этой процедуры можно будет вставлять в код и видеть дошло ли управление до этого места или ошибка произошла раньше. Так можно точно выяснить на какой инструкции процессор сбросился.

Ответ отправлен: 29.08.2003, 08:30
Отправитель: ASMодей


Отвечает Greys

Здравствуйте, pavel!
Вы забыли всего одну маленькую деталь.
jmp 0x8: 012345h ;;обратите на это место внимание
;; С помощью длинного прыжка мы загружаем
;; селектор нужного сегмента в регистр CS
;; (напрямую это сделать нельзя)
;; 8 (1000b) - первый дескриптор в GDT, RPL=0
Но вы должны заранее подготовить GDT.
С уважением, Greys!

Ответ отправлен: 31.08.2003, 22:38
Отправитель: Greys


Отвечает Bob Johnson

Доброе время суток, pavel!
Если перезагружается - значит либо ты не туда попал, либо возникло исключение, которое некому обработать. Смотри внимательнее, если ты перешел в защищенный режим, какие у тебя дескрипторы сегментов, все ли правильно настроено; не забыл ли ты перезагрузить cs? (far jump)
Когда я писал самую первую программку, переходящую в защищенный режим, у меня возникла проблема при загрузки в сегментный регистр дескриптора 0 - такого дескриптора не существует (т.е. первые 8 байт в таблице свободны), т.к. он зарезервирован. В общем, надо начинать с 1-го.

* EMan1.5: ---===*** The game we play ***===---


Ответ отправлен: 29.08.2003, 14:23
Отправитель: Bob Johnson


 Вопрос № 4037

Где найти хорошие статьи по созданию ОС?



Вопрос отправлен: 29.08.2003, 00:02
Отправитель: pavel

[Следующий вопрос >>] [Список вопросов]

Отвечает ASMодей

Здравствуйте, pavel!
Где, где ... в интернете, конечно. Прямо так и пиши в поисковике: "создание операционной системы" и будет тебе куча ссылок на всякие сайты.

Ответ отправлен: 29.08.2003, 08:33
Отправитель: ASMодей


Отвечает Greys

Здравствуйте, pavel!
http://www.lowlevel.ru/
Советую походите по всем ссылкам этого ресурса и вам этого на первый раз хватит!
С уважением,Greys!

Ответ отправлен: 31.08.2003, 22:54
Отправитель: Greys


Отвечает _vt

Доброе время суток, pavel!
На Сабскрайбе штук пять рассылок по созданию ОС... Правда все они глохнут после нескольких выпусков... Мне больше всех понравилась comp.soft.prog.osdev - но что-то и она затихла...

---===*** Updated E-Man 1.5 - it's cool!***===---


Ответ отправлен: 29.08.2003, 14:34
Отправитель: _vt


 Вопрос № 4038

Извините за глупый вопрос , но что значит OEP
Заранее спасибо.



Вопрос отправлен: 29.08.2003, 00:46
Отправитель: Libda

[Следующий вопрос >>] [Список вопросов]

Отвечает ASMодей

Приветствую Вас, Libda!
OEP (Original Entry Point) – оригинальная точка входа в программу

Ответ отправлен: 29.08.2003, 08:39
Отправитель: ASMодей


Отвечает _vt

Добрый день, Libda!
Original Entry Point - оригинальная точка входа в программу... Ну ее типа ищут, когда ломают защиту программы...

---===*** Updated E-Man 1.5 - it's cool!***===---


Ответ отправлен: 29.08.2003, 14:34
Отправитель: _vt


 Вопрос № 4040

Приветствую вас товарищи эксперты =)
Скиньте мне рабочий код для TASM 5.0 приложения под ВЫНь32 которое выводит image что-то типа test.bmp не из ресурсов , а из обычного bmp файла ,который лежит где-то рядом типа (c: est.bmp).
Заранее благодарен ...



Вопрос отправлен: 29.08.2003, 09:00
Отправитель: x.CoRe

[Следующий вопрос >>] [Список вопросов]

Отвечает Евгений Иванов

Добрый день, x.CoRe!
Смотри подпрограмму LoadBitmapFromFileOrResource в моей разработке
"Говорящие часы" на моём сайте.


;----------------------------------------------------
; Загружает картинку из файла,создаёт палитру для неё
; Если имя файла 0 или пустое,то загружает из указанного
; ресурса (номер или адрес имени)
; OUT=> EAX-номер картинки,0-ошибка
; ECX-номер палитры.
; EDX-адрес BITMAPINFOHEADER
;
proc LoadBitmapFromFileOrResource
ARG @@NameFile:dword,@@NameRes:dword
LOCAL @@hFile:dword,@@bf:BITMAPFILEHEADER,@@Read:dword,@@bi:BITMAPINFOHEADER,
@@NumColors:dword,@@hPal:dword,@@hBmp:dword,@@hPal1:dword,
@@hmemPal:dword,@@hDC:dword,@@hmemBI:dword,@@bRes:byte
USES esi,edi,ebx
sub ebx,ebx
mov [@@bRes],bl
mov [@@hPal],ebx
mov [@@hFile],ebx
mov [@@hBmp],ebx
mov [@@hmemPal],ebx
mov [@@hmemBI],ebx
mov [@@hDC],ebx
mov eax,[@@NameFile]
or eax,eax
jz @@DoBoolRes
cmp [b eax],0
jnz @@DontRes
@@DoBoolRes:
inc [@@bRes]
Call FindResource,[hInst],[@@NameRes],RT_BITMAP
or eax,eax
jz @@exitErr
mov [@@hFile],eax
Call LoadResource,[hInst],eax
or eax,eax
jz @@exitErr
Call LockResource,eax
or eax,eax
jz @@exitErr
mov [@@Read],eax
xchg esi,eax
lea edi,[@@bi]
sub ecx,ecx
mov cl,size BITMAPINFOHEADER
mov ebx,ecx
rep movsb
mov [@@Read],esi
jmp @@h1
@@DontRes:
Call CreateFile,[@@NameFile],GENERIC_READ,FILE_SHARE_READ,ebx,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN,ebx
cmp eax,INVALID_HANDLE_VALUE
jz @@exitErr
mov [@@hFile],eax
lea ecx,[@@bf]
lea edx,[@@Read]
mov bl,size BITMAPFILEHEADER
Call ReadFile,eax,ecx,ebx,edx,0
or eax,eax
jz @@exitErr
cmp [@@Read],ebx
jnz @@exitErr
cmp [@@bf.bfType],'MB'
jnz @@exitErr
lea ecx,[@@bi]
lea edx,[@@Read]
sub ebx,ebx
mov bl,size BITMAPINFOHEADER
Call ReadFile,[@@hFile],ecx,ebx,edx,0
or eax,eax
jz @@exitErr
cmp [@@Read],ebx
jnz @@exitErr
@@h1:
sub ecx,ecx
mov dl,cl
cmp [@@bi.biSize],ebx
jz @@m1
cmp [@@bi.biSize],size BITMAPCOREHEADER
jnz @@exitErr
inc dl
mov cx,[(t BITMAPCOREHEADER @@bi).bcBitCount]
jmp @@m2
@@m1:
mov cx,[@@bi.biBitCount]
mov eax,[@@bi.biClrUsed]
or eax,eax
jnz @@m3
@@m2:
sub eax,eax
cmp cl,8
ja @@m3
inc eax
shl eax,cl
@@m3:
mov [@@NumColors],eax
or dl,dl
jz @@m5
push eax
movzx edi,[(t BITMAPCOREHEADER @@bi).bcHeight]
movzx eax,[(t BITMAPCOREHEADER @@bi).bcWidth]
push eax
mov ax,[(t BITMAPCOREHEADER @@bi).bcPlanes]
mov [@@bi.biSize],ebx
mov [@@bi.biPlanes],ax
pop [@@bi.biWidth]
mov [@@bi.biHeight],edi
mov [@@bi.biBitCount],cx
sub eax,eax
mov [@@bi.biCompression],eax ;BI_RGB
mov [@@bi.biSizeImage],eax
mov [@@bi.biXPelsPerMeter],eax
mov [@@bi.biYPelsPerMeter],eax
pop eax
mov [@@bi.biClrUsed],eax
mov [@@bi.biClrImportant],eax
sub eax,eax
mov al,size BITMAPCOREHEADER
cmp [@@bRes],0
jz @@m3_1
mov [@@Read],eax
jmp @@m5
@@m3_1:
sub eax,ebx
push ecx edx
Call SetFilePointer,[@@hFile],eax,0,FILE_CURRENT
pop edx ecx
cmp eax,-1
jz @@exitErr
@@m5:
mov bl,dl
cmp [@@bi.biSizeImage],0
jnz @@m6
mov eax,[@@bi.biWidth]
mul ecx
add eax,31
shr eax,5
shl eax,2
mul [@@bi.biHeight]
mov [@@bi.biSizeImage],eax
@@m6:
mov eax,[@@NumColors]
cmp [@@bi.biClrUsed],0
jnz @@m7
mov [@@bi.biClrUsed],eax
@@m7:
shl eax,2 ;*size RGBQUAD
add eax,[@@bi.biSize]
Call GlobalAlloc,GPTR,eax
or eax,eax
jz @@exitErr
mov [@@hmemBI],eax
xchg eax,edi
push edi
mov dl,bl
mov ecx,[@@bi.biSize]
lea esi,[@@bi]
rep movsb
pop edi
mov esi,edi
add esi,[@@bi.biSize]
mov eax,[@@NumColors]
cmp eax,ecx ;ecx=0
jz @@m8
or dl,dl
jz @@infoheader
lea ebx,[eax+eax*2] ;* size RGBTRIPLE
cmp [@@bRes],0
jz @@m7_2
push esi edi
mov edi,esi
mov ecx,ebx
mov esi,[@@Read]
rep movsb
mov [@@Read],esi
pop edi esi
jmp @@h3
@@m7_2:
lea edx,[@@Read]
Call ReadFile,[@@hFile],esi,ebx,edx,0
or eax,eax
jz @@exitErr
cmp [@@Read],ebx
jnz @@exitErr
@@h3:
mov ecx,[@@NumColors]
dec ecx
@@m7_1:
lea eax,[ecx+ecx*2] ;* size RGBTRIPLE
mov eax,[esi+eax]
and eax,0FFFFFFh
mov [esi+ecx*4],eax ;*4 => *RGBQUAD
dec ecx
cmp ecx,-1
jnz @@m7_1
cmp [@@bRes],0
jz @@m8
jmp @@m10
@@infoheader:
shl eax,2 ;*size RGBQUAD
xchg eax,ebx
cmp [@@bRes],0
jz @@m7_3
push esi edi
mov edi,esi
mov ecx,ebx
mov esi,[@@Read]
rep movsb
mov [@@Read],esi
pop edi esi
jmp @@m10
@@m7_3:
lea edx,[@@Read]
Call ReadFile,[@@hFile],esi,ebx,edx,0
or eax,eax
jz @@exitErr
cmp [@@Read],ebx
jnz @@exitErr
@@m8:
mov eax,[@@bf.bfOffBits]
or eax,eax
jz @@m10
Call SetFilePointer,[@@hFile],eax,0,FILE_BEGIN
cmp eax,-1
jz @@exitErr
@@m10:
mov eax,[@@NumColors]
or eax,eax
jz @@m12
push eax
shl eax,2 ;*size PALETTEENTRY
add eax,size LOGPALETTE
Call GlobalAlloc,GPTR,eax
pop ecx
or eax,eax
jz @@exitErr
mov [@@hmemPal],eax
xchg eax,ebx
mov [(t LOGPALETTE ebx).palNumEntries],cx
sub edx,edx
@@z1:
mov al,[(t RGBQUAD esi+edx*4).rgbRed]
mov [(t LOGPALETTE ebx+edx*4).palPalEntry.peRed],al
mov al,[(t RGBQUAD esi+edx*4).rgbGreen]
mov [(t LOGPALETTE ebx+edx*4).palPalEntry.peGreen],al
mov al,[(t RGBQUAD esi+edx*4).rgbBlue]
mov [(t LOGPALETTE ebx+edx*4).palPalEntry.peBlue],al
mov [(t LOGPALETTE ebx+edx*4).palPalEntry.peFlags],PC_NOCOLLAPSE ;? 0
inc edx
dec ecx
jnz @@z1
@@z5:
mov [(t LOGPALETTE ebx).palVersion],300h
Call CreatePalette,ebx
or eax,eax
jz @@exitErr
mov [@@hPal],eax
jmp @@m14
@@m12:
cmp [@@bi.biBitCount],8
jna @@m14
inc ah ;eax=256
mov [@@NumColors],eax
push eax
shl eax,2 ;*size PALETTEENTRY
add eax,size LOGPALETTE
Call GlobalAlloc,GPTR,eax
pop ecx
or eax,eax
jz @@exitErr
mov [@@hmemPal],eax
xchg eax,ebx
mov [(t LOGPALETTE ebx).palNumEntries],cx
sub eax,eax
mov edx,eax
mov ecx,eax
@@x1:
mov [(t LOGPALETTE ebx+edx*4).palPalEntry.peRed],ch
mov [(t LOGPALETTE ebx+edx*4).palPalEntry.peGreen],cl
mov [(t LOGPALETTE ebx+edx*4).palPalEntry.peBlue],ah
mov [(t LOGPALETTE ebx+edx*4).palPalEntry.peFlags],PC_NOCOLLAPSE ;? 0
add ch,32
jnz @@x2
add cl,32
jnz @@x2
add ah,64
@@x2:
inc edx
cmp edx,[@@NumColors]
jc @@x1
jmp @@z5
@@m14:
mov eax,[@@NumColors]
shl eax,2 ;*size RGBQUAD
add eax,[@@bi.biSize]
push eax
add eax,[@@bi.biSizeImage]
Call GlobalReAlloc,edi,eax,GHND
pop ecx
or eax,eax
jz @@exitErr
mov edi,eax
add eax,ecx
mov ebx,[@@bi.biSizeImage]
cmp [@@bRes],0
jz @@m15
push esi edi
xchg edi,eax
mov ecx,ebx
mov esi,[@@Read]
rep movsb
mov [@@Read],esi
pop edi esi
jmp @@h4
@@m15:
lea edx,[@@Read]
Call ReadFile,[@@hFile],eax,ebx,edx,0
or eax,eax
jz @@exitErr
;! cmp [@@Read],ebx
; jnz @@exitErr
@@h4:
Call GetDC,0
mov [@@hDC],eax
xchg eax,ebx
cmp [@@hPal],0
jz @@m20
Call SelectPalette,ebx,[@@hPal],FALSE
mov [@@hPal1],eax
Call RealizePalette,ebx
@@m20:
mov eax,[@@NumColors]
shl eax,2 ;*size RGBQUAD
add eax,[@@bi.biSize]
add eax,edi
Call CreateDIBitmap,ebx,edi,CBM_INIT,eax,edi,DIB_RGB_COLORS
or eax,eax
jz @@exitErr
mov [@@hBmp],eax
cmp [@@hPal],0
jz @@m21
Call SelectPalette,ebx,[@@hPal1],FALSE
@@m21:
Call GlobalReAlloc,edi,size BITMAPINFOHEADER,GHND
or eax,eax
jz @@exitErr
mov [@@hmemBI],eax
jmp @@ret
@@exitErr:
mov [@@hBmp],0
@@ret:
mov esi,[@@hBmp]
sub ebx,ebx
or esi,esi
jnz @@s7
cmp [@@hPal],ebx
jz @@s8
Call DeleteObject,[@@hPal]
@@s8:
cmp [@@hmemBI],ebx
jz @@s7
Call GlobalFree,[@@hmemBI]
@@s7:
cmp [@@hDC],ebx
jz @@s6
Call ReleaseDC,0,[@@hDC]
@@s6:
cmp [@@hmemPal],ebx
jz @@s5
Call GlobalFree,[@@hmemPal]
@@s5:
cmp [@@hFile],ebx
jz @@s4
cmp [@@bRes],0
jnz @@s4
Call CloseHandle,[@@hFile]
@@s4:
xchg eax,esi
mov ecx,[@@hPal]
mov edx,[@@hmemBI]
ret
endp



Ответ отправлен: 30.08.2003, 01:46
Отправитель: Евгений Иванов


Отвечает Bob Johnson

Приветствую Вас, x.CoRe!
> Скиньте мне рабочий код
Ну-ну... :)
Используй функцию LoadImage для загрузки картинки в память, после чего bitblt для вывода ее на экран.

* EMan1.5: ---===*** The game we play ***===---


Ответ отправлен: 29.08.2003, 14:14
Отправитель: Bob Johnson


 Вопрос № 4042

Hi!
Есть на диске файл. Как можно его прочитать из Win9x, WinXP, без использования WinApi(ReadFile ... и т.д.)?
Thanks.



Вопрос отправлен: 29.08.2003, 15:54
Отправитель: Sirakuz

[Следующий вопрос >>] [Список вопросов]

Отвечает _vt

Доброе время суток, Sirakuz!
Если написать DOS-программу, она будет обращаться к файлам через прерывания DOS (реально, правда, windows nt их эмулирует и преобразовывает к вызовам API)

---===*** Updated E-Man 1.5 - it's cool!***===---


Ответ отправлен: 30.08.2003, 00:54
Отправитель: _vt


Отвечает Gibbel

Добрый день, Sirakuz!
А как вы это себе представляете??? Вся работа программ в Windows сводиться к вызову функций API.

Ответ отправлен: 29.08.2003, 16:46
Отправитель: Gibbel


Отвечает Илья

Здравствуйте, Sirakuz!
В смысле прямой доступ к диску? Тогда драйвер или что-то типа драйвера писать надо. А там - как угодно - через порты, через прерывания, через API ядра (NTFileOpen), через HAL...

Ответ отправлен: 29.08.2003, 18:33
Отправитель: Илья


Отвечает Hangatyr

Здравствуйте, Sirakuz!
Разве что через порты, но для этого нужно драйвер писать, да и файл прочитать не удастся - только сектора.

Ответ отправлен: 29.08.2003, 18:45
Отправитель: Hangatyr


Отвечает masquer

Добрый день, Sirakuz!
Одним словом - никак. Без использования апи ты под xp даже не запустишь прогу.

Ответ отправлен: 01.09.2003, 11:02
Отправитель: masquer


 Вопрос № 4043

Здравствуйте, Эксперты.
Вопрос такой. Написал код (в приложении). Программа должна проверять наличие своих копий в памяти. Если программа уже запущена, то первая копия делает что-то. В данном случае становится активной (по крайней мере должна). Но она вместо этого закрывается. Если вместо активации я посылаю ей сообщение о минимизации, то все работает правильно. Пробовал активировать ее и WM_ACTIVATE, и SetFocus, и еще как-то, но она все равно выгружается. Что я сделал не правильно?
Вопрос №2. Программа также создает иконку в трэе, но она (иконка) исчезает после наведения мыши. Что мне нужно дописать или исправить, чтобы иконка исчезала только после закрытия программы.
Заранее спасибо.



Вопрос отправлен: 29.08.2003, 20:03
Отправитель: MSoft

[Следующий вопрос >>] [Список вопросов]

Отвечает _vt

Доброе время суток, MSoft!
К сожалению не вижу приложения :-))

---===*** Updated E-Man 1.5 - it's cool!***===---


Ответ отправлен: 30.08.2003, 00:54
Отправитель: _vt


Отвечает Bob Johnson

Доброе время суток, MSoft!
> Написал код (в приложении).
А приложение вставить забыл :)
> но она все равно выгружается.
SetActiveWindow обычно для этого используется. Если выгружается - значит что-то неправильно написал...
> но она (иконка) исчезает после наведения мыши.
Нужно указывать hwnd программы. Обычно такое получается, если hwnd неверный.
> чтобы иконка исчезала только после закрытия программы.
Тебе также надо будет ее самому удалять (NIM_DELETE, кажется).

* EMan1.5: ---===*** The game we play ***===---


Ответ отправлен: 29.08.2003, 21:11
Отправитель: Bob Johnson


Отвечает Евгений Иванов

Здравствуйте, MSoft!
Наверное, у тебя циклит что-то там. Вообще поаккуратней с WM_ACTIVATE.
Его нужно аккуратно обрабатывать!
А как её создаёшь, так и удаляешь. это всего лишь иконка и ничего более!
Эту иконку создаёт и обслуживает отдельная DLL-а. Типа ты можешь написать
свой вариант этой панели...


Ответ отправлен: 30.08.2003, 01:51
Отправитель: Евгений Иванов


Отвечает Gibbel

Приветствую Вас, MSoft!
Так как не вижу вашего приложения, то на первый вопрос затрудняюсь ответить, но, скорее всего, вы где-то ошиблись в оконной функции.
Относительно второго - иконка исчезает из трея при наведении мыши, если в системе не существует окна, с которым она связана, либо это окно не реагирует (неправильно реагирует) на посылаемые ему иконкой сообщения.


P.S.: Вообще-то, для подобных вопросов была специально создана рассылка по WinAPI.

Ответ отправлен: 01.09.2003, 13:10
Отправитель: Gibbel


 Вопрос № 4044

Доброе время суток, уважаемые эксперты!
Просто ламерство какое-то меня одолело :(
Проблема такая: использую большое количество локальных переменных, помещая их в стек, делаю примерно так Var12 equ dword ptr [ebp-48], это переменные для хранения адресов функций. Так вот, проблема в том, что уже надоело делать это руками, тем более, что становится уже трудно не запутатся. Пишу макрос, пытаюсь его использовать см. приложение, но в eax всегда одно и то-же значение для всех переменных. Помогите разобраться. Что я делаю не так? Замучился уже. И если можно приведите пожалуйста пример.
Заранее благодарен!


Приложение:


Вопрос отправлен: 29.08.2003, 23:15
Отправитель: Alex

[Следующий вопрос >>] [Список вопросов]

Отвечает Евгений Иванов

Добрый день, Alex!
Используй ARG и LOCAL:

proc Algo_new
USES esi, edi, ebx
ARG @@NameSoundFile :dword, @@LenBuf :dword, @@NameTextFile :dword
LOCAL @@Algo :dword, @@si :dword, @@ti :dword, @@sbi :dword, @@tbi :dword

Всё будет автоматически высчитано. На то он компьютер и есть!


Ответ отправлен: 30.08.2003, 01:52
Отправитель: Евгений Иванов


Отвечает Bob Johnson

Приветствую Вас, Alex!
В Тасме есть директива Locals, после чего прямо в процедуре можно описывать переменные (ключевое слово "LOCAL", только желательно им "@@" в имя добавить). При этом он будет сам вычислять адреса и формировать стековый кадр. Предположу, что в масме все точно так же, т.к. тасм по умолчанию совместим с масмом.

* EMan1.5: ---===*** The game we play ***===---


Ответ отправлен: 30.08.2003, 02:03
Отправитель: Bob Johnson


Отвечает St

Привет, Alex!
В тасме можно объявить в начале процедуры что-нибудь вроде
LOCAL @@Var1:DWORD, @@Var2:DWORD
и так далее. @@ означает что переменная или метка являются локальной и действует только внутри данной процедуры.
St


Ответ отправлен: 01.09.2003, 11:41
Отправитель: St


 Вопрос № 4045

Здравствуйте Bob Johnson.
Большое спасибо за ответ на мой вопрос №4009. Ваш ответ оказался самым
полезным.
Но у меня снова возникли некоторые проблемы.
А именно.
По вашему совету я сделал во время обработки сообщения WM_MOUSEMOVE
проверку посылается ли это сообщение моему контролу (я подумал что лучше указать конкретный хендл ведь контролов
то сожет быть много..) и если это так то вывести MessageBox..
Выглядело это примерно так:
ELSEIF uMsg==WM_CREATE
invoke CreateWindowEx,NULL, ADDR ButtonClassName,ADDR ButtonText,
WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,
x1 ,y1,X,Y,hWnd,ButtonID,hInstance,NULL
mov hwndButton,eax
.ELSEIF uMsg==WM_MOUSEMOVE
mov ebx,hWnd
.IF ebx==hwndButton
invoke MessageBox, NULL, addr ButtonText, addr ButtonText, MB_OK

....
Однако, оказалось что это дело решительно отказывается работать..
Я пробовал менять проверку так:
.IF ebx!=hwnd
где hwnd - хендл главного окна, но все равно ничего не получается..
Однако, когда я написал:
.IF ebx==hwnd
то экранчик быстро стал заполняться моими MessageBox-сами...
И еще. Не совсем понятно почему в условии нельзя писать например такую строку:
.IF hWnd==hwndButton
На это он мне пишет что мои операнды инвалиды...
А ведь что hWnd, что hwndButton, что ebx - все имеют размер dword..
Заранее спасибо :).
Ramala.



Вопрос отправлен: 29.08.2003, 23:43
Отправитель: Ramala (Ramala@hotmail.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Bob Johnson

Добрый день, Ramala!
Первое, что я тебе скажу - не используй конструкции .IF, .ELSEIF и т.д. Ты спросишь, почему - потому что такое программирование вызывает абстрогирование от привычно низкого уровня языка ассемблер (может быть как-то непонятно написал, но это так :). Именно из-за этого ты спрашиваешь "Не совсем понятно почему..." - все из-за того, что обычно, когда ты пишешь, например
.IF eax == myvar

компилятор заменяет эту строку на
 cmp eax, [myvar]
jnz ...

и все работает правильно. Но когда ты хочешь написать
.IF
hWnd == hwndButton

компилятор должен был бы поставить
 cmp [hWnd], [hwndButton]
jnz ...

Но такой команды (сравнение двух ячеек памяти) нет! Это можно было бы сделать
 mov eax, [hWnd]
cmp eax, [hwndButton]
jnz ...

но здесь компилятор должен был бы неявно изменить значение eax (загрузить в него hWnd) - а в рамках команды
.IF он этого не может.
Поэтому я всем рекомендую не использовать подобные конструкции. Если хотите, чтобы был минимальный исходный текст - пишите на С++, а если уж пишите на асме, то делайте это качественно! (Знаю, что такие примеры встречаются в Iczelion's tutorials, но все равно не рекомендую их использовать.) Я обычно пишу так:

mov eax, [uMsg]
cmp eax, WM_LBUTTONDOWN
jz @@LBDown
cmp eax, WM_LBUTTONUP
jz @@LBUp
...

Теперь по основной части вопроса. Если выполняется код оконной процедуры класса WN, то сообщение обязательно пришло одному из окон класса WN! Это означает, что в ту процедуру, где ты обрабатываешь WM_CREATE никак не может придти WM_MOUSEMOVE, адресованное контролу, созданному тобой в ней же на WM_CREATE! (т.к. этот контрол имеет другой класс и у него своя оконная процедура - она стандартная и хранится где-то в User32.dll или что-то такое.)
Я тебе рекомендовал сделать совсем не это - у тебя есть Message Loop - это то место, откуда осуществляется вызов всех оконных процедур. Ты можешь сделать так:

m_loop:
Call GetMessage, offset msg, 0, 0, 0
test eax, eax
jz m_exit
cmp [msg.message], WM_MOUSEMOVE
jnz m1
mov eax, [HMainWnd];
- хэндл главного окна
cmp eax, [msg.hwnd]
jz m1;
- главное окно - оно его получит и так
; Сообщение WM_MOUSEMOVE адресовано не главному окну, так что тут
; необходимо преобразовать координаты из координат в пределах [msg.hwnd] в
; координаты в пределах [HMainWnd] (функции ClientToScreen и ScreenToClient с
; разными окнами, например) и послать главному окну новое сообщение
; WM_MOUSEMOVE с помощью SendMessage. После этого необходимо обработать
; старое сообщение WM_MOUSEMOVE.
...
Call ClientToScreen, ...
...
Call ScreenToClient, ...
...
Call SendMessage, [HMainWnd], WM_MOUSEMOVE, ...
m1:
Call DispatchMessage, offset msg
jmp m_loop
m_exit:

И тогда ты будешь получать всегда WM_MOUSEMOVE, до тех пор пока курсор находится в пределах любого из твоих окон. Это, в принципе, один из вариантов переправки сообщений (relay).

* EMan1.5: ---===*** The game we play ***===---


Ответ отправлен: 30.08.2003, 01:53
Отправитель: Bob Johnson


 Вопрос № 4046

Здраствуйте эксперты!
Может ли Dll завершить приложение его
вызвавшее(по другому-чтоб обрушить прогу
подсунуть patched dll-код неверный или
особый прием).
Приемы типа убивания через handle(FindWindow не выдает)
-небрать в расчет (FindWindow не выдает)
И в KillerProcess(!) не видется.
Суть если может обрубить ?-то как от этого избавится
может не напрямую грузить ,а другой прогой (D.EXE)
и ей управлять косвенно через socket
(MYAPP.EXE<-->D.EXE<-->plug.dll) ???



Вопрос отправлен: 30.08.2003, 01:18
Отправитель: AllDer

[Следующий вопрос >>] [Список вопросов]

Отвечает Евгений Иванов

Доброе время суток, AllDer!
По моему не может...


Ответ отправлен: 30.08.2003, 01:56
Отправитель: Евгений Иванов


Отвечает Bob Johnson

Доброе время суток, AllDer!
Бросай курить! :)
1. DLL может завершить процесс, ее загрузивший (причем корректно) - ExitProcess (0).
2. Процесс можно убить удаленно - OpenProcess, TerminateProcess, но для этого надо знать его ID. ID можно получить, просмотрев весь список процессов (CreateToolHelp32Snapshot). Так делает FAR, например.

* EMan1.5: ---===*** The game we play ***===---


Ответ отправлен: 30.08.2003, 12:29
Отправитель: Bob Johnson


Отвечает masquer

Добрый день, AllDer!
Может, DLL грузится в адресное пространство процесса, поэтому может делать что угодно.
Можно просто SEH использовать и не особо заморачиваться, если поставить целью, то можно в любом случае обрушить приложение. Запустить вечный цикл с большим приоритетом, например.

Ответ отправлен: 01.09.2003, 11:05
Отправитель: masquer



Форма отправки вопроса

Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

(C) 2002-2003 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (38)
C / C++ (29)
Perl (5)
Builder / Delphi (18)
Pascal (22)
Basic / VBA (7)
Java / JavaScript (8)
PHP (10)
Криптография (9)
WinAPI (14)
Пользователю
Windows 95/98/Me (49)
Windows NT/2000/XP (64)
"Железо" (43)
Поиск информации (23)
Администратору
Windows NT/2000/XP (33)
Linux / Unix (11)
Юристу
Гражданское право (11)
Семейное право (7)
Трудовое право (7)
КоАП (6)

Отправить вопрос всем экспертам выбранной рассылки.




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.


Яндекс цитирования
© 2001-2003 Россия, Москва. Авторское право: Калашников О.А.


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное