TdiDispatchCreate

NTSTATUS
   TdiDispatchCreate (
       IN PDEVICE_OBJECT DeviceObject,
       IN PIRP Irp
  
   );

TdiDispatchCreate ÇÔ¼ö´Â ¿­¸° ÆÄÀÏ °´Ã¼¿¡ ´ëÇÑ ¼øÂ÷ÀûÀÎ I/O ¿¬»êÀ» Æ®·¢Çϱâ À§Çؼ­ µå¶óÀ̹ö ÇÒ´ç »óŸ¦ ¼³Á¤ÇϹǷνá ÁÖ¼Ò, ¿¬°á ¿£µåÆ÷ÀÎÆ®, ÅëÁ¦ ä³ÎÀ» ±¸ÇöÇÏ´Â ÆÄÀÏ °´Ã¼¸¦ ¿¬´Ù.

¸Å°³º¯¼ö

DeviceObject
TDI Æ®·£½ºÆ÷Æ®¿¡ ÀÇÇØ¼­ »ý¼ºµÈ ÀåÄ¡ °´Ã¼¸¦ °¡¸®Å²´Ù.

Irp
Æ®·£½ºÆ÷Æ® µå¶óÀ̹öÀÇ I/O ½ºÅà ·ÎÄÉÀ̼Ǿȿ¡ MajorFunctionCode ·Î½á ¼³Á¤µÈ IRP_MJ_CREATEÀ» °¡Áø IRP¸¦ °¡¸®Å²´Ù.

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

IoStatus.Status
»ý¼º/¿­±â ¿¬»êÀÇ ¸¶Áö¸· »óŸ¦ ¼­¼úÇÑ´Ù. Æ®·£½ºÆ÷Æ®´Â TdiDispatchCreate ÇÔ¼ö¿¡ ÀÇÇØ¼­ ¸®ÅÏµÈ ¶È°°Àº °ªÀ¸·Î ÀÌ ¸â¹ö¸¦ ¼³Á¤ÇÑ´Ù.(IoStatus.Information Àº 0 À¸·Î ¼³Á¤µÈ´Ù.)

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

IrpSp->FileObject
ÁÖ¼Ò, ¿¬°á ¿£µåÆ÷ÀÎÆ®, ÅëÁ¦ ä³ÎÀ» ±¸ÇöÇϱâ À§Çؼ­ I/O ¸Å´ÏÀú°¡ »ý¼ºÇÑ ÆÄÀÏ °´Ã¼¸¦ °¡¸®Å²´Ù. ÁÖ¼Ò, ¿¬°á ¿£µåÆ÷ÀÎÆ®, ÅëÁ¦ ä³Î¿¡¼­ ¼øÂ÷ÀûÀÎ I/O ¸®Äù½ºÆ®¸¦ Æ®·¢Çϱâ À§Çؼ­ TdiDispatchCreate ÇÔ¼ö¿¡¼­ ¼³Á¤µÈ µå¶óÀ̹ö ÇÒ´ç ÄÁÅØ½ºÆ® Áö¿ªÀ¸·ÎÀÇ Á¢±ÙÀ» À§Çؼ­ Æ®·£½ºÆ÷Æ® µå¶óÀ̹ö´Â ÀÌ ÆÄÀÏ °´Ã¼¾È¿¡ FsContext¿Í °¡´ÉÇÏ´Ù¸é FsContext2¸¦ ¼³Á¤ÇÑ´Ù.

Irp->AssociatedIrp.SystemBuffer
¿­·ÁÀÖ´Â ÁÖ¼Ò¿Í ¿¬°á ¿£µåÆ÷ÀÎÆ®¸¦ ÆÄÀÏ °´Ã¼°¡ ±¸ÇöÇÑ´Ù¸é FILE_FULL_EA_INFORMATION ±¸Á¶È­µÈ ¹öÆÛ¸¦ °¡¸®Å²´Ù.

