Chapter 4 NDIS µå¶óÀ̹ö Lower-Edge ÇÔ¼öµé

À̰ÍÀº NDIS Upper-Edge(MiniportXxx)ÇÔ¼öµéÀ» ÀͽºÆ÷Æ®ÇÏ´Â ¾î¶² µå¶óÀ̹ö À§¿¡ ÀÖ´Â NDIS µå¶óÀ̹ö ³»¿¡¼­ ½ÇÇàµÇ´Â ½Ã½ºÅÛ-Á¤ÀÇ ÇÔ¼öµéÀÌ´Ù.

µÎ°¡Áö ŸÀÔÀÇ NDIS µå¶óÀ̹öµéÀº ¿©±â¿¡ ¼³¸íµÈ ÇÔ¼öµéÀ» °¡Áø´Ù:

  1. ¿©±â¿¡ ¼³¸íµÈ ProtocolXxxÇÔ¼öµéÀ» ÀͽºÆ÷Æ®Çϰí ÈÄ¿¡ ¼³¸íµÉ TDI ÀÎÅÍÆäÀ̽º¸¦ ÅëÇØ Ŭ¶óÀÌ¾ðÆ®µé°ú Åë½ÅÇÏ´Â NDIS Àü¼Û °èÃþ ÇÁ·ÎÅäÄÝ
  2. MiniportXxxÇÔ¼öµé°ú ¿©±â¿¡ ¼³¸íµÉ ProtocolXxxÇÔ¼öµéÀ» ÀͽºÆ÷Æ®ÇÏ´Â NDIS Intermediate µå¶óÀ̹öµé

    Intermediate NDIS µå¶óÀ̹öµéÀº NIC ¹Ì´ÏÆ÷Æ®¿¡°Ô´Â ¹ÙÀεùÀ» ¸¸µêÀ¸·Î½á ±×·¯ÇÑ Intermediate µå¶óÀ̹ö À§ÇØ ±×µé ÀÚ½ÅÀÌ ³õ¿© ÀÖ´Â »óÀ§ ·¹º§ NDIS µå¶óÀ̹öµé·Î º¸ÀδÙ. Intermediate NDIS µå¶óÀ̹öµéÀº NIC µå¶óÀ̹ö¸¦ Æ÷ÇÔÇØ¼­ ±×°Íµé º¸´Ù ³·°Ô NDIS µå¶óÀ̹ö¿¡°Ô ÇÁ·ÎÅäÄÝ·Î ³ªÅ¸³¯ °ÍÀÌ´Ù. NDIS ¶óÀ̺귯¸®¿¡ ´ëÇØ ±×·¯ÇÑ Intermediate µå¶óÀ̹ö´Â ÇÁ·ÎÅäÄݰú ¹Ì´ÏÆ÷Æ® µå¶óÀ̹ö·Î ³ªÅ¸³¯ °ÍÀÌ´Ù.

Driver Function Names

Á¢µÎ»ç°¡ ProtocolÀÎ(¾Õ¿¡ Protocol·Î ½ÃÀÛÇÏ´Â) ¸ðµç NDIS µå¶óÀ̹ö ÇÔ¼öµéÀº ´ÙÀ½¿¡ ³ª¿À´Â ÂüÁ¶µé¿¡¼­ ±âº»ÀûÀÎ ±â´ÉÀ» ¼³¸íÇÏ´Â ¸ÞŸ À̸§µéÀÌ ÁÖ¾îÁø´Ù.

DriverEntry ÇÔ¼ö¸¦ Á¦¿ÜÇÑ, NDISÁ¤ÀÇ µå¶óÀ̹ö ÇÔ¼öµéÀº µå¶óÀ̹ö ÀÛ¼ºÀÚ°¡ ¼±ÅÃÇÑ À̸§À» °¡Áú ¼ö ÀÖ´Ù. ½¬¿î µð¹ö±ëÀ» À§ÇØ ´ëºÎºÐÀÇ ½Ã½ºÅÛ Á¦°ø ÇÁ·ÎÅäÄݵéÀº °£´ÜÈ÷ ÀÌ ¹®¼­¿¡¼­ »ç¿ëµÈ Á¢µÎ»ç°¡ Protocol·Î µå¶óÀ̹ö ƯÁ¤ Á¢µÎ»ç·Î ´ëÄ¡µÈ´Ù.

À©µµ¿ì NT Ä¿³Î ¸ðµå µå¶óÀ̹öÀÇ Ãʱ⠿£Æ®¸® Æ÷ÀÎÆ®´Â ½Ã½ºÅÛ¿¡ ÀÇÇØ ÀÚµ¿ÀûÀ¸·Î ·ÎµåµÇ±â À§ÇØ DriverEntry À̸§À» °¡Áø´Ù. Windows NT DriverEntry ·çƾµéÀÇ ±â´É°ú ÀϹÝÀûÀÎ ¿ä±¸ »çÇ׿¡ ´ëÇÑ ´õ ¸¹Àº Á¤º¸¸¦ À§Çؼ­´Â Kernel-Mode Driver Design Guide¸¦ º¸¶ó.

Calling NdisXxx Functions at Approriate IRQLs

