!irp
Die Erweiterung !irp zeigt Informationen über ein I/O-Request-Paket (IRP) an.
!irp Address [Detail]
Parameter
Adresse
Gibt die hexadezimale Adresse der IRP an.
Detail
Wenn dieser Parameter mit einem beliebigen Wert, z. B. 1, angegeben wird, enthält die Ausgabe den Status des IRP, die Adresse seiner Memory Descriptor List (MDL), seinen eigenen Thread und Stack-Informationen für alle seine I/O-Stacks sowie Informationen über jeden Stack-Speicherplatz für den IRP, einschließlich der hexadezimalen Versionen des Major Function Code und des Minor Function Code. Wenn dieser Parameter weggelassen wird, enthält die Ausgabe nur eine Zusammenfassung der Informationen.
DLL
Kdexts.dll
Zusätzliche Informationen
Siehe Plug and Play Debugging und Debugging Interrupt Storms für Anwendungen dieses Erweiterungsbefehls. Informationen über IRPs finden Sie in der Windows Driver Kit (WDK) Dokumentation und unter Microsoft Windows Internals von Mark Russinovich und David Solomon. Weitere Informationen zu den Major- und Minor-Funktionscodes finden Sie in der Dokumentation zum Windows Driver Kit (WDK).
Dieses Thema beschreibt die IRP-Struktur, IRP.
Ausführliche Informationen zur Dekodierung der IRP-Struktur, einschließlich der zurückgegebenen Args, finden Sie in den folgenden Ressourcen.
- Windows Internals von Mark E. Russinovich, David A. Solomon und Alex Ionescu
- Entwicklung von Treibern mit der Windows Driver Foundation Guy Smith und Penny Orwick
Hinweise
Die Ausgabe gibt auch an, unter welchen Bedingungen die Abschlussroutine für jeden Stack-Ort aufgerufen wird, sobald der IRP abgeschlossen und der Stack-Ort verarbeitet ist. Das kann drei Gründe haben:
Erfolg
Gibt an, dass die Abschlussroutine aufgerufen wird, wenn der IRP mit einem Erfolgscode abgeschlossen wurde.
Fehler
Gibt an, dass die Abschlussroutine aufgerufen wird, wenn der IRP mit einem Fehlercode abgeschlossen wird.
Abbrechen
Zeigt an, dass die Abschlussroutine aufgerufen wird, wenn versucht wurde, den IRP abzubrechen.
Jede Kombination dieser drei kann auftreten, und wenn eine der angezeigten Bedingungen erfüllt ist, wird die Abschlussroutine aufgerufen. Die entsprechenden Werte sind am Ende der ersten Zeile der Informationen über jeden Stack-Ort aufgeführt, unmittelbar nach dem Eintrag Completion-Context.
Hier ist ein Beispiel für die Ausgabe dieser Erweiterung für Windows 10:
0: kd> !irp ac598dc8
Irp is active with 2 stacks 1 is current (= 0xac598e38)
No Mdl: No System Buffer: Thread 8d1c7bc0: Irp stack trace.
cmd flg cl Device File Completion-Context
>[IRP_MJ_FILE_SYSTEM_CONTROL(d), N/A(0)]
1 e1 8a6434d8 ac598d40 853220cb-a89682d8 Success Error Cancel pending
\FileSystem\Npfs fltmgr!FltpPassThroughCompletion
Args: 00000000 00000000 00110008 00000000
[IRP_MJ_FILE_SYSTEM_CONTROL(d), N/A(0)]
1 0 8a799710 ac598d40 00000000-00000000
\FileSystem\FltMgr
Args: 00000000 00000000 0x00110008 00000000
Ab Windows 10 wird der Text des IRP-Haupt- und Nebencodes angezeigt, z. B. „IRP_MJ_FILE_SYSTEM_CONTROL“. Der Codewert wird auch in Hexadezimalwerten angezeigt, in diesem Beispiel „(d)“.
Das dritte Argument, das in der Ausgabe angezeigt wird, ist der IOCTL-Code. Verwenden Sie den Befehl !ioctldecode, um Informationen über die IOCTL anzuzeigen.
Hier sehen Sie ein Beispiel für die Ausgabe dieser Erweiterung unter Windows Vista.
0: kd> !irp 0x831f4a00
Irp is active with 8 stacks 5 is current (= 0x831f4b00)
Mdl = 82b020d8 Thread 8c622118: Irp stack trace.
cmd flg cl Device File Completion-Context
[ 0, 0] 0 0 00000000 00000000 00000000-00000000
Args: 00000000 00000000 00000000 00000000
[ 0, 0] 0 0 00000000 00000000 00000000-00000000
Args: 00000000 00000000 00000000 00000000
[ 0, 0] 0 0 00000000 00000000 00000000-00000000
Args: 00000000 00000000 00000000 00000000
[ 0, 0] 0 0 00000000 00000000 00000000-00000000
Args: 00000000 00000000 00000000 00000000
>[ 3,34] 40 e1 828517a8 00000000 842511e0-00000000 Success Error Cancel pending
\Driver\disk partmgr!PmReadWriteCompletion
Args: 00007000 00000000 fe084e00 00000004
[ 3, 0] 40 e0 82851450 00000000 842414d4-82956350 Success Error Cancel
\Driver\PartMgr volmgr!VmpReadWriteCompletionRoutine
Args: 129131bb 000000de fe084e00 00000004
[ 3, 0] 0 e0 82956298 00000000 847eeed0-829e2ba8 Success Error Cancel
\Driver\volmgr Ntfs!NtfsMasterIrpSyncCompletionRoutine
Args: 00007000 00000000 1bdae400 00000000
[ 3, 0] 0 0 82ac2020 8e879410 00000000-00000000
\FileSystem\Ntfs
Args: 00007000 00000000 00018400 00000000
Beachten Sie, dass die Beendigungsroutine neben dem Treibernamen an diesem Stack-Ort eingestellt ist und vom Treiber in der Zeile darunter eingestellt wurde. Im vorangegangenen Beispiel wurde Ntfs!NtfsMasterIrpSyncCompletionRoutine von \FileSystem\Ntfs gesetzt. Der Eintrag Completion-Context oberhalb von Ntfs!NtfsMasterIrpSyncCompletionRoutine, 847eeed0-829e2ba8, gibt die Adresse der Abschlussroutine sowie den Kontext an, der an Ntfs!NtfsMasterIrpSyncCompletionRoutine übergeben wird. Daraus können wir ersehen, dass die Adresse von Ntfs!NtfsMasterIrpSyncCompletionRoutine 847eeed0 ist, und der Kontext, der an diese Routine übergeben wird, wenn sie aufgerufen wird, 829e2ba8.
IRP-Hauptfunktionscodes
Die folgenden Informationen sollen Ihnen helfen, die Ausgabe dieses Erweiterungsbefehls zu interpretieren.
Die wichtigsten IRP-Funktionscodes lauten wie folgt:
Code der Hauptfunktion | Hexadezimaler Code |
---|---|
IRP_MJ_CREATE |
0x00 |
IRP_MJ_CREATE_NAMED_PIPE |
0x01 |
IRP_MJ_CLOSE |
0x02 |
IRP_MJ_READ |
0x03 |
IRP_MJ_WRITE |
0x04 |
IRP_MJ_QUERY_INFORMATION |
0x05 |
IRP_MJ_SET_INFORMATION |
0x06 |
IRP_MJ_QUERY_EA |
0x07 |
IRP_MJ_SET_EA |
0x08 |
IRP_MJ_FLUSH_BUFFERS |
0x09 |
IRP_MJ_QUERY_VOLUME_INFORMATION |
0x0A |
IRP_MJ_SET_VOLUME_INFORMATION |
0x0B |
IRP_MJ_DIRECTORY_CONTROL |
0x0C |
IRP_MJ_FILE_SYSTEM_CONTROL |
0x0D |
IRP_MJ_DEVICE_CONTROL |
0x0E |
IRP_MJ_INTERNAL_DEVICE_CONTROL IRP_MJ_SCSI | 0x0F |
IRP_MJ_SHUTDOWN |
0x10 |
IRP_MJ_LOCK_CONTROL |
0x11 |
IRP_MJ_CLEANUP |
0x12 |
IRP_MJ_CREATE_MAILSLOT |
0x13 |
IRP_MJ_QUERY_SECURITY |
0x14 |
IRP_MJ_SET_SECURITY |
0x15 |
IRP_MJ_POWER |
0x16 |
IRP_MJ_SYSTEM_CONTROL |
0x17 |
IRP_MJ_DEVICE_CHANGE |
0x18 |
IRP_MJ_QUERY_QUOTA |
0x19 |
IRP_MJ_SET_QUOTA |
0x1A |
IRP_MJ_PNP IRP_MJ_MAXIMUM_FUNCTION | 0x1B |
Die Codes für die kleineren Plug-and-Play-Funktionen lauten wie folgt:
Minor Function Code | Hexadezimaler Code |
---|---|
IRP_MN_START_DEVICE |
0x00 |
IRP_MN_QUERY_REMOVE_DEVICE |
0x01 |
IRP_MN_REMOVE_DEVICE |
0x02 |
IRP_MN_CANCEL_REMOVE_DEVICE |
0x03 |
IRP_MN_STOP_DEVICE |
0x04 |
IRP_MN_QUERY_STOP_DEVICE |
0x05 |
IRP_MN_CANCEL_STOP_DEVICE |
0x06 |
IRP_MN_QUERY_DEVICE_RELATIONS |
0x07 |
IRP_MN_QUERY_INTERFACE |
0x08 |
IRP_MN_QUERY_CAPABILITIES |
0x09 |
IRP_MN_QUERY_RESOURCES |
0x0A |
IRP_MN_QUERY_RESOURCE_REQUIREMENTS |
0x0B |
IRP_MN_QUERY_DEVICE_TEXT |
0x0C |
IRP_MN_FILTER_RESOURCE_REQUIREMENTS |
0x0D |
IRP_MN_READ_CONFIG |
0x0F |
IRP_MN_WRITE_CONFIG |
0x10 |
IRP_MN_EJECT |
0x11 |
IRP_MN_SET_LOCK |
0x12 |
IRP_MN_QUERY_ID |
0x13 |
IRP_MN_QUERY_PNP_DEVICE_STATE |
0x14 |
IRP_MN_QUERY_BUS_INFORMATION |
0x15 |
IRP_MN_DEVICE_USAGE_NOTIFICATION |
0x16 |
IRP_MN_SURPRISE_REMOVAL |
0x17 |
IRP_MN_QUERY_LEGACY_BUS_INFORMATION |
0x18 |
Die WMI-Minor-Funktionscodes lauten wie folgt:
Minor Function Code | Hexadezimaler Code |
---|---|
IRP_MN_QUERY_ALL_DATA |
0x00 |
IRP_MN_QUERY_SINGLE_INSTANCE |
0x01 |
IRP_MN_CHANGE_SINGLE_INSTANCE |
0x02 |
IRP_MN_CHANGE_SINGLE_ITEM |
0x03 |
IRP_MN_ENABLE_EVENTS |
0x04 |
IRP_MN_DISABLE_EVENTS |
0x05 |
IRP_MN_ENABLE_COLLECTION |
0x06 |
IRP_MN_DISABLE_COLLECTION |
0x07 |
IRP_MN_REGINFO |
0x08 |
IRP_MN_EXECUTE_METHOD |
0x09 |
Die Codes für die Minor-Funktionen der Energieverwaltung lauten wie folgt:
Minor Function Code | Hexadezimaler Code |
---|---|
IRP_MN_WAIT_WAKE |
0x00 |
IRP_MN_POWER_SEQUENCE |
0x01 |
IRP_MN_SET_POWER |
0x02 |
IRP_MN_QUERY_POWER |
0x03 |
Die SCSI-Minor-Funktionscodes lauten wie folgt:
Minor Function Code | Hexadezimaler Code |
---|---|
IRP_MN_SCSI_CLASS |
0x01 |