2010-11-30 51 views
7

現在、WriteFile(またはCFile :: Write - しかし、内部的にWriteFileを呼び出す)という問題が発生し、Win32エラー5ERROR_ACCESS_DENIEDが発生しています。何が原因でWriteFileがERROR_ACCESS_DENIEDを返すのですか?

(EDIT:私たちは持っているすべては、現時点でのCFile ::書き込みだったとエラーERROR_ACCESS_DENIEDとして含有するソース行を示すログファイルである私たちが行動をREPROことができないことに注意してください!)

(EDIT :ファイルがローカルドライブ上にあり、それは実際にはファイルではなくディレクトリである)

さて、WriteFiles's documentationは本当に助けにはならない、と簡単なテストアプリを使って実験すると、次の結果が得られます。

  1. WriteFile は、書き込み用に開かれていないファイルハンドルに対して呼び出されるとERROR_ACCESS_DENIEDを引き起こします。読み取り専用に開く)。
    • ハンドルが有効でないか、またはファイルが、ファイルのすべての
    • アクセス、または書き込み保護フラグで開かれていない場合
    • それない原因ERROR_ACCESS_DENIEDますの後に変更されたファイルがプロセスによって開かれました。 (これらは、ファイルが開かれ前に、ファイルを開くと失敗するため、我々はWriteFile関数に取得することはありません変更された場合。)
    • ファイルが何らかの理由でエラー32 ERROR_SHARING_VIOLATIONで最高の結果で、別のプロセス/ハンドル(この意志によってロックされています)。ファイルが実際に読み取りフラグの代わりに、書き込みフラグで開かれた場合明らかに、このコールのための唯一の可能性が失敗する状況で私たちを残し

。しかし、私たちのコードを見ると、これは非常に起こりにくいようです。 (により、当社のトレース、 に我々は WriteFile関数が失敗したことを確認することができ、これらは描かれていないため は、我々はエラーがERROR_ACCESS_DENIEDであることを確認することができます、我々は、開放フラグの100.1パーセントを確認することはできません。)

WriteFile(CFile :: Write)がERROR_ACCESS_DENIEDを引き起こす他の既知の状況はありますか?

:さらに、この質問の内容を明確にする:

  • ファイルはので、それがディレクトリであるか、私が行っ
  • すべてのテストをsomesuchすることはできません、開いていたその中を示しますファイルは開いていますので、削除することはできませんので、ファイルはWriteFileの呼び出しでそこに残っている必要があります
  • ファイルはローカルドライブにあり、ネットワークドライブにはありません。

私たちは、Windows XPのSP3上で実行しているし、あなたがそれをデバッグすることができ、あなたが必要がある場合はアプリがVisual Studioの2005

+1

なぜあなたはオープニングフラグをトレースすることはできませんか?コードを編集したくない場合は、プロセスモニタを使用してコードを検査するだけです。 –

+0

もちろん、トレースを追加できます。これは顧客のサイトで一度だけ発生します。そこにデバッガを追加する方法はありません。 –

+1

ファイルシステムのフィルタドライバは、これを引き起こす可能性があります。もっとも明白な例は、ウイルス対策スキャナです(ただし、暗号化などの他にもあります)。 – Luke

答えて

3

質問は、WriteFile関数は ERROR_ACCESS_DENIEDを返すようになり何

でしたか?

と私はそれが 呼び出された場合のWriteFileを書き込むため を開いていないファイルハンドル用 ERROR_ACCESS_DENIEDが発生します質問に

  1. を述べた(つまりは、読み取り専用 ために開かれています) 。

オープンフラグと別のインシデントのログをさらに追加した後、これが正しいことがわかりました。開いているフラグのログは、エラーの時点で、ファイルオブジェクトがCFile :: modeReadで開かれていることを示しています。したがって、ERROR_ACCESS_DENIEDが返されます。

どの奇妙なコードパスがこれにつながっているかはまだ分かりませんが、これは次のようになります。自分のコードを信頼しないでください。 :-)

(ああ、ところで。これは失敗したことを::WriteFileませんでしたが、::FlushFileBuffers APIが、どうやらそれは同じエラーが返されます。)

+0

これがあなた自身の質問に答えた場合は、そのようにマークしてください。 – RedX

+0

@RedX:ありがとう。私は自分の答えが一定の時間ロックされていると思ったので、すぐにやっていない。これは答えの質問ではなく、質問の年齢に当てはまると思われます。 –

0

でコンパイルされていることを追加する必要があります。それは万人のものすることができます

  • MSDNが間違っている(それは多くのことを起こる)
  • いくつかのアプリ(?ウイルス)のWriteFileをフックし、
  • ファイルシステムの問題を別の行動を引き起こしていますか?
  • あなたのログで何か間違って、または観察結果
+2

IMHO、これはコメントだったはずです。現時点では、問題のデバッグはできません。 –

1

ERROR_ACCESS_DENIEDになる可能性のある状況は約10種類あります。内部的には、すべてのWriteFileがNtWriteFileを呼び出し、その意味のあるNTSTATUSエラーコードをあまり意味のないHRESULTにマップします。

特に、ERROR_ACCESS_DENIEDは、ファイルがネットワークボリューム上にあり、書き込み権限が間違っているか、ファイルが実際にはファイルではなくディレクトリであることを示しています。

+0

ファイルはネットワークボリューム上に存在せず、実際にはファイルです。 –

関連する問題