NDIS Lower-Edge Driver Functions µðÆúÆ®·Î ´ÙÀ½ÀÇ IRQLÁß¿¡ ÇϳªÀÌ´Ù. ´ÙÀ½Àº Áõ°¡ÇÏ´Â ¿ì¼±±Ç ¼øÀ§·Î º¸¿©ÁØ´Ù:

    PASSIVE_LEVEL < DISPATCH_LEVEL

IRQL PASSIVE_LEVEL¿¡¼­ ½ÇÇàÇÏ´Â ¾î¶² µå¶óÀ̹ö ÇÔ¼ö´Â »óÀ§ ¿ì¼± ¼øÀ§ IRQL¿¡¼­ ½ÇÇàÇÏ´Â ½ÇÇà ¾²·¹µå¿¡ ÀÇÇØ ¼±Á¡ ´çÇÒ ¼ö ÀÖ´Ù. Áï ¸ðµç ProtocolXxxÇÔ¼ö´Â ÀÎÅÍ·´Æ®°¡ ¹ßÇàÇßÀ» ¶§ DIRQL¿¡ ½ÇÇàÇÏ´Â ÀåÄ¡ µå¶óÀ̹öÀÇ ISRÀ̳ª ½Ã½ºÅÛ Å¬·° ÀÎÅÍ·´Æ®¿¡ ÀÇÇØ ¼±Á¡ ´çÇÒ ¼ö ÀÖ´Ù.

°¢°¢ÀÇ ´ÙÀ½¿¡ ³ª¿À´Â DriverEntry¿Í ProtocolXxx ÇÔ¼öµéÀÇ Ç¥Çö(Descriptions)µéÀº ±×·¯ÇÑ ÇÔ¼öµéÀÌ ½ÇÇàÇÏ´Â µðÆúÆ® IRQLÀ» ÁöÁ¤ÇÑ´Ù.(specific) ¾î¶² ProtocolXxx ÇÔ¼öµéÀÇ µðÆúÆ® IRQL µéÀº È¿À²ÀûÀ¸·Î ÀÌ·¯ÇÑ ProtocolXxx°¡ È£ÃâÇÒ ¼ö ÀÖ´Â NdisXxxÇÔ¼öµéÀ» Á¦ÇÑÇÑ´Ù. ¿¹·Î IRQL DISPATCH_LEVEL¿¡¼­ ½ÇÇàÇÏ´Â ProtocolXxxÇÔ¼ö·ÎºÎÅÍÀÇ NdisCopyBuffer¿¡ ´ëÇÑ È£Ãâ ProtocolXxx°¡ ½ºÇɶôÀ» À¯ÁöÇÏ´Â µ¿¾È Ä¡¸íÀûÀÎ ÆäÀÌÁö ÆúÆ®¸¦ ¾ß±âÇÒ ¼ö ÀÖ´Ù.

´ÜÁö ÃʱâÈ­¿Í ÆäÀÌÁöºí µå¶óÀ̹ö ÄÚµå

NDIS ÇÁ·ÎÅäÄݵéÀº NDIS_INIT_FUNCTION ¸ÅÅ©·Î¸¦ »ç¿ëÇÏ¿©, ´ÜÁö ÃʱâÈ­·Î¼­¸¸ DriverEntryÇÔ¼öµéÀ» Ç¥½ÃÇÑ´Ù.

´Ù¸¥ µå¶óÀ̹ö ÇÔ¼öµéÀº NDIS_PAGEABLE_FUNCTION ¸ÅÅ©·Î¸¦ »ç¿ëÇÏ¿© ÆäÀÌÀúºí ÄÚµå·Î Ç¥½ÃÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª µå¶óÀ̹ö ÇÔ¼öµéÀº if and only if it never runs at IRQL >= DISPATCH_LEVEL¿¡¼­ ÆäÀÌÀúºí ÄÚµå·Î µÉ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ Á¦ÇÑÀº ´ÙÀ½À» ¾Ï½ÃÇÑ´Ù:

  • ÆäÀÌÀúºí ¸¶Å©µÈ ÇÔ¼ö´Â ½ºÇɶôÀ» ¾òÀ» ¼ö ¾ø°í ±×·¸°Ô µÈ(that do) ´ÙÀ½ ÇÔ¼öµéÀ» È£Ãâ ÇÏÁö ¸øÇÑ´Ù.(should not)
  • ÆäÀÌÀúºí·Î ¸¶Å©µÈ ÇÔ¼ö´Â ±× È£ÃâÀÌ ÀϾ ¶§ ½ºÇɶôÀ» À¯ÁöÇÏ´Â ¾î¶² ÇÔ¼ö¿¡ ÀÇÇØ È£Ã⠵ǾîÁú ¼ö ¾ø´Ù.
  • ÆäÀÌÀúºí·Î ¸¶Å©µÈ ÇÔ¼ö´Â »ó½ÂµÈ(raised) IRQL¿¡¼­ ½ÇÇàÇÒ ¼ö ¾ø´Ù.
ProtocolBindAdapter, ProtocolOpenAdapterComplete, ProtocolUnbindAdapter, and ProtocolCloseAdapterCompleteÀ» Á¦¿ÜÇÑ ¿©±â¿¡ ¼³¸íµÈ ´ëºÎºÐÀÇ ProtocolXxx ÇÔ¼öµéÀº µðÆúÆ®·Î IRQL DISPATCH_LEVEL·Î ½ÇÇàÇÑ´Ù.