TdiRegisterPnPHandlers

NTSTATUS
   TdiRegisterPnPHandlers(
       IN PTDI_CLIENT_INTERFACE_INFO ClientInterfaceInfo,
       IN ULONG InterfaceInfoSize,
       OUT HANDLE *BindingHandle
       );

TdiRegisterPnPHandlers ÇÔ¼ö´Â ±â°è¿¡¼­ »õ·Î¿î NIC ¹ß°ßÀ̳ª ±â°è¿¡¼­ Á¸ÀçÇÏ´Â NICÀÇ Á¦°Å, ½Ã½ºÅÛ Àü¿ø»óÅ º¯È­, ±×¸®°í ÇϺÎÀÇ Æ®·£½ºÆ÷Æ®¿¡ ÀÇÇØ¼­ µî·ÏµÇ°í µî·ÏÇØÁ¦µÇ´Â ³×Æ®¿÷ ÁÖ¼ÒÀÇ Ãâ¹ß°ú µµÂø°ú °°Àº µ¿Àû PnP À̺¥Æ®ÀÇ ¼øÂ÷ÀûÀÎ Å뺸¸¦ ¹Þ±âÀ§Çؼ­ Ŭ¶óÀÌ¾ðÆ® Á¦°ø ClientPnPXxx ·çƾÀÇ ¸ðÀ½À» µî·ÏÇÑ´Ù.

¸Å°³º¯¼ö

ClientInterfaceInfo
½ºÅÿ¡¼­ ÀÌ ±¸Á¶Ã¼·Î ȤÀº ´ÙÀ½°ú °°ÀÌ Æ÷¸ËµÇ´Â È£ÃâÀÚ ÇÒ´ç, ±×¸®°í 0À¸·Î ÃʱâÈ­µÈ ¹öÆÛ¸¦ °¡¸®Å²´Ù:

typedef struct _TDI20_CLIENT_INTERFACE_INFO {

    union {

        struct {

            UCHAR MajorTdiVersion; // ÇöÀç 2

            UCHAR MinorTdiVersion; // ÇöÀç 0

        };

        // ´ÙÀ½Àº »ç¿ëÇÏÁö ¾Ê´Â´Ù. (¾²ÀÌÁö¾Ê´Â Æ®·£½ºÆ÷Æ®)

        USHORT TdiVersion;

    };

    USHORT Unused;

    PUNICODE_STRING ClientName;

    TDI_PNP_POWER_HANDLER  PnPPowerHandler;

    union {

        TDI_BINDING_HANDLER BindingHandler;

        // ´ÙÀ½Àº »ç¿ëÇÏÁö ¾Ê´Â´Ù. (¾²ÀÌÁö¾Ê´Â Æ®·£½ºÆ÷Æ®)

        struct {

            TDI_BIND_HANDLER BindHandler;

            TDI_UNBIND_HANDLER UnBindHandler;

        };

    };

    union {

        struct {

            TDI_ADD_ADDRESS_HANDLER_V2 AddAddressHandlerV2;

            TDI_DEL_ADDRESS_HANDLER_V2 DelAddressHandlerV2;

        };

        // ´ÙÀ½Àº »ç¿ëÇÏÁö ¾Ê´Â´Ù. (¾²ÀÌÁö¾Ê´Â Æ®·£½ºÆ÷Æ®)

        struct {

            TDI_ADD_ADDRESS_HANDLER AddAddressHandler;

            TDI_DEL_ADDRESS_HANDLER DelAddressHandler;

        };

    };

} TDI20_CLIENT_INTERFACE_INFO, *PTDI20_CLIENT_INTERFACE_INFO;



typedef TDI20_CLIENT_INTERFACE_INFO TDI_CLIENT_INTERFACE_INFO;

InterfaceInfoSize
ClientInterfaceInfo¿¡ ¹öÆÛÀÇ ¹ÙÀÌÆ® ¼ö¸¦ ¼­¼úÇÑ´Ù.