ÁÖ¼Ò¸¦ À§Çؼ­ EaName ¸â¹ö´Â ½Ã½ºÅÛ Á¤ÀÇ »ó¼ö·Î TdiTransportAddress¸¦ ¼³Á¤ÇÑ´Ù. ±×¸®°í EaName ¹è¿­ÀÇ ´ÙÀ½¿¡ EA °ªÀº ¿­¸° ÁÖ¼Ò¸¦ ¼­¼úÇϱâ À§Çؼ­ Ŭ¶óÀÌ¾ðÆ®¿¡ ÀÇÇØ¼­ ¼³Á¤µÈ TRANSPORT_ADDRESS ŸÀÔÀÌ´Ù. ¸î¸î Æ®·£½ºÆ÷Æ®¸¦ À§Çؼ­ ÀÌ °ªÀº Æ®·£½ºÆ÷Æ®¿¡ ÀÇÇØ¼­ ÇØ¼®µÇ´Â ½Éº¼¸¯ netBIOS ȤÀº DNS À̸§ÀÌ µÉ ¼ö ÀÖ´Ù.

¿¬°á ¿£µåÆ÷ÀÎÆ®¸¦ À§Çؼ­ EaName ¸â¹ö´Â TdiConnectionContext¸¦ ½Ã½ºÅÛ Á¤ÀÇ »ó¼ö·Î ¼³Á¤Çϰí EaName ¹è¿­ ´ÙÀ½ÀÇ EA °ªÀº Æ®·£½ºÆ÷Æ® µå¶óÀ̹ö¿¡°Ô´Â ºÒÅõ¸íÇÑ Å¬¶óÀÌ¾ðÆ® Á¦°øÇÚµéÀÌ´Ù. Æ®·£½ºÆ÷Æ®´Â ÀÌ ÇÚµéÀ» ÀúÀåÇØ¾ßÇÏ°í ¼øÂ÷ÀûÀ¸·Î ÀÌ ¿¬°áÀ» À§ÇÑ Å¬¶óÀ̾ðÆ®ÀÇ µî·ÏµÈ À̺¥Æ® Çڵ鷯·Î ±×°ÍÀ» Àü´ÞÇØ¾ßÇÑ´Ù.

ÁÖ¾îÁø ÆÄÀÏ °´Ã¼°¡ ÅëÁ¦ ä³ÎÀ» ±¸ÇöÇÑ´Ù¸é ÀÌ ¸â¹ö´Â NULLÀÌ´Ù.

IrpSp->Parameters.Create.EaLength
Irp->AssociatedIrp.SystemBuffer¿¡ ¹öÆÛÀÇ ¹ÙÀÌÆ® »çÀÌÁ ¼­¼úÇÑ´Ù. ÁÖ¾îÁø ÆÄÀÏ °´Ã¼°¡ ÅëÁ¦ ä³ÎÀ» ±¸ÇöÇÑ´Ù¸é 0 À» ¼­¼úÇÑ´Ù.

IrpSp->Parameters.Create.ShareAccess
ÁÖ¾îÁø ÆÄÀÏ °´Ã¼°¡ ÁÖ¼Ò¸¦ ±¸ÇöÇÑ´Ù¸é Ŭ¶óÀÌ¾ðÆ®°¡ ÆÄÀÏ °´Ã¼¿¡ ´ëÇØ¼­ µ¶Á¡ÀûÀÎ ¿­±â¸¦ ¸®Äù½ºÆ®¸¦ Çß´ÂÁö¸¦ ¼­¼úÇÑ´Ù. ÃʱâÀÇ Å¬¶óÀÌ¾ðÆ®°¡ ÁÖ¼Ò¸¦ ¿­±â À§Çؼ­ ZwCreateFile ÇÔ¼öÀÇ ShareAccess ¸Å°³º¯¼ö¸¦ FILE_SHARE_READ ȤÀº FILE_SHARE_WRITE·Î ¼³Á¤ÇÑ´Ù¸é ¶È°°Àº ÁÖ¼Ò°¡ ´Ù¸¥ Ŭ¶óÀÌ¾ðÆ®¿¡ ÀÇÇØ¼­ ¼øÂ÷ÀûÀ¸·Î ¿­¸± ¼ö ÀÖ´Ù.

