CreateFile 함수에 대한 상세 설명 (WinAPI)
CreateFile은 Windows 시스템에서 파일, 장치, 직렬 포트, 파이프, 드라이버 장치 등의 개체를 열 때 사용되는 핵심 함수입니다. 다음은 이 함수의 프로토타입입니다:
HANDLE CreateFile(
LPCSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
C#에서는 일반적으로 P/Invoke을 통해 호출됩니다:
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern SafeFileHandle OpenDevice(
string pathName,
uint accessMode,
uint shareMode,
IntPtr securityAttrs,
uint creationDisposition,
uint flagsAndAttributes,
IntPtr templateFile);
각 매개변수에 대한 상세 설명
| 매개변수 이름 |
타입 |
설명 |
lpFileName |
string |
파일명 또는 장치 경로, 예: "\\.\device0"는 디바이스를 나타냅니다 |
dwDesiredAccess |
uint |
접근 권한, 예: GENERIC_READ, GENERIC_WRITE |
dwShareMode |
uint |
공유 모드, 주로 0 (독점 접근) 또는 FILE_SHARE_READ |
lpSecurityAttributes |
IntPtr |
보안 속성, 일반적으로 IntPtr.Zero |
dwCreationDisposition |
uint |
생성 방식, 일반적으로 OPEN_EXISTING으로 기존 장치를 엽니다 |
dwFlagsAndAttributes |
uint |
파일/장치 속성, 예: FILE_ATTRIBUTE_NORMAL, FILE_FLAG_OVERLAPPED |
hTemplateFile |
IntPtr |
템플릿 핸들 (속성 복사), 파일 복사시 사용하며 일반적으로 IntPtr.Zero |
예제: DMA 장치 열기 (권장 방법)
const uint GENERIC_READ = 0x80000000;
const uint GENERIC_WRITE = 0x40000000;
const uint OPEN_EXISTING = 3;
const uint FILE_ATTRIBUTE_NORMAL = 0x80;
SafeFileHandle deviceHandle = OpenDevice(
@"\\.\device0", // DMA 장치 경로
GENERIC_READ, // 읽기 권한 (C2H 채널)
0, // 공유 없음 (독점)
IntPtr.Zero, // 기본 보안 속성
OPEN_EXISTING, // 이미 존재하는 장치 열기
FILE_ATTRIBUTE_NORMAL, // 표준 속성 (비동기 I/O 미사용)
IntPtr.Zero // 템플릿 핸들 미사용
);
매개변수 선택 시 유의사항 (특히 DMA 사용 시)
| 매개변수 |
권장 값 |
설명 |
dwDesiredAccess |
GENERIC_READ 또는 GENERIC_WRITE |
C2H 채널 읽기, H2C 채널 쓰기 |
dwCreationDisposition |
OPEN_EXISTING |
기존 장치 열기, 새 파일 생성 안 함 |
dwFlagsAndAttributes |
FILE_ATTRIBUTE_NORMAL |
비동기 I/O 미사용 시 FILE_FLAG_OVERLAPPED 생략 필요 |
dwShareMode |
0 (독점) |
하드웨어 드라이버는 다중 프로세스 공유 권장하지 않음 |
일반적인 오류 원인
| 오류 코드 |
원인 |
ERROR_INVALID_PARAMETER (87) |
버퍼 정렬 문제 또는 핸들이 올바르게 열리지 않음 |
INVALID_HANDLE_VALUE |
CreateFile 매개변수 오류, 경로, 권한 또는 플래그 설정 잘못됨 |
ERROR_ACCESS_DENIED (5) |
권한 불일치, 예: 읽기 전용 장치에 GENERIC_WRITE 사용 |
추가 팁: 제어 채널 열기 (레지스터 조작)
var controlHandle = OpenDevice(
@"\\.\control_device",
GENERIC_READ | GENERIC_WRITE,
0,
IntPtr.Zero,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
IntPtr.Zero);