BindingHandle
TdiRegisterPnPHandlers ÇÔ¼ö°¡ È£ÃâÀ» ¼º°øÇÑ´Ù¸é ºÒÅõ¸íÇÑ TDI Á¦°ø ÇÚµéÀ» ¸®ÅÏÇϴ ȣÃâÀÚ Á¦°ø º¯¼öÀÇ ÁÖ¼Ò¸¦ ¼­¼úÇÑ´Ù. È£ÃâÀÚ´Â TdiDeregisterPnPHandlers ÇÔ¼ö³ª ¸Å¿ì µå¹°°Ô TdiEnumerateAddresses ÇÔ¼ö·ÎÀÇ ¼øÂ÷ÀûÀΠȣÃâÀ» À§Çؼ­ ÀÌ ÇÚµéÀ» ÀúÀåÇØ¾ßÇÑ´Ù.

¸®Åϰª

TdiRegisterPnPHandlers ÇÔ¼ö´Â Á¦°øµÈ ClientPnPXxx ·çƾÀÌ ¼øÂ÷ÀûÀÎ PnP¿Í Àü¿ø»óÅ º¯È­ À̺¥Æ®¸¦ ÀνÄÇÑ´Ù¸é STATUS_SUCCESS¸¦ ¸®ÅÏÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é ´ÙÀ½Áß Çϳª¸¦ ¸®ÅÏÇÒ ¼ö ÀÖ´Ù:

TDI_STATUS_BAD_VERSION
È£ÃâÀÚ°¡ TDI_CURRENT_VERSIONº¸´Ù Å« ¹«¾ð°¡·Î ClientInterfaceInfo¿¡ ±¸Á¶Ã¼ ¾È¿¡ ¹öÀü ¸â¹ö¸¦ ¼³Á¤ÇÑ´Ù¸é È£ÃâÀÚ´Â »óÀ§ ·¹º§ ³×Æ®¿÷ ÄÄÆ÷³ÍÆ®·Î ÀÌ ¸®ÅϰªÀ» Àü´ÞÇÏÁö ¸»¾Æ¾ßÇÑ´Ù.

TDI_STATUS_BAD_CHARACTERISTICS
ÁÖ¾îÁø InterfaceInfoSize °ªÀÌ sizeof(TDI_CLIENT_INTERFACE_INFO)º¸´Ù ÀÛ´Ù. È£ÃâÀÚ´Â »óÀ§ ·¹º§ ³×Æ®¿÷ ÄÄÆ÷³ÍÆ®·Î ÀÌ ¸®ÅϰªÀ» Àü´ÞÇÏÁö ¸»¾Æ¾ßÇÑ´Ù.

STATUS_INSUFFICIENT_RESOURCES
TDI´Â µî·Ï ¸®Äù½ºÆ®¸¦ ó¸®Çϱâ À§Çؼ­ ÇÊ¿äÇÑ Å¬¶óÀ̾ðÆ®ÀÇ Å뺸¿Í ´Ù¸¥ ÀÚ¿øÀ» À§Çؼ­ »óŸ¦ À¯ÁöÇÏ´Â ¹öÆÛ¸¦ ÇÒ´çÇÏÁö ¾Ê¾Ò´Ù.(¾Æ¸¶µµ TdiRegisterPnPHandlers ÇÔ¼ö·ÎÀÇ ¼øÂ÷ÀûÀΠȣÃâÀº ÇöÀç »ç¿ëÁßÀÎ ÀÚ¿øÀÌ ÇØÁ¦µÈ´Ù¸é ÀÌ ÀÌÀ¯¸¦ À§Çؼ­ ½ÇÆÐÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù.)

ÁÖ¼®

