Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

Хуки, хуки, и ещё раз Хуки   Найти похожие ветки 

 
MPS ©   (2004-04-15 12:28) [0]

Приветствую! Кто разбирается в хуках и с++, какой-то баг немогу исправить. Дело обстоит так: есть библиотека, её исходник ниже. Устанавливаю хук WH_KEYBOARD. Проблема вся в том, что только в процедуре-фильтре строка szKillProcName показывает NULL хотя такого недолжно быть. В своей программе я вызываю вначале lib_init которая инициализирует необходимые мне данные. Вот код:
#include "stdafx.h"
#pragma data_seg(".hdata")
HINSTANCE hi = NULL;    
#pragma data_seg()  
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif

EXPORT void lib_init(void);

char* szKillProcName[100];

HHOOK hKeyHook = NULL;

LRESULT CALLBACK KeyProc(int, WPARAM, LPARAM);

void lib_init(void)
{    
 hi = (HINSTANCE)hModule;                                  
 ReadAppConfs();
 hKeyHook = SetWindowsHookEx (WH_KEYBOARD, &KeyProc, hi, 0);  
}

void ReadAppConfs(void)
{
 GetPrivateProfileString("general", "KillProcessName",
    "ExecStat.exe", szKillProcName, 100, "c:\\1.ini");
}

BOOL APIENTRY DllMain( HANDLE hModule,
                     DWORD  ul_reason_for_call,
                     LPVOID lpReserved
    )
{
  if (ul_reason_for_call == DLL_PROCESS_DETACH)
          UnhookWindowsHookEx(hKeyHook);
  return TRUE;
}

LRESULT CALLBACK KeyProc(int nCode, WPARAM wParam, LPARAM lParam)
{
 if (nCode)
    return CallNextHookEx (hKeyHook, nCode, wParam, lParam);
 
 MessageBox(0, szKillProcName, "", 32);  // собственно говоря - NULL. Почему?                    
 return CallNextHookEx(hKeyHook, nCode, wParam, lParam);
}


 
MPS ©   (2004-04-15 12:28) [0]

Приветствую! Кто разбирается в хуках и с++, какой-то баг немогу исправить. Дело обстоит так: есть библиотека, её исходник ниже. Устанавливаю хук WH_KEYBOARD. Проблема вся в том, что только в процедуре-фильтре строка szKillProcName показывает NULL хотя такого недолжно быть. В своей программе я вызываю вначале lib_init которая инициализирует необходимые мне данные. Вот код:
#include "stdafx.h"
#pragma data_seg(".hdata")
HINSTANCE hi = NULL;    
#pragma data_seg()  
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif

EXPORT void lib_init(void);

char* szKillProcName[100];

HHOOK hKeyHook = NULL;

LRESULT CALLBACK KeyProc(int, WPARAM, LPARAM);

void lib_init(void)
{    
 hi = (HINSTANCE)hModule;                                  
 ReadAppConfs();
 hKeyHook = SetWindowsHookEx (WH_KEYBOARD, &KeyProc, hi, 0);  
}

void ReadAppConfs(void)
{
 GetPrivateProfileString("general", "KillProcessName",
    "ExecStat.exe", szKillProcName, 100, "c:\\1.ini");
}

BOOL APIENTRY DllMain( HANDLE hModule,
                     DWORD  ul_reason_for_call,
                     LPVOID lpReserved
    )
{
  if (ul_reason_for_call == DLL_PROCESS_DETACH)
          UnhookWindowsHookEx(hKeyHook);
  return TRUE;
}

LRESULT CALLBACK KeyProc(int nCode, WPARAM wParam, LPARAM lParam)
{
 if (nCode)
    return CallNextHookEx (hKeyHook, nCode, wParam, lParam);
 
 MessageBox(0, szKillProcName, "", 32);  // собственно говоря - NULL. Почему?                    
 return CallNextHookEx(hKeyHook, nCode, wParam, lParam);
}


 
MPS ©   (2004-04-15 12:38) [1]

Пардон, вот код:
#include "stdafx.h"
#pragma data_seg(".hdata")
HINSTANCE hi = NULL;    
#pragma data_seg()  
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif

EXPORT void lib_init(void);

char szKillProcName[100];

HHOOK hKeyHook = NULL;

LRESULT CALLBACK KeyProc(int, WPARAM, LPARAM);

void ReadAppConfs(void)
{
GetPrivateProfileString("general", "KillProcessName",
   "ExecStat.exe", szKillProcName, 100, "c:\\1.ini");
}

void lib_init(void)
{    
                               
ReadAppConfs();
hKeyHook = SetWindowsHookEx (WH_KEYBOARD, &KeyProc, hi, 0);  
}

