[DDK] Recognizer

필터 드라이버를 등록할때

레코그나이져(인식기)가 사용된다.

일단 지금 필터를 등록하는데

앞으로 등록되는 VDO보다는

지금 등록되어 있는 VDO에 기존의 필터를 붙이는게 중요하다,

백신을 보면 재부팅을 안하고 필터를 다 붙이는 기술을 지니고 있다.

이것은 OSR에서 만든 레코그나이저를 사용하는 듯한데,,

일단 A사의 V백신 및 N사의 P백신을 보면

필터 드라이버를 붙이는 모습을 볼 수 있다.

기본적으로 디바이스 트리에 FsRec라는 게 존재하는데

이것이 파일 시스템 레코그나이저이다.

  1. InitializeObjectAttributes( &ObjectAttributes,  
  2.                                 pUnicodeString,  
  3.                                 OBJ_CASE_INSENSITIVE,  
  4.                                 NULL,  
  5.                                 NULL   
  6.                                );  
  7.  
  8.     ntStatus = ObOpenObjectByName( &ObjectAttributes,  
  9.                                    0L,  
  10.                                    0L,  
  11.                                    0L,  
  12.                                    0L,  
  13.                                    0L,  
  14.                                    &Handle   
  15.                                   );  
  16.  
  17.     if( !NT_SUCCESS( ntStatus ) )  
  18.     {  
  19.         return NULL;  
  20.     }  
  21.  
  22.     ntStatus = ObReferenceObjectByHandle( Handle,   
  23.                                           0x80000000,  
  24.                                           NULL,  
  25.                                           0,  
  26.                                           &pDriverObject,  
  27.                                           NULL   
  28.                                          );  
<TEXTAREA class="cpp" style="DISPLAY: none" name=code rows=10 cols=60>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 ); </TEXTAREA>

이런식으로 기존의 CDO에 Attach된 VDO를 찾아내야한다.

그리고 VDO의 최상위에 IoCreateDevice()를 한다음

IoAttachDeviceByPointer()이라는 API를 이용해서 붙여야한다.

  1. pDeviceExtension = pMyVDO->DeviceExtension;  
  2.                 pMyVDO->Flags &= ~DO_DEVICE_INITIALIZING;  
  3.                   
  4.                 pDeviceExtension->nType = DRIVERTYPE;  
  5.                 pDeviceExtension->chDrive = 0;  
  6.                   
  7.                 pLowerCDO = IoGetAttachedDevice( pVDO );  
  8.                 ntStatus = IoAttachDeviceByPointer( pMyVDO, pVDO );  
  9.                   
  10.                 if( NT_SUCCESS( ntStatus ) )   
  11.                 {  
  12.                     pDeviceExtension->pNextDriverDeviceObject = pLowerCDO;  
  13.                     pMyVDO->Flags |= ( pLowerCDO->Flags &   
  14.                                      ( DO_BUFFERED_IO |   
  15.                                        DO_DIRECT_IO )   
  16.                                       );        
  17.                 }  
  18.                 else 
  19.                 {  
  20.                     IoDeleteDevice( pMyVDO );  
  21.                 } 
<TEXTAREA class="cpp" style="DISPLAY: none" name=code rows=10 cols=60>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 ); } </TEXTAREA>

IoRegisterFsRegistrationChange()라는 함수는 디바이스가 등록된 이후

마운트되는 VDO에 대해서는 모두 감지를 하는 루틴이다.

이 루틴을 등록하기전에 마운트된 볼륨을 잡아내는 기술이 관건이다.

L"\\FileSystem\\NTFS",   // FSD
L"\\FileSystem\\CDFS",   // CD
L"\\FileSystem\\FASTFAT", // USB

기존에 등록되었을 법한 디바이스 들이다.

이 디바이스들을 이용해서 CDO를 뽑아올 수 있다.

레코그나이저, SSM에서 사외교육을 갔다가,

정덕영씨에게 교육을 들으러 가서

과제 관련해서 물어봐서 알게된 기술인데,

일단 내가 수행할려는 과제와는 거리가 멀어서 난감했다,, -_-;

3개월동안 삽질을 한 결과라는,, ㅎ
 
출처 : http://ssmhz.tistory.com/160
위로 스크롤