Windows °æ (¾«»ªÇø)

·¢ÐÅÈË: pony (ÕÒ²»×ŵÀµÄСÂí), ÐÅÇø: Windows
±ê  Ìâ: ÈçºÎת»»Windows NT 4µÄÇý¶¯³ÌÐòΪWindows 2000Çý¶¯³
·¢ÐÅÕ¾: ¹þ¹¤´ó×϶¡Ïã (2001Äê10ÔÂ29ÈÕ09:23:58 ÐÇÆÚÒ»), Õ¾ÄÚÐżþ

Ô­ÎÄ£ºhttp://china-pub.com/computers/emook/0649/info.htm

ÈçºÎת»»Windows NT 4µÄÇý¶¯³ÌÐòΪWindows 2000Çý¶¯³ÌÐò£¨WDM£©

Ç°ÑÔ
¡¡¡¡Ê×ÏÈҪ˵Ã÷µÄÊÇ£ºÒѾ­´æÔÚµÄWindows NT V4µÄÉ豸Çý¶¯³ÌÐò£¨Í¨³£³ÆΪ"±ê×¼
ºËÐÄģʽÇý¶¯³ÌÐò"£©²»Óøıä¾Í¿ÉÒÔÔÚWindows 2000ÖÐÔËÐС£Ö»²»¹ýÕâЩÇý¶¯³Ì
Ðò²»Ö§³ÖµçÔ´¹ÜÀíºÍеļ´²å¼´Óù¦ÄÜ¡£
¡¡¡¡ÒòΪÉÏÊöÔ­Òò£¬Ò»Ð©±È½Ï¼«¶ËµÄ¹ÛµãÈÏΪ£º¶ÔÓÚ´ó¶àÊýÇý¶¯³ÌÐò¿ª·¢Õߣ¬Èç¹û
Ó²¼þ¶ÔÓÚµçÔ´¹ÜÀíºÍ¼´²å¼´Óò»ÊǺÜÐèÒªµÄ»°£¬×îºÃµÄ²ßÂÔ¾ÍÊDz»Òª×ª»»NT V4µÄ
É豸Çý¶¯³ÌÐò£¨ÖÁÉÙÔÚ¶ÌÆÚÄÚ£©¡£ÒòΪWindows2000µÄÇý¶¯³ÌÐòºÍNT V4²»ÊÇÖ±½Ó¼æ
Èݵģ¬Èç¹ûÄ㽫Windows NT V4Çý¶¯³ÌÐòת»»µ½Windows 2000ϵĻ°£¬¾ÍÒªÐèҪά
»¤Á½Ì×Çý¶¯³ÌÐò·Ö±ðÓÃÓÚWindows NT V4ƽ̨ºÍWindows 2000¡£ÕâÑù¾ÍÒª¼Ó´óϵͳ
ά»¤µÄ¸ºµ£¡£
¡¡¡¡µ«ÊÇÈç¹ûÄãÏëÒª²âÊÔÄãµÄÓ²¼þÊÇ·ñÄܹ»ÔÚWindows 2000ÏÂÕý³£¹¤×÷£¬ÇÒÖ§³Öµç
Ô´¹ÜÀíºÍ¼´²å¼´Óá£ÄÇô¾ÍÐèÒªÑо¿Ò»ÏÂÈçºÎ½øÐÐת»»ÁË£¡

