2010-11-30 7 views
7

우리는 현재 WriteFile (또는 CFile :: Write - 대신 내부적으로 WriteFile을 호출)이라는 문제에 직면하여 Win32 오류 5ERROR_ACCESS_DENIED을 발생시킵니다.WriteFile이 ERROR_ACCESS_DENIED를 반환하게하는 원인은 무엇입니까?

(편집 :.! 우리가 행동을 repro 수 수 없습니다 우리는 순간에이 모든이 개의 cfile :: 쓰기이었다 소스 라인을 나타내는 오류 ERROR_ACCESS_DENIED로 포함하는 로그 파일입니다)

(EDIT :이 파일은 지역 드라이브에 그것은 실제로 파일이 아닌 디렉토리)

이제 WriteFiles's documentation 정말 도움이되지 않으며, 간단한 테스트 응용 프로그램과 함께 실험을하면 다음과 같은 결과를 얻을 :.

  1. WriteFile 일 때 쓰기를 위해 열리지 않은 파일 핸들 (예 : 파일 핸들)에 대해 호출되면 ERROR_ACCESS_DENIED가됩니다. 읽기 전용으로 열림). 핸들이 유효하지 않거나 파일이 파일에 대한 모든
  2. 액세스 권리, 또는 쓰기 보호 플래그 열려 있지
    • 경우
    • 하지 원인은 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을 실행하고 당신이 그것을 디버깅 할 수 있습니다, 당신이해야하는 경우 응용 프로그램이 비주얼 스튜디오 2005

+1

왜 오프닝 플래그를 추적 할 수 있습니까? 코드를 편집하고 싶지 않으면 프로세스 모니터를 사용하여 코드를 검사하면됩니다. –

+0

물론 추적을 추가 할 수 있습니다. 이는 고객 사이트에서 한 번만 발생합니다. 거기에 디버거를 추가 할 수있는 방법은 없습니다. –

+1

파일 시스템 필터 드라이버로 인해 바이러스 방지 스캐너가 가장 확실한 예가 될 수 있습니다 (암호화 등의 다른 기능이 있지만). – Luke

답변

3

문제는

ERROR_ACCESS_DENIED를 반환의 WriteFile 원인이 무엇

을했다?

와가 (즉, 읽기 전용 에 대한 열) 작성하기위한 를 개설되지 않은 파일 핸들 를 호출하면 나는

  1. 의 WriteFile이 ERROR_ACCESS_DENIED의 원인이됩니다 질문에 명시된 .

개방 플래그 및 다른 사건에 대한 상기 로그를 추가 한 결과,이 정확 나온다. 열려있는 플래그에 대한 로깅은 오류 지점에서 파일 개체가 CFile :: modeRead로 열렸 음을 보여 주므로 ERROR_ACCESS_DENIED가 표시됩니다.

이상한 코드 경로가 어떤 코드 경로로 연결되는지는 아직 밝혀지지 않았지만 다음과 같이 표시됩니다. 자신의 코드를 절대 신뢰하지 마십시오. :-)

(아, 그리고 BTW. 그것은 실패한 ::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

파일이 네트워크 볼륨에 없으며 사실 파일입니다. –

관련 문제