Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Power Basic

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

 

  Вопрос: Нужна помощь с хуком Добавлено: 25.11.08 15:46  

Автор вопроса:  Lapex

Ответить

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

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



Вопросов: 6
Ответов: 56
 Профиль | | #16 Добавлено: 29.11.08 15:01
Вообщем пока решил отказаться от хука и попытался сделать subclass окна:
  1.  
  2. GLOBAL OldProc AS LONG
  3. GLOBAL hWnd AS DWORD
  4.  
  5. FUNCTION SubClassProc (BYVAL hWnd AS LONG, BYVAL Msg AS LONG, _
  6.                   BYVAL wParam AS LONG, BYVAL lParam AS LONG) AS LONG
  7.  
  8.     SELECT CASE msg
  9.  
  10.         CASE %WM_DESTROY
  11.             SetWindowLong(hWnd, %GWL_WNDPROC, OldProc) ' Remove subclassing
  12.  
  13.     END SELECT
  14.  
  15.     FUNCTION = CallWindowProc(OldProc, hWnd, msg, wParam, lParam)
  16. END FUNCTION
  17.  
  18. hWnd= FindWindow ("", "Project")
  19. OldProc = SetWindowLong(hWnd, %GWL_WNDPROC, CODEPTR(SubClassProc))


Сообщения окна отлавливаются нормально, но при закрытии окна возникает ошибка: память не может быть "read". Подскажите пожалуйста, где я допустил ошибку.

Ответить

Номер ответа: 17
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #17
Добавлено: 29.11.08 15:44
ошибка в чьем приложении - похуканном или твоем?

Ответить

Номер ответа: 18
Автор ответа:
 Lapex



Вопросов: 6
Ответов: 56
 Профиль | | #18 Добавлено: 29.11.08 16:12
Ошибка приложения, которое вызвавает мою dll.

P.S. Вышеуказанный код находится в dll.

Ответить

Номер ответа: 19
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #19
Добавлено: 29.11.08 16:27
терь можно долго гадать, на обращение к чему идет бага...
самый простой вариант - поюзать ollydbg, найти в какой строке кода на какое действо бага. на крайний случай хотя бы адрес исключения - в системных либах или в твоем коде.

Ответить

Номер ответа: 20
Автор ответа:
 Lapex



Вопросов: 6
Ответов: 56
 Профиль | | #20 Добавлено: 29.11.08 16:42
А сам код, который я указал выше - валидный?

Ответить

Номер ответа: 21
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #21
Добавлено: 29.11.08 16:56
вот моя обработка

  1. LRESULT CALLBACK dlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  2. {
  3. switch (message)
  4. {
  5. case WM_DESTROY:
  6. DWORD proc;
  7. proc = GetWindowProp(hDlg, REAL_PROC);
  8. if (proc == 0)
  9. return 1;
  10. SetWindowLong(hDlg, GWL_WNDPROC, (LONG)proc);
  11. RemoveProp(hDlg, REAL_PROC);
  12. break;
  13. поскипано
  14. }
  15. return CallWindowProc((WNDPROC)GetWindowProp(hDlg, REAL_PROC), hDlg, message, wParam, lParam);


он в принципе ничем не отличается, и при закрытии работал нормально. значит косяк видимо надо искать в другом месте

Ответить

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



Вопросов: 6
Ответов: 56
 Профиль | | #22 Добавлено: 29.11.08 17:10
По поводу ollydbg, выдал следующее:

Return to 7C90DE5C (ntdll.7C90DE5C)
Process terminated, exit code C0000005 (-1073741819)

Предполагаю, что баг кроется в самом приложении, пока выкрутился так:
  1.  
  2. ...
  3. CASE %WM_DESTROY
  4.   SetWindowLong(hWnd, %GWL_WNDPROC, OldProc) ' Remove subclassing
  5.   TerminateProcess  GetCurrentProcess, 0
  6. ...


Хоть и не спортивно, но работает :)

Ответить

