NdisAllocateMemory

NDIS_STATUS

  NdisAllocateMemory(

    OUT PVOID  *VirtualAddress,

    IN UINT  Length,

    IN UINT  MemoryFlags,

    IN NDIS_PHYSICAL_ADDRESS  HighestAcceptableAddress

    );

NdisAllocateMemoryÇÔ¼ö´Â Á¸ÀçÇÏ´Â(nonpaged) ½Ã½ºÅÛ °ø°£ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ´Ù. ÁöÁ¤µÈ ÁÖ¼Ò Á¦Çѳ»¿¡¼­, ¹°¸®ÀûÀ¸·Î ¿¬¼ÓÀûÀÎ ÇÒ´çÀ¸·Î¼­, ±×¸®°í/ȤÀº ºñÄɽ¬ ÇÒ´çÀ¸·Î¼­.

¸Å°³º¯¼ö

VirtualAddress
ÀÌ ÇÔ¼ö°¡ ÇÒ´çµÈ ¸Þ¸ð¸®ÀÇ ±âº»ÀûÀÎ °¡»ó ÁÖ¼Ò¸¦ ¸®ÅÏÇÏ´Â °Í¿¡´ëÇÑ È£ÃâÀÚÁ¦°ø º¯¼öÀÇ Æ÷ÀÎÅÍ,¸¸¾à ÁöÁ¤µÈ ŸÀÔÀÇ ¸Þ¸ð¸®°¡ ÀÌ¿ëÇÒ¼ö ¾ø´Ù¸é NULL.

Length
ÇÒ´çµÇ¾îÁö´Â ¹ÙÀÌÆ®ÀÇ »çÀÌÁ ÁöÁ¤ÇÑ´Ù.

MemoryFlags
Á¦·Î ȤÀº ÇÒ´çµÈ ¸Þ¸ð¸® ŸÀÔÀ» ÁöÁ¤ÇÏ´Â ºñÆ®¸¶½ºÅ©¸¦ ´ÙÀ½°ú °°ÀÌ ÁöÁ¤ÇÑ´Ù.:

°ª ÀǹÌ
zero nonpaged½Ã½ºÅÛ °ø°£ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ´Ù.
NDIS_MEMORY_CONTIGUOUS ¹°¸®ÀûÀ¸·Î ¿¬¼ÓÀûÀÎ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ´Ù.
NDIS_MEMORY_NONCACHED ºñ Äɽ¬È­µÈ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ´Ù.

´ÜÁö ´Ð µå¶óÀ̹öµé¸¸ÀÌ µå¶óÀ̹ö ÃʱâÈ­½Ã ¿¬¼ÓÀûÀ̰ųª ºñ Äɽ¬È­µÈ ¸Þ¸ð¸®ÀÇ ÇÒ´çÀ» ÁöÁ¤ÇÒ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ µÎ Ç÷¹±×´Â NdisAllocateMemoryÇÔ¼ö°¡ È£ÃâµÇ±âÀü¿¡ MemoryFlags·Î ORedµÇ¾îÁú¼ö ÀÖ´Ù.

HighestAcceptableAddress
-1À» ¼­¼úÇÑ´Ù.

¸®Åϰª

NdisAllocateMemoryÇÔ¼ö´Â ´ÙÀ½Áß Çϳª¸¦ ¸®ÅÏÇÑ´Ù.

NDIS_STATUS_SUCCESS
È£ÃâÀÚ´Â VirtualAddress¿¡ ¸®ÅÏµÈ °ªÀ» ½ÃÀÛÀ¸·Î ÇÒ´çµÈ ¸Þ¸ð¸® ¹üÀ§¸¦ »ç¿ëÇÒ¼öÀÖ´Ù.

NDIS_STATUS_FAILURE
¿äûµÈ ¸Þ¸ð¸®¸¦ ÇÒ´çÇϱâÀ§ÇÑ ½Ãµµ´Â ½ÇÆÐÀÌ´Ù. ÀÌ ¸®ÅÏÀº ´ÙÀ½¿¡ À̾îÁö´Â È£ÃâÀÌ ½ÇÆÐÇÑ´Ù´Â ÇʼöÀûÀÎ Àǹ̰¡ ¾Æ´Ï´Ù.

ÁÖ¼®