IrpSp->Parameters.Create.SecurityContext->AccessState
ÁÖ¾îÁø ÆÄÀÏ °´Ã¼°¡ °øÀ¯°¡´ÉÇÑ ÁÖ¼Ò¸¦ ±¸ÇöÇÑ´Ù¸é ±× ÁÖ¼Ò·ÎÀÇ ¸®Äù½ºÆ®µÈ Á¢±ÙÀ» Á¤ÀÇÇÑ´Ù. ƯÁ¤ ÁÖ¼Ò¸¦ ±¸ÇöÇÏ´Â ÆÄÀÏ °´Ã¼¸¦ ¿­±â À§Çؼ­ ÃʱâÀÇ Å¬¶óÀÌ¾ðÆ®´Â ±× ÁÖ¼Ò¸¦ À§Çؼ­ Á¢±Ù ÅëÁ¦ ¸®½ºÆ®¸¦ ¼³Á¤ÇÑ´Ù. ¼øÂ÷ÀûÀÎ ÁÖ¼Ò ¿­±â ¸®Äù½ºÆ®°¡ ¹ß»ýÇßÀ» ¶§ TDI Æ®·£½ºÆ÷Æ® µå¶óÀ̹ö´Â ´ëÀÀÇÏ´Â ÆÄÀÏ °´Ã¼·Î ÇÒ´çµÈ ±Ùº» ACL¿¡ ´ëÇ×ÇÏ¿© ÀÌ ¸â¹ö¸¦ üũÇϱâ À§Çؼ­ ¾ÈÀü ·¹ÆÛ·±½º ¸ð´ÏÅÍ (SeXxx) ·çƾÀ» È£ÃâÇÑ´Ù. ¸®Äù½ºÆ®µÈ Á¢±ÙÀÌ ±Ùº» ACL¿¡¼­ ÁØ Á¢±Ù±ÇÀ¸·Î´Â ºÒ°¡´ÉÇÏ´Ù¸é Æ®·£½ºÆ÷Æ®´Â ¼øÂ÷ÀûÀÎ ¿­±â ¸®Äù½ºÆ®¸¦ ½ÇÆÐÇÑ´Ù.

¸®Åϰª

»ý¼º/¿­±â ¿¬»êÀÌ ¼º°øÇÏ°í Æ®·£½ºÆ÷Æ®°¡ ÁÖ¼Ò, ¿¬°á ¿£µåÆ÷ÀÎÆ®, ÅëÁ¦ ä³Î¿¡ ´ëÇÑ ¼øÂ÷ÀûÀÎ I/O ¿¬»êÀ» Æ®·¢Çϱâ À§Çؼ­ »óŰ¡ ¹«¾ùÀÎÁö¸¦ ¼³Á¤Çß´Ù¸é TdiDispatchCreate ÇÔ¼ö´Â STATUS_SUCCESS¸¦ ¸®ÅÏÇÑ´Ù. ¹Ý¸é¿¡ ´ÙÀ½°ú °°Àº µå¶óÀ̹ö °áÁ¤ »óŸ¦ ¸®ÅÏÇÒ ¼ö ÀÖ´Ù:

STATUS_INVALID_PARAMETER
Æ®·£½ºÆ÷Æ®°¡ TdiTransportAddress¿Í TdiConnectionContext¸¦ °¡Áö°í Irp->AssociatedIrp.SystemBufferÀÇ ¹öÆÛ¸¦ ¼³Á¤ÇÑ EaName ¿£Æ®¸®¸¦ ã¾Ò´Ù¸é Æ®·£½ºÆ÷Æ®´Â ÀÌ °ªÀ» ¸®ÅÏÇÑ´Ù.

