TDI_LISTEN

Ä¿³Î ¸ðµå Ŭ¶óÀÌ¾ðÆ®°¡ TDI_LISTEN ¸®Äù½ºÆ®¸¦ ÇÒ ¶§ Ä¿³Î ¸ðµå Ŭ¶óÀÌ¾ðÆ®´Â ÇϺÎÀÇ TDI Æ®·£½ºÆ÷Æ®·Î ÇÏ¿©±Ý ¿ø°ÝÁö·ÎºÎÅÍ ¿£µåÆ÷ÀÎÆ® ´ë ¿£µåÆ÷ÀÎÆ® ¿¬°áÀ» ÇÏ´Â Á¦°øÀ» À§Çؼ­ listenÇϵµ·Ï ¿ä±¸ÇÑ´Ù.

IRP

    IrpSp·Î½á ´ÙÀ½ÀÇ ¸®½ºÆ®¿¡ º¸¿©Áö´Â IRP¾È¿¡ ÀÚ½ÅÀÇ ½ºÅà ·ÎÄÉÀ̼ǿ¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¾ò±â À§Çؼ­ Æ®·£½ºÆ÷Æ®´Â ÁÖ¾îÁø Irp¸¦ °¡Áö°í IoGetCurrentIrpStackLocation ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. IRP¿¡ ´ëÇÑ Æ÷ÀÎÅÍ´Â Irp·Î½á ´ÙÀ½ÀÇ ¸®½ºÆ®¿¡ º¸¿©Áø´Ù. ÀÌ ¸®Äù½ºÆ®¿Í ¿¬°üµÈ IRP ¸â¹ö´Â ´ÙÀ½°ú °°´Ù:

    Irp->IoStatus.Status
    listen ¸®Äù½ºÆ®ÀÇ ¸¶Áö¸· »óŸ¦ ¼­¼úÇÑ´Ù. Æ®·£½ºÆ÷Æ®´Â IRP¸¦ ¿Ï·áÇϱâ Àü¿¡ ´ÙÀ½Áß¿¡ Çϳª·Î ÀÌ ¸â¹ö¸¦ ¼³Á¤ÇÑ´Ù:

    STATUS_SUCCESS
    STATUS_PENDING
    STATUS_INSUFFICIENT_RESOURCES
    STATUS_INVALID_CONNECTION

    IrpSp->MajorFunction
    IRP_MJ_INTERNAL_DEVICE_CONTROLÀ» ¼­¼úÇÑ´Ù. Æ®·£½ºÆ÷Æ®°¡ TDI_XXX ¸®Äù½ºÆ®¸¸À» ´Ù·ç´Â TdiDispatchInternalDeviceControl ·çƾÀ» ÀͽºÆ÷Æ®ÇÑ´Ù¸é ÀÌ ¸â¹ö¸¦ ¹«½ÃÇÒ ¼ö ÀÖ´Ù.

    IrpSp->MinorFunction
    TDI_LISTENÀ» ¼­¼úÇÑ´Ù.

    IrpSp->FileObject
    ¿¬°á ¿£µåÆ÷ÀÎÆ®¸¦ ±¸ÇöÇÏ´Â ¿­¸° ÆÄÀÏ °´Ã¼¸¦ °¡¸®Å²´Ù. ÀÌ ¿¬°á¿¡ ´ëÇØ¼­ À¯ÁöÇÏ´Â »óÅ·ÎÀÇ Á¢±ÙÀ» À§Çؼ­ Æ®·£½ºÆ÷Æ®´Â FsContext¿Í °¡´ÉÇÏ´Ù¸é FsContext2 Çʵ带 »ç¿ëÇÑ´Ù.

    Ŭ¶óÀÌ¾ðÆ®°¡ Æ®·£½ºÆ÷Æ®·Î ¼º°øÀûÀÎ TDI_ASSOCIATE_ADDRESS ¸®Äù½ºÆ®¸¦ ÇÒ ¶§ ÀÌ ¿¬°á ¿£µåÆ÷ÀÎÆ®´Â ¹Ì¸® ·ÎÄà ÁÖ¼Ò¿Í ¿¬°üµÇ¾îÀÖ´Ù.

    IrpSp->Parameters
    DI_REQUEST_KERNEL ±¸Á¶Ã¼¿Í ¿¬°üµÈ TDI_REQUEST_KERNEL_LISTEN ±¸Á¶Ã¼¸¦ °¡¸®Å²´Ù.

    Æ®·£½ºÆ÷Æ®·Î ÇÏ¿©±Ý Áö¿¬µÈ ¿¬°á ½ÂÀÎÀ» Çϵµ·ÏÇÏ´Â TDI_QUERY_ACCEPT¸¦ °¡Áö°í Ŭ¶óÀÌ¾ðÆ®´Â RequestFlags ¸â¹ö¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù: Ŭ¶óÀÌ¾ðÆ®·Î ÀÌ listen ¸®Äù½ºÆ®¸¦ ¿Ï·áÇϱâ À§Çؼ­ ÀûÀýÇÑ ¿¬°á Á¦°øÀÌ RequestConnectionInformation ÇÔ¼ö¸¦ È£ÃâÇÏ¹Ç·Î½á ¼­¼úµÇ¸é ¿ø°ÝÁö·ÎºÎÅÍ µé¾î¿Ã ¶§ Ŭ¶óÀÌ¾ðÆ®´Â TDI_ACCEPT ¸®Äù½ºÆ®¸¦ Á¦½ÃÇÏ¹Ç·Î½á ¿¬°áÀ» ¹Þ¾ÆµéÀ̵çÁö TDI_DISCONNECT ¸®Äù½ºÆ®¸¦ °¡Áö°í ¿ø°ÝÁö ¿¬°á Á¦°øÀ» °ÅÀýÇϵçÁö¸¦ °áÁ¤ÇÒ ¼ö ÀÖ´Ù.

    ¹Ý¸é¿¡ RequestFlags°¡ 0 ÀÏ ¶§ ÇϺÎÀÇ Æ®·£½ºÆ÷Æ®´Â Áï½Ã µé¾î¿À´Â ÀûÀýÇÑ ¿¬°á Á¦°øÀ» ¹Þ¾Æµé¿©¾ßÇÑ´Ù. TDI_QUERY_ACCEPT°¡ ¼³Á¤µÇÁö¸¸ Æ®·£½ºÆ÷Æ®°¡ Áö¿¬µÈ ¿¬°á ½ÂÀÎÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù¸é Æ®·£½ºÆ÷Æ®´Â ÀÌ listen ¸®Äù½ºÆ®¸¦ ½ÇÆÐÇÑ´Ù.

    Ŭ¶óÀÌ¾ðÆ®´Â Æ®·£½ºÆ÷Æ®°¡ ´ÙÀ½°ú °°ÀÌ ¿ø°ÝÁö·ÎºÎÅÍ ¿¬°á Á¦°øÀ» ¹Þ¾ÆµéÀÌ´ÂÁö¸¦ °áÁ¤Çϱâ À§Çؼ­ »ç¿ëÇÏ´Â RequestConnectionInformation¿¡ TDI_CONNECTION_INFORMATION ŸÀÔÀÇ ¹öÆÛ¾È¿¡ Á¤º¸¸¦ Á¦°øÇÑ´Ù:

    UserData
    ¿¬°áÀ» ¸®Äù½ºÆ®ÇÏ´Â ¿ø°ÝÁö·Î Àü¼ÛÇÏ´Â Æ®·£½ºÆ÷Æ®¸¦ À§Çؼ­ È£ÃâÀÚ Á¦°ø µ¥ÀÌŸÀÇ ¹öÆÛ¸¦ °¡¸®Å²´Ù. Æ®·£½ºÆ÷Æ®°¡ Áö¿¬µÈ ¿¬°á ½ÂÀÎÀ» Áö¿øÇϰí Ŭ¶óÀÌ¾ðÆ®°¡ DI_QUERY_ACCEPT¸¦ °¡Áö°í RequestFlags¸¦ ¼³Á¤ÇÑ´Ù¸é ÀÌ ¸â¹ö´Â NULLÀÌ´Ù.

    UserDataLength
    UserData°¡ NULLÀ̸é UserData¿¡ ¹öÆÛÀÇ ¹ÙÀÌÆ® »çÀÌÁ ¼­¼úÇÑ´Ù.

    Options
    TDI_REQUEST_KERNEL_LISTEN ±¸Á¶Ã¼ÀÇ RequestFlags ¸â¹ö¾È¿¡ ¼³Á¤µÈ °ª¿¡ ´ëÀÀµÈ´Ù.

    OptionsLength
    sizeof(ULONG)À¸·Î ¼³Á¤µÇ¾î¾ßÇÑ´Ù; TDI_QUERY_ACCEPT°¡ RequestFlags¿¡ ¼³Á¤µÇÁö ¾Ê´Â´Ù¸é ¹«ÀǹÌÇÏ´Ù.

    RemoteAddress
    ¿¬°á Á¦°øÀ» ¿¹»óÇÏ°í ·ÎÄÃÀÇ Å¬¶óÀÌ¾ðÆ®°¡ listenÇÏ´Â ¿ø°ÝÀÇ ÁÖ¼Ò¸¦ ¼­¼úÇÏ´Â ¹öÆÛ¸¦ °¡¸®Å²´Ù. ÇϺÎÀÇ Æ®·£½ºÆ÷Æ®°¡ ƯÁ¤ ÁÖ¼Ò¸¦ ¼­¼úÇϱâ À§Çؼ­ ±ÔÁ¤°ú ½ÅÅýº¸¦ Á¤ÀÇÇÑ´Ù¸é ÀÌ ¼­¼úÀº ƯÁ¤ ÁÖ¼Ò°¡ µÉ ¼ö ÀÖ´Ù. ÀÌ ¸â¹ö´Â Ŭ¶óÀÌ¾ðÆ®°¡ ¿ø°ÝÁö·ÎºÎÅÍ ¿£µåÆ÷ÀÎÆ® ´ë ¿£µåÆ÷ÀÎÆ® ¿¬°áÀ» ¹Þ¾ÆµéÀÏ °ÍÀÌ´Ù¶ó´Â °ÍÀ» ÀεðÄÉÀÌÆ®ÇϹǷνá NULLÀÏ ¼ö ÀÖ´Ù.

    RemoteAddressLength
    RemoteAddress¿¡ ¹öÆÛÀÇ ¹ÙÀÌÆ® »çÀÌÁ ¼­¼úÇÑ´Ù. 0Àº ¿ø°ÝÁö·ÎºÎÅÍ ¿¬°á Á¦°øÀÌ ÀÌ Å¬¶óÀÌ¾ðÆ®·Î ¹Þ¾ÆµéÀÏ ¼ö ÀÖ´Ù´Â °ÍÀ» ÀεðÄÉÀÌÆ®ÇÑ´Ù.

    TDI_REQUEST_KERNEL ±¸Á¶Ã¼¾È¿¡ ReturnConnectionInformation¿¡ È£ÃâÀÚ Á¦°ø ¹öÆÛ´Â TDI_CONNECTION_INFORMATION ±¸Á¶Ã¼·Î½á Æ÷¸ËµÈ´Ù. Æ®·£½ºÆ÷Æ®´Â listen ¸®Äù½ºÆ®ÀÇ ¿Ï·á¿¡¼­ ÀÌ ¹öÆÛ¾È¿¡ ¿ø°ÝÁö·ÎºÎÅÍ ¿¬°á Á¦°ø¿¡ ´ëÇÑ Á¤º¸¸¦ ¸®ÅÏÇÑ´Ù.