Windows2000==WDM?
¡¡¡¡ÔÚת»»Ç°ÓÐһЩ֪ʶÐèÒªÁ˽⣬ÆäÖÐÓкõÄÒ²»µµÄ¡£ºÃµÄÊÇ£º1¡£ËùÓеÄ
Windows NTϵͳÄÚ²¿ºÍÉ豸Çý¶¯³ÌÐò¸ÅÄîÈÔÈ»ÓÐЧ£¬Windows 2000ºÍWDMÈÔȻʵÏÖ
ÁËÒ»¸ö²ã´Î»¯µÄÇý¶¯³ÌÐò½á¹¹£¨Ö»²»¹ý¶àÁ˼¸²ã£©¡£2¡£ÍêÈ«WDM¼æÈݵÄÇý¶¯³ÌÐòÄÜ
¹»²»¼ÓÐ޸ĵŤ×÷ÔÚWindows2000ºÍWindows 9XÏ¡£
¡¡¡¡µ«ÊDz»ÒªÈÏΪWDMÇý¶¯³ÌÐòºÍWindows 2000µÄÇý¶¯³ÌÐòÊÇÏàͬµÄ¡£WDM±ê×¼ÊÇ
Windows 2000ºËÐÄģʽÇý¶¯³ÌÐò±ê×¼µÄ×Ó¼¯¡£Ò»¸öÇý¶¯³ÌÐòÄܹ»ÍêÈ«¼æÈÝ
Windows 2000±ê×¼£¬Ö§³Ö¼´²å¼´Óú͵çÔ´¹ÜÀí£¬µ«ÊÇÈÔÈ»¿ÉÄܲ»Ö§³ÖWDM£¬Òò´Ë¿É
Äܲ»ÄÜÖ±½ÓÓÃÔÚWindows 9X¡£WDMÇý¶¯³ÌÐòÊÇÒýÓÃÁËÎļþWDM.H£¬¶øWindows 2000±ê
×¼ºËÐÄģʽÇý¶¯³ÌÐòÊÇÒýÓÃNTDDK.H¡£
¡¡¡¡ÕâÓÐʲô²»Í¬ÄØ£¿WDMÇý¶¯³ÌÐòʹÓÃÁËÒ»¸ö¶Ë¿ÚºÍ΢Çý¶¯³ÌÐò¸ÅÄÀàËÆÓÚ
SCSI΢¶Ë¿ÚÇý¶¯³ÌÐòËùʹÓõķ½·¨¡£WDMÇý¶¯³ÌÐòͨ³£¶¼¸üС£¬¼¸ºõ½ö½ö°üº¬ÁËÕë
¶Ô¾ßÌåÉ豸µÄÖ§³Ö¡£ÕâЩÇý¶¯³ÌÐòÖ»µ÷Óñê×¼NT APIsµÄÒ»¸ö×Ó¼¯¡£´ó²¿·Ö¹¤×÷£¨
Èç´¦ÀíÖжϣ©ÊÇͨ¹ýËûÃǵÄÀàÇý¶¯³ÌÐò´¦Àí¡£¶ø´ó²¿·ÖÎÒÃÇÊìϤµÄ½Ó¿ÚÔÚWDMÇý¶¯
³ÌÐòÖл¹¿ÉʹÓ㬲¿·ÖÀϵĽӿڣ¨È磺HalGetAdapter(...), 
IoConnectInterrupt(...), and IoAssignResources(...) £©±»Ò»Ð©Ðµķ½·¨È¡´ú
¡£Ò»Ð©²»³£Ê¹ÓõÄÌØÕ÷È磺ÄÚ´æÓòºÍERESOURCES²»±»WDMÖ§³ÖÁË¡£
¡¡¡¡ÁíÒ»·½Ã棬Windows 2000Çý¶¯³ÌÐò°üº¬ÁËÒ»Ì×еÄIRP_MJ¹¦ÄÜ£¬ÐµÄÇý¶¯³ÌÐò
Èë¿ÚµãºÍеĴ¦Àí·½·¨¡£µ«ÊǴ󲿷ÖÎÒÃÇÊìϤµÄ¾Éº¯ÊýÈÔÈ»±»Windows 2000ºËÐÄÄ£
ʽÇý¶¯³ÌÐò±ê×¼Ö§³Ö¡£
¡¡¡¡ÕýÊÇÓÉÓÚÉÏÃæµÄÔ­Òò£¬Windows 2000±ê×¼ÊÇWDM±ê×¼µÄÒ»¸ö³¬¼¯£¬ËùÒÔûÓÐÒ»
¸öWindows 2000Çý¶¯³ÌÐòÊÇÈÝÒ×±ä³ÉWDMÇý¶¯³ÌÐòµÄ¡£

¾ßÌå²½Öè
ÏÖÔÚÎÒÃÇÀ´½²ÊöÈçºÎ½«Windows NT V4ºËÐÄÇý¶¯³ÌÐòÉý¼¶ÎªWindows 2000Çý¶¯³ÌÐò
¡££¨×¢£ºµ«ÊDz»Ò»¶¨ÊÇWDMÇý¶¯³ÌÐò£©
¡¡¡¡ÔÚWindows NT V4£¬ËùÓеÄÇý¶¯³ÌÐòºÍÉ豸³õʼ»¯¹¤×÷¶¼ÊÇÔÚDriverEntry(¡­
)ÖÐʵÏֵġ£ÔÚDriverEntry(¡­)£¬ÎÒÃÇͨ¹ýDriver¶ÔÏóÊä³öÈë¿Úµã¡¢Ê¶±ðÉ豸£¬ÇÒ
¶Ôÿ¸öÕÒµ½µÄÉ豸²úÉúÒ»¸öÉ豸¶ÔÏó¡£Õâͨ³£Òâζ×ÅɨÃè×ÜÏß·¢ÏÖÉ豸£¬È»ºóµ÷ÓÃ
IoCreateDevice(¡­)¡£½ÓÏÂÀ´¸øÉ豸±£ÁôÓ²¼þ×ÊÔ´£¬Èç¶ÔÓÚPCIÉ豸µ÷ÓÃ
HalAssignSlotResources(¡­) ºÍIoAssignResources(¡­)À´»ñµÃÉ豸ÐèÒªµÄÓ²¼þ×Ê
Ô´CM_RESOURCE_LIST£¬ÕâЩ×ÊÔ´°üÀ¨£º¶Ë¿Ú¡¢¹²ÏíÄÚ´æÇøÓò¡¢IRQs¡¢DMAͨµÀÒÔ¼°
ÆäËûÎÒÃǵÄÉ豸ÐèÒªµÄÓ²¼þ×ÊÔ´¡£ÎÒÃÇÒ²ÔÚDriverEntry(..)ÖÐÁ¬½ÓÖжϵȵȡ£
¡¡¡¡ÔÚWindows2000ÖУ¬Ç°ÃæÔÚDriverEntry(¡­)ÖеĴ¦Àí±»·Ö³ÉÁËÈý¸ö²¿·Ö£º
¡¡¡¡1£® ³õʼ»¯Çý¶¯³ÌÐò±¾Éí¡£È磺Êä³ö³ÌÐòÈë¿Úµã¡£
¡¡¡¡2£® ·¢ÏÖÇý¶¯³ÌÐòÐèÒªÖ§³ÖµÄÉ豸¡£È磺²úÉúÒ»¸öÉ豸¶ÔÏó£¨ÏÖÔÚÕⲿ·Ö±»ÒÆ
µ½AddDevice(¡­)Èë¿Úµã£©¡£
¡¡¡¡3£® É豸×ÊÔ´·ÖÅäºÍÉ豸³õʼ»¯¡£Õⲿ·ÖÊÇÔÚ´¦ÀíÒ»¸öIRP_MJ_PNP IRP£¨ÆäÖÐ
´Î¹¦ÄܺÅΪIRP_MN_START_DEVICE£©½øÐеġ£

