2월, 2011의 게시물 표시

Driver Development Part 1 : 요약정리

디바이스 드라이버를 만들기 위해서 기본적으로 구현해 주어야 하는 함수들이 있는데. 1. 디바이스를 만든다.(DriverEntry) 2. 디바이스를 삭제한다.(Example_Unload) 3. 디바이스로 데이터를 보내고 받는다. DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath);    DRIVER_OBJECT : 드라이버를 나타내는 데이터 구조체 이거는 DEVICE_OBJECT를 포함하고 있고(특정디바이스를 나타내는 데이터 구조체)    pRegistryPath : 드라이버의 정보가 저장된 레지스트리 위치를 가리키는 문자열 드라이버의 특정 정보를 저장하는데 사용될수 있다.    역할 : 디바이스를 만든다. 모든 드라이버가 하드웨어와 동작하는 것은 아니기 때문에 드라이버 타입은 UNKNOWN이 될 수 있다.   UNICODE_STRING은 자체적으로 사이즈 파라미터를 갖고 있기 때문에 널로 끝날필요는 없다. 따라서 드라이버로 건네지는 유니코드 스트링은 널로 끝나지 않기 때문에 항상 염두에 두고 있어야 한다. pDeviceObject는 새롭게 만들어지는 디바이스 오브젝트를 받는다. 두번째 파라미터는 0을 건네주고 있는데, device extension이 필요로 하는 바이트 수를 의미한다. 사용하지 않기 때문에 0을 건네고 있다. 특정 요청들이 왔을때 드라이버가 호출될수 있도록 뭔가를 세팅을 해주어야 하는데 (이러한 요청이 IRP Major request이고 여기 아래에는 sub-request인 Minor request가 있다. IRP 스택 위치에서 발견될 수 있다) for (uiIndex = 0 ; uiIndex < IRP_MJ_MAXIMUM_FUNCTION; uiIndex++) pDriverObject- > MajorFunction[uiIndex]...