ÁÖ¼®

TDI_QUERY_ACCEPT°¡ RequestFlags¾È¿¡ ¼³Á¤µÆ´ÂÁö¿¡ ÀÇÁ¸ÇÏ¿© Æ®·£½ºÆ÷Æ®´Â ·ÎÄÃÀÇ Å¬¶óÀÌ¾ðÆ®¸¦ ´ë½ÅÇÏ¿© Á¦°øµÈ ¿ø°ÝÀÇ ¿¬°áÀ» ¹Þ¾ÆµéÀÓÀ¸·Î½á ȤÀº ±× Ŭ¶óÀÌ¾ðÆ®·Î ±×·¯ÇÑ Á¦°øÀÇ ½ÂÀÎÀ» Áö¿¬Çϰųª °ÅÀýÇϹǷνá listen ¸®Äù½ºÆ®¸¦ ¿Ï·áÇÑ´Ù.

listen ¸®Äù½ºÆ®¸¦ ¼º°øÀûÀ¸·Î ½ÃÀÛÇϱâ À§Çؼ­ ·ÎÄÃÀÇ Å¬¶óÀÌ¾ðÆ®´Â idle ¿¬°á ¿£µåÆ÷ÀÎÆ®¿Í ¿¬°üµÈ Æ®·£½ºÆ÷Æ® ÁÖ¼Ò¸¦ °¡Á®¾ßÇÑ´Ù. Áï ¿¬°áÀ» ±¸ÇöÇÏ´Â IrpSp->FileObject¿¡ ÆÄÀÏ °´Ã¼¸¦ À§Çؼ­ Æ®·£½ºÆ÷Æ®´Â TDI_ASSOCIATE_ADDRESS ¸®Äù½ºÆ®¸¦ ¸¸Á·½ÃŲ´Ù. ¿¬°á ¿£µåÆ÷ÀÎÆ®¸¦ À§Çؼ­ °¢°¢ÀÇ Æ®·£½ºÆ÷Æ®°¡ FsContext³ª FsContext2¿¡ À¯ÁöÇÏ´Â ÄÁÅØ½ºÆ®ÀÇ ºÎºÐÀº Æ®·£½ºÆ÷Æ®°¡ °ü°è¸¦ ¸ÎÀ» ¶§ ¼³Á¤ÇÏ´Â ¿¬°üµÈ ÁÖ¼Ò¸¦ ±¸ÇöÇÏ´Â ÆÄÀÏ °´Ã¼¿¡ ´ëÇÑ Æ÷ÀÎÅÍÀÌ´Ù.