Windows 2000µÄÇý¶¯³ÌÐòÈë¿Ú£ºDriverEntry(¡­)
¡¡¡¡ºÍWindows NT V4Ò»Ñù£¬ÔÚWindows 2000ÖÐDriverEntry(¡­)Ò²Êǵ±Çý¶¯³ÌÐòµÚ
Ò»´Î±»ÔØÈëʱ£¬ÔÚIRQL_PASSIVE_LEVEL¼¶µ÷Óõġ£
¡¡¡¡DriverEntry(¡­)Ö»×öÇý¶¯³ÌÐòµÄ³õʼ»¯¹¤×÷¡£°üÀ¨Í¨¹ýDrivers¶ÔÏóÊä³ö³ÌÐò
Èë¿Úµã¡£ÆäÖÐÁ½¸öÖØÒªµÄÈë¿ÚµãÊÇ(1)AddDevice(¡­)£¬·ÅÔÚ
DriverObject->DriverExtension->AddDevice.
¡¡(2) IRP_MJ_PNP IRPsµÄ·ÖÅÉÈë¿Úµã£¬·ÅÔÚ
DriverObject->MajorFunction[IRP_MJ_PNP]).
¡¡¡¡ÄãÒ²¿ÉÒÔÔÚDriverEntry(¡­)Íê³ÉÇ°£¬¿ÉÒÔ±£´æ×¢²á·¾¶ÐÅÏ¢¹©ÒÔºóʹÓᣵ«
ÊÇÕâÒ»Ïî²»ÊDZØÐëµÄ£¬Ö»ÓÐÔÚÄãÒÔºóÈç¹ûµ÷ÓÃÏÂÁк¯Êýʱ£¬¿ÉÄÜÐèÒªÕâЩÐÅÏ¢×÷Ϊ
²ÎÊý¡£È磺IoRegisterDriverReinitialization(¡­)£¬HalAssignSlotResources(
¡­)£¬IoAssignResources(¡­).¡£»òÕßÔÚAddDevice(¡­)´¦Àí¹ý³ÌÖнøÐÐ×¢²á±í²éÕÒ
¡£µ±È»£¬Ò»¸öºÃµÄWindows 2000Çý¶¯³ÌÐò²»Ê¹ÓÃÕâЩ·½·¨¡£Èç¹ûÄãȷʵÐèÒª´æ´¢×¢
²á±í·¾¶£¬Ò»¶¨Òª´æ´¢×¢²á±í·¾¶Êý¾Ý£¬¶ø²»ÊÇ×¢²á±í·¾¶µÄÖ¸Õë¡£ÒòΪI/O¹ÜÀí
Æ÷ÔÚµ÷ÓÃÍêDriverEntry(¡­)ºó£¬»áÊÍ·Å×¢²á±í·¾¶Êý¾ÝÕ¼ÓõĿռ䡣
ËäÈ»Widnows 2000µÄÎĵµÖÐûÓÐÃ÷ÏÔÖ¸Ã÷£¬µ«ÊÇÔÚDriverEntry(¡­)Öл¹ÊÇ¿ÉÒÔÉú
³ÉDevice¶ÔÏóµÄ¡£Ö»²»¹ýÕâ²»ÊÇÒ»ÖÖ±ê×¼µÄ·½·¨ÁË¡£ÊÂʵÉÏ£¬ÔÚDriverEntry(¡­)
ÖÐΨһÐèÒªÉú³ÉµÄÉ豸¶ÔÏóÊÇÄÇЩÕû¸öÇý¶¯³ÌÐò¶¼ÐèÒªµÄÉ豸¶ÔÏó¡£È磺һЩ²Ù×÷
¹ÜÀíÉ豸¡£Èç¹ûÄãȷʵÐèÒªÔÚDriverEntry(¡­)ÖÐÉú³ÉÈκÎÉ豸¶ÔÏó£¬×¢ÒâÒ»¶¨Òª
½«É豸¶ÔÏóµÄDO_DEVICE_INITIALIZINGλÇå³ý¡£
¡¡¡¡ÉÏÃæ¾ÍÊÇWindows 2000µÄDriverEntry(¡­)Ëù×öµÄ¹¤×÷£¬ÓëÒÔÇ°µÄWindows NT
°æ±¾Ïà±È½Ï£¬ÄÚÈÝ´ó´ó¼õÉÙÁË¡£½ÓÏÂÀ´¾ÍÊÇÔÚAddDevice(¡­)ÖнøÐд¦ÀíÁË¡£

