Win32의 CreateFile 사용법

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);

태그: WinAPI C# P/Invoke DMA DeviceControl

5월 28일 05:03에 게시됨