¼º°øÀûÀÎ TDI_ASSOCIATE_ADDRESS ¸®Äù½ºÆ®¸¦ Á¦½ÃÇÑ ÈÄ¿¡ Ŭ¶óÀÌ¾ðÆ®´Â Å¬¶óÀÌ¾ðÆ®°¡ Á¦°øµÈ ¿¬°áÀ» ¹Þ¾ÆµéÀÏ ¶§±îÁö Æ®·£½ºÆ÷Æ® µå¶óÀ̹ö°¡ FIFO ¼ø¼­·Î ó¸®ÇؾßÇÏ´Â TDI_LISTEN ¸®Äù½ºÆ®ÀÇ ¼ö¸¦ Á¦½ÃÇÒ ¼ö ÀÖ´Ù.

Æ®·£½ºÆ÷Æ®´Â µå¶óÀ̹ö °áÁ¤ ¼ø¼­·Î ¸ðµå Ŭ¶óÀÌ¾ðÆ®·ÎºÎÅÍ µé¾î¿À´Â ¸®Äù½ºÆ®¸¦ ó¸®ÇÒ ¼ö ÀÖ´Ù.

TDI_LISTEN ¸®Äù½ºÆ®¸¦ Çϱâ Àü¿¡ Ŭ¶óÀÌ¾ðÆ®°¡ ¿¬°á ¿£µåÆ÷ÀÎÆ®¿Í ¿¬°üµÈ ÁÖ¼Ò»ó¿¡¼­ ClientEvent(Chained)Receive¿Í ClientEvent(Chained)ReceiveExpedited Çڵ鷯¸¦ µî·ÏÇß´Ù¸é Æ®·£½ºÆ÷Æ®°¡ Ŭ¶óÀ̾ðÆ®ÀÇ listen ¸®Äù½ºÆ®¸¦ ¿Ï·áÇϱâ Àü¿¡ ¿ø°ÝÁö·ÎºÎÅÍ ¿¬°áÀ» ¹Þ¾ÆµéÀÌÀÚ ¸¶ÀÚ ¸®½Ãºê´Â ±× Ŭ¶óÀÌ¾ðÆ®¸¦ À§Çؼ­ µé¾î¿Ã ¼ö ÀÖ´Ù. ±×·¯ÇÑ Å¬¶óÀÌ¾ðÆ®´Â listen ¸®Äù½ºÆ®¸¦ ÇÏÁö¸¶ÀÚ ¼º¸³µÇ´Â ¿£µåÆ÷ÀÎÆ® ´ë ¿£µåÆ÷ÀÎÆ® ¿¬°áÀ» À§Çؼ­ ÁغñµÇ¾î¾ßÇÑ´Ù. ±×¸®°í Æ®·£½ºÆ÷Æ®´Â listen ¸®Äù½ºÆ®ÀÇ ¿Ï·á¸¦ °¡Áö°í µ¿½Ã¿¡ ±× Ŭ¶óÀÌ¾ðÆ®·Î ¸®½Ãºê¸¦ ÀεðÄÉÀÌÆ®Çϱâ À§Çؼ­ ÁغñµÇ¾î¾ßÇÑ´Ù

