ClientEventChainedReceive

NTSTATUS
   ClientEventChainedReceive(
       IN PVOID TdiEventContext,
       IN CONNECTION_CONTEXT ConnectionContext,
       IN ULONG ReceiveFlags,
       IN ULONG ReceiveLength,
       IN ULONG StartingOffset,
       IN PMDL Tsdu,
       IN PVOID TsduDescriptor
       );

ClientEventChainedReceive ÇÔ¼ö´Â Ŭ¶óÀÌ¾ðÆ®°¡ ¼º¸³µÈ ¿£µåÆ÷ÀÎÆ® ´ë ¿£µåÆ÷ÀÎÆ® ¿¬°áÀ» °¡Áö°í ¿ø°ÝÁö·ÎºÎÅÍ µé¾î¿À´Â ¸®½Ãºê¿¡ ´ëÇÑ ÀÀ´äÀ¸·Î ÇϺÎÀÇ TDI Æ®·£½ºÆ÷Æ®°¡ È£ÃâÇÏ´Â À̺¥Æ® Çڵ鷯ÀÌ´Ù.

NDIS ¹Ì´ÏÆ÷Æ®¿¡ ÀÇÇØ¼­ ÀεðÄÉÀÌÆ®µÈ Àüü TSDU¸¦ Àü´ÞÇϰí Ŭ¶óÀÌ¾ðÆ®°¡ µ¥ÀÌŸ¸¦ ¼ÒºñÇÒ ¶§±îÁö ¹öÆÛÈ­µÈ TSDU·ÎÀÇ Á÷Á¢ Àбâ Àü¿ëÁ¢±ÙÀ» ¾ò¾úÀ» ¶§ Æ®·£½ºÆ÷Æ®´Â ClientEventReceive ÇÔ¼öº¸´Ù´Â ÀÌ Çڵ鷯¸¦ È£ÃâÇÑ´Ù.

¸Å°³º¯¼ö

TdiEventContext
ClientEventChainedReceive ÇÔ¼ö°¡ ÇϺÎÀÇ Æ®·£½ºÆ÷Æ®¸¦ °¡Áö°í µî·ÏµÆÀ» ¶§ TdiBuildSetEventHandler ÇÔ¼ö¸¦ °¡Áö°í ¼³Á¤µÈ IRP¾È¿¡ Á¦°øµÈ Ŭ¶óÀÌ¾ðÆ® Á¦°ø ÄÁÅØ½ºÆ®¸¦ °¡¶óŲ´Ù.

ConnectionContext
ÀÌ ¿¬°á ¿£µåÆ÷ÀÎÆ®¿¡ ´ëÇÑ Å¬¶óÀ̾ðÆ®ÀÇ ÄÁÅØ½ºÆ® Áö¿ªÀ» °¡¸®Å²´Ù. Ŭ¶óÀ̾ðÆ®ÀÇ ClientEventConnect ÇÔ¼ö°¡ ¿ø°ÝÁö·ÎºÎÅÍÀÇ ¿¬°á Á¦°øÀ» ½ÂÀÎÇϰųª ZwCreateFile ÇÔ¼ö¸¦ °¡Áö°í ¿¬°á ¿£µåÆ÷ÀÎÆ®¸¦ ¿­¾úÀ» ¶§ Ŭ¶óÀÌ¾ðÆ®´Â Àü¿¡ ÀÌ °ªÀ» ÇϺÎÀÇ Æ®·£½ºÆ÷Æ®·Î Á¦°øÇß´Ù.

ReceiveFlags
´ÙÀ½ Ç÷¡±×µéÀÇ OR ¿¬»êÀ¸·Î½á ¸®½Ãºê ÀεðÄÉÀ̼ÇÀÇ Æ¯Â¡À» ¼­¼úÇÑ´Ù:

TDI_RECEIVE_NORMAL
Tsdu¿¡ ¸ÊµÈ ¹öÆÛ´Â Ŭ¶óÀ̾ðÆ®ÀÇ ¿ø°ÝÁö·ÎºÎÅÍ ¸®½ÃºêµÈ Á¤»óÀûÀÎ µ¥ÀÌŸ¸¦ Æ÷ÇÔÇÑ´Ù. ÀÌ Ç÷¡±×¿Í TDI_RECEIVE_EXPEDITED´Â ¼­·Î ¹èŸÀûÀÌ´Ù.

TDI_RECEIVE_EXPEDITED
Tsdu¿¡ ¸ÊµÈ ¹öÆÛ´Â Ŭ¶óÀ̾ðÆ®ÀÇ ¿ø°ÝÁö·ÎºÎÅÍ ¸®½ÃºêµÈ ½Å¼ÓÇÑ µ¥ÀÌŸ¸¦ Æ÷ÇÔÇÑ´Ù. Ŭ¶óÀÌ¾ðÆ®°¡ ClientEventChainedReceiveExpedited¿Í ClientEventReceiveExpedited Çڵ鷯¸¦ µî·ÏÇÏÁö ¾Ê¾Ò°Å³ª ÇϺÎÀÇ Æ®·£½ºÆ÷Æ®°¡ ½Å¼ÓÇÑ Àü¼ÛÀ» Áö¿øÇÒ ¶§¸¸ ÀÌ Ç÷¡±×´Â ¼³Á¤µÉ ¼ö ÀÖ´Ù.

TDI_RECEIVE_ENTIRE_MESSAGE
Tsdu¿¡ ¸ÊµÈ ¹öÆÛ´Â Àüü TSDU¸¦ Æ÷ÇÔÇÑ´Ù. ±×¸®°í ClientEventChainedReceive ÇÔ¼ö°¡ STATUS_PENDINGÀ» ¸®ÅÏÇÑ´Ù¸é Ŭ¶óÀÌ¾ðÆ®°¡ ÀεðÄÉÀÌÆ®µÈ µ¥ÀÌŸ¸¦ ¼ÒºñÇÒ ¶§±îÁö Ŭ¶óÀÌ¾ðÆ®´Â ÀÌ ¹öÆÛ·ÎÀÇ Àбâ Àü¿ë Á¢±ÙÀ» À¯ÁöÇÑ´Ù. ÀÌ Ç÷¡±×´Â ClientEventChainedReceive ÇÔ¼ö°¡ È£ÃâµÆÀ» ¶§ Ç×»ó ¼³Á¤µÈ´Ù.

ReceiveLength
Tsdu¿¡ ¸ÊµÈ ¹öÆÛ¾È¿¡ Ŭ¶óÀÌ¾ðÆ® µ¥ÀÌŸÀÇ ¹ÙÀÌÆ® ¼ö¸¦ ¼­¼úÇÑ´Ù.

StartingOffset
Tsdu¿¡ ¸ÊµÈ ¹öÆÛ¾È¿¡¼­ Ŭ¶óÀ̾ðÆ®ÀÇ µ¥ÀÌŸ°¡ ½ÃÀÛÇÏ´Â ¹ÙÀÌÆ® ¿É¼ÂÀ» ¼­¼úÇÑ´Ù.

Tsdu
¸®½ÃºêµÈ TSDU¸¦ Æ÷ÇÔÇÏ´Â ¹öÆÛ¸¦ ¸ÅÇÎÇϴ üÀξȿ¡ óÀ½ MDLÀ» °¡¸®Å²´Ù.

TsduDescriptor
¸®½ÃºêµÈ TSDU¿¡ ´ëÇÑ µð½ºÅ©¸³Å͸¦ °¡¸®Å²´Ù. Ŭ¶óÀÌ¾ðÆ®°¡ ÀÌ ¸®½Ãºê ÀεðÄÉÀ̼ǿ¡ ´ëÇØ¼­ STATUS_PENDINGÀ» ¸®ÅÏÇÑ´Ù¸é ¼øÂ÷ÀûÀ¸·Î ÀÌ Æ÷ÀÎÅ͸¦ °¡Áö°í TdiReturnChainedReceives ÇÔ¼ö¸¦ È£ÃâÇØ¾ßÇÑ´Ù. ÀÌ Æ÷ÀÎÅÍ´Â ClientEventChainedReceive ÇÔ¼ö°¡ STATUS_PENDINGÀ» ¸®ÅÏÇÑ´Ù¸é TdiReturnChainedReceives ÇÔ¼ö¿¡ ´ëÇÑ ¸Å°³º¯¼ö·Î½á¸¸ Ŭ¶óÀÌ¾ðÆ®¿¡ ÀÇÇØ¼­ »ç¿ëµÇ´Â ºÒÅõ¸íÇÑ º¯¼ö¿¡ ´ëÇÑ ÇÚµé·Î½á Ãë±ÞµÇ¾î¾ßÇÑ´Ù.

¸®Åϰª

ClientEventChainedReceive ÇÔ¼ö´Â ´ÙÀ½Áß Çϳª¸¦ ¸®ÅÏÇÒ ¼ö ÀÖ´Ù:

STATUS_SUCCESS
ÁÖ¾îÁø TSDU¾È¿¡ ¼ÒºñµÈ ¸ðµç µ¥ÀÌŸ¸¦ Ŭ¶óÀÌ¾ðÆ®·Î ÀεðÄÉÀÌÆ®ÇÑ´Ù. ±×¸®°í Áï½Ã ¹öÆÛ(±×¸®°í TsduDescriptor)ÀÇ ¼ÒÀ¯±ÇÀ» ¸®ÅÏÇÑ´Ù.

STATUS_PENDING
Ŭ¶óÀÌ¾ðÆ®°¡ ÁÖ¾îÁø TsduDescriptor¸¦ °¡Áö°í TdiReturnChainedReceives ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§±îÁö Ŭ¶óÀÌ¾ðÆ®´Â ÁÖ¾îÁø TSDU¸¦ Æ÷ÇÔÇÏ´Â ¹öÆÛÀÇ ¼ÒÀ¯±ÇÀ» À¯ÁöÇÑ´Ù´Â °ÍÀ» ÀεðÄÉÀÌÆ®ÇÑ´Ù.

STATUS_DATA_NOT_ACCEPTED
Ŭ¶óÀÌ¾ðÆ®°¡ TSDU¿¡ °ü½ÉÀÌ ¾øÀ½À» ÀεðÄÉÀÌÆ®ÇÑ´Ù.

ÇϺÎÀÇ Æ®·£½ºÆ÷Æ®°¡ ³»ºÎÀûÀ¸·Î ¸®½ÃºêµéÀ» ¹öÆÛÈ­ÇÑ´Ù¸é Æ®·£½ºÆ÷Æ®°¡ ClientEventChainedReceive(Xxx) Çڵ鷯·Î ÀεðÄÉÀÌÆ®µÈ ¹öÆÛÈ­µÈ µ¥ÀÌŸ¸¦ ¹ö¸®Áö ¾ÊÀ» ¶§ Ŭ¶óÀÌ¾ðÆ®´Â TDI_RECEIVE ¸®Äù½ºÆ®¸¦ °¡Áö°í µ¥ÀÌŸ¸¦ ¾ò´Â´Ù.

ÁÖ¼®

ClientEventChainedReceive ÇÔ¼ö·ÎÀÇ È£ÃâÀº ÀÔ·Â StartingOffset°ú ReceiveLength¿¡ ÀÇÇØ¼­ ¼­¼úµÈ ¹öÆÛ¾È¿¡ ¹üÀ§¿¡ ´ëÇØ¼­ ÀεðÄÉÀÌÆ®µÈ TSDU·ÎÀÇ Àбâ Àü¿ëÁ¢±ÙÀ» Ŭ¶óÀÌ¾ðÆ®¿¡°Ô ÁØ´Ù. ÀεðÄÉÀÌÆ®µÈ µ¥ÀÌŸ°¡ Ŭ¶óÀÌ¾ðÆ®¿¡ °ü°èµÈ °ÍÀ̶ó¸é ClientEventChainedReceive ÇÔ¼ö´Â Ŭ¶óÀÌ¾ðÆ® ÇÒ´ç ³»ºÎ ¹öÆÛ¾ÈÀ¸·Î ÀεðÄÉÀÌÆ®µÈ TSDU µ¥ÀÌŸÀÇ ¹üÀ§¸¦ º¹»çÇϰí STATUS_SUCCESS¸¦ Áï½Ã ¸®ÅÏÇϰųª STATUS_PENDINGÀ» ¸®ÅÏÇÏ¹Ç·Î½á ¹öÆÛÀÇ ÅëÁ¦¸¦ À¯ÁöÇÑ´Ù. STATUS_PENDINGÀ» ¸®ÅÏÇÑ´Ù¸é Ŭ¶óÀÌ¾ðÆ®´Â µ¥ÀÌŸ¸¦ ¼ÒºñÇÑ ÈÄ¿¡ ¹öÆÛÀÇ ÅëÁ¦¸¦ ¾çµµÇϱâ À§Çؼ­ ÀÔ·Â TsduDescriptor¸¦ °¡Áö°í ¼øÂ÷ÀûÀ¸·Î TdiReturnChainedReceives ÇÔ¼ö¸¦ È£ÃâÇØ¾ßÇÑ´Ù.

