|
¿ì¸®´Â ƯÁ¤ ¸ñÀû¿¡ ÀÇÇØ¼ Filter Driver¸¦ ÅëÇØ¼ ¿À°í °¡´Â µ¥ÀÌÅ͸¦ ÇÊÅ͸µÀ» ÇÕ´Ï´Ù.
ÀÌ Filter DriverÀÇ ¿ªÇÒÀº ¸ñÀû¿¡ µû¶ó¼ Upper Filter Driver, Lower Filter Driver·Î
³ª´µ°Ô
µÇ´Âµ¥ ÀÌ ºÎºÐ¿¡ ´ëÇØ¼´Â ±ÛÀÇ ¸ñÀû°ú °ü·ÃÀÌ ¾øÀ¸¹Ç·Î »ý·«À» ÇÕ´Ï´Ù.
Áö±ÝºÎÅÍ ¼Ò°³ÇÒ·Á°í ÇÏ´Â °ÍÀº ÀÌ Filter Driver¿Í Åë½ÅÇϱâ ÀÔ´Ï´Ù.
¿ì¸®°¡ À¯¿ëÇÏ°Ô »ç¿ëÇϰí ÀÖ´Â Filter Driver¿Í Åë½ÅÀ» Çϱâ À§Çؼ´Â º°µµÀÇ Åë½ÅÀ» ´ã´ç
ÇÏ°Ô µÇ´Â Device Object¸¦ »ý¼ºÇØ¾ß ÇÕ´Ï´Ù. ±×·¡¼ ÀÌ Åë½Å¿ë Device Object¸¦ ÅëÇØ¼
Filter Driver¿Í Åë½ÅÀ» ÇÏ°Ô µË´Ï´Ù.
ÀϹÝÀûÀÎ Filter DriverÀÇ ±¸Á¶¸¦ º¸¸é, º¸Åë ±×³É ¾Æ·¡·Î ¸ðµç IRP¸¦ Èê·Á º¸³À´Ï´Ù.
¿ì¸®°¡ Åë½Å¿ë Device Object¸¦ ¸¸µå´Â ½ÃÁ¡Àº ÀϹÝÀûÀ¸·Î "IRP_MN_START_DEVICE" Minor Function
Code°¡ ³»·Á¿Ã ¶§,
ÇØ´ç IRP µî·ÏÇÑ ¿Ï·á ·çƾÀÌ È£ÃâµÇ´Â ½ÃÁ¡¿¡ Åë½Å¿ë Device Object¸¦ »ý¼ºÇÕ´Ï´Ù.
[ Sample Code ]
switch (irpStack->MinorFunction)
{ case IRP_MN_START_DEVICE:
IoCopyCurrentIrpStackLocationToNext(Irp);
IoSetCompletionRoutine(Irp,
(PIO_COMPLETION_ROUTINE) CompletionRoutine,
NULL, TRUE,
TRUE, TRUE); return
IoCallDriver(deviceExtension->NextLowerDriver, Irp);
}
NTSTATUS CompletionRoutine( IN
PDEVICE_OBJECT DeviceObject,
IN PIRP
Irp, IN
PVOID Context )
{
....... »ý ·« .......
// Åë½Å¿ë Device
Object »ý¼º.
status = IoCreateDevice(
DeviceObject->DriverObject,
sizeof(CONTROL_DEVICE_EXTENSION),
&ntDeviceName,
FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN, FALSE,
&ControlDeviceObject); // Åë½Å¿ë Device Object
....... »ý ·« .......
}
¿ì¸®´Â ÀÌÁ¦ Filter Driver¿Í Åë½ÅÀº ControlDeviceObject ¸¦
ÅëÇØ¼ ÇÒ ¼ö ÀÖ½À´Ï´Ù.
¿©±â¼ ÇÑ °¡Áö ÁÖÀÇÇÒ Á¡Àº, ControlDeviceObject¸¦ ÅëÇØ¼ Åë½ÅÀ» ÇÒ ¶§ ¿ø·¡
Filter Driver
ÀÇ Device Object¿Í ControlDeviceObject¸¦ ±¸ºÐÇØ¼ 󸮸¦ ÇØ ÁÖ¾î¾ß
ÇÕ´Ï´Ù.
¿¹¸¦ µé¸é, IOCTL¸¦ ÀÌ¿ëÇØ¼ Filter Driver¸¦ Åë½ÅÀ» ÇϰíÀÚ ÇÒ ¶§, ¾Æ·¡¿Í °°ÀÌ Ã³¸®¸¦
ÇØ ÁÖ¾î¾ß ÇÕ´Ï´Ù.
[ Sample Code ]
// ÇöÀç Device Object°¡ ControlDeviceObject°¡
¾Æ´Ï¸é, ¾Æ·¡·Î PassÇÔ.
if(DeviceObject != ControlDeviceObject)
{ return FilterPass(DeviceObject,
Irp); }
....... »ý ·« .......
// ÇöÀç Deviceobject°¡
ControlDeviceObject¶ó¸é..
// ÇØ´ç µ¿ÀÛ Ã³¸® ÈÄ, ÇØ´ç IRP ¿Ï·á ½ÃÅ´.
|