ÀϹÝÀûÀ¸·Î TDI Æ®·£½ºÆ÷Æ® µå¶óÀ̹ö´Â ´ë±â ¸®Äù½ºÆ®°¡ ¿¬°üµÈ ·ÎÄà ÁÖ¼Ò¸¦ ±¸ÇöÇϴ Ŭ¶óÀ̾ðÆ®ÀÇ ¿­¸° ÆÄÀÏ °´Ã¼»ó¿¡¼­ Áö¿¬µÇ´Â ÇÑ µî·ÏµÈ ClientEventConnect Çڵ鷯¸¦ È£ÃâÇÒ ¼ö ¾ø´Ù. ±×·¯³ª µå¶óÀ̹ö´Â Æ®·£½ºÆ÷Æ®°¡ IrpSp->Parameters.RequestConnectionInformation¿¡ Á¦°øµÈ ¿ø°ÝÀÇ ÁÖ¼Ò ½ÂÀÎ criteria°¡ ¿Ï·áµÊÀ¸·ÎºÎÅÍ ´ë±â ¿¬»êÀ» ¹æÇØÇÒ °ÍÀÌ´Ù´Â °ÍÀ» °áÁ¤ÇÑ´Ù¸é ±×·¯ÇÑ ´ë±â°¡ Áö¿¬ÁßÀÏ ¶§ ClientEventConnect ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù.

