음… 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;}
댓글 남기기