התמיכה עבור Windows Vista Service Pack 1 (SP1) מסתיימת ב- 12 ביולי, 2011. כדי להמשיך לקבל עדכוני אבטחה עבור Windows, ודא שאתה משתמש ב-Windows Vista עם Service Pack 2 (SP2). לקבלת מידע נוסף, עיין בדף אינטרנט זה של Microsoft: התמיכה מסתיימת עבור גירסאות מסוימות של Windows.
מקור: התמיכה של Microsoft
פרסום מהיר
מאמרי פרסום מהירים מספקים מידע ישירות מתוך ארגון התמיכה של MICROSOFT. המידע הכלול ב- HEREIN נוצר בתגובה לנושאים מתפתחים או ייחודיים, או מציין תוספת למידע נוסף במאגר הידע.
מאפיין הבעיה
כאשר תהפוך התקן USB שאינו פעיל כעת, ייתכן שתקבל את הודעת השגיאה "עצור 0x44" במסך כחול. הודעת שגיאה זו דומה להודעה הבאה: STOP 0x00000044 ( parameter1 , parameter2 , parameter3 , parameter4 ) MULTIPLE_IRP_COMPLETE_REQUESTS
סיבה
בעיה זו עלולה להתרחש אם התקן ה- USB משתמש במנהל התקן שנכתב באמצעות Kernel Mode Driver Framework (KMDF) גירסה 1.7 או גירסה קודמת.הבעיה מתרחשת כאשר התקן ה- USB במצב לא פעיל (השעיה סלקטיבית מסוג USB) וההתקן הופך ללא זמין (למשל על-ידי לחיצה באמצעות לחצן העכבר הימני על ההתקן ב- מנהל ההתקנים ולחיצה על הפוך ללא זמין).בתנאים אלה, מסגרת KMDF גירסה 1.7 (או גירסה קודמת) אינה מחכה להשלמת Irps סלקטיבית מסוג USB, ובכך מאפשרת להסיר את ערימת המכשיר לפני השלמת Irp ההשעיה סלקטיבית מסוג USB (לדוגמה, על-ידי מנהל ההתקן של Usbhub).
פתרון
בעיה זו נפתרה בגירסה 1.9 ואילך של Kernel Mode Driver Framework (KMDF). Kernel Mode Driver Framework (KMDF) גירסה 1.9 זמינה בגירסת Windows 7 של Windows Driver Kit (WDK).מפתח מנהל התקן USB מבוסס-KMDF יכול לעקוף בעיה זו על-ידי ביצוע הפעולות הבאות:
-
רשום שגרת התקשרות חזרה של EvtDeviceReleaseHardware ברוטינה EvtDriverDeviceAdd של מנהל ההתקן.
-
הקצה אובייקט WDFWORKITEM ברוטינה התקשרות חזרה של EvtDriverDeviceAdd של מנהל ההתקן.
-
הקצאה ואתחול של אובייקט KEVENT, הצב את פריט העבודה בתור ברוטינה של התקשרות חזרה של EvtDeviceReleaseHardware של מנהל ההתקן, העברת אירוע זה כפרמטר הקשר והמתן לאותת על האירוע.
-
ברוטינה של התקשרות חזרה של פריט עבודה, השהה את הליך המשנה ב- 2 שניות בקירוב ולאחר מכן הגדר את האירוע. ערך ההשהיה המדויק הנדרש עשוי להיות שונה במערכות שונות ויש לבדוק אותו לפני היישום הסופי.
לפתרון המתואר יש שני אפקטים עיקריים:
-
הוא מכין בתור פריט עבודה שמסייע להשהות את ההפסקה של ערימת המכשירים עד שתור פריט העבודה מרוקן עד לפריט עבודה זה (מאחר שמחסנית ליבת ה- USB עשויה להשלים את ה- Irp של ההשעיה סלקטיבית מסוג USB באמצעות פריט עבודה).
-
הוא מציג עיכוב במקרה שפריט העבודה של מחסנית ליבת ה- USB ופריט העבודה של מנהל ההתקן מבוצעים בו-זמנית במערכות מרובות מעבדים/מרובות ליבות.
הערה: זהו אינו פתרון מקיף. זה רק עוזר לצמצם את הבעיה.
מידע נוסף
מקטעי הקוד לדוגמה שלהלן ממחישים כיצד ליישם פתרון זה:EvtDriverDeviceAdd( במנהל התקן של WDFDRIVER, IN PWDFDEVICE_INIT DeviceInit ) { PWORKER_ITEM_CONTEXT הקשר; WDF_OBJECT_ATTRIBUTES תכונות; WDF_WORKITEM_CONFIG workitemConfig; פריט עבודה של WDFWORKITEM; אני לא יכול לעשות את // הגדר התקשרות חזרה של EvtDeviceReleaseHardware // ... pnpPowerCallbacks.EvtDeviceReleaseHardware = EvtDeviceReleaseHardware; WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks); אני לא יכול לעשות את // הקצאת WDFWORKITEM // WDF_OBJECT_ATTRIBUTES_INIT(&תכונות); WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(&,WORKER_ITEM_CONTEXT); תכונות. ParentObject = מכשיר; WDF_WORKITEM_CONFIG_INIT(&workitemConfig, EvtWorkItem); status = WdfWorkItemCreate(&workitemConfig, &, &workItem); אם (! NT_SUCCESS(מצב)) { מצב החזרה; } devContext->WorkItem = workItem; אתה לא יכול לעשות את זה.NTSTATUSEvtDeviceReleaseHardware( ב- WDFDEVICE Device, IN WDFCMRESLIST ResourcesTranslated ){ KEVENT event; PWORKER_ITEM_CONTEXT הקשר; פריט עבודה של WDFWORKITEM; UNREFERENCED_PARAMETER(ResourcesTranslated); workItem = GetDeviceContext(Device)->WorkItem; context = GetWorkItemContext(workItem); KeInitializeEvent(&, NotificationEvent, FALSE); אירוע >הקשר = &אירוע; // הצב בתור את פריט העבודה // WdfWorkItemEnqueue(workItem); // המתן ל- workitem כדי לאותת על האירוע // KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL); החזר STATUS_SUCCESS;}VOIDEvtWorkItem( IN WDFWORKITEM WorkItem ){ PWORKER_ITEM_CONTEXT הקשר; LARGE_INTEGER זמן; context = GetWorkItemContext(WorkItem); // השהה את הליך המשנה למשך 2 שניות // מרווח זמן. QuadPart = -2 * 10 * 1000 * 1000; KeDelayExecutionThread(KernelMode, FALSE, &זמן); // אותת את שרשור ההמתנה // KeSetEvent(context->Event, IO_NO_INCREMENT, FALSE); אירוע תלוי הקשר >= NULL;}בקובץ הכותרתtypedef struct _WORKER_ITEM_CONTEXT { PKEVENT Event;} WORKER_ITEM_CONTEXT, * PWORKER_ITEM_CONTEXT;WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(WORKER_ITEM_CONTEXT, GetWorkItemContext)EVT_WDF_DEVICE_RELEASE_HARDWARE EvtDeviceReleaseHardware;EVT_WDF_WORKITEM EvtWorkItem;
כתב ויתור
MICROSOFT ו/או ספקיה אינם מהווים כל מצג או אחריות לגבי התאימות, המהימנות או הדיוק של המידע הכלול במסמכים ובגרפיקה הקשורה שפורסמו באתר אינטרנט זה ("החומרים") לכל מטרה. החומרים עשויים לכלול אי-דיוקים טכניים או שגיאות טיפוגרפיות, וייתכן שיתוקנו בכל עת ללא הודעה מוקדמת.עד למידה המרבית המותרת על-פי החוק החל, MICROSOFT ו/או ספקיה אינם מצייתים ולא כוללים את כל הייצוגים, האחריות והתנאים בין אם מפורשים, משתמעים או סטטוטטוריים, כולל אך לא מוגבל לייצוגים, לאחריות או לתנאים של תואר, אי-הפרה, איכות משביעת רצון, סחירות וכושר למטרה מסוימת, ביחס לחמרים.