일단 DriverExtension에 대해서
알아보면,
- typedef struct _DRIVER_EXTENSION
- {
- PDRIVER_OBJECT DriverObject;
- LONG * AddDevice;
- ULONG Count;
- UNICODE_STRING ServiceKeyName;
- PIO_CLIENT_EXTENSION ClientDriverExtension;
- PFS_FILTER_CALLBACKS FsFilterCallbacks;
- } DRIVER_EXTENSION, *PDRIVER_EXTENSION;
<TEXTAREA class="cpp" style="DISPLAY: none" name=code
rows=10 cols=60>typedef struct _DRIVER_EXTENSION { PDRIVER_OBJECT
DriverObject; LONG * AddDevice; ULONG Count; UNICODE_STRING ServiceKeyName;
PIO_CLIENT_EXTENSION ClientDriverExtension; PFS_FILTER_CALLBACKS
FsFilterCallbacks; } DRIVER_EXTENSION, *PDRIVER_EXTENSION; </TEXTAREA>
DriverExtension은 시작하는 DriverEntry 루틴에서 할당되며 드라이버의 전역적인 자료를 저장할때 사용된다.
DeviceExtension과 거의 흡사한 의미이지만 내포하는 범위는 다르다.
DriverExtension은 시작하는 DriverEntry 루틴에서 할당되며 드라이버의 전역적인 자료를 저장할때 사용된다.
DeviceExtension과 거의 흡사한 의미이지만 내포하는 범위는 다르다.
IoAllocateDriverObjectExtension()는 DriverExtension을 할당하는
역할을 하며
IoGetDriverObjectExtension()는 이 메모리의 주소를 얻는 역할을 한다.
DriverExtension 메모리를 해제해주는 함수는 없다.
왜냐하면 Driver Unload 가 실행되는
시점에서 I/O Manager가 알아서 처리해 주기때문이다.
- NTSTATUS
- DriverDeviceControl(
- PDEVICE_OBJECT DeviceObject,
- PIRP Irp
- )
- {
- PDEVICE_EXTENSION deviceExtension = DeviceObject->DeviceExtension;
- return SmartcardDeviceControl(
- &(deviceExtension->SmartcardExtension),
- Irp
- );
- }
<TEXTAREA class="cpp" style="DISPLAY: none" name=code
rows=10 cols=60>NTSTATUS DriverDeviceControl( PDEVICE_OBJECT DeviceObject,
PIRP Irp ) { PDEVICE_EXTENSION deviceExtension =
DeviceObject->DeviceExtension; return SmartcardDeviceControl(
&(deviceExtension->SmartcardExtension), Irp ); } </TEXTAREA>
위는 Device Extension을 사용하는 예제이다.
그리고 DeviceExtension 메모리는 AddDevice 루틴에서 할당되며 각 장치 고유의 정보를 담을수 있다.
이는 DriverExtension과는 다르다. DriverExtension이 각 장치의 드라이버마다 모두 공유하는 데이터 이지만
DeviceExtension은 공유되지 않는다.
IoCreateDevice()에 의해 DeviceObject를 생성할때 DeviceExtension 메모리를 할당 할수 있으며
IoDeleteDevice()로 DeviceObject를 삭제할때 DeviceExtension을 해제할 수 있다.
이둘의 차이점을 요약하면 AddDevice 루틴안에서 DeviceObject를 생성할때 고유 정보를 저장하기
위해서 DeviceExtension을 사용한다. 이 DeviceExtension에 저장된 내용은 Device Object마다 고유하며
다른 Device Object와 공유되지 않는다.
하지만 RegistryPath와 같은 정보의 경우 모든 DeviceObject가 공통적으로 사용하는 것이다.
이는 서로 공유되는 정보이며 다시 말해 Driver 전역적인 정보이다.
DriverExtension은 이와같이 Driver 전역 적인 정보를 저장하는 메모리이다.
위는 Device Extension을 사용하는 예제이다.
그리고 DeviceExtension 메모리는 AddDevice 루틴에서 할당되며 각 장치 고유의 정보를 담을수 있다.
이는 DriverExtension과는 다르다. DriverExtension이 각 장치의 드라이버마다 모두 공유하는 데이터 이지만
DeviceExtension은 공유되지 않는다.
IoCreateDevice()에 의해 DeviceObject를 생성할때 DeviceExtension 메모리를 할당 할수 있으며
IoDeleteDevice()로 DeviceObject를 삭제할때 DeviceExtension을 해제할 수 있다.
이둘의 차이점을 요약하면 AddDevice 루틴안에서 DeviceObject를 생성할때 고유 정보를 저장하기
위해서 DeviceExtension을 사용한다. 이 DeviceExtension에 저장된 내용은 Device Object마다 고유하며
다른 Device Object와 공유되지 않는다.
하지만 RegistryPath와 같은 정보의 경우 모든 DeviceObject가 공통적으로 사용하는 것이다.
이는 서로 공유되는 정보이며 다시 말해 Driver 전역적인 정보이다.
DriverExtension은 이와같이 Driver 전역 적인 정보를 저장하는 메모리이다.