BOOL WINAPI ReadFile( HANDLE hFile, // 읽을 대상 파일 or 디바이스 핸들 LPVOID lpBuffer, // 읽은 데이터를 저장할 유저 모드 버퍼 DWORD nNumberOfBytesToRead, // 읽을 바이트 수 LPDWORD lpNumberOfBytesRead, // 실제로 읽은 바이트 수 (출력) LPOVERLAPPED lpOverlapped // 비동기 I/O 용 구조체 (일반적인 경우 NULL) ); 파라미터 설명파라미터설명hFile읽을 대상의 핸들 (파일, 드라이버, 소켓, 파이프 등)lp..
DO_DIRECT_IO vs DO_BUFFERED_IO 차이 & 성능 비교항목DO_DIRECT_IODO_BUFFERED_IO메모리 처리 방식MDL (Memory Descriptor List)로 유저 모드 버퍼를 커널에서 직접 접근I/O Manager가 유저 모드 버퍼를 커널 메모리에 복사해서 SystemBuffer를 제공데이터 복사 횟수유저 버퍼 ↔ 커널 버퍼 복사 ❌ (복사 없음)유저 버퍼 → 커널 버퍼 복사 있음버퍼 접근 방법MmGetSystemAddressForMdlSafe()로 커널에서 유저 버퍼 직접 접근바로 Irp->AssociatedIrp.SystemBuffer 사용 가능성능★ 더 좋음 (복사가 없으므로 대용량 처리에 유리)복사 때문에 약간 느림 (특히 큰 데이터)안전성유저 버퍼를 커널에서 ..
필터 드라이버를 만들면서 커널에서 애플리케이션으로 내용을 전달하기 위해 아래 사진과 같은 코드를 사용했습니다. 그런데 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가..
윈도우를 디버그 모드로 부팅할 수 있도록 설정해줘야 합니다. 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를 재부팅을 하면 아래와 같이 화면이 나오게 됩니다.