ÀϹÝÀûÀ¸·Î TdiReturnChainedReceives ÇÔ¼ö·ÎÀÇ ±×·¯ÇÑ È£ÃâÀº °¡´ÉÇÑ ÇÑ »¡¸® ¹ß»ýÇØ¾ßÇÑ´Ù. ¿¬ÀåµÈ ±â°£µ¿¾È ClientEventChainedReceive ÇÔ¼ö·Î Àü´ÞµÈ ¹öÆÛ¸¦ À¯ÁöÇÏ´Â °ÍÀº ÇϺÎÀÇ µå¶óÀ̹ö¿¡¼­ I/O È¿À²À» °­¿äÇÑ´Ù. ¿Ö³ÄÇÏ¸é ¹öÆÛ¸¦ ÇÒ´çÇÑ NDIS ¹Ì´ÏÆ÷Æ®´Â TdiReturnChainedReceives ÇÔ¼ö°¡ È£ÃâµÉ ¶§±îÁö ¼øÂ÷ÀûÀÎ ¸®½Ãºê ÀεðÄÉÀ̼ÇÀ» À§Çؼ­ ÀÌ ÀÚ¿øÀ» Àç»ç¿ëÇÒ ¼ö ¾ø±â ¶§¹®ÀÌ´Ù.

ClientEventChainedReceive ÇÔ¼ö·ÎÀÇ È£ÃâÀÌ Ç×»ó Àüü TSDUÀÇ »ç¿ëÀ» ÀεðÄÉÀÌÆ®Çϱ⠶§¹®¿¡ Ŭ¶óÀÌ¾ðÆ®´Â ´ëÀÀÇÏ´Â ClientEventReceive Çڵ鷯°¡ °¡²û Àüü TSDU¸¦ ¾ò¾î¾ßÇÒ ¶§ ±×·¯ÇÑ ÀεðÄÉÀ̼ÇÀ» À§Çؼ­ TDI_RECEIVE ¸®Äù½ºÆ®¸¦ ¼³Á¤ÇÒ Çʿ䰡 ¾ø´Ù. °á±¹ ClientEventChainedReceive ÇÔ¼ö·Î ¸¸µé¾îÁø ¸®½Ãºê ÀεðÅ×À̼ÇÀº Ŭ¶óÀ̾ðÆ®, ÇϺÎÀÇ Æ®·£½ºÆ÷Æ®, ±×¸®°í ½Ã½ºÅÛ Àüü¸¦ À§ÇÑ È£Ãâ °úºÎÇϸ¦ ÁÙÀÓÀ¸·Î½á ³×Æ®¿÷ I/OÀÇ È¿À²°ú ÆÛÆ÷¸Õ½º¸¦ Çâ»ó½ÃŲ´Ù.

