TdiBuildSetEventHandler

VOID
   TdiBuildSetEventHandler (
       IN PIRP Irp,
       IN PDEVICE_OBJECT DevObj,
       IN PFILE_OBJECT FileObj,
       IN PVOID CompRoutine,
       IN PVOID Contxt,
       IN LONG InEventType,
       IN PVOID InEventHandler,
       IN PVOID InEventContext
  
   );

TdiBuildSetEventHandler ÇÔ¼ö´Â ·ÎÄÃÀÇ Å¬¶óÀÌ¾ðÆ®°¡ ÁÖ¼Ò¸¦ ±¸ÇöÇÏ´Â ÆÄÀÏ °´Ã¼¸¦ ÀÌ¹Ì ¿¬ ÇϺÎÀÇ Æ®·£½ºÆ÷Æ®·Î TDI_SET_EVENT_HANDLER ¸®Äù½ºÆ®¸¦ À§Çؼ­ ³»ºÎÀÇ ÀåÄ¡ ÅëÁ¦ IRP¸¦ ¼³Á¤ÇÑ´Ù.

¸Å°³º¯¼ö

Irp
´õ »óÀ§ ·¹º§ ³×Æ®¿÷ ÄÄÆ÷³ÍÆ®¿¡¼­ ¹ß»ýÇϰųª TdiBuildInternalDeviceControlIrp ÇÔ¼ö¸¦ °¡Áö°í ÇÒ´çµÈ Ŭ¶óÀÌ¾ðÆ® Á¦°ø IRP¸¦ °¡¸®Å²´Ù.

DevObj
ÇϺÎÀÇ TDI Æ®·£½ºÆ÷Æ® µå¶óÀ̹ö¿¡ ÀÇÇØ¼­ »ý¼ºµÈ ÀåÄ¡ °´Ã¼¸¦ °¡¸®Å²´Ù.

FileObj
ÁÖ¼Ò¸¦ ±¸ÇöÇÏ´Â ÆÄÀÏ °´Ã¼¸¦ °¡¸®Å²´Ù.

CompRoutine
Ŭ¶óÀÌ¾ðÆ® Á¦°ø IoCompletion ·çƾÀÇ ¿£Æ®¸® Æ÷ÀÎÆ®¸¦ ¼­¼úÇϰųª NULLÀÌ´Ù. Ŭ¶óÀÌ¾ðÆ®°¡ ÀÌ ¸Å°³º¯¼ö¸¦ NULL·Î ¼³Á¤ÇÏÁö ¾Ê´Â´Ù¸é ÁÖ¾îÁø IRP°¡ ¿Ï·áµÉ ¶§ I/O ¸Å´ÏÀú´Â ÀÌ ·çƾÀ» È£ÃâÇÑ´Ù.

Contxt
Ŭ¶óÀÌ¾ðÆ® °áÁ¤ ÄÁÅØ½ºÆ®¸¦ °¡¸®Å²´Ù. ÀÌ Å¬¶óÀÌ¾ðÆ® Á¦°ø Æ÷ÀÎÅÍ´Â ¿Ï·áµÈ IRP¸¦ °¡Áö°í È£ÃâµÉ ¶§ IoCompletion ·çƾÀ¸·Î Àü´ÞµÈ´Ù. CompRoutineÀÌ NULLÀ̸é Contxt´Â NULLÀÌ´Ù.

InEventType
´ÙÀ½Áß Çϳª·Î½á µî·ÏµÇ´Â À̺¥Æ® Çڵ鷯ÀÇ Å¸ÀÔÀ» ¼­¼úÇÑ´Ù:

TDI_EVENT_CONNECT
¿ø°ÝÁö¿¡ ÀÇÇØ¼­ ¿£µåÆ÷ÀÎÆ® ´ë ¿£µåÆ÷ÀÎÆ® ¿¬°áÀÌ Á¦°øµÆÀ» ¶§ È£ÃâµÇ´Â ÁÖ¾îÁø ClientEventConnect Çڵ鷯¸¦ µî·ÏÇÑ´Ù.