STATUS_SHARING_VIOLATION
µ¶Á¡ÀûÀÎ Á¢±ÙÀ» À§Çؼ­ ÀÌ¹Ì ¿­¸° ÁÖ¼Ò¸¦ ±¸ÇöÇÏ´Â ÆÄÀÏ °´Ã¼¸¦ ¿­±â À§ÇÑ ½Ãµµ°¡ ÇàÇØÁø´Ù¸é Æ®·£½ºÆ÷Æ®´Â ÀÌ °ªÀ» ¸®ÅÏÇÑ´Ù.

STATUS_NONEXISTENT_EA_ENTRY
¿£Æ®¸®ÀÇ EaName ¹è¿­ÀÌ Irp->AssociatedIrp.SystemBufferÀÇ ¹öÆÛ¾È¿¡ ÁÖ¾îÁø EaValueLengthÀÇ À¯È¿ÇÑ ÁÖ¼Ò°ª¿¡ ÀÇÇØ¼­ µÚµû¸£Áö ¾Ê´Â´Ù¸é Æ®·£½ºÆ÷Æ®´Â ÀÌ °ªÀ» ¸®ÅÏÇÑ´Ù.

STATUS_INSUFFICIENT_RESOURCES
Æ®·£½ºÆ÷Æ®°¡ ÁÖ¼Ò, ¿¬°á ¿£µåÆ÷ÀÎÆ®, ÅëÁ¦ ä³Î¿¡ ´ëÇÑ »óÅ Á¤º¸¸¦ À¯ÁöÇϱâ À§Çؼ­ ÃæºÐÇÑ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏÁö ¾Ê¾Ò´Ù¸é Æ®·£½ºÆ÷Æ®´Â ÀÌ »óŸ¦ ¸®ÅÏÇÑ´Ù.

STATUS_INVALID_DEVICE_REQUEST
µðÆúÆ® ¿¡·¯¸®ÅÏÀ̳ª ´ÙÀ½ ÇÏÀ§ µå¶óÀ̹öÀÇ ÀåÄ¡°¡ Áö±Ý ´ÝÈù´Ù¸é Æ®·£½ºÆ÷Æ®´Â ÀÌ »óŸ¦ ¸®ÅÏÇÑ´Ù.

ÁÖ¼®

ÁÖ¼Ò, ¿¬°á ¿£µåÆ÷ÀÎÆ®, ÅëÁ¦ ä³Î °´Ã¼¸¦ ¿©´Â °ÍÀº ¿ø·¡ µ¿±âÀûÀÎ ¿¬»êÀÌ´Ù. µå¶óÀ̹ö ÇÒ´ç ÄÁÅØ½ºÆ® Áö¿ª¿¡ ÀÖ´Â ±¸Á¶Ã¼¸¦ ÃʱâÈ­Çϰųª ÁÖ¼Ò¸¦ À§Çؼ­ ACLÀ» üũÇÏ´Â °Íó·³ ƯÁ¤ ÀÛ¾÷À» ó¸®Çϱâ À§Çؼ­ ³»ºÎÀÇ TdiDispatchCreate ÇÔ¼ö´Â µå¶óÀ̹ö ÇÔ¼ö¸¦ ±â´Ù¸®´Â °ÍÀ» ¹æÇØÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª TdiDispatchCreate ÇÔ¼ö´Â IRP¿¡ IoStatus.Status¸¦ STATUS_SUCCESS·Î ¼³Á¤Çϰųª ±×°ÍÀÌ ÅëÁ¦¸¦ ¸®ÅÏÇϱâ Àü¿¡ ÀûÀýÇÑ ¿¡·¯ »óŸ¦ ¼³Á¤ÇؾßÇÑ´Ù.

Æ®·£½ºÆ÷Æ® µå¶óÀ̹ö´Â Irp->AssociatedIrp.SystemBufferÀÇ ¹öÆÛ°¡ TdiTransportAddress¿Í TdiConnectionContext¸¦ °¡Áö°í ¼³Á¤µÈ EaName ¸â¹ö¸¦ Æ÷ÇÔÇÏ´Â »ý¼º/¿­±â ¸®Äù½ºÆ®¸¦ ½ÇÆÐÇÑ´Ù. ½Ì±Û ÆÄÀÏ °´Ã¼´Â °áÇÕµÈ ÁÖ¼Ò¿Í ¿¬°á ¿£µåÆ÷ÀÎÆ®¸¦ ¸®Äù½ºÆ®ÇÒ ¼ö ¾ø±â ¶§¹®¿¡ Ŭ¶óÀÌ¾ðÆ®´Â ÁÖ¼Ò¿Í ¿¬°á ¿£µåÆ÷ÀÎÆ®¸¦ ¿­±â À§Çؼ­ ZwCreateFile ÇÔ¼ö·Î ºÐ¸®µÈ È£ÃâÀ» ÇØ¾ßÇÑ´Ù.

Ŭ¶óÀÌ¾ðÆ®´Â Æ®·£½ºÆ÷Æ® ÁÖ¼Ò¸¦ TDI µå¶óÀ̹ö·Î ÀεðÄÉÀÌÆ®ÇÏ´Â ÁÖ¼Ò¸¦ ±¸ÇöÇÏ´Â ÆÄÀÏ °´Ã¼¸¦ ¿¬´Ù. ±×·¯ÇÑ ÆÄÀÏ °´Ä¡¸¦ ¿©´Â óÀ½ÀÇ Å¬¶óÀÌ¾ðÆ®´Â µ¶Á¡ÀûÀ̰ųª °øÀ¯µÈ´Ù°Å³ª ÇÏ´Â °ÍÀ» ¼­¼úÇÒ ¼ö ÀÖ´Ù. óÀ½ÀÇ Å¬¶óÀÌ¾ðÆ®°¡ µ¶Á¡ÀûÀ¸·Î ¿­¸° ÆÄÀÏ °´Ã¼¸¦ ¼­¼úÇÑ´Ù¸é Æ®·£½ºÆ÷Æ® µå¶óÀ̹ö´Â ±× ÁÖ¼Ò¸¦ ¿­±â À§ÇÑ ¸ðµç ¼øÂ÷ÀûÀΠŬ¶óÀÌ¾ðÆ® ¸®Äù½ºÆ®¸¦ ½ÇÆÐÇÑ´Ù. óÀ½ÀÇ Å¬¶óÀÌ¾ðÆ®°¡ °øÀ¯µÈ ÆÄÀÏ °´Ã¼¸¦ ¼­¼úÇÑ´Ù¸é Æ®·£½ºÆ÷Æ® µå¶óÀ̹ö´Â ¶ÇÇÑ ±× ÁÖ¼ÒÀÇ µ¶Á¡ÀûÀÎ ¿­±â¸¦ À§ÇÑ ¸ðµç ¼øÂ÷ÀûÀΠŬ¶óÀ̾ðÆ®ÀÇ ¸®Äù½ºÆ®¸¦ ½ÇÆÐÇÑ´Ù. ¹Ý¸é¿¡ °°Àº ÁÖ¼ÒÀÇ °øÀ¯µÈ Á¢±ÙÀ» À§Çؼ­ ¾î¶² ¼öÀÇ Å¬¶óÀÌ¾ðÆ®´Â °°Àº ÆÄÀÏ °´Ã¼¸¦ ¿­ ¼ö ÀÖ´Ù.

