Главная страница
    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.045 c
3-1081923497
loger
2004-04-14 10:18
2004.05.09
D5-Access


7-1079534916
Arm79
2004-03-17 17:48
2004.05.09
Создание форм в потоках


3-1082013569
kat
2004-04-15 11:19
2004.05.09
Не могу создать alias в ODBC Driver do Microsoft Access


14-1082312672
Феликс
2004-04-18 22:24
2004.05.09
Черты характера


9-1068552959
Thor
2003-11-11 15:15
2004.05.09
Улучшенный Power Draw





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский