필터 드라이버를 등록할때
레코그나이져(인식기)가 사용된다.
일단 지금 필터를 등록하는데
앞으로
등록되는 VDO보다는
지금 등록되어 있는 VDO에 기존의 필터를 붙이는게 중요하다,
백신을 보면 재부팅을 안하고 필터를
다 붙이는 기술을 지니고 있다.
이것은 OSR에서 만든 레코그나이저를 사용하는 듯한데,,
일단 A사의 V백신 및 N사의
P백신을 보면
필터 드라이버를 붙이는 모습을 볼 수 있다.
기본적으로 디바이스 트리에 FsRec라는 게
존재하는데
이것이 파일 시스템 레코그나이저이다.
- InitializeObjectAttributes( &ObjectAttributes,
- pUnicodeString,
- OBJ_CASE_INSENSITIVE,
- NULL,
- NULL
- );
- ntStatus = ObOpenObjectByName( &ObjectAttributes,
- 0L,
- 0L,
- 0L,
- 0L,
- 0L,
- &Handle
- );
- if( !NT_SUCCESS( ntStatus ) )
- {
- return NULL;
- }
- ntStatus = ObReferenceObjectByHandle( Handle,
- 0x80000000,
- NULL,
- 0,
- &pDriverObject,
- NULL
- );
이런식으로 기존의 CDO에 Attach된 VDO를 찾아내야한다.
그리고 VDO의 최상위에 IoCreateDevice()를 한다음
IoAttachDeviceByPointer()이라는 API를 이용해서 붙여야한다.
- pDeviceExtension = pMyVDO->DeviceExtension;
- pMyVDO->Flags &= ~DO_DEVICE_INITIALIZING;
- pDeviceExtension->nType = DRIVERTYPE;
- pDeviceExtension->chDrive = 0;
- pLowerCDO = IoGetAttachedDevice( pVDO );
- ntStatus = IoAttachDeviceByPointer( pMyVDO, pVDO );
- if( NT_SUCCESS( ntStatus ) )
- {
- pDeviceExtension->pNextDriverDeviceObject = pLowerCDO;
- pMyVDO->Flags |= ( pLowerCDO->Flags &
- ( DO_BUFFERED_IO |
- DO_DIRECT_IO )
- );
- }
- else
- {
- IoDeleteDevice( pMyVDO );
- }
IoRegisterFsRegistrationChange()라는 함수는 디바이스가 등록된 이후
마운트되는 VDO에 대해서는 모두 감지를 하는 루틴이다.
이 루틴을 등록하기전에 마운트된 볼륨을 잡아내는 기술이 관건이다.
L"\\FileSystem\\NTFS", // FSD
L"\\FileSystem\\CDFS", // CD
L"\\FileSystem\\FASTFAT", // USB
기존에 등록되었을 법한 디바이스 들이다.
이 디바이스들을 이용해서 CDO를 뽑아올 수 있다.
레코그나이저, SSM에서 사외교육을 갔다가,
정덕영씨에게 교육을 들으러 가서
과제 관련해서 물어봐서 알게된 기술인데,
일단 내가 수행할려는 과제와는 거리가 멀어서 난감했다,, -_-;
3개월동안 삽질을 한 결과라는,, ㅎ