È£ÃâÀÚ´Â PnP/Àü¿ø»óÅ º¯È­, ¹ÙÀεù º¯È­, ±×¸®°í ³×Æ®¿÷ ÁÖ¼Ò º¯È­ÀÇ ¼øÂ÷ÀûÀÎ Å뺸¸¦ ¹Þ±â À§Çؼ­ ClientInterfaceInfo¿¡ ´ÙÀ½ Á¤º¸¸¦ Á¦°øÇؾßÇÑ´Ù:

  • MajorTdiVersionÀº 2³ª TDI_CURRENT_MAJOR_VERSIONÀ¸·Î ¼³Á¤ÇÑ´Ù.
  • MinorTdiVersionÀº 0À̳ª TDI_CURRENT_MINOR_VERSIONÀ¸·Î ¼³Á¤ÇÑ´Ù.
  • ClientNameÀº ·¹Áö½ºÆ®¸® registry HKLM\System\CCS\Services Æ®¸®¿¡ Ŭ¶óÀÌ¾ðÆ®·Î ¸í¸íµÈ ۸¦ ¼­¼úÇÏ´Â ¹öÆÛÈ­µÈ À¯´ÏÄÚµåÀÇ ÁÖ¼Ò¸¦ ¼³Á¤ÇÑ´Ù.
  • PnPPowerHandler´Â È£ÃâÀÚÀÇ ClientPnPPowerChange ·çƾÀÇ ¿£Æ®¸® Æ÷ÀÎÆ®¸¦ ¼³Á¤ÇÑ´Ù.
  • BindingHandler´Â È£ÃâÀÚÀÇ ClientPnPBindingChange ·çƾÀÇ ¿£Æ®¸® Æ÷ÀÎÆ®¸¦ ¼³Á¤ÇÑ´Ù.
  • AddAddressHandlerV2´Â È£ÃâÀÚÀÇ ClientPnPAddNetAddress ·çƾÀÇ ¿£Æ®¸® Æ÷ÀÎÆ®¸¦ ¼³Á¤ÇÑ´Ù.
  • DelAddressHandlerV2´Â È£ÃâÀÚÀÇ ClientPnPDelNetAddress ·çƾÀÇ ¿£Æ®¸® Æ÷ÀÎÆ®¸¦ ¼³Á¤ÇÑ´Ù.
