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¾È¿¡ ä¿ì±â À§Çؼ­ »ç¿ëµÈ ¸ÅÅ©·ÎÀÌ´Ù.