NDISµå¶óÀ̹ö´Â NdisAllocateMemoryÇÔ¼ö¸¦ MemoryFlags¸¦ 0À¸·Î ¼³Á¤ÇÏ¿© È£ÃâÇÒÁö ¸ð¸¥´Ù. ¿¹¸¦µé¾î, NDIS upper-edgeÇÔ¼öµéÀÇ ¼³Á¤À» ÀͽºÆ÷Æ®ÇÏ´Â NDISµå¶óÀ̹öµéÀº ÄÁÅØ½ºÆ® ¿µ¿ªÀ» µå¶óÀ̹ö°¡ ´Ð´ç(ȤÀº °¡»ó ´Ð´ç)·±Å¸ÀÓ »óÅÂÁ¤º¸¸¦ À¯ÁöÇϰí VirtualAddress¿¡ ¸®ÅÏµÈ Æ÷ÀÎÅ͸¦ NdisMSetAttributes(Ex)·Î ³Ñ±â´Â°Í¿¡ÀÖ¾î ÇÒ´çÇϱâÀ§ÇØ NdisAllocateMemoryÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù. NDIS lower-edge(ProtocolXxx)ÇÔ¼öÀÇ ¼³Á¤À» ÀͽºÆ÷Æ®ÇÏ´Â NDISµå¶óÀ̹öµé ¶ÇÇÑ ±×·± µå¶óÀ̹ö°¡ ¹öÆÛ °ø°£À» ÇÒ´çÇÒ Çʿ䰡 ÀÖÀ»¶§¸¶´Ù NdisAllocateMemory¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù.

NdisAllocateMemory ¸¦ ÃʱâÈ­½Ã¿¡ È£Ãâ Çϵµ·Ï ÇßÀ»¶§, ´ÜÁö NIC¹Ì´ÏÆ÷Æ®µé¸¸ÀÌ MemoryFlags¸¦ NDIS_MEMORY_XXX¸¦ µÑ´Ù ȤÀº Çϳª¸¦ ¼³Á¤ÇÒ¼öÀÖ´Ù. ÃʱâÈ­µ¿¾È, ¹Ì´ÏÆ÷Æ® µå¶óÀ̹öµéÀº ±×µé ´Ð°ú °øÀ¯µÇ±âÀ§ÇØ ÀÌ·± ŸÀÔÀÇ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ´Ù.

¸¸¾à ±×·± ¹Ì´ÏÆ÷Æ®°¡ NdisAllocateMemoryÀÇ È£Ãâ¿¡¼­ ¹°¸®ÀûÀ¸·Î ¿¬¼ÓÀûÀÎ ¸Þ¸ð¸®¸¦ ÁöÁ¤ÇÑ´Ù¸é, °¡»ó ¸Þ¸ð¸® ÇÒ´çÀº ÇϳªÀÇ ¹°¸®ÀûÀ¸·Î ¿¬¼ÓÀûÀÎ ¿µ¿ªÀ» ÇÒ´çÇÑ´Ù. ¸¸¾à ¹Ì´ÏÆ÷Æ®°¡ ºñÄɽ¬È­µÇ´Â ¸Þ¸ð¸®¸¦ ÁöÁ¤ÇÑ´Ù¸é,ÇÒ´çµÈ °¡»ó ¹üÀ§´Â Äɽ¬ÇϵÇÁö¾Ê´Â´Ù. ´Ðµå¶óÀ̹ö´Â DMA¿¬»êµ¿¾È Äɽ¬ ¹öÆÛ¸¦ Ç÷¯½¬Çϴ°;øÀÌ ºñÄɽ¬È­µÈ ¸Þ¸ð¸®¸¦ Á¢±ÙÇÒ¼öÀÖ´Ù.

ÀÔ·Â MemoryFlagsÀÇ °ªÀÌ ¹«¾ùÀ̵ç, NdisAllocateMemoryÀÇ ¼º°øÀûÀΠȣÃâÀÚ´Â ÇÒ´çµÈ ¸Þ¸ð¸®¿¡ Á¢±ÙÇϱâÀ§ÇÑ °¡»ó ÁÖ¼ÒµéÀÇ ¹üÀ§¸¦ »ç¿ëÇÑ´Ù. ÇÒ´çÀÇ Å©±â¿¡ ±×¸®°í ¸Þ¸ð¸® ¿äû ŸÀÔ¿¡ ÀÇÁ¸ÇÏ¿©, Çϳª ȤÀº ±×ÀÌ»óÀÇ ¹°¸® ¸Þ¸ð¸®¹üÀ§(ÆäÀÌÁö)´Â ÀÌ ½Ì±Û °¡»ó ¹üÀ§¸¦ backÇÑ´Ù.