Ŭ¶óÀÌ¾ðÆ® Á¦°ø ¿ø°ÝÁöÀÇ ÁÖ¼ÒÈ­µÈ Á¤º¸´Â Æ®·£½ºÆ÷Æ®°¡ Áö¿¬µÈ ´ë±â ¸®Äù½ºÆ®¸¦ À§Çؼ­ RequestFlags¸¦ üũÇϱâ Àü¿¡ Àû¿ëµÈ ÇÊÅÍ·Î½á µ¿ÀÛÇÑ´Ù. µé¾î¿À´Â ¿¬°á Á¦°øÀÌ ´ë±â IRP¾È¿¡ ¸í½ÃµÈ ÁÖ¼Ò¿Í ¾î¿ï¸®Áö ¾Ê´Â ¿ø°ÝÁöÀÇ ÁּҷκÎÅÍ µé¾î¿ÔÀ» ¶§ Æ®·£½ºÆ÷Æ®´Â Ŭ¶óÀÌ¾ðÆ®¸¦ À§Çؼ­ ´ë±â¸¦ ¿Ï·áÇÒ ¼ö ¾ø´Ù. ¿ø°ÝÁö·ÎºÎÅÍ µé¾î¿À´Â ¿¬°á Á¦°øÀÌ ÁÖ¾îÁø ÁÖ¼Ò ½ÂÀÎ criteria¸¦ ¸¸Á·ÇÒ ¶§ Æ®·£½ºÆ÷Æ®´Â ´ÙÀ½Áß ÇϳªÀÇ ¹æ¹ýÀ¸·Î Ŭ¶óÀ̾ðÆ®ÀÇ ´ë±â ¸®Äù½ºÆ®¸¦ ¸¸Á·½Ãų ¼ö ÀÖ´Ù:

  • TDI_QUERY_ACCEPT°¡ RequestFlags¿¡ ¼³Á¤µÇÁö ¾Ê°Å³ª µå¶óÀ̹ö°¡ Áö¿¬µÈ ¿¬°á ½ÂÀÎÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù¸é Æ®·£½ºÆ÷Æ®´Â ¿ø°ÝÁö·Î ½ÂÀÎÀ» º¸³»°í IRPÀÇ »óÅ ºí·°À» ¼³Á¤Çϰí ÅëÁ¦¸¦ ¸®ÅÏÇÏ´Â °Í°ú ¸¶Âù°¡Áö·Î ÀûÀýÇÑ µ¥ÀÌŸ¸¦ °¡Áö°í IrpSp->Parameters.ReturnConectionInformation¿¡ ¹öÆÛ¸¦ ¼³Á¤ÇÑ´Ù.
  • TDI_QUERY_ACCEPT°¡ RequestFlags¿¡ ¼³Á¤µÈ´Ù¸é Æ®·£½ºÆ÷Æ®´Â IrpSp->Parameters.ReturnConnectionInformation¿¡ ¹öÆÛ¸¦ ¼³Á¤Çϰí Á¦°øµÈ ¿¬°á¿¡ ´ëÇÑ Å¬¶óÀ̾ðÆ®ÀÇ ½ÂÀΠȤÀº °ÅÀýÀ» ±â´Ù¸®±â À§Çؼ­ ŸÀӾƿô °£°ÝÀ» ¼³Á¤ÇÑ´Ù. ±×¸®°í ÅëÁ¦¸¦ ¸®ÅÏÇÑ´Ù. ·ÎÄÃÀÇ Å¬¶óÀÌ¾ðÆ®´Â Å¸ÀӾƿô °£°Ý¾È¿¡¼­ Á¦°øµÈ ¿¬°áÀ» ½ÂÀÎÇϰųª °ÅÀýÇØ¾ßÇÑ´Ù: ±×·¸Áö ¾ÊÀ¸¸é Æ®·£½ºÆ÷Æ®´Â ¿ø°ÝÁö·Î °Å·¯Áñ º¸³»¾ßÇÑ´Ù.