TdiRegisterPnPHandlers ÇÔ¼ö¿¡ ´ëÇÑ ¼º°øÀûÀΠȣÃâÀÇ ¸®ÅÏ¿¡¼­ ClientPnPBindingChange¿Í ClientPnPAddNetAddress ·çƾÀº ÀÌ¹Ì µî·ÏµÈ ³×Æ®¿÷ ÁÖ¼Ò¿Í Æ®·£½ºÆ÷Æ®¿¡ ´ëÇØ¼­ TDI°¡ ÇöÀç ÀÌ¿ëÇÒ ¼ö ÀÖ´Â ¸ðµç ½Ã½ºÅÛ ¼³Á¤ ½Ã°£ Á¤º¸¸¦ °¡Áö°í ÇѹøÀÌ»ó È£ÃâµÆ´Ù. Áï TDI´Â ¹æ±Ý µî·ÏµÈ Ŭ¶óÀ̾ðÆ®ÀÇ PnP ·çƾÀ¸·Î ´ÙÀ½ÀÇ ÃʱâÈ­½Ã¿¡ È£ÃâÀ» ÇÑ´Ù:

  • ClientPnPBindingChange ÇÔ¼ö´Â ÀÌ¹Ì TDI¸¦ °¡Áö°í µî·ÏµÈ Æ®·£½ºÆ÷Æ®¿¡ ÀÇÇØ¼­ ¼º¸³µÈ Æ®·£½ºÆ÷Æ®¿Í NICÀÇ ¹ÙÀεùÀ» ±¸ÇöÇϱâ À§Çؼ­ »ý¼ºµÈ ÀåÄ¡ °´Ã¼ÀÇ ¹öÆÛÈ­µÈ À̸§°ú °ªÀÌ TDI_PNP_OP_ADDÀÎ PnPOpcode¸¦ °¡Áö°í ÇѹøÀÌ»ó È£ÃâµÆ´Ù. ¶ÇÇÑ ClientPnPBindingChange ÇÔ¼ö´Â ±â´ëµÇ´Â Æ®·£½ºÆ÷Æ®¿Í NICÀÇ ¹ÙÀεù¿¡¼­ ³×Æ®¿÷ I/O ¿¬»êÀ» ¼öÇàÇϱâ À§Çؼ­ ÁغñµÈ ÀÚ½ÅÀ» ¼±¾ðÇÑ TDI Æ®·£½ºÆ÷Æ® µå¶óÀ̹öÀÇ ¹öÆÛÈ­µÈ À̸§°ú °ªÀÌ TDI_PNP_OP_PROVIDERREADYÀÎ PnPOpcode¸¦ °¡Áö°í ÇѹøÀÌ»ó È£ÃâµÆ´Ù.

    °ªÀÌ TDI_PNP_OP_ADDÀÎ PnPOpcode¸¦ °¡Áø ClientPnPBindingChange ÇÔ¼ö·ÎÀÇ °¢°¢ÀÇ È£Ãâ¿¡¼­ ÀÌ ·çƾÀº ZwCreateFile ÇÔ¼ö·ÎÀÇ È£ÃâÀ» °¡Áö°í ÇϺÎÀÇ Æ®·£½ºÆ÷Æ®¿Í NICÀÇ ¹ÙÀεù¿¡ ÀÚ½ÅÀ» ¹ÙÀεùÇÒ °ÍÀÎÁö¸¦ °áÁ¤ÇÑ´Ù.(ZwCreateFile ÇÔ¼ö È£Ãâ¿¡ ´ëÇÑ Æ¯Â¡¿¡ ´ëÇØ¼­´Â Ä¿³Î ¸ðµå ·¹ÆÛ·±½º¸¦ ºÁ¶ó.)

  • ClientPnPAddNetAddress ÇÔ¼ö´Â TdiRegisterNetworkAddress ÇÔ¼ö·ÎÀÇ È£ÃâÀ» °¡Áö°í ¼º¸³µÈ ¹ÙÀεù»ó¿¡¼­ Æ®·£½ºÆ÷Æ®°¡ ÀÌ¹Ì µî·ÏÇÑ °¢°¢ÀÇ ³×Æ®¿÷ ÁÖ¼Ò¸¦ °¡Áö°í ÇѹøÀÌ»ó È£ÃâµÆ´Ù.

    ClientPnPAddNetAddress ÇÔ¼ö·ÎÀÇ °¢°¢ÀÇ È£Ãâ¿¡¼­ ÀÌ ·çƾÀº ÀÌ ³×Æ®¿÷ ÇÁ·ÎÅäÄÝÀ» ÀνÄÇϰí Áï½Ã ÅëÁ¦¸¦ ¸®ÅÏÇÏ´ÂÁö¸¦ °áÁ¤Çϱâ À§Çؼ­ ÀÔ·Â Address¿¡ ±¸Á¶Ã¼ÀÇ AddressType ¸â¹ö¸¦ °Ë»çÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é ClientPnPAddNetAddress ÇÔ¼ö´Â Ŭ¶óÀÌ¾ðÆ®°¡ ÀÌ¹Ì ÀÌ Æ®·£½ºÆ÷Æ®¿Í ÀÚ½ÅÀ» ¹ÙÀεùÇß´ÂÁö¸¦ °áÁ¤Çϱâ À§Çؼ­ DeviceName¿¡ ¹öÆÛÈ­µÈ ¹®ÀÚ¿­À» °Ë»çÇÑ´Ù. ±×·¸´Ù¸é ClientPnpAddNetAddress ÇÔ¼ö´Â À¯È¿ÇÏ°í µî·ÏµÈ ³×Æ®¿÷ ÁÖ¼ÒÀÇ Å¬¶óÀÌ¾ðÆ® ÇÒ´ç ³»ºÎ ¸®½ºÆ®¿¡ ´ëÇÑ ¿£Æ®¸®¸¦ Ãß°¡Çϱâ À§Çؼ­ ÀÔ·Â ÇÁ·ÎÅäÄÝ Æ¯Á¤ ÁÖ¼Ò Á¤º¸¸¦ »ç¿ëÇÑ´Ù. Ŭ¶óÀÌ¾ðÆ®´Â ³×Æ®¿÷ ÁÖ¼Ò¸¦ ¿­°í ´Ù½Ã ZwCreateFile ÇÔ¼öÀÇ È£ÃâÀ» °¡Áö°í ±× ÈÄ¿¡ ¼øÂ÷ÀûÀÎ ³×Æ®¿÷ I/O ¸®Äù½ºÆ®¸¦ À§Çؼ­ µî·ÏµÈ ³×Æ®¿÷ ÁÖ¼Ò¸¦ »ç¿ëÇÑ´Ù.