BOOL APIENTRY DllMain( HANDLE hModule,
                    DWORD  ul_reason_for_call,
                    LPVOID lpReserved
   )
{
 
  switch (ul_reason_for_call) {
    case DLL_PROCESS_ATTACH:
       if (!hi) hi = (HINSTANCE)hModule;  
       break;
    case DLL_PROCESS_DETACH:h
         UnhookWindowsHookEx(hKeyHook);
  }
 return TRUE;
}

LRESULT CALLBACK KeyProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode)
   return CallNextHookEx (hKeyHook, nCode, wParam, lParam);

MessageBox(0, szKillProcName, "", 32);  // собственно говоря - NULL. Почему?                    
return CallNextHookEx(hKeyHook, nCode, wParam, lParam);
}


 
MPS ©   (2004-04-15 12:38) [1]

Пардон, вот код:
#include "stdafx.h"
#pragma data_seg(".hdata")
HINSTANCE hi = NULL;    
#pragma data_seg()  
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif

EXPORT void lib_init(void);

char szKillProcName[100];

HHOOK hKeyHook = NULL;

LRESULT CALLBACK KeyProc(int, WPARAM, LPARAM);

void ReadAppConfs(void)
{
GetPrivateProfileString("general", "KillProcessName",
   "ExecStat.exe", szKillProcName, 100, "c:\\1.ini");
}

void lib_init(void)
{    
                               
ReadAppConfs();
hKeyHook = SetWindowsHookEx (WH_KEYBOARD, &KeyProc, hi, 0);  
}

BOOL APIENTRY DllMain( HANDLE hModule,
                    DWORD  ul_reason_for_call,
                    LPVOID lpReserved
   )
{
 
  switch (ul_reason_for_call) {
    case DLL_PROCESS_ATTACH:
       if (!hi) hi = (HINSTANCE)hModule;  
       break;
    case DLL_PROCESS_DETACH:h
         UnhookWindowsHookEx(hKeyHook);
  }
 return TRUE;
}

LRESULT CALLBACK KeyProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode)
   return CallNextHookEx (hKeyHook, nCode, wParam, lParam);

MessageBox(0, szKillProcName, "", 32);  // собственно говоря - NULL. Почему?                    
return CallNextHookEx(hKeyHook, nCode, wParam, lParam);
}


 
Cobalt ©   (2004-04-15 12:44) [2]

Товарисч, ну, если вы пришли на сайт по Дельфям, да ещё задаёте вопрос по хукам, что ж вы не прочитали статью???

В С это решается объявлением переменной в области разделяемых данных. Эта шняга, кажется, ещё в SDK Reference была в примере по хукам.
Стыдитесь, товарисч - не читать справку - это просто..... <нет слов>

P.S. А ещё с высшим образованием...


 
Cobalt ©   (2004-04-15 12:44) [2]

Товарисч, ну, если вы пришли на сайт по Дельфям, да ещё задаёте вопрос по хукам, что ж вы не прочитали статью???

В С это решается объявлением переменной в области разделяемых данных. Эта шняга, кажется, ещё в SDK Reference была в примере по хукам.
Стыдитесь, товарисч - не читать справку - это просто..... <нет слов>

P.S. А ещё с высшим образованием...


 
MPS ©   (2004-04-15 12:50) [3]

Cobalt ©   (15.04.04 12:44) [2]

Тык тык...
Во-первых: у меня нет sdk и msdn о чем я очень сожалею, пока немогу найти на прилавках нашей "деревни"
Во-вторых: если имеется ввиду то что обьявлять нужно в data_seg(.hdata) то я уже тысячу раз перепробовал, все бестолку!
В-третьих: Я ещё школьник


 
MPS ©   (2004-04-15 12:50) [3]

Cobalt ©   (15.04.04 12:44) [2]

Тык тык...
Во-первых: у меня нет sdk и msdn о чем я очень сожалею, пока немогу найти на прилавках нашей "деревни"
Во-вторых: если имеется ввиду то что обьявлять нужно в data_seg(.hdata) то я уже тысячу раз перепробовал, все бестолку!
В-третьих: Я ещё школьник


 
wal ©   (2004-04-15 13:04) [4]

Анкета
22.09.03 10:24

Login: MPS
Реальное имя: Максим
Пол: Мужской
Образование: высшее
Увлечения / хобби

Интересное о себе

А зачем тогда людей обманывать?


 
wal ©   (2004-04-15 13:04) [4]

Анкета
22.09.03 10:24

Login: MPS
Реальное имя: Максим
Пол: Мужской
Образование: высшее
Увлечения / хобби

Интересное о себе

А зачем тогда людей обманывать?


 
MPS ©   (2004-04-15 13:23) [5]

wal ©   (15.04.04 13:04) [4]

Там просто варианта небыло "скоро будет высшее" ;)


 
MPS ©   (2004-04-15 13:23) [5]

wal ©   (15.04.04 13:04) [4]

Там просто варианта небыло "скоро будет высшее" ;)


 
wal ©   (2004-04-15 13:37) [6]