AddDevice(¡­)¹ý³Ì
¡¡¡¡ÔÚDriverEntry(¡­)´¦ÀíÍêºó£¬Èç¹ûÄãµÄÇý¶¯³ÌÐòÐèÒª´¦ÀíµÄÈκÎÉ豸±»¼Óµ½
ϵͳµÄ»°£¬I/O¹ÜÀíÆ÷¾Í»áµ÷ÓÃÇý¶¯³ÌÐòÖеÄAddDevice(¡­)Èë¿Úµã¹ý³Ì¡£ËüµÄÔ­ÐÍ
ÈçÏ£º
¡¡¡¡NTSTATUS XxxxAddDevice (IN struct _DRIVER_OBJECT *DriverObject,
¡¡¡¡IN struct _DEVICE_OBJECT *PhysicalDeviceObject);
¡¡¡¡ÆäÖÐDriverObject²ÎÊýµÄÄÚÈݺʹ«¸øDriverEntry(¡­)Èë¿ÚµãµÄ²ÎÊýÄÚÈÝÒ»Ñù
¡£PhysicalDeviceObject²ÎÊýÊÇÒ»¸öÃèÊöÉ豸µÄÎïÀíÉ豸¶ÔÏó(PDO)Ö¸Õë¡£Õâ¸ö¶Ô
ÏóÊÇ×ÜÏßÇý¶¯³ÌÐòÔÚɨÃè×ÜÏßʱ¶Ô·¢ÏÖµÄÿ¸öÎïÀíÁ¬½Óµ½×ÜÏßµÄÉ豸²úÉúµÄ¡£PDO
±»ÓÃ×ö×ÜÏßÇý¶¯³ÌÐòºÍ¼´²å¼´ÓùÜÀíÆ÷ͨÐÅ£¬Í¨ÖªÄãµÄÇý¶¯³ÌÐòÒ»¸öPnPʼþ£¨Èç
£ºÍ»È»É豸¶Ï¿ª£©¡£Í¼Ò»Õ¹Ê¾ÁËʵ¼ÊÎïÀíÉ豸¶ÔÏóºÍ¹¦ÄÜÉ豸¶ÔÏóµÄ¹Øϵ¡£

¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Í¼1
ÔÚAddDevice(¡­)Èë¿Úµã¹ý³ÌÖУ¬Ö÷Òª×öÁ½¸ö¹¤×÷£º
¡¡¡¡1£® Éú³ÉÒ»¸ö»ò¶à¸öDevice¶ÔÏóÀ´´ú±íÄãµÄʵ¼ÊÉ豸£¬ÕâÊÇÓÃ
IoCreateDeviceÀ´ÊµÏֵġ£µ«ÊÇҪעÒ⣬DeviceObject->FlagsÖеÄ
DO_DEVICE_INITIALIZINGλҪ±»Çå³ý¡£ÕâÊÇÖØÒªµÄ£¬Èç¹ûÕâ¸öλûÓб»Çå³ý£¬ÆäËû
É豸¾Í²»Äܸ½¼ÓÔÚÕâ¸öÉ豸ÉÏ¡£Èç¹ûÄãûÓÐÇå³ýÕâ¸ö룬ÔÚDebug°æµÄÇý¶¯³ÌÐòÔË
ÐÐʱ£¬I/O¹ÜÀíÆ÷»áÌáÐÑÄãµÄ¡£»¹ÓÐÒ»¸ö¾ÍÊÇÈç¹ûÍⲿͨ¹ýCreateFileÀ´²Ù×÷Õâ¸ö
É豸µÄ»°£¬ÔòÐèҪΪÕâ¸öÉ豸¶ÔÏóÓÃIoCreateSymbolicLink(¡­)Éú³ÉÒ»¸ö·ûºÅÁ¬½Ó
.
¡¡¡¡2£® ½«Õâ¸öÐÂÉú³ÉµÄÉ豸¶ÔÏ󸽼ÓÔÚÉ豸Çý¶¯³ÌÐòÉú³ÉµÄÎïÀíÉ豸ÉÏ¡£Õâ²½¿É
ÓÃIoAttachDeviceToDeviceStack(¡­)À´ÊµÏÖ£¬´«µÝµÄ²ÎÊýΪÄãÐÂÉú³ÉµÄÉ豸¶ÔÏó
ºÍAddDevice(¡­)Ëù´«µÝ½øÀ´µÄÎïÀí¶ÔÏó¡£·µ»ØֵΪʼþ±»¸½¼Óµ½µÄʵ¼ÊÉ豸¶ÔÏó
¡£

¡¡¡¡ÔÚAddDevice(¡­)Íê³ÉÇ°£¬Äã¿ÉÒÔ¶Ôÿ¸öÉ豸¶ÔÏó½øÐгõʼ»¯¡£°üÀ¨£º¼ì²é×¢
²á±íÖÐÓëÉ豸Ïà¹ØµÄÐÅÏ¢¡£ÒòΪÄãûÓнӴ¥µ½Êµ¼ÊµÄÓ²¼þ£¬ËùÒÔ´ËʱÄ㻹²»ÄÜ´¦Àí
ÄãËùÊÕµ½µÄÇëÇó¡£ÕýÈ·µÄÀí½âÊÇ£º´ËʱÄãµÄÉ豸ËäÈ»±»Éú³ÉÁË£¬µ«ÊÇ»¹Ã»Óб»Æô¶¯
£¨ÄãÖ»ÊÇÊÕµ½Ò»¸öÕë¶ÔÕâ¸öÉ豸µÄAddDevice(¡­)µ÷Ó㬻¹Ã»ÓÐÊÕµ½
IRP_MN_START_DEVICEÇëÇ󣩣¬Ö»ÊÇÅŶÓÈκÎIRPsÇëÇó¹©ÒÔºóÔÚÄãµÄÉ豸ÉÏ´¦Àí¡£

¡¡¡¡AddDevice(¡­)³É¹¦Íê³Éºó£¬Ò»¸öSTATUS_SUCCESS±»·µ»Ø¡£Èç¹û·µ»ØÒ»¸ö´íÎó
£¬ÔòÇý¶¯³ÌÐòµÄÔØÈë¹ý³Ì±»ÖÐÖ¹¡£

·ÖÅÉIRP_MJ_PNP£º
¡¡¡¡µ±Ò»¸öÇ°ÃæÌí¼ÓµÄÉ豸±»Æô¶¯ºó£¬¼´²å¼´ÓùÜÀíÆ÷Òªµ÷ÓÃÄãµÄÇý¶¯³ÌÐò£¬²¢´«
µÝÒ»¸öIRP°üº¬IRP_MJ_PNPÖ÷¹¦ÄÜÂëºÍIRP_MN_START_DEVICE´Î¹¦ÄÜÂë¡£
IRP_MJ_PNP±»ÓÃÓÚ±íʾÕâ¸öIRPÊÇÒ»¸ö¼´²å¼´ÓÃʼþ¡£ÆäÖÐÓÐÆ߸ö²»Í¬¹¦ÄÜÂëÀ´·Ö
±ðΨһµÄ±íʾ¸÷ÖÖ¼´²å¼´ÓÃÇëÇó¡£ÔÚWDM/Windows 2000ÖУ¬É豸Çý¶¯³ÌÐòËù´¦µÄÇý
¶¯³ÌÐò¶ÑÕ»µÍ¶ËÈç¹ûÊÇÒ»¸ö×ÜÏßÇý¶¯³ÌÐò¡£Õâʱ´¦ÀíPNPÇëÇóÓÉÁ½µãÐèҪעÒ⣺
¡¡¡¡1£® ËùÓеÄIRP_MJ_PNP IRPs±ØÐë±»ÄãµÄÇý¶¯³ÌÐò´«µ½ÏÂÃæµÄ×ÜÏßÇý¶¯³ÌÐò¡£
ÕâÊÇϵͳÕý³£ÔËÐеĹؼü¡£
¡¡¡¡2£® Ò»Ð©PNP IRPsÔÚ±»ÄãµÄÉ豸Çý¶¯³ÌÐò´¦ÀíÇ°£¬±ØÐë±»ÏÂÃæµÄ×ÜÏßÇý¶¯³ÌÐò
ÕýÈ·´¦Àí¡£ÁíÒ»·½Ã棬һЩPNP IRPsÔÚ±»´«µ½ÏÂÃæµÄ×ÜÏßÇý¶¯³ÌÐòÇ°£¬ÐèÒª±»ÄãµÄ
Çý¶¯³ÌÐòÕýÈ·´¦Àí¡£
¡¡¡¡¾ö¶¨ÄÄЩPNP IRPsÊ×Ïȱ»Ë­´¦Àí£¬ÕâÊÇÄãµÄÇý¶¯³ÌÐòµÄÈÎÎñ¡£²¢ÇÒÔÚ´¦ÀíÍêºó
£¨»òûÓд¦Àí£©£¬µ÷ÓÃIoCallDriverCall(¡­)À´´«µÝIRP¡£ÆäÖÐ
IoCallDriverCall(¡­)ÖеÄDevice¶ÔÏó²ÎÊý¾ÍÊÇÇý¶¯³ÌÐòÔÚAddDevice(¡­)µ÷ÓÃ
IoAttachDeviceToDeviceStack(¡­)·µ»ØµÄPDEVICE_OBJECT¶ÔÏó¡£Ï±í×ܽáÁËPNP 
IRPµÄ´¦Àí˳Ðò¡£

