Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 | 3 | 4 |

 

  Вопрос: Переопределение оконной процедуры Добавлено: 27.11.05 20:38  

Автор вопроса:  Sacred Phoenix | ICQ: 304238252 

Ответить

  Ответы Всего ответов: 47  

Номер ответа: 16
Автор ответа:
 ANDREY



Вопросов: 0
Ответов: 33
 Профиль | | #16 Добавлено: 29.11.05 10:22
На что фатически влияет ключ /SECTION:.bss,S ?
Только не говори, что разделяемые секции. Это я уже слышал. Что этот термин означает?

Ответить

Номер ответа: 17
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #17 Добавлено: 29.11.05 12:59
хук-пpоцедуpа должна находиться в DLL, котоpая будет пpомэппиpована в дpугой пpоцесс. Когда Windows мэппиpует DLL в дpугой пpоцесс, секция данных мэппиpоваться не будет. То есть, все пpоцессы pазделяют одну копию секции кода, но у них будет своя личная копия секции данных DLL! Это может стать большим сюpпpизом для непpедупpежденного человека. Вы можете подумать, что пpи сохpанении значения в пеpеменную в секции данных DLL, это значение получат все пpоцессы, загpузившие DLL в свое адpесное пpостpанство. Hа самом деле, это не так. В обычной ситуации, такое поведение пpавильно, потому что это создает иллюзию, что у каждого пpоцесса есть отдельная копия DLL. Hо не тогда, когда это касается хуков Windows. Hам нужно, чтобы DLL была идентична во всех пpоцессах, включая данные. Решение: вы должны пометить секцию данных как pазделяемую. Это можно сделать, указав аттpибуты секции линкеpу.

Уроки Iczelion'а. Урок 24.

Ответить

Номер ответа: 18
Автор ответа:
 Sacred Phoenix



ICQ: 304238252 

Вопросов: 52
Ответов: 927
 Профиль | | #18 Добавлено: 29.11.05 20:11
В общем, где качать hasm32?
Кстати, я там пытался влепить в переменную Long две переменные типа Long. Это же ерунда! Сколько байт занимает DWORD?

Ответить

Номер ответа: 19
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #19 Добавлено: 29.11.05 20:27
hasm32?
Что это?

http://website.masmforum.com//masm32/m32v82r.zip

Только это не так как в VB, все нужно делать руками :)
В пакете есть куча примеров, сделаешь по образу и подобию для начала

DWORD - это 4 байта

Ответить

Номер ответа: 20
Автор ответа:
 Sacred Phoenix



ICQ: 304238252 

Вопросов: 52
Ответов: 927
 Профиль | | #20 Добавлено: 29.11.05 22:08
DWORD - это 4 байта
То бишь width/height, получается, задаются Integer'ом.

Только это не так как в VB, все нужно делать руками :)
Что именно?

Ответить

Номер ответа: 21
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #21 Добавлено: 29.11.05 22:38
QWORD (quad word)    equ Double (8 Bytes)
DWORD (double word)  equ Long or Single (4 Bytes)
WORD                 equ Integer (2 Bytes)
BYTE                 equ Byte (1 byte)


Свои width/height можешь задавать хоть в Integer, хоть в Byte, хоть в попугаях. Как больше нравится.

Что именно?
Всё :) Создаешь файл .asm, пишешь в него все инклюды, либы, пишешь свои процедуры, запускаешь в командной строке компилятор (ml.exe) c нужными параметрами, получаешь .obj, запускаешь в командной строке с нужными параматрами линкер Link.exe, и вот у тебя .dll.

Ну ты скачай да попробуй, потом будешь вопросы задавать :)

Ответить

Номер ответа: 22
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #22
Добавлено: 30.11.05 04:32
 Я так понял вот это имеется в виду под ключом линкеру:
o 00000004h - используется для кода с 16 битными смещениями
  o 00000020h - секция кода
  o 00000040h - секция инициализированных данных
  o 00000080h - секция неинициализированных данных
  o 00000200h - комментарии или любой другой тип информации
  o 00000400h - оверлейная секция
  o 00000800h - не будет являться частью образа программы
  o 00001000h - общие данные
  o 00500000h - выравнивание по умолчанию, если не указано иное
  o 02000000h - может быть выгружен из памяти
  o 04000000h - не кэшируется
  o 08000000h - не подвергается страничному преобразованию
  o 10000000h - разделяемый
  o 20000000h - выполнимый
  o 40000000h - можно читать
  o 80000000h - можно писать

 Флаг секции собсно. Если уж кому приспичит на VB, просто возьмите какой нибудь PE-редактор и установите 28-й бит.