Номер ответа: 23
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #23
Добавлено: 29.11.08 17:14
жесть =) ваще за такое все таки руки нада отрывать ;)
а в олли ты не то видишь. нада залезть в настройки, отрубить игнорирование всех исключений(убрать все галки), дальше запустить в олли твой прого с длл, хукнуть прогу и звкрыть прогу - тада олли вывалится на бажный код. можешь ради интереса вставить сюда строк 10. 5 до строки с ошибкой и 5 после.

Ответить

Номер ответа: 24
Автор ответа:
 Lapex



Вопросов: 6
Ответов: 56
 Профиль | | #24 Добавлено: 29.11.08 17:32
  1.  
  2. 7C90E4E6   8DA424 00000000  LEA ESP,DWORD PTR SS:[ESP]
  3. 7C90E4ED   8D49 00          LEA ECX,DWORD PTR DS:[ECX]
  4. 7C90E4F0 > 8BD4             MOV EDX,ESP
  5. 7C90E4F2   0F34             SYSENTER
  6.  
  7. 7C90E4F4 > C3               RETN
  8.  
  9. 7C90E4F5   8DA424 00000000  LEA ESP,DWORD PTR SS:[ESP]
  10. 7C90E4FC   8D6424 00        LEA ESP,DWORD PTR SS:[ESP]
  11. 7C90E500 > 8D5424 08        LEA EDX,DWORD PTR SS:[ESP+8]
  12. 7C90E504   CD 2E            INT 2E
  13. 7C90E506   C3               RETN


Ответить

Номер ответа: 25
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #25
Добавлено: 29.11.08 17:36
хм. это не место ошибки. сталобыть или исключение теперь не возникает, или оно возникает в другом процессе.

Ответить

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



Вопросов: 6
Ответов: 56
 Профиль | | #26 Добавлено: 29.11.08 17:44
ваще за такое все таки руки нада отрывать

Я понимаю что это не спортивно, но я не вижу причины почему я не могу принудительно закрыть процесс, если он и так собирался закрыться или остается вероятность наступить на грабли?

Если ошибка в приложении - я все равно ее не устраню, т.к. это не мое приложение.

Ответить

Номер ответа: 27
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #27
Добавлено: 29.11.08 17:55
дело не в спортивности. бага, корни который непонятны, может проявица в разных формах. нету гарантий, что кильнув процесс баги не будет. если б гарантировать, что такой способ решения 100% спасет - то сгодится.

Ответить

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



Вопросов: 6
Ответов: 56
 Профиль | | #28 Добавлено: 30.11.08 14:45
...значит косяк видимо надо искать в другом месте