TDI µå¶óÀ̹ö´Â ºÎºÐÀûÀÎ ÁÖ¼Ò¸¦ ´Ù·ç´Â ¹æ¹ýÀÌ ¹Ù²ï´Ù. Æ®·£½ºÆ÷Æ® ÁÖ¼ÒÀÇ ½ÅÅýº°¡ TDI Æ®·£½ºÆ÷Æ® µå¶óÀ̹ö ƯÁ¤À̱⠶§¹®¿¡ ºÎºÐÀûÀÎ ÁÖ¼Ò¸¦ ¼­¼úÇÏ´Â ¸ÅÄ¿´ÏÁò ¶ÇÇÑ °¢°¢ÀÇ Æ®·£½ºÆ÷Æ® µå¶óÀ̹ö ƯÁ¤ÀÌ´Ù.

´ë±âÁß¿¡ ºÎºÐÀûÀÎ ÁÖ¼Ò ¼­¼ú Áö¿ø¿¡ ´õÇØ¼­ TDI Æ®·£½ºÆ÷Æ®´Â ±×µéÀÇ Å¬¶óÀÌ¾ðÆ®¿¡ ÀÇÇØ¼­ QOS(quality-of-service) ¼­¼úÀ» Áö¿øÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦µé¾î Æ®·£½ºÆ÷Æ®´Â TDI µå¶óÀ̹ö ƯÁ¤ ½ÅÅýº¿Í semanticÀ» °¡Áö°í º¯¼öÈ­µÈ ±æÀÌ·Î Ä«¿îÆ®µÈ ¹®ÀÚ¿­À» »ç¿ëÇÏ¿© Ŭ¶óÀÌ¾ðÆ®·Î ÇÏ¿©±Ý QOS¸¦ ¼­¼úÇϵµ·Ï ÇÑ´Ù.

TdiBuildListenÀº Ŭ¶óÀÌ¾ðÆ®°¡ ÀÌ IRP¸¦ ä¿ì±â À§Çؼ­ »ç¿ëÇÏ´Â ¸ÅÅ©·ÎÀÌ´Ù.