Windows Driver

Windows Driver/Kernel & Driver 개발

BOOL WINAPI ReadFile( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) 함수

BOOL WINAPI ReadFile(     HANDLE hFile,                        // 읽을 대상 파일 or 디바이스 핸들     LPVOID lpBuffer,                      // 읽은 데이터를 저장할 유저 모드 버퍼     DWORD nNumberOfBytesToRead,           // 읽을 바이트 수     LPDWORD lpNumberOfBytesRead,          // 실제로 읽은 바이트 수 (출력)     LPOVERLAPPED lpOverlapped             // 비동기 I/O 용 구조체 (일반적인 경우 NULL) );  파라미터 설명파라미터설명hFile읽을 대상의 핸들 (파일, 드라이버, 소켓, 파이프 등)lp..

Windows Driver/Kernel & Driver 개발

DO_DIRECT_IO vs DO_BUFFERED_IO 차이 & 성능 비교

DO_DIRECT_IO vs DO_BUFFERED_IO 차이 & 성능 비교항목DO_DIRECT_IODO_BUFFERED_IO메모리 처리 방식MDL (Memory Descriptor List)로 유저 모드 버퍼를 커널에서 직접 접근I/O Manager가 유저 모드 버퍼를 커널 메모리에 복사해서 SystemBuffer를 제공데이터 복사 횟수유저 버퍼 ↔ 커널 버퍼 복사 ❌ (복사 없음)유저 버퍼 → 커널 버퍼 복사 있음버퍼 접근 방법MmGetSystemAddressForMdlSafe()로 커널에서 유저 버퍼 직접 접근바로 Irp->AssociatedIrp.SystemBuffer 사용 가능성능★ 더 좋음 (복사가 없으므로 대용량 처리에 유리)복사 때문에 약간 느림 (특히 큰 데이터)안전성유저 버퍼를 커널에서 ..

Windows Driver/Kernel & Driver 개발

DO_BUFFERED_IO 사용시 주의 할 점.

필터 드라이버를 만들면서 커널에서 애플리케이션으로 내용을 전달하기 위해 아래 사진과 같은 코드를 사용했습니다. 그런데 eventBuffer에 항상  NULL로 저장되는 현상이 있어 원인을 찾아본 결과  커널 모드 드라이버가 SystemBuffer를 사용하면, I/O Manager가 유저 모드 버퍼의 데이터를 커널로 복사해서 SystemBuffer에 넣어주는데 DO_DIRECT_IO로 선언하고 SystemBuffer를 사용하려고 하니 NULL로 나온것 이였습니다.그래서 DO_DIRECT_IO로 선언을 했다면 애플리케이션 입장에서는 관계가 없지만, 드라이버는 SystemBuffer를 보면 안 되고 MDL에서 직접 데이터를 다뤄야합니다.  Direct I/O 특징Direct I/O에서는 I/O Manager가..

Windows Driver/Kernel & Driver 참고 자료

[WinDbg] 원격 디버깅 세팅.

윈도우를 디버그 모드로 부팅할 수 있도록 설정해줘야 합니다. Target PC에 아래 명령어를 이용해 세팅을 해줍니다. bcdedit /dbgsettings net hostip:192.168.0.0 port:50000 bcdedit /set bootmenupolicy legacy bcdedit /copy {current} /d "Windows 10 [Debug, F8]" bcdedit /debug {GUID} on /* {GUID}는 위 명령어를 입력시 출력된 내용 */ Target PC의 세팅이 끝났다면 WinDbg에 Key값을 넣고 "OK" 버튼을 클릭합니다. 대기중인 모습을 볼 수 있고 Target PC를 재부팅을 하면 아래와 같이 화면이 나오게 됩니다.

lwj789
'Windows Driver' 카테고리의 글 목록