システムフックの共有メモリについて


コロン  2009-12-05 05:46:04  No: 71173

質問させて頂きます。

現在、マウスフック用DLLを作成しております
DLL_PROCESS_ATTACHで、共有メモリを作成し
以降、フックプロシージャでは、作成した共有メモリの内部を元に処理を行っておりますが
現在、その処理がうまく行っておりません

例えば
typedef struct  _tag_HOGEHOGE
{
    HHOOK   hHook;
    BOOL    bFlg;
} HOGEHOGE

のように、定義した構造体サイズの共有メモリを作成し
以降そのメモリは、OpenFileMapping->(HOGHOGE *)MapViewOfFileとしてアクセスします

フックプロシージャ内では、bFlgを基に処理をしており
bFlgがTRUEなら処理をするようにしています。

TRUEにする方法は、DLL内部関数を通す事で操作出来るようにしています(仮にsetDLLFlg関数で操作とします)

つまり、フックプロシージャ内で処理を行うときは、アプリ側で
setDLLFlg( TRUE );
のように、一度共有メモリのbFlgをTRUEにする必要があります

アプリ側では、必要な時にTRUEにして、必要の無いときはFALSEにして害を与えないようにしていますが
不思議な事に、TRUEとされていないのに、フックプロシージャ内部処理が動くときがあります

アプリ側にデバッガを通し、TRUEにするタイミングでブレークを貼ってみましたが
やはりアプリ側でTRUEにしていないのに、フックプロシージャ内部の処理が動きます
調べてみると、bFlgがいつの間にかTRUEになっております

このように、アプリ側が操作をしていないのに共有メモリの値が変わる場合、どのようなケースが考えられるでしょうか?

DLLのアタッチとデタッチの時の処理は以下の用にしています

case    DLL_PROCESS_ATTACH:
    /* 共有メモリを作成 */
    g_hMapHandle = CreateFileMapping(
                (HANDLE)0xFFFFFFFF,
                NULL,
                PAGE_READWRITE,
                0,
                sizeof(HOGEHOGE),
                TEXT("MAP_HOGEHOGE")
    );

    break;

case    DLL_PROCESS_DETACH:
    if( g_hMapHandle != NULL )
    {
        /* 共有メモリハンドルを破棄 */
        CloseHandle( g_hMapHandle );
    }

どうぞご教授の程、よろしくお願いします。


オショウ  2009-12-05 06:36:56  No: 71174

例えば・・・

#pragma data_seg("MAP_HOGEHOGE_DATA")
typedef struct  _tag_HOGEHOGE
{
    HHOOK   hHook;
    BOOL    bFlg;
} HOGEHOGE
#pragma data_seg()

で、尚且つ・・・DEFファイルに

SECTIONS
    MAP_HOGEHOGE_DATA READ WRITE SHARED

としたらどうなりますか?

※  私は、これで問題なく動作しています。
    因みにキーボードフックでです。
    何をしているかと言えば、画面のキャプチャソフト
    で使ってます。(自作)

以上。


オショウ  2009-12-05 06:38:41  No: 71175

をを〜一部間違い!

HOGEHOGEの実体を宣言している部分に

#pragma data_seg("MAP_HOGEHOGE_DATA")
// HOGEHOGEの実体宣言
#pragma data_seg()

として下さい。

以上。


オショウ  2009-12-05 06:39:43  No: 71176

う〜ん・・・

そうしたら共有メモリを作成する必要ありませんネ!

※  うっかりにもほどがある・・・
    すいません・・・

以上。


コロン  2009-12-05 06:46:39  No: 71177

オショウさん

レス有難うございます。

#pragma data_seg()
ですが、これを使わずに当初作成していました
その為、ファイルマッピングを用いて共有メモリを作成し
#pragma data_seg()を、共有メモリを用いる事で再現しています

>HOGEHOGEの実体を宣言している部分に
HOGEHOGE自体は、共有メモリの操作する方法なので
実体は
static HANDLE g_hMapHandle;
となっています

操作時は、OpenFileMapping->(HOGHOGE *)MapViewOfFileとして
操作毎に、共有メモリにアクセスして、マップを操作しています

この場合でも、
static HANDLE g_hMapHandle;
を#pragma data_seg()を利用するのは有効なのでしょうか?

やはり、共有メモリを用いずに
初めから、#pragma data_seg()を使うべきでしょうか?


オショウ  2009-12-05 06:59:37  No: 71178

#pragma data_seg("MAP_HOGEHOGE_DATA")
HHOOK   hHook;
BOOL    bFlg;
#pragma data_seg()

としてDEFファイルにも定義するのが、随分昔に
マイクロソフト社の何かのサンプルで見た覚え
があり、ずっと踏襲してます。

次にパッキングの設定くらいかな〜・・・

私は共有メモリ(CreateFileMapping)を使わず
上記の方法で、延々やってきました。
問題(トラブル)も無かったです。

●  気になることが1点・・・
    DLL_PROCESS_ATTACHで、CreateFileMapping
    されてますが、その際のハンドル(g_hMapHandle)
    は、DLL_PROCESS_DETACH時のCloseHandleにしか
    使わないようになっていますか?

    要は、書かれている通り、毎回MapViewOfFile
    してポインタを取得して動作させていることには
    間違いがないのか・・・

※  勝手に書き変わる・・・
    と言うならば、パッキングくらいしか無いように
    思いますが、摩訶不思議ですネ・・・

※  #pragma data_seg()で宣言してもDEFファイルに
    READ WRITE SHARED属性定義しないと、正しく動
    作しませんでした。

以上。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加