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.