TDI_EVENT_DISCONNECT
¿ø°ÝÁö¿¡ ÀÇÇØ¼­ ¼º¸³µÈ ¿£µåÆ÷ÀÎÆ® ´ë ¿£µåÆ÷ÀÎÆ® ¿¬°áÀÌ ´ÝÈú ¶§ È£ÃâµÇ´Â ÁÖ¾îÁø ClientEventDisconnect Çڵ鷯¸¦ µî·ÏÇÑ´Ù.

TDI_EVENT_RECEIVE
Á¤»óÀûÀÎ ¸®½Ãºê°¡ ¿ø°ÝÁö·ÎºÎÅÍ ¿£µåÆ÷ÀÎÆ® ´ë ¿£µåÆ÷ÀÎÆ® ¿¬°á·Î µé¾î¿Ã ¶§ È£ÃâµÇ´Â ÁÖ¾îÁø ClientEventReceive Çڵ鷯¸¦ µî·ÏÇϰí Ŭ¶óÀÌ¾ðÆ®´Â ¹öÆÛÈ­µÈ TSDUÀÇ ÀϺΠȤÀº ÀüºÎ¸¦ º¹»çÇÒ ±âȸ¸¦ ¾ò´Â´Ù.

TDI_EVENT_CHAINED_RECEIVE
Á¤»óÀûÀÎ ¸®½Ãºê°¡ ¿ø°ÝÁö·ÎºÎÅÍ ¿£µåÆ÷ÀÎÆ® ´ë ¿£µåÆ÷ÀÎÆ® ¿¬°á·Î µé¾î¿Ã ¶§ È£ÃâµÇ´Â ÁÖ¾îÁø ClientEventChainedReceive Çڵ鷯¸¦ µî·ÏÇϰí Ŭ¶óÀÌ¾ðÆ®´Â TdiReturnChainedReceives ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§±îÁö ¹öÆÛÈ­µÈ Àüü TSDU¿¡ ´ëÇØ¼­ Àбâ Àü¿ë Á¢±Ù¸¸À» ¾ò´Â´Ù.

TDI_EVENT_RECEIVE_EXPEDITED
½Å¼ÓÇÑ ¸®½Ãºê°¡ ¿ø°ÝÁö·ÎºÎÅÍ ¿£µåÆ÷ÀÎÆ® ´ë ¿£µåÆ÷ÀÎÆ® ¿¬°á·Î µé¾î¿Ã ¶§ È£ÃâµÇ´Â ÁÖ¾îÁø ClientEventReceiveExpedited Çڵ鷯¸¦ µî·ÏÇϰí Ŭ¶óÀÌ¾ðÆ®´Â ¹öÆÛÈ­µÈ TSDUÀÇ ÀϺΠȤÀº ÀüºÎ¸¦ º¹»çÇÒ ±âȸ¸¦ ¾ò´Â´Ù.

TDI_EVENT_CHAINED_RECEIVE_EXPEDITED
½Å¼ÓÇÑ ¸®½Ãºê°¡ ¿ø°ÝÁö·ÎºÎÅÍ ¿£µåÆ÷ÀÎÆ® ´ë ¿£µåÆ÷ÀÎÆ® ¿¬°á·Î µé¾î¿Ã ¶§ È£ÃâµÇ´Â ÁÖ¾îÁø ClientEventChainedReceiveExpedited Çڵ鷯¸¦ µî·ÏÇϰí Ŭ¶óÀÌ¾ðÆ®´Â TdiReturnChainedReceives ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§±îÁö ¹öÆÛÈ­µÈ Àüü TSDU·ÎÀÇ ÀбâÀü¿ë Á¢±Ù¸¸À» ¾ò´Â´Ù.

TDI_EVENT_RECEIVE_DATAGRAM
¿ø°ÝÁö·ÎºÎÅÍ µ¥ÀÌŸ±×·¥ÀÌ µé¾î¿Ã ‹š È£ÃâµÇ´Â ÁÖ¾îÁø ClientEventReceiveDatagram Çڵ鷯¸¦ µî·ÏÇϰí Ŭ¶óÀÌ¾ðÆ®´Â ¹öÆÛÈ­µÈ TSDUÀÇ ÀϺΠȤÀº ÀüºÎ¸¦ º¹»çÇÒ ±âȸ¸¦ ¾ò´Â´Ù.