¡¡¡¡
¡¡¡¡Èç¹ûÒ»¸öÇëÇóÊ×ÏÈÓÉÉ豸Çý¶¯³ÌÐò´¦Àí£¬ÄÇôµ±É豸Çý¶¯³ÌÐò½ÓÊÕµ½Õâ¸öÇëÇó
ºó£¬Ê×Ïȼì²éÕâ¸öÇëÇó£¬Èç¹ûÄܹ»´¦Àí£¬È»ºó´¦ÀíÕâ¸öÇëÇó¡£µ±É豸Çý¶¯³ÌÐò³É¹¦
Íê³ÉÁËÕâ¸öÇëÇóµÄ´¦Àíºó£¬Ëü·¢ËÍÕâ¸öÇëÇóµ½ÏÂÃæµÄ×ÜÏßÇý¶¯³ÌÐò¡£Èç¹û²»ÄÜ´¦Àí
Õâ¸öÇëÇó£¬É豸Çý¶¯Íê³ÉÕâ¸öÇëÇó²¢·µ»ØÒ»¸ö´íÎ󣬴Ëʱ¾Í²»½«IRP´«µÝµ½ÏÂÃæµÄ
×ÜÏßÇý¶¯³ÌÐò¡£
¡¡¡¡´«µÝÒ»¸öIRPÇëÇóµ½Ä¿±êÇý¶¯³ÌÐòÉ豸Ëù²ÉÓõķ½·¨ºÍÒÔÇ°µÄÒ»Ñù¡£Ö»²»¹ý
Windows 2000ÏÖÔÚÓÐÁËһЩ´¦ÀíºêÀ´°ïÖúÍê³ÉÕâ¸ö¹¤×÷¡£Òª´«µÝÒ»¸öÇëÇóµ½ÏÂÃæµÄ
Çý¶¯³ÌÐò£¬ÄãÖ»Òª¿½±´µ±Ç°µÄI/O¶ÑջλÖõ½ÏÂÒ»¸öI/O¶ÑջλÖ㬲¢×¢²áÒ»¸öÍê³É
Àý³Ì£¨Èç¹ûÔ¸ÒâµÄ»°£©£¬È»ºóµ÷ÓÃIoCallDriver(¡­)¾Í¿É¡£ÀýÈçÏÂÃæÕâ¸öÇé¿ö£ºÇý
¶¯³ÌÐòÊ×ÏÈ´¦ÀíIRP_MJ_PNP IRP£¬ÇÒ²»ÐèÒªÍê³ÉÀý³Ì¡£Õⲿ·ÖµÄ´úÂëÒ»ÖÖÐÎʽÈçÏÂ
£º
¡¡¡¡// µ÷ÓöÑÕ»¿½±´ºê£¬Õë¶ÔWindows2000
¡¡¡¡IoCopyCurrentIrpStackLocationToNext(Irp); 
¡¡¡¡// ·¢ËÍÇëÇóµ½×ÜÏßÇý¶¯³ÌÐò²¢·µ»Ø¡£
¡¡¡¡Return (IoCallDriver(DeviceExtension->PdoPointer,Irp); 

¡¡¡¡µ«ÕâÖÖ´¦Àí·½·¨¶ÔÓÚËùÓеÄIRP¶¼¿ÉÒÔÂ𣿴ð°¸ÊDz»ÐС£ÒòΪÈç¹ûµ±×ÜÏßÇý¶¯
³ÌÐòÊ×ÏÈ´¦ÀíÇëÇóµÄ»°£¬ÉÏÃæµÄ×ö·¨¾Í»á³öÎÊÌâ¡£ÀýÈ磺µ±ÄãµÄÉ豸±»Æô¶¯Ê±£¬ÊÕ
µ½ÁËÒ»¸öIRP_MN_START_DEVICE IRPÇëÇó£¬ËüÊ×ÏÈÐèÒª±»×ÜÏßÇý¶¯³ÌÐò´¦Àí¡£É豸
Çý¶¯³ÌÐòÒ»½Óµ½Õâ¸öÇëÇ󣬾ͽ«Ëü´«µÝ¸ø×ÜÏßÇý¶¯³ÌÐò£¬±¾Éí²»×öÈκδ¦Àí¡£ºÍ
Windows NT V4Ïàͬ£¬É豸Çý¶¯³ÌÐò´ËʱÈç¹ûÏëÔÚÏÂÃæµÄÇý¶¯³ÌÐò´¦ÀíÍêÒ»¸öIRPºó
±»Í¨Öª£¬¿ÉÒÔÔÚIRP±»´«µÝµ½ÏÂÃæµÄÇý¶¯³ÌÐòÇ°£¬ÉèÖÃÒ»¸öÍê³ÉÀý³Ì¡£µ±Íê³ÉÀý³Ì
±»µ÷ÓÃʱ£¬Õâ¸öIRP¾ÍÄܱ»Õâ¸öÉ豸Çý¶¯³ÌÐò´¦Àí¡£µ«²»ÐÒµÄÊÇ£¬Íê³ÉÀý³Ì¿ÉÄÜÊÇ
ÔÚIRQL>=DISPATCH_LEVEL²ã±»µ÷Óõģ¬Èç¹ûÕâÑùµÄ»°£¬ÄÇô´¦Àí¹ý³Ì½«±äµÃ¸´ÔÓ¡£

¡¡¡¡½â¾öÕâ¸öÎÊÌâÒ²ÓкܶàµÄ·½·¨£¬ÎÒÈÏΪ×îºÃµÄ·½·¨ÊÇÔÚÉ豸Çý¶¯³ÌÐòµÄ·ÖÅÉÀý
³ÌÖеȴýÒ»¸öʼþ£¬µ±Íê³ÉÀý³Ì±»µ÷ÓÃʱ£¬ËüÉú³ÉÕâ¸öʼþ´Ó¶ø»½ÐÑ·ÖÅÉÀý³Ì£¬È»
ºóÔÚ·ÖÅÉÀý³ÌÖУ¬IRP±»´¦ÀíºÍÍê³É¡£¶øÍê³ÉÀý³Ì´Ëʱͨ¹ý·µ»ØÒ»¸ö
STATUS_MORE_PROCESSING_REQUIRED¸øI/O¹ÜÀíÆ÷À´Ðû³Æ¶ÔÓÚÕâ¸öIRPµÄÓµÓÐȨ¼´¿É
¡£ÏÂÃæ¾ÍÊÇÕâÑùÒ»¶ÎÀý×Ó
// ÕâÊÇÒ»¸öWindows 2000ÐÂÌṩµÄºê¡£
//
IoCopyCurrentIrpStackLocationToNext (Irp);
//
//ΪIRPÉèÖÃÒ»¸öÍê³ÉÀý³Ì¡£ÆäÖеĴ«µÝÁËÒ»¸öºóÃæ
// Òª½øÐÐ֪ͨµÄʼþÖ¸Õë pnpEvent 
// ×öΪÉÏÏÂÎÄÃô¸Ð²ÎÊý¡£
//
IoSetCompletionRoutine (Irp,
OsrPnpCompRoutine,
&pnpEvent,
TRUE,
TRUE,
TRUE);
//
// ³õʼ»¯ºóÃæÒª´«µÝµÄ֪ͨʼþpnpEvent. 
// 
KeInitializeEvent(&pnpEvent, 
NotificationEvent, 
FALSE);

// ´«µÝIRPµ½ÏÂÃæµÄÇý¶¯³ÌÐò

status = IoCallDriver(devExt->NextDriverObject, Irp);
//
// µÈ´ýÕâ¸öʼþ
//
KeWaitForSingleObject(&pnpEvent,
Executive,
KernelMode,
FALSE,
NULL);
//
// ÊÕµ½Íê³ÉÀý³ÌÖеÄʼþºó£¬´¦ÀíIRP
// 
//
status = Irp->IoStatus.Status;
if (NT_SUCCESS (status)) {
//
//
status = OsrProcessPnPIrp(Irp);
}
//
//ÔÚÕâÀï×îÖÕÍê³ÉÕâ¸öÀý³Ì¡£
//
Irp->IoStatus.Status = status;
Irp->IoStatus.Information = 0;
IoCompleteRequest (Irp, IO_NO_INCREMENT);

¡¡¡¡²»ÄÑ°É£¬¶Ô²»¶Ô£¿ÕýÈçÇ°Ãæ½²ÊöµÄ£¬Õâ¶Î´úÂë²»½ö½ö´«µÝIRPµ½ÏÂÃæµÄÇý¶¯³Ì
Ðò£¬ËüÒ²²úÉúÒ»¸öʼþ£¬²¢µÈ´ýÕâ¸öʼþ±»Í¨Öª¡£Ê¼þÊÇÔÚÍê³ÉÀý³ÌÖб»Í¨ÖªµÄ¡£
ÈçÏ£º
NTSTATUS
OsrPnpCompRoutine(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context)
{
PKEVENT event = (PKEVENT)Context;
//
// ÅжÏÊÇ·ñÕâ¸öIRPÐèÒª±»¹ÒÆð£¿
//
if (Irp->PendingReturned) {
IoMarkIrpPending( Irp );
}
//
// Ïò·ÖÅÉÀý³Ì֪ͨÕâ¸öʼþ
//
KeSetEvent(event, 0, FALSE);
//
// ÖØÐÂÉùÃ÷IRP£¬ÒÔ±ã·ÖÅÉÀý³Ì¼ÌÐøÍê³É¡£
//
// ×¢Ò⣺·ÖÅÉÀý³Ì±ØÐëµ÷ÓÃIoCompleteRequest À´Íê³ÉÕâ¸öÀý³Ì¡£
//
return STATUS_MORE_PROCESSING_REQUIRED; 
}

¡¡¡¡ÎÞ¿É·ñÈÏ£¬ÕâÊÇÒ»¸ö¼òµ¥ÍêÉƵÄÍê³ÉÀý³Ì£¬»ù±¾ÉϵŤ×÷¶¼ÊµÏÖÁË¡£¶ÔÓÚÕâ¸ö
Àý³Ì£¬Ò»¸öûÓо­ÑéµÄÇý¶¯³ÌÐò×÷Õß¿ÉÄÜÈÏΪ£¬µ±Irp->PendingReturned±»ÉèÖõÄ
»°²»ÐèÒªIoMarkIrpPending(¡­)¡£µ«Êµ¼ÊÉÏÕâÊǾø¶ÔÐèÒªµÄ¡£¾ßÌå¿ÉÒԲμûÆäËû×Ê
ÁÏ£¬ÕâÀï¾Í²»ÏêÊöÁË¡£ 

´¦ÀíIRP_MN_START_DEVICE
¡¡¡¡ÏÖÔÚÏêϸÌÖÂÛһϾßÌåÈçºÎ´¦ÀíIRP_MN_START_DEVICEÇëÇó¡£
¡¡¡¡ÕýÈçÇ°Ãæ½²ÊöµÄ£¬µ±¼´²å¼´ÓùÜÀíÆ÷ÏëÆô¶¯ÄãµÄÉ豸ʱ£¬ËüÏòÄãµÄÇý¶¯³ÌÐò·¢
ËÍÒ»¸öIRP_MJ_PNP IRP£¬ÆäÖдι¦ÄܺÅΪIRP_MN_START_DEVICE¡£Õâ¸ö±»Æô¶¯µÄÉè
±¸¾ÍÊÇÓÉÎÒÃÇÔÚPNP·ÖÅÉÀý³ÌÖнÓÊÕµ½µÄÉ豸¶ÔÏóÖ¸ÕëÀ´±íʾ¡£Õâ¸öÇëÇóÒªÊ×Ïȱ»
×ÜÏßÇý¶¯³ÌÐò´¦Àí£¬È»ºóÔÙÓÉÉ豸Çý¶¯³ÌÐò´¦Àí£¬´¦Àí¹ý³Ì¿ÉÒÔ²ÉÓÃÇ°Ãæ½²ÊöµÄ·½
·¨¡£
¡¡¡¡µ«ÊÇÕâ¸öÇëÇóÔÚÉ豸Çý¶¯³ÌÐòÖб»´¦ÀíÀ´¸ÉʲôÄØ£¿»Ø¹ýÍ·À´ÎÒÃÇ¿ÉÒÔ¿´³ö£¬
µ½ÏÖÔÚΪֹÎÒÃÇ»¹Ã»ÓÐΪÉ豸·ÖÅäºÍ±£ÁôÈκÎ×ÊÔ´£¬Õâ¸öIRP_MN_START_DEVICE 
IRPµÄÖ÷ҪĿµÄ¾ÍÊÇΪÎÒÃÇÌṩһ¸öÕâЩ×ÊÔ´µÄÁÐ±í¡£
¡¡¡¡°üº¬ÔÚIRP_MN_START_DEVICE IRPµÄµ±Ç°I/O¶ÑջλÖÃÖÐÓÐÁ½¸ö²ÎÊýÊÇÎÒÃǸÐÐË
ȤµÄ£º¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Parameters.StartDevice.AllocatedResources £¨ÕâÊÇ
Ò»¸öÃèÊöÉ豸×ÊÔ´µÄCM_RESOURCE_LSITÀàÐ͵ÄÖ¸Õ룩ºÍParameters.StartDevice.
AllocatedResourceTranslated£¨ÕâÊÇÒ»¸ö°üº¬É豸×ÊÔ´µÄת»»ÖµµÄ
CM_RESOURCE_LISTÀàÐ͵ÄÖ¸Õ룩¡£ÕâЩ²ÎÊýÖеÄ×ÊÔ´¶¼ÊÇPnP¹ÜÀíÆ÷¡¢I/O¹ÜÀíÆ÷ºÍ
HALͬÒâ·ÖÅä¸øÄãµÄÉ豸ʹÓõÄ×ÊÔ´¡£ ¶ÔÓ¦ÓÚWindows NT V4µÄPCIÉ豸£¬Î´×ª»»µÄ
×ÊÔ´ÊÇÄÇЩÓÉHalAssignSlotResource(¡­)Ëù·µ»ØµÄ×ÊÔ´£¬ÕâЩ×ÊÔ´µÄת»»°æ±¾¾Í
ÊÇ´ÓHalTranslateBusAddress(¡­)ºÍHalGetInterruptVector(¡­)ËùÊä³öµÄ×ÊÔ´¡£

¡¡¡¡µÃµ½CM_RESOURCE_LIST£¬Çý¶¯³ÌÐò¾Í¿ÉÒÔ²ÉÓÃWindows NT V4 Öеķ½·¨À´´¦Àí
¡¢³õʼ»¯É豸¡£È磺µ±Ò»¸ö×ÊÔ´ÔÚÄÚ´æ¿Õ¼ä£¬É豸Çý¶¯³ÌÐòÐèÒªµ÷ÓÃ
MmMapIoSpace(¡­)À´¸³Óè¸øËü¶ÔÓ¦µÄºËÐÄÐéÄâµØÖ·¡£µ±ÒªÁ¬½ÓÒ»¸öÖжϣ¬¾Í¿ÉÒÔµ÷
ÓÃIoConnectInterrupt(¡­)¡£

×ܽá
¡¡¡¡µ±È»£¬»¹ÓÐÐèÒªÐí¶àÒªÌÖÂ۵ģ¬ÈçÔõÑùÍ£Ö¹É豸¡¢ÒÆ×ßÉ豸µÈµÈ¡£ÓÉÓÚÏÞÓÚÎÄ
ÕÂƪ·ù£¬ÕâÀï¾Í²»Ò»Ò»½éÉÜÁË¡£µ«ÊÇÄ¿Ç°µÄÄÚÈݶÔÓÚÈçºÎ¿ªÊ¼ÒÆÖ²Windows NT V4
µ½Windows 2000ÊÇ×ã¹»ÁË¡£


--
¡ù À´Ô´:¡¤¹þ¹¤´ó×϶¡Ïã bbs.hit.edu.cn¡¤[FROM: 172.16.1.103]
[°Ù±¦Ïä] [·µ»ØÊ×Ò³] [Éϼ¶Ä¿Â¼] [¸ùĿ¼] [·µ»Ø¶¥²¿] [Ë¢ÐÂ] [·µ»Ø]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
Ò³ÃæÖ´ÐÐʱ¼ä£º3.596ºÁÃë