TDI_RECEIVE_DATAGRAM
Ä¿³Î ¸ðµç Ŭ¶óÀÌ¾ðÆ®°¡ TDI_RECEIVE_DATAGRAM ¸®Äù½ºÆ®¸¦ ÇàÇÒ ¶§ Ä¿³Î ¸ðµå Ŭ¶óÀÌ¾ðÆ®´Â Æ¯Á¤ ÁÖ¼Ò»ó¿¡¼ µ¥ÀÌŸ±×·¥À¸·Î½á TSDU¸¦ ÀεðÄÉÀÌÆ®Çϱâ À§Çؼ ÇϺÎÀÇ TDI Æ®·£½ºÆ÷Æ® µå¶óÀ̹ö¿¡°Ô ¿ä±¸ÇÑ´Ù.
IRP
IrpSp·Î½á ´ÙÀ½ÀÇ ¸®½ºÆ®¿¡ º¸¿©Áö´Â IRP ¾È¿¡ ÀÚ½ÅÀÇ I/O ½ºÅà ·ÎÄÉÀ̼ǿ¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¾ò±â À§Çؼ Æ®·£½ºÆ÷Æ®´Â IoGetCurrentIrpStackLocation ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. IRP¿¡ ´ëÇÑ Æ÷ÀÎÅÍ´Â Irp·Î½á ´ÙÀ½ÀÇ ¸®½ºÆ®¿¡ º¸¿©Áø´Ù. ÀÌ ¸®Äù½ºÆ®¿Í ¿¬°üµÈ IRP ¸â¹ö´Â ´ÙÀ½°ú °°´Ù:
- Irp->IoStatus.Status
- ¸®½Ãºê µ¥ÀÌŸ±×·¥ ¸®Äù½ºÆ®ÀÇ ¸¶Áö¸· »óŸ¦ ¼¼úÇÑ´Ù. Æ®·£½ºÆ÷Æ®´Â IRP¸¦ ¿Ï·áÇϱâ Àü¿¡ ´ÙÀ½ Áß ÇϳªÀÇ °ªÀ¸·Î ÀÌ ¸â¹ö¸¦ ¼³Á¤ÇؾßÇÑ´Ù:
STATUS_PENDING
STATUS_INSUFFICIENT_RESOURCES
STATUS_INVALID_ADDRESS
STATUS_BUFFER_OVERFLOW
STATUS_BUFFER_TOO_SMALL
- Irp->IoStatus.Information
- Æ®·£½ºÆ÷Æ®°¡ Ŭ¶óÀÌ¾ðÆ® Á¦°ø ¹öÆÛ·Î ¿ä±¸ÇÏ´Â ¸®½ÃºêµÈ µ¥ÀÌŸÀÇ ¹ÙÀÌÆ® ¼ö¸¦ ¼¼úÇÑ´Ù.
- IrpSp->MajorFunction
- IRP_MJ_INTERNAL_DEVICE_CONTROL¸¦ ¼¼úÇÑ´Ù. Æ®·£½ºÆ÷Æ®´Â TDI_XXX ¸®Äù½ºÆ®¸¸À» ´Ù·ç´Â TdiDispatchInternalDeviceControl ·çƾÀ» ÀͽºÆ÷Æ®ÇÑ´Ù¸é ÀÌ ¸â¹ö¸¦ ¹«½ÃÇÒ ¼ö ÀÖ´Ù.
- IrpSp->MinorFunction
- TDI_RECEIVE_DATAGRAMÀ» ¼¼úÇÑ´Ù.
- IrpSp->FileObject
- ·ÎÄà ÁÖ¼Ò¸¦ ±¸ÇöÇÏ´Â ¿¸° ÆÄÀÏ °´Ã¼¸¦ °¡¸®Å²´Ù. Æ®·£½ºÆ÷Æ®´Â ÀÌ ÁÖ¼Ò¿¡ ´ëÇØ¼ À¯ÁöÇÏ´Â »óŸ¦ Á¢±ÙÇϱâ À§Çؼ FsContext¿Í °¡´ÉÇÏ´Ù¸é FsContext2 Çʵ带 »ç¿ëÇÑ´Ù.
- IrpSp->Parameters
- ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǴ TDI_REQUEST_KERNEL_RECEIVEDG ±¸Á¶Ã¼¸¦ °¡¸®Å²´Ù:
struct _TDI_REQUEST_KERNEL_RECEIVEDG {
ULONG ReceiveLength;
PTDI_CONNECTION_INFORMATION ReceiveDatagramInformation;
PTDI_CONNECTION_INFORMATION ReturnInformation;
ULONG ReceiveFlags;
} TDI_REQUEST_KERNEL_RECEIVEDG, *PTDI_REQUEST_KERNEL_RECEIVEDG;
Æ®·£½ºÆ÷Æ®´Â ´ÙÀ½°ú °°ÀÌ ÀÌ ¸â¹öÀÇ ±¸Á¶Ã¼¸¦ »ç¿ëÇÑ´Ù:
- ReceiveLength
- Ŭ¶óÀÌ¾ðÆ® Á¦°ø ¸®½Ãºê ¹öÆÛÀÇ ÃÖ´ë ¹ÙÀÌÆ® »çÀÌÁ ¼¼úÇÑ´Ù. ÀÌ ¸â¹ö°¡ 0ÀÌ¸é Æ®·£½ºÆ÷Æ®´Â Irp->MdlAddress¿¡ ¸ÊµÈ Àüü ¹öÆÛ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
- ReceiveDatagramInformation
- Ŭ¶óÀÌ¾ðÆ®°¡ µ¥ÀÌŸ±×·¥À» ¼ö½ÅÇϱ⸦ ±â´ëÇÏ´Â ¿ø°ÝÁöÀÇ ÁÖ¼Ò¸¦ ¼¼úÇϰųª ¿ø°ÝÁö·ÎºÎÅÍÀÇ µ¥ÀÌŸ±×·¥ÀÌ ÀÌ Å¬¶óÀÌ¾ðÆ®¿¡¼ ½ÂÀεȴٸé RemoteAddressLength ¸â¹ö¿¡ 0À» ¼¼úÇÏ´Â TDI_CONNECTION_INFORMATION ±¸Á¶Ã¼¸¦ °¡¸®Å²´Ù.
- ReturnInformation
- ¸®ÅϵǴ µ¥ÀÌŸ±×·¥ÀÇ ¸®½Ãºê·ÎºÎÅÍ ¿ø°ÝÁöÀÇ ÁÖ¼Ò¸¦ ¸®ÅÏÇÏ´Â Æ®·£½ºÆ÷Æ® ¾È¿¡ TDI_CONNECTION_INFORMATION ±¸Á¶Ã¼·Î½á Æ÷¸ËµÈ È£ÃâÀÚ Á¦°ø ¹öÆÛ¸¦ °¡¸®Å²´Ù.
- ReceiveFlags
- 0À̳ª Çϳª ȤÀº ´ÙÀ½ÀÇ Ç÷¡±× °áÇÕ(OR ¿¬»ê)À¸·Î Ŭ¶óÀÌ¾ðÆ®°¡ ±â´ëÇÏ´Â µ¥ÀÌŸ±×·¥ÀÇ Å¸ÀÔÀ» ¼¼úÇÑ´Ù:
TDI_RECEIVE_NORMAL - Á¤»óÀûÀÎ µ¥ÀÌŸ±×·¥À» ¸®ÅÏÇØ¶ó.
TDI_RECEIVE_PEEK - µ¥ÀÌŸ±×·¥ÀÇ »ç¿ë°¡´ÉÇÑ ºÎºÐÀ» ¸®ÅÏÇØ¶ó.
- Irp->MdlAddress
- ¸®½ÃºêµÈ µ¥ÀÌŸ±×·¥À» ¸®ÅÏÇÏ´Â Æ®·£½ºÆ÷Æ®ÀÇ Å¬¶óÀÌ¾ðÆ® Á¦°ø ¹öÆÛ¸¦ ¸ÅÇÎÇϴ üÀο¡¼ °¡´ÉÇÏ´Ù¸é óÀ½ MDLÀ» °¡¸®Å²´Ù.
ÁÖ¼®
µ¥ÀÌŸ±×·¥Àº ¿£µåÆ÷ÀÎÆ® ´ë ¿£µåÆ÷ÀÎÆ® ¿¬°á°ú´Â ¹«°úÇϱ⠶§¹®¿¡ Æ®·£½ºÆ÷Æ®´Â °¢°¢ÀÇ µ¥ÀÌŸ±×·¥À» µû¶ó¼ ¸®½ÃºêÇϴ Ŭ¶óÀÌ¾ðÆ®·Î ¿ø°ÝÁö Ŭ¶óÀ̾ðÆ®ÀÇ ÁÖ¼Ò¸¦ ¸®ÅÏÇØ¾ßÇÑ´Ù.
TDI Æ®·£½ºÆ÷Æ®´Â µ¥ÀÌŸ±×·¥À» ´ÜÆíÈÇÏÁö ¾Ê´Â´Ù. °á±¹ Ŭ¶óÀÌ¾ðÆ®´Â TDI_RECEIVE_PEEK Ç÷¡±×°¡ ¼³Á¤µÇÁö ¾Ê´Â´Ù¸é Àüü µ¥ÀÌŸ±×·¥À» À§Çؼ ÇϳªÀÇ ¸®½Ãºê µ¥ÀÌŸ±×·¥ ¸®Äù½ºÆ®¸¦ ÇÑ´Ù. TDI Æ®·£½ºÆ÷Æ® µå¶óÀ̹ö°¡ ¿ø°ÝÁö·ÎºÎÅÍ µ¥ÀÌŸ±×·¥À» ¹ÞÀ» ¶§ ´ÙÀ½ÀÇ ³»¿ëÀÌ »ç½ÇÀ̶ó¸é Ŭ¶óÀ̾ðÆ®ÀÇ ¸®½Ãºê µ¥ÀÌŸ±×·¥ ¸®Äù½ºÆ®¸¦ ¿Ï·áÇÑ´Ù:
- ¹æ±Ý ¸®½ÃºêµÈ µ¥ÀÌŸ±×·¥ÀÌ IrpSp->FileObject¿¡ ÆÄÀÏ °´Ã¼¿¡ ÀÇÇØ¼ ±¸ÇöµÇ´Â ·ÎÄà ÁÖ¼Ò¿Í ÀÏÄ¡ÇÏ´Â ¸ñÀûÁö ÁÖ¼Ò¸¦ °¡Áö°í ÀÖ´Ù.
- ¹æ±Ý ¸®½ÃºêµÈ µ¥ÀÌŸ±×·¥ÀÌ IrpSp->Parameters¿¡ RemoteAddress¾È¿¡ ¼¼úµÈ °ª°ú ÀÏÄ¡ÇÏ´Â ±Ù¿øÁö ÁÖ¼Ò¸¦ °¡Áö°í Àְųª RemoteAddressLength°¡ 0À̰í RemoteAddress°¡ NULLÀÌ´Ù.
¸®½ÃºêµÈ µ¥ÀÌŸ±×·¥ÀÌ Irp->MdlAddress¿¡ ¸ÊµÈ Ŭ¶óÀÌ¾ðÆ® Á¦°ø ¹öÆÛ¿¡ ´ëÇØ¼ ³Ê¹« Å©´Ù¸é Æ®·£½ºÆ÷Æ®´Â ÀÌ ¹öÆÛ¸¦ ReceiveLength ¹ÙÀÌÆ®¸¦ °¡Áö°í ä¿ì°í Ŭ¶óÀ̾ðÆ®ÀÇ ¸®½Ãºê µ¥ÀÌŸ±×·¥ IRP¸¦ ¿Ï·áÇÑ´Ù. °á°úÀûÀ¸·Î Ŭ¶óÀÌ¾ðÆ®´Â ¸®½Ãºê µ¥ÀÌŸ±×·¥ ¸®Äù½ºÆ®¸¦ °¡Áö°í ÃæºÐÈ÷ Å« ¹öÆÛ¸¦ Á¦°øÇÏÁö ¾Ê´Â´Ù¸é ³¡ÀÌ À߸° µ¥ÀÌŸ±×·¥À» ¹Þ´Â´Ù.
¶ÇÇÑ ·ÎÄà Ŭ¶óÀÌ¾ðÆ®´Â Æ¯Á¤ ÁÖ¼Ò¿¡ ´ëÇØ¼ ClientEventReceiveDatagram ȤÀº ClientEventChainedReceiveDatagram Çڵ鷯¸¦ µî·ÏÇϱâ À§Çؼ TDI_SET_EVENT_HANDLER ¸®Äù½ºÆ®¸¦ Á¦½ÃÇÏ¹Ç·Î½á µ¥ÀÌŸ±×·¥À» ¹ÞÀ» ¼ö ÀÖ´Ù. TDI_RECEIVE_EXPEDITED¸¦ Á¦¿ÜÇÑ TDI_RECEIVE¿¡ ´ëÇÑ ·¹ÆÛ·±½º¿¡ ¸®½ºÆ®µÈ Ç÷¡±×µéÀ» °¡Áö°í ClientEvent(Chained)ReceiveDatagram ÇÔ¼ö¿¡ ReceiveDatagramFlags ¸Å°³º¯¼ö¸¦ ¼³Á¤ÇÏ¹Ç·Î½á Æ®·£½ºÆ÷Æ®´Â Ŭ¶óÀÌ¾ðÆ®·Î ÀÌ Á¤º¸¸¦ Á¦°øÇÑ´Ù. °Ô´Ù°¡ µ¥ÀÌŸ±×·¥ ÀεðÄÉÀ̼ÇÀ» À§Çؼ ReceiveDatagramFlags´Â ´ÙÀ½Áß Çϳª·Î ¼³Á¤µÉ ¼ö ÀÖ´Ù:
- TDI_RECEIVE_BROADCAST
- ¸®½ÃºêµÈ TSDU°¡ ºê·Îµåij½ºÆ®ÀÌ´Ù.
- TDI_RECEIVE_MULTICAST
- ¸®½ÃºêµÈ TSDU°¡ ¸ÖƼij½ºÆ®ÀÌ´Ù.
TDI Ŭ¶óÀÌ¾ðÆ®´Â ÇϺΠƮ·£½ºÆ÷Æ®ÀÇ ºê·Îµåij½ºÆ® ÁÖ¼Ò¸¦ ±¸ÇöÇÏ´Â ÆÄÀÏ °´Ã¼¸¦ ¿¾î¼ ºê·Îµåij½ºÆ® µ¥ÀÌŸ±×·¥À» ¹ÞÀ» ¼ö ÀÖ´Ù. ¾î¶² ºê·Îµåij½ºÆ® ÁּҴ Ŭ¶óÀÌ¾ðÆ®°¡ ÇϺÎÀÇ Æ®·£½ºÆ÷Æ®·Î TDI_QUERY_INFORMATION ¸®Äù½ºÆ®¸¦ Á¦¼¼ÇÏ¹Ç·Î½á ¾òÀ» ¼ö ÀÖ´Â µå¶óÀ̹ö ƯÁ¤ Æ÷¸ËÀ» °¡Áø´Ù. Æ®·£½ºÆ÷Æ®´Â Ŭ¶óÀÌ¾ðÆ®·Î ÇÏ¿©±Ý ºê·Îµåij½ºÆ® ÁּҷκÎÅÍ µ¥ÀÌŸ±×·¥À» º¸³»µµ·Ï Çã¶ôÇÏÁö ¾Ê´Â´Ù. ±×¸®°í Æ®·£½ºÆ÷Æ®´Â ºê·Îµåij½ºÆ® ÁÖ¼Ò¸¦ ¼¼úÇϴ Ŭ¶óÀÌ¾ðÆ® Á¦½Ã TDI_ASSOCIATE_ADDRESS ¸®Äù½ºÆ®¸¦ ½ÇÆÐÇÑ´Ù.
TdiBuildReceiveDatagram ÇÔ¼ö´Â Ŭ¶óÀÌ¾ðÆ®°¡ IRP¿¡ ä¿ì±â À§Çؼ »ç¿ëÇÏ´Â ¸ÅÅ©·ÎÀÌ´Ù.fill in the IRP.
|