!irp
A extensão !irp mostra informações sobre um pacote de solicitação de E/S (IRP).
!irp Address [Detail]
Parâmetros
Endereço
Especifica o endereço hexadecimal do IRP.
Detalhe
Se esse parâmetro for incluído com qualquer valor, como 1, a saída incluirá o status do IRP, o endereço da sua lista de descritores de memória (MDL), seu thread proprietário e informações de pilha para todas as pilhas de E/S e informações sobre cada local de pilha para o IRP, incluindo versões hexadecimais do código de função principal e do código de função secundária. Se esse parâmetro for omitido, a saída incluirá somente um resumo das informações.
DLL
Kdexts.dll
Informações Adicionais
Consulte Depuração Plug and Play e Depuração Interrupt Storms para aplicativos deste comando de extensão. Para obter informações sobre IRPs, confira a documentação do Kit de Driver do Windows (WDK) e o livro Microsoft Windows Internals de Mark Russinovich e David Solomon. Para mais informações sobre os códigos de função principais e secundários, consulte a documentação do Kit de Driver do Windows (WDK).
Este tópico descreve a estrutura IRP, IRP.
Para obter informações detalhadas sobre como decodificar a estrutura IRP, incluindo Args retornados, consulte os recursos a seguir.
- Windows Internals de Mark E. Russinovich, David A. Solomon e Alex Ionescu
- Como desenvolver drivers com o Windows Driver Foundation Guy Smith e Penny Orwick
Comentários
A saída também indica em quais condições a rotina de conclusão para cada local de pilha será chamada depois que o IRP for concluído e o local da pilha for processado. Há três possibilidades:
Êxito
Indica que a rotina de conclusão vai ser chamada quando o IRP for concluído com um código de êxito.
Erro
Indica que a rotina de conclusão vai ser chamada quando o IRP for concluído com um código de erro.
Cancelar
Indica que a rotina de conclusão vai ser chamada se uma tentativa tiver sido feita para cancelar o IRP.
Qualquer combinação desses três pode aparecer, e se alguma das condições exibidas for satisfeitas, a rotina de conclusão será chamada. Os valores apropriados são listados no final da primeira linha de informações sobre cada local de pilha, imediatamente após a entrada Completion-Context.
Veja a seguir um exemplo da saída desta extensão do 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
A partir do Windows 10, o texto do código principal e secundário do IRP aparece, por exemplo, "IRP_MJ_FILE_SYSTEM_CONTROL" O valor do código também aparece em hex, neste exemplo, "(d)".
O terceiro argumento mostrado na saída é o código IOCTL. Use o comando !ioctldecode para exibir informações sobre o IOCTL.
Veja a seguir um exemplo da saída dessa extensão do sistema 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
A rotina de conclusão ao lado do nome do driver é definida neste local de pilha e foi definida pelo driver na linha abaixo. No exemplo anterior, Ntfs!NtfsMasterIrpSyncCompletionRoutine foi definido por \FileSystem\Ntfs. A entrada Completion-Context acima de Ntfs!NtfsMasterIrpSyncCompletionRoutine, 847eeed0-829e2ba8 indica o endereço da rotina de conclusão, bem como o contexto que será passado para Ntfs!NtfsMasterIrpSyncCompletionRoutine. A partir disso, podemos ver que o endereço de Ntfs!NtfsMasterIrpSyncCompletionRoutine is 847eeed0 e o contexto que será passado para esta rotina quando ela for chamada é 829e2ba8.
Códigos de função principais do IRP
As informações a seguir estão incluídas para ajudar você a interpretar a saída desse comando de extensão.
Os códigos de função principais do IRP são estes:
Códigos de função principais | Código hexadecimal |
---|---|
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 |
Os códigos de função secundária do Plug and Play são estes:
Código de função secundária | Código hexadecimal |
---|---|
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 |
Os códigos de função secundários do WMI são estes:
Código de função secundária | Código hexadecimal |
---|---|
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 |
Os códigos de função secundária de gerenciamento de energia são estes:
Código de função secundária | Código hexadecimal |
---|---|
IRP_MN_WAIT_WAKE |
0x00 |
IRP_MN_POWER_SEQUENCE |
0x01 |
IRP_MN_SET_POWER |
0x02 |
IRP_MN_QUERY_POWER |
0x03 |
Os códigos de função secundária do SCSI são estes:
Código de função secundária | Código hexadecimal |
---|---|
IRP_MN_SCSI_CLASS |
0x01 |