TDI_EVENT_CHAINED_RECEIVE_DATAGRAM
¿ø°ÝÁö·ÎºÎÅÍ µ¥ÀÌŸ±×·¥ÀÌ µé¾î¿Ã ‹š È£ÃâµÇ´Â ÁÖ¾îÁø ClientEventChainedReceiveDatagram Çڵ鷯¸¦ µî·ÏÇϰí Ŭ¶óÀÌ¾ðÆ®´Â TdiReturnChainedReceives ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§±îÁö ¹öÆÛÈ­µÈ Àüü TSDU·ÎÀÇ ÀбâÀü¿ë Á¢±ÙÀ» ¾ò´Â´Ù.

TDI_EVENT_SEND_POSSIBLE
Àü¿¡ STATUS_DEVICE_NOT_READY¸¦ °¡Áö°í Á¦½ÃµÈ º¸³»±â ¸®Äù½ºÆ®¸¦ ¸®ÅÏÇÑ ÇϺÎÀÇ Æ®·£½ºÆ÷Æ®°¡ ´Ù½Ã Á¦½ÃµÈ Ŭ¶óÀÌ¾ðÆ® Á¦°ø µ¥ÀÌŸ¸¦ º¹»çÇÒ ¼ö ÀÖ´Â ³»ºÎÀÇ ¹öÆÛ°ø°£À» ´Ù½Ã °¡Áú ¶§ È£ÃâµÇ´Â ÁÖ¾îÁø ClientEventSendPossible Çڵ鷯¸¦ µî·ÏÇÑ´Ù.

TDI_EVENT_ERROR
ÀÌ ·ÎÄà ÁÖ¼Ò¿¡¼­ ³×Æ®¿÷ I/O°¡ ºñ½Å¿ëÀûÀÎ ÇϺÎÀÇ µå¶óÀ̹ö¿¡¼­ ¿¡·¯°¡ ¹ß»ýÇÑ´Ù¸é È£ÃâµÇ´Â ÁÖ¾îÁø ClientEventError Çڵ鷯¸¦ µî·ÏÇÑ´Ù.

TDI_EVENT_ERROR_EX
ÀÌ ·ÎÄà ÁÖ¼Ò¿¡¼­ ³×Æ®¿÷ I/O°¡ ºñ½Å¿ëÀûÀÎ ÇϺÎÀÇ µå¶óÀ̹ö¿¡¼­ ¿¡·¯°¡ ¹ß»ýÇÑ´Ù¸é È£ÃâµÇ´Â ÁÖ¾îÁø ClientEventErrorEx Çڵ鷯¸¦ µî·ÏÇÑ´Ù. ÇϺÎÀÇ µå¶óÀ̹ö°¡ ÀÌ ÀεðÄÉÀ̼ÇÀ» Áö¿øÇÑ´Ù¸é ClientEventError º¸´Ù´Â ClientEventErrorEx ÇÔ¼ö·Î ±×·¯ÇÑ ¿¡·¯¿¡ ´ëÇØ¼­ ¹öÆÛÈ­µÈ Ãß°¡Á¤º¸¸¦ Á¦°øÇÑ´Ù.

¾Õ¼± ½Ã½ºÅÛ Á¤ÀÇ À̺¥Æ®¿¡ Ãß°¡ÇÏ¿© Æ®·£½ºÆ÷Æ®´Â Ŭ¶óÀÌ¾ðÆ®·Î À̺¥Æ®ÀÇ Æ®·£½ºÆ÷Æ® ƯÁ¤ Å뺸¸¦ Áö¿øÇϱâ À§Çؼ­ ÀÌ ÀÎÅÍÆäÀ̽º¸¦ ¿¬ÀåÇÑ´Ù. ±×·¯ÇÑ Æ®·£½ºÆ÷Æ®´Â °¡Àå Áß¿äÇÑ ºñÆ®°¡ ¼³Á¤µÈ TDI_EVENT_XXX Äڵ带 Á¤ÀÇÇØ¾ßÇÑ´Ù.

InEventHandler
µî·ÏµÇ´Â ClientEventXxx Çڵ鷯ÀÇ ¿£Æ®¸® Æ÷ÀÎÆ®¸¦ ¼­¼úÇÑ´Ù. Ŭ¶óÀÌ¾ðÆ®´Â Àü¿¡ µî·ÏµÈ À̺¥Æ® Çڵ鷯·ÎÀÇ Å뺸¸¦ µð½º¿¡À̺íÇϱâ À§Çؼ­ ÀÌ ¸Å°³º¯¼ö¸¦ NULL·Î ¼³Á¤ÇÒ ¼ö ÀÖ´Ù.

InEventContext
Æ®·£½ºÆ÷Æ®¿¡ ÀÇÇØ¼­ È£ÃâµÆÀ» ¶§ ClientEventXxx ·çƾÀ¸·Î Àü´ÞµÇ´Â È£ÃâÀÚ °áÁ¤ ÄÁÅØ½ºÆ®¸¦ °¡¸®Å²´Ù. InEventHandler°¡ NULLÀ̸é ÀÌ ¸Å°³º¯¼ö´Â NULLÀ̾î¾ßÇÑ´Ù.

ÁÖ¼®

Ŭ¶óÀÌ¾ðÆ®°¡ ÁÖ¼Ò¸¦ ±¸ÇöÇÏ´Â ÆÄÀÏ °´Ã¼¸¦ óÀ½ ¿­¾úÀ» ¶§ ÇϺÎÀÇ Æ®·£½ºÆ÷Æ®´Â ¸ðµç À̺¥Æ® Çڵ鷯¸¦ NULL·Î ÃʱâÈ­ÇÑ´Ù.

TdiBuildSetEventHandler ÇÔ¼ö´Â ÁÖ¾îÁø IRPÀÇ Æ®·£½ºÆ÷Æ® I/O ½ºÅà ·ÎÄÉÀ̼Ǿȿ¡ MajorFunction·Î½á IRP_MJ_INTERNAL_DEVICE_CONTROLÀ» ¼³Á¤Çϰí MinorFunction·Î½á TDI_SET_EVENT_HANDLER¸¦ ¼³Á¤ÇÑ´Ù.

TdiBuildSetEventHandler ÇÔ¼ö¿¡ ÀÇÇØ¼­ ¼³Á¤µÇ°í IoCallDriver ÇÔ¼ö¸¦ °¡Áö°í ÇϺÎÀÇ Æ®·£½ºÆ÷Æ®·Î Á¦½ÃµÈ °¢°¢ÀÇ IRP¸¦ °¡Áö°í Ŭ¶óÀÌ¾ðÆ®´Â Æ¯Á¤ Æ®·¡½ºÆ÷Æ® ÁÖ¼Ò»ó¿¡¼­ ¹ß»ýÇÒ ¼ö ÀÖ´Â ÁÖ¾îÁø À̺¥Æ® ŸÀÔÀ» À§Çؼ­ ÇϳªÀÇ À̺¥Æ® Çڵ鷯¸¦ µî·ÏÇÑ´Ù. Æ®·£½ºÆ÷Æ®¿¡ ÀÇÇØ¼­ ClientEventXxx ·çƾÀ¸·Î Àü´ÞµÇ´Â ´õ ÇÏÀ§ ·¹º§ÀÇ NDIS µå¶óÀ̹ö·ÎºÎÅÍÀÇ ÀεðÄÉÀ̼ÇÀº º¸Åë IRQL DISPATCH_LEVEL¿¡¼­ ¹ß»ýÇÑ´Ù. ÀÌ Å¬¶óÀÌ¾ðÆ® Á¦°ø À̺¥Æ® Çڵ鷯¸¦ À§Çؼ­ È£ÃâÀÚ´Â ºñÆäÀÌÁöÈ­µÈ Ç®·ÎºÎÅÍ InEventContext¿¡ °ø°£À» ÇÒ´çÇØ¾ßÇÑ´Ù.

Ŭ¶óÀÌ¾ðÆ®´Â ZwCreateFile ÇÔ¼ö·ÎÀÇ ¼º°øÀûÀΠȣÃâÀ» °¡Áö°í ÁÖ¼Ò¸¦ ±¸ÇöÇÏ´Â ÆÄÀÏ °´Ã¼¸¦ ¿­ÀÚ¸¶ÀÚ ClientEvent(Chained)ReceiveDatagram°ú ClientEventError(Ex) Çڵ鷯¸¦ µî·ÏÇÒ ¼ö ÀÖ´Ù. ÁÖ¼Ò¿Í ¿¬°á ¿£µåÆ÷ÀÎÆ®¸¦ ±¸ÇöÇÏ´Â ÆÄÀÏ °´Ã¼¸¦ ¿­°í ÇϺÎÀÇ Æ®·£½ºÆ÷Æ®·Î ÁÖ¼Ò¸¦ ¿¬°ü½ÃŰ´Â ¸®Äù½ºÆ®¸¦ ¼º°øÇÏÀÚ¸¶ÀÚ Å¬¶óÀÌ¾ðÆ®´Â ClientEventConnect Çڵ鷯¸¦ µî·ÏÇÒ ¼ö ÀÖ´Ù.

¸î¸î InEventType °ª¿¡ ´ëÇØ¼­ ÁÖ¾îÁø ÆÄÀÏ °´Ã¼¿¡ ÀÇÇØ¼­ ±¸ÇöµÈ ÁּҴ Ŭ¶óÀÌ¾ðÆ®°¡ ClientEventXxx Çڵ鷯¸¦ µî·ÏÇϱâ Àü¿¡ Ŭ¶óÀÌ¾ðÆ®¿¡ ÀÇÇØ¼­ ¿¬°á ¿£µåÆ÷ÀÎÆ®¿Í ¿¬°üµÇ¾î¾ßÇÑ´Ù. ƯÈ÷ Ŭ¶óÀÌ¾ðÆ®´Â ¿¬°á ƯÁ¤ ±âº»¿¡¼­ ¸¸µé¾îÁø ³×Æ®¿÷ Àü¼ÛÀ» À§Çؼ­ ClientEvent(Chained)Receive(Expedited), ClientEventDisconnect, ±×¸®°í ClientEventSendPossible Çڵ鷯¸¦ µî·ÏÇϱâ Àü¿¡ ·ÎÄà ÁÖ¼Ò¸¦ °¡Áö°í ¿¬°á ¿£µåÆ÷ÀÎÆ®¸¦ ¿¬°ü½ÃÄѾßÇÑ´Ù. Æ®·£½ºÆ÷Æ®°¡ Áö¿¬µÈ ¿¬°á ½ÂÀÎÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù¸é Ŭ¶óÀÌ¾ðÆ®´Â À̺¥Æ® Çڵ鷯¸¦ µî·ÏÇÏ´Â À̺¥Æ® Çڵ鷯 ¼³Á¤ ¸®Äù½ºÆ®¸¦ ÇÒ ¶§ ÁÖ¼Ò¸¦ ±¸ÇöÇÏ´Â ¿­¸° ÆÄÀÏ °´Ã¼¿Í ÀÌ¹Ì ¿¬°üµÈ ¿£µåÆ÷ÀÎÆ® ´ë ¿£µåÆ÷ÀÎÆ® ¿¬°áÀÌ È°¼ºÈ­µÆ´Ù°í °¡Á¤ÇÑ´Ù.

³»ºÎÀûÀ¸·Î º¸³»±â µ¥ÀÌŸ¸¦ ¹öÆÛÈ­ÇÑ Æ®·£½ºÆ÷Æ®ÀÇ Å¬¶óÀÌ¾ðÆ®¸¸ÀÌ ClientEventSendPossible Çڵ鷯¸¦ µî·ÏÇÒ ¼ö ÀÖ´Ù.