Ответить

Номер ответа: 23
Автор ответа:
 ANDREY



Вопросов: 0
Ответов: 33
 Профиль | | #23 Добавлено: 30.11.05 09:48
Ага. Вот так понятнее.

Ответить

Номер ответа: 24
Автор ответа:
 Sacred Phoenix



ICQ: 304238252 

Вопросов: 52
Ответов: 927
 Профиль | | #24 Добавлено: 30.11.05 20:14
2 CyRax: 28 бит - то бишь image_scn_mem_shared? Ты прям Гималаи с плеч снял :) А то HOOLIGAN тут asm'ом стал пугать :)

Ответить

Номер ответа: 25
Автор ответа:
 Sacred Phoenix



ICQ: 304238252 

Вопросов: 52
Ответов: 927
 Профиль | | #25 Добавлено: 30.11.05 22:14
2 All: почему не катит код:

Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
'Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
'Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private Const WH_CALLWNDPROC As Long = 4
'Private Const LB_ADDSTRING   As Long = &H180

'Private Type EVENTMSG
'   wMsg                      As Long
'   lParam                    As Long
'   hParam                    As Long
'   Time                      As Long
'   hWnd                      As Long
'End Type

Private lngHHook             As Long
Private lngHInst             As Long
'Private lngHLB               As Long
Option Explicit

Public Function DLLMain(ByVal A&, ByVal B&, ByVal C&;) As Long
    lngHInst = A
    ;DLLMain = 1
End Function

Public Sub Main()
   'Dummy :)
End Sub

Public Function SetWindowsHookStatus(ByVal blnSet As Boolean, ByVal lngListBoxHandle&;) As Boolean
   If blnSet Then
'      lngHLB = lngListBoxHandle
      lngHHook = SetWindowsHookEx(WH_CALLWNDPROC, AddressOf WindowsHookProc, lngHInst, 0)
      SetWindowsHookStatus = lngHHook
   ElseIf lngHHook Then
      Call UnhookWindowsHookEx(lngHHook)
      SetWindowsHookStatus = True
   End If
End Function

Public Function WindowsHookProc(ByVal nCode&, ByVal wParam&, ByVal lParam&;) As Long
   If nCode < 0 Then
      WindowsHookProc = CallNextHookEx(lngHHook, nCode, wParam, ByVal lParam)
   Else

'Dim lpMSG As EVENTMSG

'      Call CopyMemory(lpMSG, lParam, Len(lpMSG))
'      Call SendMessage(lngHLB, LB_ADDSTRING, 0, ByVal Format(Now, "dd.MM.yy hh:mm:ss";) & " - Handle = " & lpMSG.hWnd & "; Message = " & lpMSG.wMsg)
      
      WindowsHookProc = CallNextHookEx(lngHHook, nCode, wParam, ByVal lParam)
   End If
End Function

Explorer и все программы вылетают, проорав пару мессагов что-то о памяти. Если это не работает, то о часиках и говорить рано...

Ответить

Номер ответа: 26
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #26 Добавлено: 30.11.05 23:34
Судя по закомментированным участкам, до перехвата дело даже не дошло...
Я мог бы конечно сказать почему это не работает, но боюсь, ты опять скажешь, что я тебя асмом пугаю :)))

Слушай, закинь на мыло эту "dll", если не в лом: жутко интересно под микроскопом поглядеть, что же внутри :)

Ответить

Номер ответа: 27
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #27 Добавлено: 01.12.05 01:17
Слушай, а с чего это ты взял, что если вернуть из CallWndProc координаты, то часы изменят свой размер? Это с какого перепугу вдруг?

Тебе нужны 2 dll: одна, которая обсуждается до сих пор, она будет типа трамплина для подгрузки в процесс explorer'а второй dll, в которой описывается новая WndProc. То есть первая нужна для попадания внутрь эксплорера через механизм хука, и попав туда, она должна подтянуть за собой вторую dll, которая собственно и будет менять размер.
Возможно, обе их можно совместить, надо пробовать.

Ответить

Номер ответа: 28
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #28 Добавлено: 01.12.05 01:48
Да, сейчас попробовал, можно делать в одной dll, только нельзя завершать хук, т.е. вызывать функцию UninstallHook, а то при этом dll выгружается из пространства эксплорера и он теряет свою новую оконную процедуру (она ведь в выгружаемой dll) и грохается.
Так что сейчас у меня часы шириной в полэкрана :)))

Короче такой вот код получается:

;=====новая оконная процедура=============================
NewProc proc hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
    
    mov     eax, uMsg
    .if     eax==WM_USER+100
        mov     eax,100
        shl     eax,16
        add     eax,600       ;это новая ширина
        ret
    .endif
    invoke  CallWindowProc, oldProc, hWin, uMsg, wParam, lParam
    ret

NewProc endp

;======= тут ловим какое-нибудь сообщение и меняем процедуру WndProc ====
WProc proc uses ebx nCode:DWORD,wParam:DWORD,lParam:DWORD

    cmp     nCode,0
    jl      @F
    mov     ebx,lParam
    assume  ebx: ptr CWPSTRUCT
    mov     eax,[ebx].hwnd
    cmp     eax,hTarget
    jne     @F
    cmp     oldProc,0
    jne     @F
    invoke  SetWindowLong, hTarget, GWL_WNDPROC, addr NewProc
    mov     oldProc,eax
    @@:
    assume  ebx: nothing
    invoke CallNextHookEx,hHook,nCode,wParam,lParam
    xor eax,eax
    ret
WProc endp

;=============================================================================
InstallHook proc hwnd:DWORD,hwndFrom:DWORD
    push    hwnd
    pop     hWnd
    push    hwndFrom
    pop     hWndFrom
    invoke  FindWindow, SADD("Shell_TrayWnd";), NULL
    invoke  FindWindowEx, eax, NULL, SADD("TrayNotifyWnd";), NULL
    invoke  FindWindowEx, eax, NULL, SADD("TrayClockWClass";), NULL
    mov     hTarget,eax
    invoke SetWindowsHookEx,WH_CALLWNDPROC,addr WProc,hInstance,NULL
    mov hHook,eax
    ret
InstallHook endp

;============================================================================

Ответить

Номер ответа: 29
Автор ответа:
 Sacred Phoenix



ICQ: 304238252 

Вопросов: 52
Ответов: 927
 Профиль | | #29 Добавлено: 02.12.05 21:15
2 HOOLIGAN:
1) на комменты не обращай внимания, я убрал часть кода, чтоб "облегчить" алгоритм. А вообще, Handle хука DLL возвращает, imho, дело в WindowsHookProc.
2)
Слушай, а с чего это ты взял, что если вернуть из CallWndProc координаты, то часы изменят свой размер? Это с какого перепугу вдруг?
Статьи, статьи и еще раз статьи... :)
Afaik, таскбар посылает часам мессагу WM_USER + 100 и получает в ответ инфу о ширине/высоте, соответственно расширяясь.
3) 2 DLL не нужны, т.к. Chameleon Clock и Tray Skins Clock (которая написана наподобие первой проги) юзают 1 DLL.
4) Так все равно скажи, чего мой код не катит! Если очень нужно, пойму :))

Ответить

Номер ответа: 30
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #30 Добавлено: 02.12.05 23:24
Во-первых, таскбар ничего никому не посылает.
Сообщения посылает windows. В данном случае в оконную процедуру процесса explorer.

Во-вторых, когда винда посылает в оконную процедуру сообщения, из неё (из оконной процедуры) должны вернуться определенные данные, которые говорят о том, было ли обработано сообщение, или нет, если было то каким образом.

В-третьих, ты оконную процедуру не менял, и возвращаемые из неё значения тоже. Ты всего лишь пытаешься из процедуры хука пронаблюдать, какие сообщения проследовали через неё в оконную процедуру. Не более того. То, что ты возвращаешь из процедуры хука, никаким боком на значение, возвращаемое из оконной процудуры, не влияет. Максимум, что ты можешь сделать из процедуры хука - это заблокировать прохождение в оконную процедуру каких-то сообщений. Не более того.

В-четвёртых, одна или две dll - непринципиально. Я тебе привел пример с одной dll (может ты не заметил?)

В-пятых. Чтобы сказать, почему твой код не работает, я должен его повторить, имея ту примочку, которой ты пользовался. Но качать ту примочку и ставить к себе никакого желания нет, так как есть нормальный инструмент, предназначенный для таких вещей, даже два (vc++ и asm). Твой код практически ничего криминального не делает, чтобы explorer грохался. Раз он грохается, то наиболее вероятная причина, на мой взгляд - кривая dll (ёе структура).

В-шестых, я тебе уже выдал количество кода, достаточное для изменения размера часов. Чего ты пытаешься левой ногой почесать правое ухо - мне непонятно :) Правое ухо удобнее всего чесать правой рукой. А что у нас правая рука? Правильно, ассемблер. Можно также почесать и левой рукой, тоже достаточно удобно (левая рука у нас си). Если ты хочешь и дальше мазохировать, то я тебе не помощник :)

Ответить

Страница: 1 | 2 | 3 | 4 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам