Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
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.
Вопрос и дополнение |
Ваш вопрос:
Приложение (если необходимо):
Получить ответов:
Выбор рассылки |
Программисту 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.
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||