Æ®·£½ºÆ÷Æ®¿¡ ÀÇÁ¸ÇÏ¿© Ŭ¶óÀÌ¾ðÆ®´Â ¿­¸®´Â Æ®·£½ºÆ÷Æ® ÁÖ¼Ò¸¦ ¼­¼úÇÒ ¼ö ÀÖ°í Æ®·£½ºÆ÷Æ® µå¶óÀ̹ö·Î ÇÏ¿©±Ý ÁÖ¼Ò¸¦ ¼±ÅÃÇÏ°Ô ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦µé¾î Ŭ¶óÀÌ¾ðÆ®´Â ¿¬°áÁöÇâ ¸ðµå¿¡¼­ µ¥ÀÌŸ±×·¥À» ¸®½ÃºêÇϱâ À§Çؼ­ TDI µå¶óÀ̹öÀÇ ºê·ÎµåÄɽºÆ® ÁÖ¼Ò¸¦ ¼­¼úÇÒ ¼ö ÀÖ´Ù.

¿¬°á ¿£µåÆ÷ÀÎÆ®¸¦ ¿©´Â °ÍÀº Ŭ¶óÀ̾ðÆ®ÀÇ ³×Æ®¿÷ ¿¬°áÀÇ ³¡À» Á¤ÀÇÇÑ´Ù. TdiDispatchCreate ÇÔ¼ö°¡ ±×·¯ÇÑ ¸®Äù½ºÆ®¸¦ ó¸®ÇÒ ¶§ ±×°ÍÀº idle »óÅ·Π¿¬°á ¿£µåÆ÷ÀÎÆ®¸¦ ¼³Á¤ÇÑ´Ù. °á±¹ Ŭ¶óÀÌ¾ðÆ®´Â ÁÖ¼Ò¸¦ ±¸ÇöÇÏ´Â ¿­¸° ÆÄÀÏ °´Ã¼¸¦ °¡Áö°í ¿­¸° ¿¬°á ¿£µåÆ÷ÀÎÆ® ¿¬±­½ÃÄѾßÇÑ´Ù. Áï Æ®·£½ºÆ÷Æ®´Â ¿­¸° ÁÖ¼Ò¿Í ¿¬°üµÉ ¶§±îÁö ¿­¸° ¿£µåÆ÷ÀÎÆ®¿¡¼­ I/O¸¦ ÇÏÁö ¾Ê´Â´Ù.

ÅëÁ¦ ä³ÎÀ» ¿©´Â °ÍÀº Ŭ¶óÀÌ¾ðÆ®¿Í TDI Æ®·£½ºÆ÷Æ® µå¶óÀ̹ö »çÀÌ¿¡¼­ ÅëÁ¦ ä³ÎÀ» ¼³Á¤ÇÑ´Ù. Ŭ¶óÀÌ¾ðÆ®´Â ÁÖ¼Ò È¤Àº ¿¬°á ¿£µåÆ÷ÀÎÆ®¿Í ¸í¹éÇÏ°Ô ¿¬°üµÇÁö ¾ÊÀº Á¤º¸¸¦ Äõ¸®ÇÏ°í ¼ÂÇϱâ À§Çؼ­ ¿­¸° ÅëÁ¦ ä³ÎÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦µé¾î Æ®·£½ºÆ÷Æ® µå¶óÀ̹öÀÇ (ºê·ÎµåÄɽºÆ® µ¥ÀÌŸ±×·¥À» ¸®½ÃºêÇϱâ À§Çؼ­ »ç¿ëµÇ´Â)ºê·ÎµåÄɽºÆ® ÁÖ¼Ò¸¦ Äõ¸®Çϰųª Æ®·£½ºÆ÷Æ®°¡ À¯ÁöÇÏ´Â ÆÛÆ÷¸Õ½º Åë°è¸¦ Äõ¸®Çϱâ À§Çؼ­ Ŭ¶óÀÌ¾ðÆ®´Â ¿­¸° ÅëÁ¦ ä³ÎÀ» »ç¿ëÇÑ´Ù.

±âº»ÀûÀ¸·Î TdiDispatchCreate ÇÔ¼ö´Â IRQL PASSIVE_LEVEL¿¡¼­ ½ÇÇàµÈ´Ù.