음… Attach하는데 완전 오래걸렸네…

윽 엄청난 삽질로… 완전 포기 단계 까지 갔다가… 막판에

저번에 사용하던 심볼링크이름으로 디바이스포인터 얻어오는 방법을 했더니만…

오오케이!!! 쿠쿠

이제… 필터 디바이스로 통해 들어오는 정보들 처리하면 되겠군…

아… 부족해… 실력이.. 유유 유유



//////////////////////////////////////////////////////////////////////////
// AttachDevice 함수
// GUIDeviceObject : GUI Device 포인터를 받아들이는 인자
// 기능 : Keyboard Device에 Keyboard Filter Device를 붙여준다.
BOOLEAN AttachDevice ( IN PDEVICE_OBJECT GUIDeviceObject )
{
 NTSTATUS   status;
 PDEVICE_OBJECT  KbdDevice, KbdHookDevice;
 PDEVICE_EXTENSION pDevExt;
 UNICODE_STRING  KbdName;
 PFILE_OBJECT  pFileObject;


 // KbdName Unicode String에 Keyboard class 이름을 넣는다.
 RtlInitUnicodeString ( &KbdName, L”\\Device\\KeyboardClass0” );


 // KbdName을 통해서 Keyboard Device Object 포인터를 구한다
 status = IoGetDeviceObjectPointer ( &KbdName, FILE_ALL_ACCESS, &pFileObject, &KbdDevice );
 if ( !NT_SUCCESS ( status ) )
 {
  KdPrint ( ( “IoGetDeviceObjectPointer () Fail!!!” ) );
  return FALSE;
 }


 // Keyboard Device 에다가 Filter Device를 붙인다
 status = IoCreateDevice ( GUIDeviceObject->DriverObject,
        sizeof ( DEVICE_EXTENSION ),
        NULL,
        KbdDevice->DeviceType,
        0,
        FALSE,
        &KbdHookDevice );
 if ( !NT_SUCCESS ( status ) )
 {
  KdPrint ( ( “IoCreateDevice () Fail!!!” ) );
  return FALSE;
 }


 // Device Extension 변수에 정보들을 저장한다.
 pDevExt = (PDEVICE_EXTENSION) KbdHookDevice->DeviceExtension;
 pDevExt->DeviceType = KBD_HOOK;
 pDevExt->pHookDevObj = KbdDevice;


 KbdHookDevice->Flags |= (DO_BUFFERED_IO | DO_POWER_PAGABLE);
 KbdHookDevice->Flags &= ~DO_DEVICE_INITIALIZING;


 // Keyboard Device에 Keyboard Filter Device를 붙인다
 pDevExt->pTopOfStack = IoAttachDeviceToDeviceStack ( KbdHookDevice, KbdDevice );
 if ( pDevExt->pTopOfStack == NULL )
 {
  IoDeleteDevice ( KbdHookDevice );
  KdPrint ( ( “IoAttachDeviceToDeviceStack () Fail!!!” ) );
  return FALSE;
 }


 // Hook성공한 Device 포인터를 전역변수 KbdHookedDevice에 저장해놓는다.
 KbdHookedDevice = KbdHookDevice;


 KdPrint ( ( “Keyboard Hook Device Attach Success” ) );
 return TRUE;}

댓글 남기기