ClientPnPBindingChange ÇÔ¼ö´Â ¶Ç´Ù¸¥ Æ®·£½ºÆ÷Æ®¿Í NICÀÇ ¹ÙÀεùÀÌ ¼º¸³µÇ°í Æ®·£½ºÆ÷Æ®°¡ TdiRegisterDeviceObject, (ÇѹøÀÌ»óÀÇ ClientPnPAddNetAddress ÇÔ¼ö È£ÃâÀ» ¾ß±âÇÏ´Â) TdiRegisterNetworkAddress, TdiProviderReady ÇÔ¼ö·ÎÀÇ ¼º°øÀûÀΠȣÃâÀ» ÇÑ´Ù¸é ½Ã½ºÅÛ ¼³Á¤ µ¿¾È¿¡ ¼øÂ÷ÀûÀ¸·Î °ªÀÌ TDI_PNP_OP_ADD¿Í TDI_PNP_OP_PROVIDERREADYÀÎ PnPOpcode¸¦ °¡Áö°í È£ÃâµÉ ¼ö ÀÖ´Ù.

°Ô´Ù°¡ TDI°¡ ÄÄÇ»Å͸¦ À§Çؼ­ ±¸¼ºµÈ ¸ðµç °¡´ÉÇÑ Æ®·£½ºÆ÷Æ®¿Í NIC°úÀÇ ¹ÙÀεùÀÌ ¼º¸³µÆ°í ¸ðµç Æ®·£½ºÆ÷Æ®°¡ ³×Æ®¿÷ µ¥ÀÌŸ¸¦ Àü¼ÛÇϱâ À§Çؼ­ ±× Áغñ¸¦ ÀεðÄÉÀÌÆ®Çß´Ù´Â °ÍÀ» °áÁ¤ÇßÀ» ¶§ TDI´Â °ªÀÌ TDI_PNP_OP_NETREADYÀÎ PnPOpcode¿Í NULL DeviceName Æ÷ÀÎÅ͸¦ °¡Áö°í ÇѹøÀÌ»ó ¸ðµç µî·ÏµÈ ClientPnPBindingChange ·çƾÀ» È£ÃâÇÑ´Ù. ClientPnPBindingChange ÇÔ¼ö·ÎÀÇ ¸¶Áö¸· ÃʱâÈ­½Ã¿¡ È£ÃâÀº ³×Æ®¿÷ Åë½Å ¼³Á¤ÀÇ ½Ã½ºÅÛ ÃʱâÈ­ ½Ã±â°¡ Áö±Ý ÇàÇØÁ³À½À» ¾Ë¸°´Ù.

½Ã½ºÅÛ ¼³Á¤¿¡ µû¶ó TDI´Â Ŭ¶óÀÌ¾ðÆ®°¡ *BindingHandle¿¡ ¸®ÅÏµÈ ÇÚµéÀ» °¡Áö°í TdiDeregisterPnPHandlers ÇÔ¼ö·ÎÀÇ »óÈ£ÀûÀΠȣÃâÀ» ÇÒ ¶§±îÁö Ŭ¶óÀÌ¾ðÆ®°¡ ¹ÙÀεùÇÑ Æ®·£½ºÆ÷Æ®°¡ TdiRegisterDeviceObject, TdiDeregisterDeviceObject, TdiRegisterNetAddress, TdiDeregisterNetAddress, ±×¸®°í TdiPnPPowerRequest ÇÔ¼ö·ÎÀÇ ½Ç½Ã°£ È£ÃâÀ» ÇÒ ¶§ µî·ÏµÈ ClientPnPXxx ·çƾÀ¸·ÎÀÇ µ¿ÀûÀΠȣÃâÀ» ÇÑ´Ù.

TdiRegisterPnPHandlers ÇÔ¼öÀÇ È£ÃâÀÚ´Â IRQL < DISPATCH_LEVEL¿¡¼­ ½ÇÇàµÇ¾î¾ßÇÑ´Ù.