1. CreateFile는 파일에 국한된 내용이 아니라 Device에 적용되는 내용이다.
CreateFile는 하드웨어와 프로그램 중앙에 존재하는 드라이버를 경유해서 물리적인 녀석을 제어하기 위해서 제공하는 함수다. 내부적으로 DeviceIoControl를 사용하게 된다.
결국 CreateFiles는 DeviceIoControl를 좀더 사용할때 익숙하도록 하는 녀석일뿐이다.
여기서는 DeviceIoControl부분이 당연히 핵심이다. 하지만 여기의 문서 내용은 CreateFile만을 다루도록 하겠다.
반환값은 핸들이다. 핸들은 내부적으로 커널의 자원을 사용함으로써 동시 접근을 하는 경우에 문제가 될수 있음으로 데이타를 보호할수 있는 메커니즘을 제공해야 한다.
어찌되었던, 핸들은 데이타 보호 기능과 내부적으로 맞물릴수 있다는 것을 인지하는 것은 중요하다. 이부분에 대해서는 나중에 기회가 되면 언급하도록 하자.
lpFileName
디바이스에 대한 Symbol Link과 맞물리는 부분이다.
대표적인 것인 파일의 절대 경로이겠지만, 그외에도 파일 스트림, 디렉토리, 물리 디스크, 불룜, 컨솔 버퍼, 테이프 드라이버, 통신 리소스, 메일슬롯, 네임드 파이드를 포함해서 여타 물리 자원를 대표하는 Symbol Link임을 인지하자.
dwDesiredAccess
디바이스에 대한 권한으로 읽기용인지, 쓰기용인지 아니면 둘다인지 지정해주어야 한다.
만약에 0를 값으로 넘기면 디바이스를 엑세스하지 않으면서 디바이스의 속성를 Query하겠다는 의미다. 결국 디바이스 정보를 얻을 목적으로 사용할수 있다.
예를 들면 A 드라이브의 용량이라든지, 디스크 포멧 이란든지.. 여타 정보를 얻어낼때 사용될수 있다. 또한 파일의 존재 여부나 폴더의 존재 여부를 확인할때도 아주 유용하다.
dwShareMode
제 3의 프로그램에서 같은 디바이스 자원을 사용할때의 엑세스 권한을 지정한다. 역시 위에 dwDesiredAccess와 동일하지만, 내가 아닌 다른 프로그램에 대한 권한이라는 부분만이 다르다.
만약에 0을 값으로 지정하면 위에 경우와 다르게 모든 권한이 none으로 지정되어서 외부에서는 전혀 접근이 불가하다.
위와 같은 값을 넣을수 있다.
lpSecurotyAttributes
SECURITY_ATTRIBUTES라는 구조체를 이용해서 ACL를 제어하는 목적으로 사용한다.
이 부분에 대한 내용은 조금 복잡한 정보를 담고 있으나, 일반적으로 NULL를 넣어주는 것이 관례다.
ACL는 DACL와 FACL로 다시 구분할수 있는데, 간단하게 의미만 파악하면 폴더 제어 권한, 파일 제어권한으로 해석될수 있다. 결국 해당 디바이스 하단의 리소스를 Child라고 부르고, 그 부분에 대해서도 적당한 권한을 지정할수 있다. 일단 이 부분을 이해할수 없다면 NULL를 넣어서 비 상속형
Child권한을 부여하는 것이 좋다.
dwCreationDispostion
엑세스하길 원하는 디바이스 리소스가 없다면 어떻게 할것인지.. 지정한다.
dwFlagsAndAttributes
2. 디바이스 Symbol Link를 알아보자.
위에 경우는 물리 디스크를 의미한다. 논리 디스크를 접근하는 것은 아래와 같다.
논리 디스크 접근하기.. 아마도 가장 일반적으로 사용하는 경우다.
여기서 알아두어야 할 것은 디스크를 포맷하거나 하는 작업도 결국 DeviceIoControl를 통해서 가능하다. 잘못된 접근은 때론 하드 파티션을 보낼수 있다.
이것을 방지하기 위해서 CreateFile과 같은 일반적인 함수를 만들었다는 것을 짐작할수 있다.
위에 내용은 바로 테이프 디바이스 예..
위에 경우는 바로 시리얼 통신을 포함한 통신 리소스의 접근..예
댓글 없음:
댓글 쓰기