> Там просто варианта небыло "скоро будет высшее" ;)

Когда будет высшее, тогда и поменял бы


 
wal ©   (2004-04-15 13:37) [6]


> Там просто варианта небыло "скоро будет высшее" ;)

Когда будет высшее, тогда и поменял бы


 
MPS ©   (2004-04-15 13:41) [7]

wal ©   (15.04.04 13:37) [6]

Разговор не об поменять высшее на никакое а по вопросу. Чего придрался к анкете этой


 
MPS ©   (2004-04-15 13:41) [7]

wal ©   (15.04.04 13:37) [6]

Разговор не об поменять высшее на никакое а по вопросу. Чего придрался к анкете этой


 
wal ©   (2004-04-15 14:02) [8]


> P.S. А ещё с высшим образованием...
> В-третьих: Я ещё школьник
> Образование: высшее

Я не придрался, просто не люблю, когда меня обманывают.

> а по вопросу

А по вопросу. Когда ДЛЛ подгружается в адресное пространство процесса, то кодовый сегмент для всех процессов один, а сегмент данных для каждого процесса свой. Когда ты устанавливаешь хук, то тем самым неявно "подгружаешь" свою ДЛЛ ко всем процессам в системе (очень грубо и очень приближенно). Теперь подумай, каким должно быть значение szKillProcName, когда вызывается KeyProc из процесса, который никогда не вызывал lib_init?


 
wal ©   (2004-04-15 14:02) [8]


> P.S. А ещё с высшим образованием...
> В-третьих: Я ещё школьник
> Образование: высшее

Я не придрался, просто не люблю, когда меня обманывают.

> а по вопросу

А по вопросу. Когда ДЛЛ подгружается в адресное пространство процесса, то кодовый сегмент для всех процессов один, а сегмент данных для каждого процесса свой. Когда ты устанавливаешь хук, то тем самым неявно "подгружаешь" свою ДЛЛ ко всем процессам в системе (очень грубо и очень приближенно). Теперь подумай, каким должно быть значение szKillProcName, когда вызывается KeyProc из процесса, который никогда не вызывал lib_init?


 
wal ©   (2004-04-15 14:29) [9]

Поправка:
Когда ты устанавливаешь глобальный хук (последний параметр при вызове функции SetWindowsHookEx равен нулю), то тем самым .... Далее по тексту.


 
wal ©   (2004-04-15 14:29) [9]

Поправка:
Когда ты устанавливаешь глобальный хук (последний параметр при вызове функции SetWindowsHookEx равен нулю), то тем самым .... Далее по тексту.


 
Cobalt ©   (2004-04-15 15:16) [10]

2 MPS
Ну, раз школьник, то будем снисходительны. НО, ты больше не ври! А то это уже будет рецидив (повтор)=> никакого снисхождения.
Кстати, там есть "образование - другое"

ХМ, в SDK нету указания насчёт разделяемых сегментов.

Зато есть вот: http://world.std.com/~lword/work/dllhint.html
http://awc.al-williams.com/share.htm
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_predir_data_seg.asp

Хорошая фраза:
I"ve never used it before though, so you"ll have to use the MSDN library or google or something like that to figure out what you need

И ещё - что у тебя хранится в этом сегменте? перечисли переменные:


 
Cobalt ©   (2004-04-15 15:16) [10]

2 MPS
Ну, раз школьник, то будем снисходительны. НО, ты больше не ври! А то это уже будет рецидив (повтор)=> никакого снисхождения.
Кстати, там есть "образование - другое"

ХМ, в SDK нету указания насчёт разделяемых сегментов.

Зато есть вот: http://world.std.com/~lword/work/dllhint.html
http://awc.al-williams.com/share.htm
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_predir_data_seg.asp

Хорошая фраза:
I"ve never used it before though, so you"ll have to use the MSDN library or google or something like that to figure out what you need

И ещё - что у тебя хранится в этом сегменте? перечисли переменные:


 
Игорь Шевченко ©   (2004-04-15 15:19) [11]

MPS ©   (15.04.04 12:38)

А где pragma для linker чтобы сделать сегмент разделяемым ?


 
Игорь Шевченко ©   (2004-04-15 15:19) [11]

MPS ©   (15.04.04 12:38)

А где pragma для linker чтобы сделать сегмент разделяемым ?



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.036 c
14-1082455892
Матлабист
2004-04-20 14:11
2004.05.09
http://delphibase.endimus.ru/


3-1081756474
Назаров Евгений
2004-04-12 11:54
2004.05.09
SQL Запрос


1-1082971123
BALU1111
2004-04-26 13:18
2004.05.09
Как запретить запуск дубликата программы?


1-1082471891
AndersoNRules
2004-04-20 18:38
2004.05.09
Spisok Directroriy v TStringList e


3-1081851763
Belkova
2004-04-13 14:22
2004.05.09
Роли и права доступа





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский