CreateFile()
- 파일이나 입출력 장치를 새로 만들거나 열 때 사용하는 함수
- 가장 일반적으로 쓰이는 입출력 장치는 파일, 파일 스트림, 디렉터리, 물리적 디스크, 볼륨, 콘솔 버퍼, 테이프 드라이브, 통신 리소스, 메일 슬롯, 파이프 등이다.
- 이 함수는 파일이나 장치 및 지정된 플래그와 속성에 따라 다양한 유형의 I/O에 대한 파일이나 장치에 액세스하는 데 사용할 수 있는 핸들을 반환한다.
형태
HANDLE CreateFileA(
LPCSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
매개변수
lpFileName : 생성하거나 열고자 하는 파일이나 디바이스의 이름. /나 \를 붙일 수 있다.
dwDesiredAccess : 파일이나 디바이스의 접근 권한 지정
- GENERIC_READ : 읽기
- GENERIC_WRITE : 쓰기
- GENERIC_READ | GENERIC_WRITE : 읽기와 쓰기 둘 다
- 0 : 둘 다 안 한다.
dwShareMode : 파일이나 디바이스의 공유 모드 지정(0x0000000*)
- 0(0) : 다른 프로세스가 읽기, 쓰기, 삭제 못 하도록 막기
- FILE_SHARE_READ(1) : 다른 프로세스의 읽기 권한 지정
- FILE_SHARE_WRITE(2) : 다른 프로세스의 쓰기 권한 지정
- FILE_SHARE_DELETE(4) : 다른 프로세스의 삭제 권한 지정
lpSecurityAttributes : 파일의 보안 속성을 지정하는 구조체 포인터(자식한테 상속할 마음이 없으면 NULL)
dwCreationDisposition : 존재하거나 존재하지 않는 파일 또는 디바이스에 대해 수행할 작업
- CREATE_NEW(1) : 파일이 존재하지 않을 때만 새로운 파일 생성
- CREATE_ALWAYS(2) : 항상 새로운 파일을 생성
- OPEN_EXISTING(3) : 파일이나 디바이스가 존재하면 열기
- OPEN_ALWAYS(4) : 항상 파일을 열기
- TRUNCATE_EXISTING(5) : 파일이 존재하면 0바이트가 되도록 자르고 열기
dwFlagsAndAttributes : 생성할 파일이나 디바이스의 속성 또는 기타 객체의 속성을 지정 (Attribute)
- FILE_ATTRIBUTE_ARCHIVE(32 (0x20)) : 쓰기 속성으로 생성
- FILE_ATTRIBUTE_ENCRYPTED(16384 (0x4000)) : 파일을 암호화하여 생성
- FILE_ATTRIBUTE_HIDDEN(2 (0x2)) : 숨김 파일로 생성
- FILE_ATTRIBUTE_NORMAL(128 (0x80)) : 아무런 속성이 없는 파일을 생성
- FILE_ATTRIBUTE_OFFLINE(4096 (0x1000)) : 데이터가 오프라인 상태로 즉시 사용 불가
- FILE_ATTRIBUTE_READONLY(1 (0x1)) : 읽기 전용 속성으로 생성
- FILE_ATTRIBUTE_SYSTEM(4 (0x4)) : 시스템 파일로 생성
- FILE_ATTRIBUTE_TEMPORARY(256 (0x100)) : 임시 파일로 생성
hTemplateFile : 새로 만들 파일의 속성을 제공할 템플릿 파일(안 써도 된다.)
ReadFile()
- 파일에 있는 데이터를 읽을 때 사용하는 함수
형태
ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
매개변수
hFile : 데이터를 읽을 파일의 핸들을 지정
lpBuffer : 읽은 데이터를 저장할 버퍼의 주소를 지정
nNumberOfBytesToRead : 파일로부터 읽고자 하는 데이터 크기를 바이트 단위로 지정
lpNumberOfBytesRead : 실제로 읽은 데이터 크기를 얻기 위한 변수의 주소를 지정
lpOverlapped : CreateFile() 함수의 전달인자
WriteFile()
- 파일에 데이터를 저장할 때 사용하는 함수
형태
WriteFile(
HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped
);
매개변수
hFile : 데이터를 저장할 파일의 핸들을 지정
lpBuffer : 데이터를 저장하고 있는 버퍼의 주소를 지정
nNumberOfBytesToWrite : 파일에 저장하고자 하는 데이터 크기를 바이트 단위로 지정
lpNumberOfBytesWritten : 파일에 실제 저장된 데이터 크기를 얻기 위해 변수의 주소 지정
lpOverlapped : CreateFile() 함수의 전달인자
CloseHandle()
- 핸들을 닫을 때 사용하는 함수
형태
CloseHandle(
HANDLE hObject
);
매개변수
hObject : 닫을 핸들 지정
참조한 사이트들
docs.microsoft.com/ko-kr/windows/win32/api/fileapi/nf-fileapi-createfilea?redirectedfrom=MSDN
blog.naver.com/PostView.nhn?blogId=power2845&logNo=50144496765
www.joinc.co.kr/w/man/4200/CreateFile
www.soen.kr/lecture/win32api/reference/Function/CreateFile.htm
'IT' 카테고리의 다른 글
Hyper-V와 WinDbg를 이용연결해서 Windows kernel 디버깅하기 (0) | 2020.12.31 |
---|---|
디바이스 드라이버와 응용 프로그램 간의 통신 방법(feat.DeviceIoControl) (0) | 2020.11.01 |
프로세스(Process), 스레드(Thread), 모듈(Module) 정의 및 열거 방법 (0) | 2020.07.19 |
가상 주소 공간 (VAS, Virtual Address Space) (0) | 2020.06.08 |
PE(Portable Executable) 구조 (0) | 2020.05.31 |