Ŭ¶óÀÌ¾ðÆ®°¡ ¿£µåÆ÷ÀÎÆ® ´ë ¿£µåÆ÷ÀÎÆ® ¿¬°áÀ» À§Çؼ­ ClientEventChainedReceive¿Í ClientEventReceive Çڵ鷯¸¦ µî·ÏÇßÀ» ¶§ ClientEventChainedReceive ÇÔ¼ö´Â Æ®·£½ºÆ÷Æ®°¡ ½Å¼ÓÇÑ º¸³»±â¿Í ¹Þ±â¸¦ Áö¿øÇÑ´Ù°í °¡Á¤Çϰí ReceiveFlags¸¦ üũÇϹǷνá TSDU°¡ Á¤»óÀÇ °ÍÀÎÁö ½Å¼ÓÇÑ °ÍÀÎÁö¸¦ °áÁ¤ÇÒ ¼ö ÀÖ´Ù. Æ®·£½ºÆ÷Æ®´Â ClientEventChainedReceive ÇÔ¼ö·Î ÇàÇÏ´Â °°Àº ÀεðÄÉÀ̼ÇÀ» °¡Áö°í ´ëÀÀÇÏ´Â ClientEventReceive Çڵ鷯¸¦ °áÄÚ È£ÃâÇÒ ¼ö ¾ø´Ù.

Ŭ¶óÀÌ¾ðÆ®°¡ Áö±Ý ó¸®ÁßÀÎ Á¤»óÀûÀÎ ¸®½Ãºê ¸®Äù½ºÆ®¸¦ °¡Áö°Å³ª ¸®½Ãºê°¡ ¿Ï·áµÉ ¶§±îÁö µé¾î¿À´Â ƯÁ¤ÀÇ Á¤»óÀûÀÎ ¸®½Ãºê¿¡ ´ëÇØ¼­ ÀεðÄÉÀÌÆ®µÈ µ¥ÀÌŸ¸¦ Àü¿¡ °ÅÀýÇß´Ù¸é Æ®·£½ºÆ÷Æ®´Â ClientEvent(Chained)Receive ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ¾ø´Ù. ±×·¯³ª ½Å¼ÓÇÑ µ¥ÀÌŸ¸¦ Áö¿øÇÏ´Â Æ®·£½ºÆ÷Æ®´Â ½Å¼ÓÇÑ TSDU°¡ ¿ø°ÝÁö·ÎºÎÅÍ µé¾î¿Â´Ù¸é Á¤»óÀûÀÎ TSDU¸¦ ÀεðÄÉÀÌÆ®ÇÏ´Â Áß¿¡ClientEvent(Chained)Receive(Expedited) ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù.

ClientEventChainedReceive ÇÔ¼ö°¡ STATUS_SUCCESS³ª STATUS_DATA_NOT_ACCEPTED¸¦ °¡Áö°í ÅëÁ¦¸¦ ¸®ÅÏÇÒ ¶§ ÇϺÎÀÇ Æ®·£½ºÆ÷Æ®´Â Ŭ¶óÀÌ¾ðÆ®°¡ ÀÌ ¸®½Ãºê ÀεðÄÉÀ̼ÇÀ» °¡Áö°í ÇàÇØÁø´Ù°í °¡Á¤ÇÑ´Ù. Ŭ¶óÀÌ¾ðÆ®°¡ STATUS_PENDINGÀ» ¸®ÅÏÇÑ´Ù¸é Æ®·£½ºÆ÷Æ®´Â ÀÌ ¸®½Ãºê ÀεðÄÉÀ̼ÇÀÇ ¿Ï·á¸¦ Æ®·¢ÇÒ ¹æ¹ýÀÌ ¾ø´Ù°í °¡Á¤ÇÑ´Ù. ¿Ö³ÄÇϸé Ŭ¶óÀÌ¾ðÆ®°¡ ÀεðÄÉÀÌÆ®µÈ TSDU¸¦ ¼ÒºñÇßÀ» ¶§ Ŭ¶óÀÌ¾ðÆ®´Â TdiReturnChainedReceives ÇÔ¼ö¸¦ È£ÃâÇÒ Ã¥ÀÓÀÌ Àֱ⠶§¹®ÀÌ´Ù.

ClientEventChainedReceive ÇÔ¼ö´Â IRQL DISPATCH_LEVEL¿¡¼­ ¿¬»êÀ» ¼öÇàÇÒ ´É·ÂÀÌ ÀÖ¾î¾ßÇÑ´Ù.