プロが教える店舗&オフィスのセキュリティ対策術

別プロセスで握られていているファイルがあります。
通常の削除では削除できない状態です。

同じファイル名で新規ファイルを作成したいのですが、
削除できないため、更新できない状態となっています。

これをWindowsAPIのCreateFile関数またはDeleteFile関数を利用して、
削除&新規ファイル作成したいのですが、どうしたら良いでしょうか。
DeleteFile関数には強制削除パラメータ等がないように見受けられます。

初心者的な質問で申し訳ございませんが、解決方法を教えていただけませんでしょうか。

上記以外の関数で解決できるのであれば、それでも結構ですので、教えてください。

A 回答 (3件)

 こんばんは。



 先ずはファイルを縛りつけているプロセスを停止させる事から着手するしかないのではないでしょうか。
 手順として簡単に書くと、大体以下の様になると思います(抜けている部分があるかもしれません)。

(1)ZwQuerySystemInformation()にSystemHandleInformationフラグを与えて、システム上のハンドル情報、SYSTEM_HANDLE_INFORMATION[0~n]をリストアップ。
(2)OpenProcess()にプロセスID(SYSTEM_HANDLE_INFORMATION::ProcessIdメンバ)を渡してプロセスを開く。
(3)ZwDuplicateObject()に(SYSTEM_HANDLE_INFORMATION::Handleメンバ)を渡してハンドルを複製。
(4)ZwQueryObject()でOBJECT_BASIC_INFORMATIONを取る。
(5)ZwQueryObject()でOBJECT_TYPE_INFORMATIONを取り、ハンドルがファイルである事を確認する。
(6)ZwQueryObject()でOBJECT_NAME_INFORMATIONを取り、縛りを解除したいファイル名(フルパス)と比較する。
(7)一致したら、TerminateProcess()でファイルを縛りつけているプロセスを閉じる。
(8)SYSTEM_HANDLE_INFORMATION[0~n]の分だけ、(4)~(7)を繰り返す。
(9)DeleteFile()で消す。

 見慣れないフラグや構造体、API名が並んでいますが、これ等はデバイスドライバ開発キットのヘッダファイルで定義されているものが大半です。
 其れでも、コンパイルエラーが出る場合には、自前で構造体を書くなり、APIをダイナミックロードして不足分を補います。
 要は、とても簡単に出来る事では無いと言う事です。
    • good
    • 0
この回答へのお礼

詳しく教えていただきありがとうございました。

しかし上記を実装するには少し私の力量では足りない気がします。
ですが、考え方は何となく分かる気がするので、
これを参考に、実装してみたいと思います。

他の皆様も、ありがとうございました。

お礼日時:2009/12/08 05:58

> DeleteFile関数には強制削除パラメータ等がないように見受けられます。



プロセスが生きている間にAPIで簡単にファイルを削除できてしまったら、それはそれで問題だと思います。(ファイルロックの意味が・・・)

ファイルを削除するにはロックしているプロセスを終了するしかないでしょう。ファイルをロックしているプロセスを調べるソフトはいくつかあります。どのようにプロセスを探しているのかは分かりませんが・・・。
    • good
    • 0

APIで可能なのかどうかは知りませんが、handle.exeを使えばできると思います。

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!