ÀϹÝÀûÀ¸·Î TDI Æ®·£½ºÆ÷Æ®´Â °°Àº Á¾·ùÀÇ À̺¥Æ®°¡ ÁøÇàÁßÀÎ µ¿¾È¿¡ Ŭ¶óÀÌ¾ðÆ®·Î À̺¥Æ®¸¦ ÀεðÄÉÀÌÆ®ÇÒ ¼ö ÀÖ´Ù. ´Ù½Ã¸»Çϸé ClientEventXxx Çڵ鷯´Â ´Ù½Ã ½ÇÇàÇÑ´Ù. ¶ÇÇÑ ÀÌ ·çƾÁß¿¡ Çϳª¸¦ µî·ÏÇϴ Ŭ¶óÀ̾ðÆ®ÀÇ À̺¥Æ® Çڵ鷯 ¼³Á¤ IRP°¡ ¿Ï·áµÇ±â Àü¿¡ Æ®·£½ºÆ÷Æ®´Â ClientEvent(Chained)Receive(Expedited) ȤÀºClientEvent(Chained)Receive(Datagram) ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù. °á±¹ Ŭ¶óÀÌ¾ðÆ®´Â ClientEvent(Chained)Receive(Xxx) Çڵ鷯ÀÇ µî·ÏÀ» ¸®Äù½ºÆ®ÇÏÀÚ¸¶ÀÚ ¸®½ÃºêÀÇ Ã³¸®¸¦ ÁغñÇØ¾ßÇÑ´Ù.

Ŭ¶óÀÌ¾ðÆ®°¡ ÇϺÎÀÇ Æ®·£½ºÆ÷Æ®·Î TdiBuildReceive ȤÀº TdiBuildReceiveDatagram ÇÔ¼ö¸¦ °¡Áö°í ¼³Á¤µÈ ¸®½Ãºê ȤÀº ¸®½Ãºê µ¥ÀÌŸ±×·¥ IRP¸¦ Á¦½ÃÇÒ ¶§¸¶´Ù µî·ÏµÈ ClientEvent(Chained)Receive(Xxx) Çڵ鷯·ÎÀÇ È£ÃâÀº µð½º¿¡À̺íµÈ´Ù. ÇϺÎÀÇ Æ®·£½ºÆ÷Æ®°¡ ±×·¯ÇÑ IRP¸¦ °¡Áö°í È£ÃâµÈ ÈÄ¿¡ ÇϺÎÀÇ Æ®·£½ºÆ÷Æ®´Â µé¾î¿À´Â ¸®½Ãºê ÀεðÄÉÀ̼ÇÀ» °¡Áö°í µî·ÏµÈ ClientEvent(Chained)Receive(Xxx) ·çƾÀÇ È£ÃâÀ» ´Ù½Ã ½ÃÀÛÇϱâ Àü¿¡ ±× IRP¸¦ ¿Ï·áÇϱâ À§Çؼ­ ÇÊ¿äÇÑ ¸ðµç ¿¬»êÀ» ¼öÇàÇÑ´Ù.

°°Àº InEventTypeÀ» °¡Áö°í ¶Ç´Ù¸¥ À̺¥Æ® Çڵ鷯 ¼³Á¤ ¸®Äù½ºÆ®¸¦ ÇϹǷνá Ŭ¶óÀÌ¾ðÆ®´Â µî·ÏµÈ À̺¥Æ® Çڵ鷯¸¦ µð½º¿¡À̺íÇÒ ¼ö ÀÖ´Ù. ÇÏÁö¸¸ TdiBuildSetEventHandler Çڵ鷯ÀÇ InEventHandler¿Í InEventContext ¸Å°³º¯¼ö·Î½á NULLÀ» ¼­¼úÇÑ´Ù.

PnP¿Í Àü¿ø »óÅ º¯È­Å뺸¸¦ À§ÇØ ClientPnPXxx Çڵ鷯¸¦ µî·ÏÇÏ·Á¸é Ŭ¶óÀÌ¾ðÆ®´Â IoCallDriver ÇÔ¼ö¿¡ ÀÇÇØ¼­ µÚµû¸£´Â TdiBuildSetEventHandler ÇÔ¼öº¸´Ù´Â TdiRegisterPnPHandlers ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.