파일이 수정 (삭제) 가능한 상태인지 체크하는 방법 (How to Determine a File is Writable or Deletable)
C++ 2013. 7. 18. 10:38CreateFile(pszFilePath, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
ShareMode의 의미는 "일단 이 핸들이 열리고 나면 방금 지정한 ShareMode 중 하나라도 포함하지 않은 핸들은 열릴 수 없다" 가 됩니다. 이 항목에 "0"을 지정하는 경우는 두가지 의미를 가지게 되죠.
1. 이 핸들이 열린 이후로는 이 파일에 대해 어떠한 핸들도 열릴 수 없음. 말하자면 파일에 Exclusive Lock을 거는 거죠. 악성코드 들이 곧잘 이 짓을 합니다. ^^
2. 이 CreateFile이 호출되기 전에 해당 파일에 대해 어떠한 핸들이라도 열려있다면 이 호출은 실패함. 왜냐하면... 이전에 호출된 CreateFile의 세번째 인자가 0이 아니었다면... 그 값을 포함하는 CreateFile만 성공할 수 있기 때문에 실패할 것이고, 이전에 호출된 CreateFile의 세번째 인자가 0이었다면... Exclusive하게 핸들이 열려있기 때문에 실패하겠죠. ^^;;;
따라서 ShareMode에 "0"을 지정하여 CreateFile을 호출하는 것은 이전에 열려있는 핸들이 있는지 체크하는 용도로 사용될 수 있습니다. ^^
참고로 MSDN 상의 "dwShareMode"에 대한 설명을 첨부합니다.
The requested sharing mode of the file or device, which can be read, write, both, delete, all of these, or none (refer to the following table). Access requests to attributes or extended attributes are not affected by this flag.
If this parameter is zero and CreateFile succeeds, the file or device cannot be shared and cannot be opened again until the handle to the file or device is closed. For more information, see the Remarks section.
You cannot request a sharing mode that conflicts with the access mode that is specified in an existing request that has an open handle. CreateFile would fail and the GetLastError function would returnERROR_SHARING_VIOLATION.
To enable a process to share a file or device while another process has the file or device open, use a compatible combination of one or more of the following values. For more information about valid combinations of this parameter with the dwDesiredAccess parameter, see Creating and Opening Files.
Note The sharing options for each open handle remain in effect until that handle is closed, regardless of process context.
'C++' 카테고리의 다른 글
VM환경에서 CoCreateGuid()의 GUID Dup 문제 (0) | 2018.05.10 |
---|---|
CreateFile 시 DesiredAccess와 ShareMode의 관계 (2) | 2013.07.31 |
CreateProcessAsUser 시 ACCESS_DENIED 문제 (0) | 2013.06.13 |
DLL / LIB 에서의 함수 Export 시 Name Mangling (Decoration) 규칙 (0) | 2012.05.08 |
서비스를 svchost에 따로 실행하기 (0) | 2011.07.27 |