こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

コンソールアプリのFileIOフック

環境はWin7ProfessionalとVC++2010Expressです。

市販のコンソールアプリ(A.exeとします)があります。ソースコードはありません。
実行させ,標準入力から使用する入力ファイル名の拡張子を除く部分を入力すると,その入力ファイルから必要な情報を読み取り,計算が行われます。
今は手持ちのC++プログラム(B.exeとします。ソースコードもあります。)の中でCreateProcessを用いて,A.exeを実行させています。
このときA.exeの中では,入力ファイルを開いて,ファイルの中身を読むといった作業が行われているはずですが,これをディスク上のファイルから読むのではなく,メモリから読ませたいと思っています。つまりB.exeの中でA.exeを起動される部分の前にいったんファイル出力をして,そのファイルをA.exeの入力ファイルとしているのを,何とかファイルの入出力を行わないでA.exeを実行させたいのです。
A.exeはループの中で実行させるため,FileIOにかかる時間がバカになりません。
このようなことは可能なのでしょうか?
参考になるWebSite等を紹介していただけたら幸いです。

投稿日時 - 2012-06-01 15:46:12

QNo.7508401

困ってます

質問者が選んだベストアンサー

失礼致しました。

>CreateProcess 関数が返したハンドルには、プロセスオブジェクトに対する PROCESS_ALL_ACCESS アクセス権が割り当てられています。(MSDNより)

との事なので、アプリケーションのサブクラス化は必要無いようです。

なので、必要な話としては、

1.メモリマップドファイルへのIO
2.モジュールのインポートセクションの操作によるAPIのフック

ですね。実現性は自分で確かめてください。

投稿日時 - 2012-06-03 01:32:55

お礼

再度の回答をいただきありがとうございます。
いただいたキーワードをもとに検索して、適当にテストプログラムを作ってみることにします。

投稿日時 - 2012-06-03 16:21:40

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(7)

追加でもう一つ、自分は使った事ないけどクリップボードも便利かもしれません。

投稿日時 - 2012-06-05 21:40:35

お礼

回答ありがとうございます。
クリップボードはサイズが小さいというイメージがあるのですが、数百MBから数GBでも大丈夫なのかなと考えてしまいます。まあ、調べてみればわかるんでしょうけど...

投稿日時 - 2012-06-10 13:24:15

ANo.6

Detoursとか。
http://asd.if.land.to/code/apihook7.html

投稿日時 - 2012-06-03 07:08:17

お礼

回答ありがとうございます。
この辺のことは初めて考えていることなので、みなさんどのようにやっているのかよくわからないのです。ご教示いただいたツールを使って何がどこまでできるのか、ちょっと遊んでみます。

投稿日時 - 2012-06-03 16:28:02

B.exeの中でメモリマップドファイルへ書き込みを行い、
A.exeが使っているファイルIOのAPIをサブクラス化しメモリマップドファイルから読み込む様にする。

そんなこと出来るんですかね・・・。自分はやったこと無いです。

メモリマップドファイル、アプリケーションのサブクラス化、
APIのフック等を調べて見てください。

ただ、アプリケーションのサブクラス化をしようとしたことはあるのですが
ウィンドウとダイアログを同一視できなかったりして、結構落とし穴は多い物
でしたので、課題リストを作って一つ一つ実現性を検証しておく必要がある
かと思います。

もっとも簡単にパフォーマンスを改善する方法として、
“SSDドライブにする”というのが手っ取り早いですね。

投稿日時 - 2012-06-02 21:16:37

お礼

キーワードがあれば検索しやすくなります。ありがとうございました。
> 自分はやったこと無いです。
全く同じでなくても似たような実例があれば理解しやすいんですが...

投稿日時 - 2012-06-03 13:11:57

ANo.3

>その簡単じゃないことをやりたいのですが,なにかヒントになる資料はありますでしょうか?

ReadFileやReadFileExの仕様を見て「こういう処理が必要になるだろうしめんどくさそうだなぁ」と思っただけなので具体的な資料などは存じません。
WIN32 APIのファイルを扱うAPIには一通り目を通した方がよいとは思いますけど。

投稿日時 - 2012-06-02 14:01:02

お礼

引き続き回答していただきありがとうございます。
WIN32 APIのファイルを扱うAPIには一通り目を通した方がよいというのはその通りですね。

投稿日時 - 2012-06-03 13:09:54

ANo.2

ReadFile, ReadFileExやその他関係しそうなAPIをフックすればできなくはないと思いますけど簡単じゃないと思いますよ。

投稿日時 - 2012-06-01 19:52:42

補足

その簡単じゃないことをやりたいのですが,なにかヒントになる資料はありますでしょうか?

投稿日時 - 2012-06-01 22:59:24

お礼

回答していただきありがとうございます

投稿日時 - 2012-06-01 22:58:20

ANo.1

メインメモリの一部をRAMDISKとして確保して、そこを使うようにしたほうが簡単じゃないかと思います。

投稿日時 - 2012-06-01 15:54:37

補足

RAMDISKを使用するのはテスト環境では簡単なのですが,実際に動作させようとしている環境は私の制御下にないため,そのような変更はできないのです。

投稿日時 - 2012-06-01 19:39:48

お礼

さっそくの回答をいただきありがとうございます。

投稿日時 - 2012-06-01 19:39:46