TDI_SEND
Ä¿³Î ¸ðµå Ŭ¶óÀÌ¾ðÆ®°¡ TDI_SEND ¸®Äù½ºÆ®¸¦ ÇÒ ¶§ Ä¿³Î ¸ðµå Ŭ¶óÀÌ¾ðÆ®´Â ÇϺÎÀÇ TDI Æ®·£½ºÆ÷Æ® µå¶óÀ̹ö·Î ÇÏ¿©±Ý ¿ø°ÝÁöÀÇ ¸í½ÃµÈ ¿¬°á ¿£µåÆ÷ÀÎÆ®»ó¿¡¼ Á¤»óÀûÀ̰ųª ½Å¼ÓÇÑ TSDU¸¦ Àü¼ÛÇϵµ·Ï ¿ä±¸ÇÑ´Ù.
IRP
IrpSp·Î½á ´ÙÀ½ÀÇ ¸®½ºÆ®¿¡ º¸¿©Áö´Â IRP¾È¿¡ ÀÚ½ÅÀÇ I/O ½ºÅà ·ÎÄÉÀ̼ǿ¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¾ò±â À§Çؼ ÁÖ¾îÁø Irp¸¦ °¡Áö°í Æ®·£½ºÆ÷Æ®´Â IoGetCurrentIrpStackLocation ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. IRP¿¡ ´ëÇÑ Æ÷ÀÎÅÍ´Â Irp·Î½á ´ÙÀ½ÀÇ ¸®½ºÆ®¿¡ º¸¿©Áø´Ù. ÀÌ ¸®Äù½ºÆ®¿Í ¿¬°üµÈ IRP ¸â¹ö´Â ´ÙÀ½°ú °°´Ù:
- Irp->IoStatus.Status
- º¸³»±â ¸®Äù½ºÆ®ÀÇ ¸¶Áö¸· »óŸ¦ ¼¼úÇÑ´Ù. Æ®·£½ºÆ÷Æ®°¡ ´ÙÀ½Áß Çϳª¸¦ °¡Áö°í IRP¸¦ ¿Ï·áÇϱâ Àü¿¡ ÀÌ ¸â¹ö¸¦ ¼³Á¤ÇÑ´Ù:
STATUS_SUCCESS
STATUS_PENDING
STATUS_INVALID_CONNECTION
STATUS_INVALID_PARAMETER
STATUS_DEVICE_NOT_READY
- Irp->IoStatus.Information
- Irp->MdlAddress¿¡ ¸ÊµÈ Ŭ¶óÀÌ¾ðÆ® Á¦°ø ¹öÆÛ·ÎºÎÅÍ Àü¼ÛµÈ Ŭ¶óÀÌ¾ðÆ® Á¦°ø µ¥ÀÌŸÀÇ ¹ÙÀÌÆ® ¼ö¸¦ ¼¼úÇÑ´Ù.
- IrpSp->MajorFunction
- IRP_MJ_INTERNAL_DEVICE_CONTROLÀ» ¸®ÅÏÇÑ´Ù. Æ®·£½ºÆ÷Æ®°¡ TDI_XXX ¸®Äù½ºÆ®¸¸À» ´Ù·ç´Â TdiDispatchInternalDeviceControl ·çƾÀ» ÀͽºÆ÷Æ®ÇÑ´Ù¸é Æ®·£½ºÆ÷Æ®´Â ÀÌ ¸â¹ö¸¦ ¹«½ÃÇÒ ¼ö ÀÖ´Ù.
- IrpSp->MinorFunction
- TDI_SEND¸¦ ¼¼úÇÑ´Ù.
- IrpSp->FileObject
- ¿¬°á ¿£µåÆ÷ÀÎÆ®¸¦ ±¸ÇöÇÏ´Â ¿¸° ÆÄÀÏ °´Ã¼¸¦ °¡¸®Å²´Ù. Æ®·£½ºÆ÷Æ®´Â ÀÌ ¿¬°á¿¡ ´ëÇØ¼ À¯ÁöÇÏ´Â »óÅ·ΠÁ¢±ÙÇϱâ À§Çؼ FsContext¿Í °¡´ÉÇÏ´Ù¸é FsContext2 Çʵ带 »ç¿ëÇÑ´Ù.
Ŭ¶óÀÌ¾ðÆ®´Â ÀÌ ¿¬°á ¿£µåÆ÷ÀÎÆ®»ó¿¡¼ ¿ø°ÝÁö¿Í ÀÌ¹Ì ¿£µåÆ÷ÀÎÆ® ´ë ¿£µåÆ÷ÀÎÆ® ¿¬°áÀ» ¼º¸³Çß´Ù.
- IrpSp->Parameters
- ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǴ TDI_REQUEST_KERNEL_SEND ±¸Á¶Ã¼¸¦ °¡¸®Å²´Ù:
struct _TDI_REQUEST_KERNEL_SEND {
ULONG SendLength;
ULONG SendFlags;
} TDI_REQUEST_KERNEL_SEND, *PTDI_REQUEST_KERNEL_SEND;
Æ®·£½ºÆ÷Æ®´Â ´ÙÀ½°ú °°ÀÌ ÀÌ ±¸Á¶Ã¼ÀÇ ¸â¹ö¸¦ »ç¿ëÇÑ´Ù:
- SendLength
- Irp->MdlAddress¿¡ ¸ÊµÈ ¹öÆÛ·Î º¸³»Áø µ¥ÀÌŸÀÇ ¹ÙÀÌÆ® ¼ö¸¦ ¼¼úÇÑ´Ù.
- SendFlags
- Ŭ¶óÀÌ¾ðÆ®°¡ 0, ÇϳªÈ¤Àº OR ¿¬»êµÈ TDI_SEND_XXX Ç÷¡±×(ÁÖ¼®À» ºÁ¶ó)·Î½á º¸³»Áöµµ·Ï ±â´ëµÇ´Â TSDUÀÇ Å¸ÀÔÀ» ¼¼úÇÑ´Ù.
- Irp->MdlAddress
- º¸³»Áú µ¥ÀÌŸ¸¦ Æ÷ÇÔÇϴ Ŭ¶óÀÌ¾ðÆ® Á¦°ø ¹öÆÛ¸¦ ¸ÅÇÎÇϴ üÀξȿ¡ óÀ½ MDLÀ» °¡¸®Å²´Ù.
ÁÖ¼®
Ŭ¶óÀÌ¾ðÆ®°¡ ÀÌ IRP¸¦ ¼³Á¤Çϱâ À§Çؼ TdiBuildSend ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§ Ŭ¶óÀÌ¾ðÆ®´Â ¿øÇÏ´Â º¸³»±â ŸÀÔÀ» ¼¼úÇÒ ¼ö ÀÖ´Ù. Æ®·£½ºÆ÷Æ®´Â SendFlags ¸â¹ö¾È¿¡ IrpSp->Parameters¿¡ Á¤º¸¸¦ ã´Â´Ù. ÀԷ¿¡¼ SendFlags´Â 0À» ¼ö Àְųª ´ÙÀ½ Ç÷¡±×µéÀÇ OR ¿¬»ê °áÇÕÀ¸·Î½á ¼³Á¤µÉ ¼ö ÀÖ´Ù:
- TDI_SEND_EXPEDITED
- ÁÖ¾îÁø µ¥ÀÌŸ´Â Æ®·£½ºÆ÷Æ®°¡ ¿£µåÆ÷ÀÎÆ® ´ë ¿£µåÆ÷ÀÎÆ® ¿¬°á¿¡¼ Àü¼ÛÀ» À§Çؼ Å¥¸¦ ÇöÀç À¯ÁöÇϰí ÀÖ´Â Á¤»óÀûÀÎ º¸³»±â ¸®Äù½ºÆ®ÀÇ ¾ÕºÎºÐÀÌ º¸³»Á®¾ßÇÑ´Ù. Æ®·£½ºÆ÷Æ®°¡ ½Å¼ÓÇÑ Àü¼ÛÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù¸é ÀÌ Ç÷¡±×¸¦ ¹«½ÃÇÒ ¼ö ÀÖ´Ù.
- TDI_SEND_PARTIAL
- ÁÖ¾îÁø µ¥ÀÌŸ´Â ¿Ï·áµÈ ¸Þ¼¼Áö ¸ðµå TSDU°¡ ¾Æ´Ï´Ù. Ŭ¶óÀÌ¾ðÆ®´Â TSDU¸¦ À§Çؼ ³ªÁß¿¡ ³²¾ÆÀÖ´Â µ¥ÀÌŸ¸¦ º¸³¾ °ÍÀÌ´Ù. ÀÌ Ç÷¡±×´Â ½ºÆ®¸² ¸ðµå Æ®·£½ºÆ÷Æ®¿Í ¹«°üÇÏ´Ù.
ÀÌ Ç÷¡±×°¡ ¸Þ¼¼Áö ¸ðµå Æ®·£½ºÆ÷Æ®·Î Á¦½ÃµÈ º¸³»±â¿¡¼ Ŭ¸®¾îµÈ´Ù¸é µå¶óÀ̹ö´Â Ŭ¶óÀ̾ðÆ®ÀÇ ¹öÆÛ¿¡¼ Á¦°øµÈ ¸ðµç µ¥ÀÌŸ¸¦ º¸³½ ÈÄ¿¡ ¶óÀÎ ÇÃ·Î¿ì ¾ÈÀ¸·Î ·¹ÄÚµåÇ¥½ÃÀÇ ³¡À» »ðÀÔÇÑ´Ù.
- TDI_SEND_NO_RESPONSE_EXPECTED
- È£ÃâÀÚ´Â ¿ø°ÝÁö·ÎºÎÅÍ ÀÌ º¸³»±â¿¡ ´ëÇÑ ÀÀ´äÀ» ±â´ëÇÏÁö ¾Ê´Â ÇϺÎÀÇ Æ®·£½ºÆ÷Æ®¿¡°Ô ÈùÆ®¸¦ ÁÖ°íÀÖ´Ù. ÀÌ Ç÷¡±×´Â ¿ø°ÝÁö Æ®·£½ºÆ÷Æ®¿¡ ÀÇÇØ¼ TSDU ½ÂÀÎÀÇ ÇDZâ¹éÀ» µð½º¿¡À̺í ÇØ¾ßÇÑ´Ù.
- TDI_SEND_NON_BLOCKING
- ÇϺÎÀÇ Æ®·£½ºÆ÷Æ®°¡ ÇöÀç ÁÖ¾îÁø µ¥ÀÌŸ¸¦ À§Çؼ ÀÌ¿ëÇÒ ¼ö ÀÖ´Â ³»ºÎÀÇ ¹öÆÛ°ø°£À» °¡Áö°í ÀÖÁö ¾Ê´Ù¸é ÇϺÎÀÇ Æ®·£½ºÆ÷Æ®´Â STATUS_DEVICE_NOT_READY¸¦ °¡Áö°í IRP¸¦ ¿Ï·áÇØ¾ßÇÑ´Ù. ¸¸¾à Æ®·£½ºÆ÷Æ®°¡ ¾à°£ÀÇ ¹öÆÛ °ø°£À» »ç¿ëÇÒ ¼ö ÀÖ´Ù¸é Æ®·£½ºÆ÷Æ®´Â º¹»çµÇ´Â ¹ÙÀÌÆ® ¼ö°¡ IoStatus.Information¿¡ ¼³Á¤µÈ Ŭ¶óÀÌ¾ðÆ® Á¦°ø ¹öÆÛ·ÎºÎÅÍ ÇÒ ¼ö ÀÖ´Â ¸¸Å ¸¹Àº µ¥ÀÌŸ¸¦ º¹»çÇØ¾ßÇÑ´Ù. ±×¸®°í STATUS_SUCCESS¸¦ °¡Áö°í IRP¸¦ ¿Ï·áÇØ¾ßÇÑ´Ù.
ÀÌ Ç÷¡±×´Â ³»ºÎÀûÀ¸·Î º¸³»±â¸¦ ¹öÆÛÈÇÏÁö ¾ÊÀº Æ®·£½ºÆ÷Æ®¿Í´Â ¹«°üÇÏ´Ù.
-
°¢°¢ÀÇ ·ÎÄà Ŭ¶óÀ̾ðÆ®ÀÇ º¸³»±â ¸®Äù½ºÆ®´Â ´ÙÀ½Áß Çϳª¿Í ¿¬°üÀÌ ÀÖ´Ù:
- ¿ø°ÝÁöÀÇ Å¬¶óÀÌ¾ðÆ®¿¡ ÀÇÇØ¼ ¸®½Ãºê ¸®Äù½ºÆ®°¡ ÇϺÎÀÇ Æ®·¡½ºÆ÷Æ®·Î Á¦½ÃµÆ´Ù.
- Ŭ¶óÀ̾ðÆ®ÀÇ µî·ÏµÈ ClientEventReceive, ClientEventReceiveExpedited, ClientEventChainedReceive, ȤÀº ClientEventChainedReceiveExpedited Çڵ鷯·ÎÀÇ ¿ø°ÝÁö Æ®·£½ºÆ÷Æ®ÀÇ È£Ãâ.
·ÎÄà TDI Æ®·£½ºÆ÷Æ®´Â ƯÁ¤ ¿¬°á¿¡¼ º¸³»±â ¸®Äù½ºÆ®¸¦ Å¥¿¡ ÀúÀåÇÒ ¼ö ÀÖ´Ù. ÇÏÁö¸¸ Ŭ¶óÀÌ¾ðÆ®°¡ ½Å¼ÓÇÑ º¸³»±â¸¦ Á¦½ÃÇÏÁö ¾Ê´Â´Ù¸é FIFO ¼ø¼·Î ó¸®ÇؾßÇÑ´Ù. °¢°¢ÀÇ ½Å¼ÓÇÑ º¸³»±â ¸®Äù½ºÆ®´Â Å¥¿¡ ÀúÀåµÇ¾î¾ßÇÏ°í Æ®·£½ºÆ÷Æ®°¡ Å¥¿¡ ÀúÀåÇϰí ÀÖ´Â Á¤»óÀûÀÎ º¸³»±â ¸®Äù½ºÆ®ÀÇ ¾ÕºÎºÐÀ» Àü¼ÛÇØ¾ßÇÑ´Ù. ¶ÇÇÑ °¢°¢ÀÇ ½Å¼ÓÇÑ º¸³»±â ¸®Äù½ºÆ®´Â Ŭ¶óÀÌ¾ðÆ®¸¦ À§Çؼ FIFO ¼ø¼·Î Àü¼ÛµÇ¾î¾ßÇÑ´Ù.
Æ®·£½ºÆ÷Æ®´Â »óŰ¡ ¼º°øÀÌµç ¿¡·¯À̵çÁö °£¿¡ ½Ã±âÀûÀýÇÏ°Ô °¢°¢ÀÇ º¸³»±â IRP¸¦ ¿Ï·áÇØ¾ßÇÑ´Ù. µå¶óÀ̹ö´Â ÇϺΠ³×Æ®¿÷ »óÅÂÀÇ Áö½Ä¿¡ ±â¹ÝÇÏ¿© ÀûÀýÇÑ Å¸ÀӾƿôÀ» °áÁ¤ÇؾßÇÑ´Ù.
ÇϺÎÀÇ Æ®·£½ºÆ÷Æ®¿¡ ÀÇÁ¸ÇÏ¿© Ŭ¶óÀÌ¾ðÆ®´Â ½ºÆ®¸² ¸ðµå ȤÀº ¸Þ¼¼Áö ¸ðµåÀÇ TSDU¸¦ º¸³¾ ¼ö ÀÖ°í ´ÙÀ½¿¡ ÇϳªÀÌ»óÀÇ º¸³»±â ¸®Äù½ºÆ®¸¦ ÇÒ ¼ö ÀÖ´Ù. ½ºÆ®¸² ¸ðµå Æ®·£½ºÆ÷Æ®¿¡ ´ëÇØ¼ Ŭ¶óÀÌ¾ðÆ®´Â ¸Þ¼¼Áö Á¦ÇÑÀ» ÇÏÁö¾Ê°í TDI_SEND_PARTIAL Ç÷¡±×´Â ¹«°üÇÏ´Ù. ¸Þ¼¼Áö ¸ðµå Æ®·£½ºÆ÷Æ®¿¡ ´ëÇØ¼ Ŭ¶óÀÌ¾ðÆ®´Â °¢°¢ÀÇ TDI_SEND_PARTIAL Ç÷¡±×¸¦ ¼¼úÇÏ´Â ¼øÂ÷ÀûÀÎ º¸³»±â ¸®Äù½ºÆ®·Î½á TSDU¸¦ º¸³¾ ¼ö ÀÖ´Ù. ÀÌ Ç÷¡±×°¡ Á¦½ÃµÈ º¸³»±â ¸®Äù½ºÆ®¿¡¼ Ŭ¸®¾îµÈ´Ù¸é ¸Þ¼¼Áö ¸ðµå Æ®·£½ºÆ÷Æ®´Â ±× µ¥ÀÌŸ¸¦ ¼øÂ÷ÀûÀÎ º¸³»±âÀÇ ³¡À̳ª TSDUÀÇ ¿Ï·á·Î °£ÁÖÇÑ´Ù. ¿ø°ÝÁöÀÇ TDI Æ®·£½ºÆ÷Æ®´Â ´ëÀÀÇÏ´Â ¸®½Ãºê ÀεðÄÉÀ̼ÇÀ¸·Î Àü´ÞµÈ ¸®½Ãºê ÀεðÄÉÀÌÅ͸¦ ÅëÇØ¼ ¼ö½ÅÇϴ Ŭ¶óÀ̾ðÆ®ÀÇ ºÎºÐÀûÀÎ TSDU¸¦ ÀνÄÇÑ´Ù.
º¸³»±â ¸®Äù½ºÆ®¿¡¼ º¸³»´Â Ŭ¶óÀÌ¾ðÆ®´Â TSDU¸¦ Æ÷ÇÔÇÏ´Â ¹öÆÛ¸¦ Á¦°øÇÑ´Ù. Ŭ¶óÀÌ¾ðÆ®´Â Æ®·£½ºÆ÷Æ® °áÁ¤ Á¦ÇÑ¿¡ ´ëÇØ¼ ¹öÆÛÀÇ »çÀÌÁ Á¦°øÇÑ´Ù. Æ®·£½ºÆ÷Æ®´Â º¸³»±â¸¦ ¿Ï·áÇÒ ¶§±îÁö ÀÌ Å¬¶óÀÌ¾ðÆ® Á¦°ø ¹öÆÛÀÇ ¼ÒÀ¯±ÇÀ» ¾ò´Â´Ù. Æ®·£½ºÆ÷Æ®°¡ Áö¿øÇÏ´Â °Íº¸´Ù ´õ Å« SendLength¸¦ ¼¼úÇϴ Ŭ¶óÀÌ¾ðÆ®¿¡ ´ëÇØ¼ Æ®·£½ºÆ÷Æ®´Â º¸³»±â ¸®Äù½ºÆ®¸¦ ½ÇÆÐÇÑ´Ù.
Ŭ¶óÀÌ¾ðÆ®´Â TDI_QUERY_PROVIDER_INFO ŸÀÔÀÇ Äõ¸®¸¦ Á¦½ÃÇϹǷνá ÇϺΠƮ·£½ºÆ÷Æ®ÀÇ º¸³»±â »çÀÌÁîÀÇ Á¦ÇÑÀ» °áÁ¤ÇÒ ¼ö ÀÖ´Ù.
Æ®·£½ºÆ÷Æ®°¡ ³»ºÎÀûÀ¸·Î Ŭ¶óÀÌ¾ðÆ® Á¦°ø º¸³»±â µ¥ÀÌŸ¸¦ ¹öÆÛÈÇÑ´Ù¸é Ŭ¶óÀÌ¾ðÆ®´Â TDI_SEND_NON_BLOCKING Ç÷¡±×¸¦ ¼³Á¤ÇÏ¹Ç·Î½á ºñºí·¯Å· º¸³»±â¸¦ ¸®Äù½ºÆ®ÇÒ ¼ö ÀÖ´Ù. ±×·¯ÇÑ Æ®·£½ºÆ÷Æ®°¡ ¼³Á¤µÈ ÀÌ Ç÷¡±×¸¦ °¡Áö°í º¸³»±â ¸®Äù½ºÆ®¸¦ ¾òÀ» ¶§ Æ®·£½ºÆ÷Æ®°¡ ³»ºÎÀÇ ¹öÆÛ°ø°£À¸·Î ÁÖ¾îÁø µ¥ÀÌŸ¸¦ º¹»çÇÒ ¼ö ¾ø´Ù¸é STATUS_DEVICE_NOT_READY Ç÷¡±×¸¦ °¡Áö°í IRP¸¦ ¿Ï·áÇÑ´Ù. ±×·¯ÇÑ Æ®·£½ºÆ÷Æ®´Â ³»ºÎÀûÀ¸·Î ÁÖ¾îÁø TSDUÀÇ ºÎºÐ¸¸ ¹öÆÛÈÇÑ´Ù¸é STATUS_SUCCESS¸¦ ¸®ÅÏÇÑ´Ù. ÇÏÁö¸¸ ³»ºÎÀûÀ¸·Î ¹öÆÛÈµÈ ¹ÙÀÌÆ®ÀÇ ¼ö·Î ±×·¯ÇÑ IRP¾È¿¡ IoStatus.InformationÀ» ¼³Á¤ÇؾßÇÑ´Ù. ±×·¡¼ Ŭ¶óÀÌ¾ðÆ®´À ¿ø·¡ º¸³»±â ¸®Äù½ºÆ®¾È¿¡ À¯ÁöÇÏ´Â µ¥ÀÌŸ¿¡ ´ëÇØ¼ ¼øÂ÷ÀûÀÎ º¸³»±â¸¦ Á¦½ÃÇÒ ¼ö ÀÖ´Ù.
ºñºí·¯Å· º¸³»±â ¸®Äù½ºÆ®¸¦ Á¦½ÃÇϴ Ŭ¶óÀÌ¾ðÆ®´Â º¸Åë ClientEventSendPossible Çڵ鷯¸¦ µî·ÏÇÑ´Ù. Æ®·£½ºÆ÷Æ®´Â À¯ÁöÇϰí ÀÖ´Â º¸³»±â µ¥ÀÌŸ¸¦ À§Çؼ ÀÌ¿ëÇÒ ¼ö ÀÖ´Â ³»ºÎÀÇ ¹öÆÛ°ø°£À» °®ÀÚ¸¶ÀÚ STATUS_DEVICE_NOT_READY¸¦ °¡Áö°í º¸³»±â ¸®Äù½ºÆ®¸¦ °ÅÀýÇÑ ÈÄ¿¡ ÇϺÎÀÇ Æ®·£½ºÆ÷Æ®´Â ÀÌ Çڵ鷯¸¦ È£ÃâÇÑ´Ù.
¶ÇÇÑ Æ®·£½ºÆ÷Æ®´Â ±æÀ̰¡ 0ÀÎ º¸³»±â ¸®Äù½ºÆ®¸¦ Áö¿øÇÒ ¼ö ÀÖ´Ù. TDI_SEND_PARTIALÀÌ Å¬¸®¾îµÈ ±æÀ̰¡ 0ÀÎ º¸³»±â´Â ÇÁ·ÎÅäÄÝ È帧À» °¿äÇÑ´Ù. ±×·¯ÇÑ Æ®·£½ºÆ÷Æ®ÀÇ Å¬¶óÀÌ¾ðÆ®´Â ¸®½Ãºê ¸®Äù½ºÆ®¸¦ ¸¸Á·½Ã۱â À§Çؼ ±æÀ̰¡ 0ÀÎ º¸³»±â¸¦ Á¦½ÃÇÒ ¼ö ÀÖ´Ù. µå¶óÀ̹ö°¡ ±æÀ̰¡ 0ÀÎ º¸³»±â¸¦ Áö¿øÇÏÁö ¾Ê´Â´Ù¸é µå¶óÀ̹ö´Â Ŭ¶óÀÌ¾ðÆ®°¡ ±æÀ̰¡ 0ÀÎ º¸³»±â¸¦ Á¦½ÃÇÒ ¶§ ¿¡·¯¸¦ ¸®ÅÏÇÑ´Ù.
TdiBuildSend ÇÔ¼ö´Â Ŭ¶óÀÌ¾ðÆ®°¡ IRP¾È¿¡ ä¿ì±â À§Çؼ »ç¿ëÇÏ´Â ¸ÅÅ©·ÎÀÌ´Ù.
|