TDI_SET_EVENT_HANDLER
Ä¿³Î ¸ðµå Ŭ¶óÀÌ¾îÆ®°¡ TDI_SET_EVENT_HANDLER ¸®Äù½ºÆ®¸¦ ÇÒ ¶§ Ä¿³Î ¸ðµå Ŭ¶óÀÌ¾îÆ®´Â ´ëÀÀÇÏ´Â ³×Æ®¿÷ À̺¥Æ®°¡ ¹ß»ýÇÒ ¶§¸¶´Ù ÇϺÎÀÇ TDI Æ®·£½ºÆ÷Æ® µå¶óÀ̹ö¿¡°Ô ¸í½ÃµÈ ClientEventXxx ·çƾÀ» È£ÃâÇϵµ·ÏÇÑ´Ù.
IRP
IrpSp·Î½á ´ÙÀ½ÀÇ ¸®½ºÆ®¿¡ º¸¿©Áö´Â IRP¾È¿¡ ÀÚ½ÅÀÇ I/O ½ºÅà ·ÎÄÉÀ̼ǿ¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¾ò±â À§Çؼ ÁÖ¾îÁø Irp¸¦ °¡Áö°í Æ®·£½ºÆ÷Æ®´Â IoGetCurrentIrpStackLocation ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. IRP¿¡ ´ëÇÑ Æ÷ÀÎÅÍ´Â Irp·Î½á ´ÙÀ½ÀÇ ¸®½ºÆ®¿¡ º¸¿©Áø´Ù. ÀÌ ¸®Äù½ºÆ®¿Í ¿¬°üµÈ IRP ¸â¹ö´Â ´ÙÀ½°ú °°´Ù:
- Irp->IoStatus.Status
- ¼Â À̺¥Æ® Çڵ鷯 ¸®Äù½ºÆ®¿¡ ´ëÇÑ ¸¶Áö¸· »óŸ¦ ¼¼úÇÑ´Ù. Æ®·£½ºÆ÷Æ®´Â ´ÙÀ½Áß Çϳª·Î IRP¸¦ ¿Ï·áÇϱâ Àü¿¡ ÀÌ ¸â¹ö¸¦ ¼³Á¤ÇÑ´Ù:
STATUS_SUCCESS
STATUS_INVALID_ADDRESS_COMPONENT
STATUS_INVALID_PARAMETER
µ¥ÀÌŸ°¡ ÀÌ ¸®Äù½ºÆ®¿¡ ´ëÇØ¼´Â Àü¼ÛµÇÁö ¾Ê±â ¶§¹®¿¡ IoStatus.Information ¸â¹ö´Â 0ÀÌ´Ù.
- IrpSp->MajorFunction
- IRP_MJ_INTERNAL_DEVICE_CONTROLÀ» ¼¼úÇÑ´Ù. Æ®·£½ºÆ÷Æ®´Â TDI_XXX ¸®Äù½ºÆ®¸¸À» ´Ù·ç´Â TdiDispatchInternalDeviceControl ·çƾÀ» ÀͽºÆ÷Æ®ÇÑ´Ù¸é ÀÌ ¸â¹ö¸¦ ¹«½ÃÇÒ ¼ö ÀÖ´Ù.
- IrpSp->MinorFunction
- TDI_SET_EVENT_HANDLER¸¦ ¼¼úÇÑ´Ù.
- IrpSp->FileObject
- ·ÎÄà ÁÖ¼Ò¸¦ ±¸ÇöÇÏ´Â ¿¸° ÆÄÀÏ °´Ã¼¸¦ °¡¸®Å²´Ù. Æ®·£½ºÆ÷Æ®´Â ÀÌ ÁÖ¼Ò¿¡ ´ëÇØ¼ À¯ÁöÇÏ´Â »óŸ¦ Á¢±ÙÇϱâ À§Çؼ FsContext¿Í °¡´ÉÇÏ´Ù¸é FsContext2 Çʵ带 »ç¿ëÇÑ´Ù.
µî·ÏµÈ ClientEventXxx Çڵ鷯ÀÇ Å¸ÀÔ¿¡ ÀÇÁ¸ÇÏ¿© ÀÌ ÁּҴ Ŭ¶óÀÌ¾îÆ®¿¡ ÀÇÇØ¼ ¸¸µé¾îÁø ¼º¸³µÈ ¿£µåÆ÷ÀÎÆ® ´ë ¿£µåÆ÷ÀÎÆ® ¿¬°á°ú ¿¬°üµÉ ¼ö ÀÖ´Ù.
- IrpSp->Parameters
- ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǴ TDI_REQUEST_KERNEL_SET_EVENT ±¸Á¶Ã¼¸¦ °¡¸®Å²´Ù:
struct _TDI_REQUEST_KERNEL_SET_EVENT {
LONG EventType;
PVOID EventHandler;
PVOID EventContext;
} TDI_REQUEST_KERNEL_SET_EVENT, *PTDI_REQUEST_KERNEL_SET_EVENT;
Æ®·£½ºÆ÷Æ®´Â ´ÙÀ½°ú °°ÀÌ ÀÌ ±¸Á¶Ã¼ÀÇ ¸â¹ö¸¦ »ç¿ëÇÑ´Ù:
- EventType
- µî·ÏµÈ ClientEventXxx Çڵ鷯ÀÇ Å¸ÀÔÀ» ¼¼úÇÑ´Ù(ÁÖ¼®À» ºÁ¶ó).
- EventHandler
- ÀÌ Å¸ÀÔÀÇ À̺¥Æ®°¡ ¹ß»ýÇßÀ» ¶§ È£ÃâµÇ´Â ClientEventXxx ·çƾÀÇ ¿£Æ®¸® Æ÷ÀÎÆ®¸¦ ¼¼úÇÑ´Ù. Ŭ¶óÀÌ¾ðÆ®°¡ Àü¿¡ µî·ÏµÈ À̺¥Æ® Çڵ鷯¸¦ µî·ÏÇØÁ¦ÇÑ´Ù¸é ÀÌ ¸â¹ö´Â NULL¿¡ µÉ ¼ö ÀÖ´Ù.
- EventContext
- Æ®·£½ºÆ÷Æ®¿¡ ÀÇÇØ¼ ¾ðÀÎÅÍÇÁ¸®Æ®µÇ´Â ÁÖ¾îÁø ClientEventXxx ·çƾÀ¸·Î Àü´ÞµÇ´Â Æ÷ÀÎÅ͸¦ ¼¼úÇÑ´Ù. EventHandler°¡ NULLÀ̸é ÀÌ ¸â¹ö´Â NULLÀÌ´Ù.
ÁÖ¼®
Ŭ¶óÀÌ¾ðÆ®°¡ ÁÖ¼Ò¸¦ ±¸ÇöÇÏ´Â ÆÄÀÏ °´Ã¼¸¦ óÀ½ ¿¾úÀ» ¶§ TDI Æ®·£½ºÆ÷Æ®´Â Ŭ¶óÀÌ¾ðÆ®¸¦ À§Çؼ ±× ÁÖ¼Ò¿Í ¿¬°üµÈ ¸ðµç À̺¥Æ® Çڵ鷯¸¦ NULL·Î ÃʱâÈÇÑ´Ù.
¼øÂ÷ÀûÀ¸·Î Ŭ¶óÀÌ¾ðÆ®°¡ ÀÌ IRP¸¦ ¼³Á¤ÇÑ TdiBuildSetEventHandler ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§ Ŭ¶óÀÌ¾ðÆ®´Â µî·ÏµÇ´Â Çڵ鷯ÀÇ Å¸ÀÔÀ» ¼¼úÇÑ´Ù. Æ®·£½ºÆ÷Æ®´Â EventType ¸â¹ö¾È¿¡ IrpSp->Parameters¿¡¼ ÀÌ Á¤º¸¸¦ ã´Â´Ù. ÀԷ¿¡¼ EventTypeÀº ´ÙÀ½ÀÇ ½Ã½ºÅÛ Á¤ÀÇ °ªÁß¿¡ Çϳª°¡ µÉ ¼ö ÀÖ´Ù:
- TDI_EVENT_CONNECT
- ¿£µåÆ÷ÀÎÆ® ´ë ¿£µåÆ÷ÀÎÆ® ¿¬°áÀÌ ¿ø°ÝÁö¿¡ ÀÇÇØ¼ Á¦°øµÉ ¶§ È£ÃâµÇ´Â ClientEventConnect Çڵ鷯¸¦ µî·ÏÇØ¶ó.
- TDI_EVENT_DISCONNECT
- ¼º¸³µÈ ¿£µåÆ÷ÀÎÆ® ´ë ¿£µåÆ÷ÀÎÆ® ¿¬°áÀÌ ¿ø°ÝÁö¿¡ ÀÇÇØ¼ ´ÝÈú ¶§ È£ÃâµÇ´Â ClientEventDisconnect Çڵ鷯¸¦ µî·ÏÇØ¶ó.
- TDI_EVENT_RECEIVE
- Á¤»óÀûÀÌ ¸®½Ãºê°¡ ¿ø°ÝÁöÀÇ ¿£µåÆ÷ÀÎÆ® ´ë ¿£µåÆ÷ÀÎÆ® ¿¬°á»ó¿¡¼ ¿Ã ¶§ È£ÃâµÇ´Â ClientEventReceive Çڵ鷯¸¦ µî·ÏÇØ¶ó. ±×¸®°í Æ®·£½ºÆ÷Æ®´Â Ŭ¶óÀÌ¾ðÆ®¿¡°Ô Àüü ȤÀº ¹öÆÛÈµÈ TSDU¸¦ º¹»çÇÒ ±âȸ¸¦ ÁÙ °ÍÀÌ´Ù.
- TDI_EVENT_CHAINED_RECEIVE
- Á¤»óÀûÀÎ ¸®½Ãºê°¡ ¿ø°ÝÁöÀÇ ¿£µåÆ÷ÀÎÆ® ´ë ¿£µåÆ÷ÀÎÆ® ¿¬°á»ó¿¡¼ ¿Ã ¶§ È£ÃâµÇ´Â ClientEventChainedReceive Çڵ鷯¸¦ µî·ÏÇØ¶ó. ±×¸®°í Ŭ¶óÀÌ¾ðÆ®°¡ TsduDescriptor¸¦ °¡Áö°í TdiReturnChainedReceives ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§±îÁö ¹öÆÛÈµÈ Àüü TSDU·ÎÀÇ Àбâ Àü¿ëÁ¢±ÙÀ» ÁÙ ¼ö ÀÖ´Ù.
- TDI_EVENT_RECEIVE_EXPEDITED
- ½Å¼ÓÇÑ ¸®½Ãºê°¡ ¿ø°ÝÁöÀÇ ¿£µåÆ÷ÀÎÆ® ´ë ¿£µåÆ÷ÀÎÆ® ¿¬°á»ó¿¡¼ ¿Ã ¶§ È£ÃâµÇ´Â ClientEventReceiveExpedited Çڵ鷯¸¦ µî·ÏÇØ¶ó. ±×¸®°í Æ®·£½ºÆ÷Æ®´Â ÀÌ Å¬¶óÀÌ¾ðÆ®¿¡°Ô Àüü ȤÀº ºÎºÐÀÇ ¹öÆÛÈµÈ TSDU¸¦ º¹»çÇÒ ±âȸ¸¦ ÁØ´Ù.
- TDI_EVENT_CHAINED_RECEIVE_EXPEDITED
- ½Å¼ÓÇÑ ¸®½Ãºê°¡ ¿ø°ÝÁöÀÇ ¿£µåÆ÷ÀÎÆ® ´ë ¿£µåÆ÷ÀÎÆ® ¿¬°á»ó¿¡¼ ¿Ã ¶§ È£ÃâµÇ´Â ClientEventChainedReceiveExpedited Çڵ鷯¸¦ µî·ÏÇØ¶ó. ±×¸®°í Æ®·£½ºÆ÷Æ®´Â ÀÌ Å¬¶óÀÌ¾ðÆ®¿¡°Ô Ŭ¶óÀÌ¾ðÆ®°¡ TsduDescriptor¸¦ °¡Áö°í TdiReturnChainedReceives ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§±îÁö ¹öÆÛÈµÈ Àüü TSDU·ÎÀÇ ÀбâÀü¿ë Á¢±ÙÀ» ÁÙ ¼ö ÀÖ´Ù.
- TDI_EVENT_RECEIVE_DATAGRAM
- µ¥ÀÌŸ±×·¥ÀÌ ¿ø°ÝÁö¿¡¼ µé¾î¿Ã ¶§ È£ÃâµÇ´Â ClientEventReceive Çڵ鷯¸¦ µî·ÏÇØ¶ó. ±×¸®°í Æ®·£½ºÆ÷Æ®´Â ÀÌ Å¬¶óÀÌ¾ðÆ®¿¡°Ô Àüü ȤÀº ºÎºÐÀÇ ¹öÆÛÈµÈ TSDU¸¦ º¹»çÇÒ ±âȸ¸¦ ÁØ´Ù.
- TDI_EVENT_CHAINED_RECEIVE_DATAGRAM
- µ¥ÀÌŸ±×·¥ÀÌ ¿ø°ÝÁö¿¡¼ µé¾î¿Ã ¶§ È£ÃâµÇ´Â ClientEventChainedReceiveDatagram Çڵ鷯¸¦ µî·ÏÇØ¶ó. Æ®·£½ºÆ÷Æ®´Â Ŭ¶óÀÌ¾ðÆ®°¡ TsduDescriptor¸¦ °¡Áö°í TdiReturnChainedReceives ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§±îÁö ¹öÆÛÈµÈ Àüü TSDU·ÎÀÇ Àбâ Àü¿ë Á¢±ÙÀ» ÁØ´Ù.
- TDI_EVENT_SEND_POSSIBLE
- Àü¿¡ STATUS_DEVICE_NOT_READY¸¦ °¡Áö°í Á¦½ÃµÈ º¸³»±â ¸®Äù½ºÆ®¸¦ ¸®ÅÏÇÑ ÇϺÎÀÇ Æ®·£½ºÆ÷Æ®°¡ º¸³»Áö´Â ´Ù½Ã Á¦½ÃµÈ Ŭ¶óÀÌ¾ðÆ® Á¦°ø µ¥ÀÌŸ¸¦ º¹»çÇÒ ¼ö ÀÖ´Â À̿밡´ÉÇÑ ³»ºÎ¹öÆÛ°ø°£À» °¡Áú ¶§ È£ÃâµÇ´Â ClientEventSendPossible Çڵ鷯¸¦ µî·ÏÇØ¶ó.
- TDI_EVENT_ERROR
- ·ÎÄà ÁÖ¼Ò¿¡¼ÀÇ ³×Æ®¿÷ I/O°¡ ºñ½Å·ÚÀûÀ̰ųª ºÒ°¡´ÉÇÒ ¶§ Æ®·£½ºÆ÷Æ®³ª ÇϺÎÀÇ µå¶óÀ̹ö¿¡¼ ¿¡·¯°¡ ¹ß»ýÇÑ´Ù¸é È£ÃâµÇ´Â ClientEventError Çڵ鷯¸¦ µî·ÏÇØ¶ó.
- TDI_EVENT_ERROR_EX
- ·ÎÄà ÁÖ¼Ò¿¡¼ÀÇ ³×Æ®¿÷ I/O°¡ ºñ½Å·ÚÀûÀ̰ųª ºÒ°¡´ÉÇÒ ¶§ Æ®·£½ºÆ÷Æ®³ª ÇϺÎÀÇ µå¶óÀ̹ö¿¡¼ ¿¡·¯°¡ ¹ß»ýÇÑ´Ù¸é È£ÃâµÇ´Â ClientEventError Çڵ鷯¸¦ µî·ÏÇØ¶ó.
¾Õ¿¡ ¼¼úµÈ ½Ã½ºÅÛ Á¤ÀÇ À̺¥Æ®¿¡ Ãß°¡ÇÏ¿© Æ®·£½ºÆ÷Æ®´Â µå¶óÀ̹ö °³¹ßÀÚÀÇ °áÁ¤¿¡¼ ÀÌ ÀÎÅÍÆäÀ̽º¸¦ Æ®·£½ºÆ÷Æ® ƯÁ¤ À̺¥Æ® Å뺸¸¦ Áö¿øÇϱâ À§Çؼ Ä¿³Î ¸ðµå Ŭ¶óÀÌ¾ðÆ®·Î È®ÀåÇÒ ¼ö ÀÖ´Ù. ±×·¯ÇÑ Æ®·£½ºÆ÷Æ®´Â °¡Àå Áß¿äÇÑ ºñÆ®¸¦ ¼³Á¤ÇÑ TDI_EVENT_XXX Äڵ带 Á¤ÀÇÇØ¾ßÇÑ´Ù.
TDI Æ®·£½ºÆ÷Æ®´Â °°Àº Á¾·ùÀÇ Æ®·£½ºÆ÷Æ®°¡ ÁøÇàÁßÀÎ µ¿¾È¿¡ Ŭ¶óÀÌ¾ðÆ®·Î À̺¥Æ®¸¦ ÀεðÄÉÀÌÆ®ÇÒ ¼ö ÀÖ´Ù. ´Ù½Ã¸»Çϸé ClientEventXxx Çڵ鷯´Â ÀçÈ£ÃâµÈ´Ù.
Æ®·£½ºÆ÷Æ®´Â Ŭ¶óÀÌ¾ðÆ®¿¡°Ô ¿£Æ®¸® Æ÷ÀÎÆ®¸¦ Á¦°øÇÑ ¼Â À̺¥Æ® Çڵ鷯 IRP¸¦ ¿Ï·áÇϱâ Àü¿¡ ¿ø°ÝÁö·ÎºÎÅÍ µ¥ÀÌŸ¸¦ ¹Þ°í ÀÖ´Ù¸é TDI Æ®·£½ºÆ÷Æ®´Â Ŭ¶óÀÌ¾ðÆ® Á¦°ø ClientEvent(Chained)ReceiveXxx Çڵ鷯¸¦ Áï½Ã È£ÃâÇÒ ¼ö ÀÖ´Ù.
ÀϹÝÀûÀ¸·Î Æ®·£½ºÆ÷Æ® ½ºÅÃÀÇ ¹Ø¿¡¼ ProtocolReceivePacket ÇÔ¼ö°¡ ¸®½Ãºê ÀεðÄÉÀ̼ÇÀ» °¡Áö°í È£ÃâµÉ ¶§ Æ®·£½ºÆ÷Æ®´Â ClientEventChainedReceiveXxx Çڵ鷯¸¦ È£ÃâÇÑ´Ù. ProtocolReceivePacket ÇÔ¼ö·ÎÀÇ È£ÃâÀº ÆÐŶ µð½ºÅ©¸³ÅͰ¡ ÇϺΠNDIS ¹Ì´ÏÆ÷Æ®·Î ¸®Å쵃 ¶§±îÁö ÀÔ·Â NDIS_PACKET ŸÀÔÀÇ µð½ºÅ©¸³ÅÍ¿¡ ÀÇÇØ¼ ¼¼úµÈ ÀεðÄÉÀ̼ÇÀ» À§Çؼ ÇϺÎÀÇ NDIS ¹Ì´ÏÆ÷Æ®°¡ ¸ðµç ÀÚ¿øÀÇ ¼ÒÀ¯±ÇÀ» ÀÓ½ÃÀûÀ¸·Î ¾çµµÇÑ´Ù´Â °ÍÀ» ¾Ï½ÃÇÑ´Ù.
Æ®·£½ºÆ÷Æ®´Â Àü¿¡ TDI_RECEIVE¿¡¼ ¼¼úÇßµå½Ã Ŭ¶óÀ̾ðÆ®ÀÇ ClientEventChainedReceiveXxx Çڵ鷯·Î ÀԷµǴ TsduDescriptor·Î½á NDIS_PACKET ŸÀÔÀÇ µð½ºÅ©¸³Å͸¦ Àü´ÞÇÏ¹Ç·Î½á ±×·¯ÇÑ ÀεðÄÉÀ̼ÇÀ» ¼³Á¤ÇؾßÇÑ´Ù. Ŭ¶óÀ̾ðÆ®ÀÇ TdiReturnChainedReceives ÇÔ¼ö·ÎÀÇ ¼øÂ÷ÀûÀΠȣÃâÀº ¸ðµç Ŭ¶óÀÌ¾ðÆ®°¡ ¸®½ÃºêµÈ µ¥ÀÌŸ¸¦ ¼ÒºñÇßÀ» ¶§ Æ®·£½ºÆ÷Æ® ÇϺο¡ ÀÖ´Â ÀεðÄÉÀÌÆ®ÇÏ´Â ¹Ì´ÏÆ÷Æ®·Î ÀÌ ÀÚ¿øÀ» ¸®ÅÏÇÏ´Â NDIS¿¡¼ Á÷Á¢ ¼¼úµÇ´Â TsduDescriptor¿Í ¸ðµç ÀÚ¿øÀ» ¸®ÅÏÇÑ´Ù.
¹Ý¸é¿¡ Æ®·£½ºÆ÷Æ®ÀÇ ProtocolReceive ÇÔ¼ö°¡ ¸®½Ãºê ÀεðÄÉÀ̼ÇÀ» °¡Áö°í È£ÃâµÉ ¶§ ClientEventReceiveXxx Çڵ鷯¸¦ È£ÃâÇÑ´Ù. ProtocolReceive ÇÔ¼ö·ÎÀÇ È£ÃâÀº ÇϺÎÀÇ NDIS µå¶óÀ̹ö°¡ ¸ðµç »óÀ§ ·¹º§ ³×Æ®¿÷ ÄÄÆ÷³ÍÆ®°¡ ÀεðÄÉÀÌÆ®µÈ µ¥ÀÌŸ¸¦ º¹»çÇϵµ·Ï ±â´ëÇϰí ÇÏÀ§ µå¶óÀ̹ö°¡ ¸®½Ãºê ÀεðÄÉÀ̼ÇÀ» Çϱâ À§Çؼ »ç¿ëÇÏ´Â ÀÚ¿øÀÇ ÅëÁ¦¸¦ ´Ù½Ã ¾ò±â À§Çؼ °¡´ÉÇÑ ÇÑ »¡¸® ¸®ÅÏÇÑ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù.
Ŭ¶óÀÌ¾ðÆ®´Â EventHandler¿Í EventContext°¡ NULLÀÌÁö¸¸ EventType ¸â¹ö¿¡°¡ Çڵ鷯ÀÇ Å¸ÀÔÀ» ¼¼úÇÑ ¼øÂ÷ÀûÀÎ TDI_SET_EVENT_HANDLER ¸®Äù½ºÆ®¸¦ ÇϹǷνá ÀÌ¹Ì µî·ÏµÈ À̺¥Æ® Çڵ鷯¸¦ µð½º¿¡À̺íÇÒ ¼ö ÀÖ´Ù.
TdiBuildSetEventHandler ÇÔ¼ö´Â Ŭ¶óÀÌ¾ðÆ®°¡ IRP¾È¿¡ ä¿ì±â À§Çؼ »ç¿ëµÈ ¸ÅÅ©·ÎÀÌ´Ù.
|