Таки ты прав, создал dll с функцией Subclass, но без функций необходимых для подключения плагина и сделал вызов из приложения функции Subclass (приложение поддерживает работу с dll) - все ок, ошибки не происходит.
Получается виноваты ф-ции связки плагина с приложением :(.
Ф-ции связки все однотипные, в SDK есть пример на Си, я сделал аналог на PB:

Си:
  1.  
  2. char szObjectName[] = "MyPlugin";   
  3.  
  4. int GetPluginName(char* szBuffer, int* pnBufferSize)
  5. {
  6. int nLength = lstrlen(szObjectName);
  7. if(*pnBufferSize < nLength)
  8. {
  9. *pnBufferSize = nLength;
  10. return -1;
  11. } else
  12. {
  13. memset(szBuffer,0,*pnBufferSize);
  14. lstrcpy(szBuffer,szObjectName);
  15. return nLength;
  16. }
  17. }



GetPluginName
Purpose: To return the name of the action plugin to the calling program. Keep this short
but descriptive. For example, if your plugin is used to access ADO databases, call it
something like “ADODatabase”.
Prototype:
int GetPluginName(char* szBuffer, int* pnBufferSize)
Parameters:
szBuffer - [out] A pointer to a character buffer that will receive the name of the plugin.
pnBufferSize - [in/out] A pointer to an integer that contains the number of characters in
szBuffer on the way in and will be set to the number of characters actually copied to the
buffer on the way out.
Returns:
The number of characters copied to the buffer or -1 if the buffer was not large enough to
contain the plugin’s name. If you return -1, be sure that you set pnBufferSize to the
number of characters actually required.


PB:
  1.  
  2. MACRO szObjectName = "MyPlugin"
  3.  
  4. FUNCTION GetPluginName   CDECL ALIAS "GetPluginName" (BYREF szBuffer AS ASCIIZ, BYREF pnBufferSize AS LONG) EXPORT AS LONG
  5.  
  6.   IF(pnBufferSize < lstrlen(szObjectName)) THEN  
  7.     pnBufferSize = lstrlen(szObjectName)          
  8.     FUNCTION = -1                                
  9.   ELSE                                            
  10.     lstrcpy(szBuffer, szObjectName)              
  11.     FUNCTION = lstrlen(szObjectName)              
  12.   END IF
  13. END FUNCTION


Я не вижу причину, которая может повлиять на работу Subclass или все таки мой налог кода не корректен?

Ответить

Номер ответа: 29
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #29
Добавлено: 30.11.08 15:42
на вид все корректно. видимо в другом месте косяк. есть другие функции?

Ответить

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



Вопросов: 6
Ответов: 56
 Профиль | | #30 Добавлено: 30.11.08 19:10
Все функции аналогичны выше указанной, кроме одной:
  1.  
  2. MACRO SIZE_XML_STRING = 10000           ' Размер строки XML
  3. MACRO szResourceName  = "XML"           ' Имя ресурса
  4. MACRO szResourceType  = "TEXTFILE"      ' Тип ресурса
  5.  
  6. '-------------------------------------------------------------------------------
  7. ' Функция загружает строку XML из ресурса в память и возвращает: 1-успешно или 0-ошибка
  8. '   szBuffer      - строка XML
  9. '   pnBufferSize  - размер буфера для строки XML
  10. '-------------------------------------------------------------------------------
  11. FUNCTION GetTextFromResourceFile   CDECL ALIAS "GetTextFromResourceFile" (BYREF szBuffer AS ASCIIZ, BYVAL nBufferSize AS LONG) EXPORT AS LONG
  12.   DIM nRes      AS LONG                                                     ' флаг ошибки: 1-успешно, 0-ошибка
  13.   DIM pszTemp   AS ASCIIZ * SIZE_XML_STRING                                 ' строка текста XML
  14.   DIM hRsrc     AS LONG                                                     ' ID найденного ресурса
  15.   DIM hGlobal   AS LONG                                                     ' ID загруженного ресурса
  16.   DIM nTempSize AS LONG                                                     ' размер ресурса
  17.  
  18.   hRsrc = FindResource(ghInstance, BYCOPY szResourceName,  @szResourceType) ' поиск ресурса
  19.   IF(hRsrc <> 0) THEN                                                       ' если ресурс найден
  20.     nTempSize = SizeofResource(ghInstance, hRsrc)                           ' размер ресурса
  21.     hGlobal = LoadResource(ghInstance, hRsrc)                               ' загрузка ресурса в память
  22.     IF(hGlobal) THEN                                                        ' если ресурс загружен
  23.         pszTemp = PEEK$(LockResource(hGlobal), nTempSize)                   ' получаем строку текста XML
  24.         IF(lstrlen(pszTemp) > nBufferSize) THEN                             ' если строка текста XML больше буфера
  25.           nRes = 0                                                          ' флаг: ошибка
  26.         ELSE                                                                ' если размер буфера соответствует длине строки
  27.           lstrcpy(szBuffer, pszTemp)                                        ' помещаем строку в буфер
  28.           nRes = 1                                                          ' флаг: успешно
  29.         END IF
  30.         DeleteObject(hGlobal)                                               ' уничтожаем объект
  31.     ELSE                                                                    ' если ресурс не загружен
  32.       nRes = 0                                                              ' флаг: ошибка
  33.     END IF
  34.   ELSE                                                                      ' если ресурс не найден
  35.     nRes = 0                                                                ' флаг: ошибка
  36.   END IF
  37.   FUNCTION = nRes                                                           ' возвращаем флаг ошибки
  38. END FUNCTION
  39.  
  40. IF(GetTextFromResourceFile(szXML, BYVAL SIZE_XML_STRING) = 0) THEN lstrcpy(szXML, "") ' получаем строку XML

Ответить

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

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





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