NDIS_MEMORY_XXX°¡ ´Ð µå¶óÀ̹ö¿¡ÀÇÇØ ¿¬¼ÓÀûÀÌ°í ºñÄɽ¬È­µÇ´Â ÇÒ´çÀ» ¿äûÇϱâÀ§ÇØ MemoryFlags¿¡ ORedµÉ¼ö ÀÖ´Â ¹Ý¸é¿¡ µÎ ¿¬¼ÓÀûÀÌ°í ºñ Äɽ¬È­µÇ´Â ¸Þ¸ð¸®´Â ¸Å¿ì Á¦ÇÑµÈ ½Ã½ºÅÛ ¸Þ¸ð¸®ÀÌ´Ù. ´Ð µå¶óÀ̹ö´Â ÇÊ¿äÀÌ»óÀ¸·Î ¸¹Àº ¿¬¼ÓÀûÀÎ ¸Þ¸ð¸® ¿Í/ȤÀº ¸¹Àº ºñÄɽ¬È­µÇ´Â ¸Þ¸ð¸®¸¦ ¿äÃ»ÇØ¼­´Â ¾ÈµÈ´Ù. µå¶óÀ̹ö°¡ ÃʱâÈ­ Çϴµ¿¾ÈÀ» Á¦¿ÜÇϰí ÀÌ·± ŸÀÔÀÇ ¸Þ¸ð¸®Áß Çϳª¸¦ ÇÒ´çÇϵµ·Ï ÇÏ´Â ½Ãµµ´Â ÇÁ·Î±×·¡¹Ö ¿¡·¯ÀÌ´Ù. ±×·± ½Ãµµ´Â ¼º°øµÉ°Í °°Áö°¡ ¾Ê´Ù. ¿Ö³ÄÇÏ¸é ½Ã½ºÅÛ °ø°£ ¸Þ¸ð¸®´Â ´Ù¸¥ Ä¿³Î¸ðµå ¿ä¼Òµé¿¡ÀÇÇÑ ÇÒ´çÀ¸·Î Âɰ³Áö°íµÇ¹Ç·Î, ´Ù¸¥ µå¶óÀ̹ö¸¦ Æ÷ÇÔÇÏ¿©, ±×¸®°í ·±Å¸ÀÓ ÆäÀÌ¡ ¶§¹®¿¡.

¸¸¾à ±×·± ÃʱâÈ­¶§ÀÇ È£ÃâÀÌ ½ÇÆÐÇϸé, ´Ðµå¶óÀ̹ö´Â Çϳª ȤÀº ±×ÀÌ»óÀÇ ÀÛÀº ºí·°ÀÇ ¿¬¼ÓÀû À̰í/ȤÀº ºñÄɽ¬È­µÇ´Â ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ·Á°í ½Ãµµ ÇÒ ¼ö ÀÖ´Ù. ¸¸¾à Å« ºí·°ÀÇ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÒ¼ö¾ø¾î¼­ ÃʱâÈ­Çϴ°ÍÀ» ½ÇÆÐÇϱ⺸´Ù´Â.

NdisAllocateMemoryÇÔ¼öÀÇ È£ÃâÀÚ´Â ºñÆäÀÌÈ­µÇ´Â POOL·ÎºÎÅÍ ¸Þ¸ð¸®¸¦ ÇÒ´çÇϱâÀ§ÇØ IRQL<=DISPATCH_LEVEL¿¡¼­ µ¿ÀÛÇÒ¼ö ÀÖ´Ù. ¿¬¼ÓÀû À̰í/ȤÀº ºñÄɽ¬È­µÇ´Â ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ´Â ´Ðµå¶óÀ̹ö´Â ÃʱâÈ­µ¿¾È¿¡ IRQL PASSIVE_LEVEL¿¡¼­ µ¿À۵Ǿî¾ß¸¸ ÇÑ´Ù.