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¿¡¼ ½ÇÇàµÈ´Ù.
|