現在ファイルのチェックを行うプログラムでCreateFile()を使用してデータの読み込みを行ってます。
パラメータは以下になります。
CreateFile("パス", GENERIC_READ ,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
リードのみで共有モードをONの設定を使用しています。
この場合、他のプロセスが排他モードでファイルをオープンしていると、当たり前ですがアクセスできません(GetLastError()=5 で失敗します)
なんらかの方法でこのファイルに対して、ファイルのハンドルを取得することはできないでしょうか?
また無理の場合、このファイルのバイナリデータをメモリー上にコピーする方法などは無いでしょうか?
他プロセスが排他モードで開かれているファイルにアクセスする方法
Re: 他プロセスが排他モードで開かれているファイルにアクセスする方法
調べてみた限りでは以下の方法があります。
1. CreateRemoteThreadを使ってロックしているプロセスのハンドルを強制的に削除する。
これで排他モードを解除してハンドルを得ることができます。
問題は勝手にハンドルを削除されたプロセスでエラーがでる可能性が高いことです。
http://www.codeguru.com/cpp/w-p/files/f ... -Files.htm
2. Volume Shadow Copy を利用する
バックアップ用の機能です。ロックされたファイルを含めてボリュームごとコピーできます。
ボリューム単位でしかコピーできないので使いにくいと思いますが。
http://wj32.org/wp/2012/12/13/how-to-ba ... rvice-vss/
3. 何らかの方法でOSより低いレベルでファイルにアクセスする
排他モードはOSが管理しているので、それより低いレベルではアクセスできるはずです。
1. CreateRemoteThreadを使ってロックしているプロセスのハンドルを強制的に削除する。
これで排他モードを解除してハンドルを得ることができます。
問題は勝手にハンドルを削除されたプロセスでエラーがでる可能性が高いことです。
http://www.codeguru.com/cpp/w-p/files/f ... -Files.htm
2. Volume Shadow Copy を利用する
バックアップ用の機能です。ロックされたファイルを含めてボリュームごとコピーできます。
ボリューム単位でしかコピーできないので使いにくいと思いますが。
http://wj32.org/wp/2012/12/13/how-to-ba ... rvice-vss/
3. 何らかの方法でOSより低いレベルでファイルにアクセスする
排他モードはOSが管理しているので、それより低いレベルではアクセスできるはずです。