!irp
!irp 확장은 IRP(I/O 요청 패킷)에 대한 정보를 표시합니다.
!irp Address [Detail]
매개 변수
주소
IRP의 16진수 주소를 지정합니다.
세부
이 매개 변수가 1과 같은 값에 포함된 경우 출력에는 IRP의 상태, MDL(메모리 설명자 목록) 주소, 해당 소유 스레드 및 모든 I/O 스택에 대한 스택 정보 및 주요 함수 코드의 16진수 버전 및 부 함수 코드를 포함하여 IRP의 각 스택 위치에 대한 정보가 포함됩니다. 이 매개 변수를 생략하면 출력에 정보의 요약만 포함됩니다.
DLL
Kdexts.dll
추가 정보
이 확장 명령의 애플리케이션에 대한 플러그 앤 플레이 디버깅 및 디버깅 인터럽트 폭풍을 참조하세요. IRP에 대한 자세한 내용은 WDK(Windows 드라이버 키트) 설명서 및 Mark Russinovich 및 David Solomon의 Microsoft Windows 내부 문서를 참조하세요. 주 및 부 함수 코드에 대한 자세한 내용은 WDK(Windows 드라이버 키트) 설명서를 참조하세요.
이 항목에서는 IRP 구조인 IRP에 대해 설명합니다.
반환된 Args를 포함하여 IRP 구조를 디코딩하는 방법에 대한 자세한 내용은 다음 리소스를 참조하세요.
- Windows Internals by Mark E. Russinovich, David A. Solomon, Alex Ionescu
- Windows 드라이버 파운데이션 가이 스미스와 페니 오윅을 사용하여 드라이버 개발
설명
또한 출력은 IRP가 완료되고 스택 위치가 처리되면 각 스택 위치에 대한 완료 루틴이 호출되는 조건을 나타냅니다. 세 가지 가능성이 있습니다.
성공
IRP가 성공 코드로 완료될 때 완료 루틴이 호출됨을 나타냅니다.
오류
IRP가 오류 코드와 함께 완료될 때 완료 루틴이 호출됨을 나타냅니다.
취소
IRP를 취소하려고 하면 완료 루틴이 호출된다는 것을 나타냅니다.
이러한 세 가지의 조합이 나타날 수 있으며 표시된 조건이 충족되면 완료 루틴이 호출됩니다. 적절한 값은 완료 컨텍스트 항목 바로 뒤 각 스택 위치에 대한 정보의 첫 번째 행 끝에 나열됩니다.
다음은 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
Windows 10부터 IRP 주 코드 및 부 코드 텍스트가 표시됩니다(예: "IRP_MJ_FILE_SYSTEM_CONTROL"). 이 예제에서는 코드 값도 16진수로 표시됩니다.
출력에 표시되는 세 번째 인수는 IOCTL 코드입니다. !ioctldecode 명령을 사용하여 IOCTL에 대한 정보를 표시합니다.
다음은 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
드라이버 이름 옆에 있는 완료 루틴은 해당 스택 위치에 설정되며 아래 줄의 드라이버에 의해 설정되었습니다. 앞의 예제에서 Ntfs!NtfsMasterIrpSyncCompletionRoutine은 \FileSystem\Ntfs에 의해 설정되었습니다. Ntfs!NtfsMasterIrpSyncCompletionRoutine, 847eeed0-829e2ba8 위의 완료 컨텍스트 항목은 완료 루틴의 주소와 Ntfs!NtfsMasterIrpSyncCompletionRoutine에 전달될 컨텍스트를 나타냅니다. 여기에서 Ntfs!NtfsMasterIrpSyncCompletionRoutine의 주소가 847eeed0이고 호출될 때 이 루틴에 전달되는 컨텍스트는 829e2ba8임을 알 수 있습니다.
IRP 주요 함수 코드
이 확장 명령의 출력을 해석하는 데 도움이 되는 다음 정보가 포함되어 있습니다.
IRP 주요 함수 코드는 다음과 같습니다.
주 함수 코드 | 16진수 코드 |
---|---|
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 |
플러그 앤 플레이 부 함수 코드는 다음과 같습니다.
부 함수 코드 | 16진수 코드 |
---|---|
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 |
WMI 부 함수 코드는 다음과 같습니다.
부 함수 코드 | 16진수 코드 |
---|---|
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 |
전원 관리 부 함수 코드는 다음과 같습니다.
부 함수 코드 | 16진수 코드 |
---|---|
IRP_MN_WAIT_WAKE |
0x00 |
IRP_MN_POWER_SEQUENCE |
0x01 |
IRP_MN_SET_POWER |
0x02 |
IRP_MN_QUERY_POWER |
0x03 |
SCSI 부 함수 코드는 다음과 같습니다.
부 함수 코드 | 16진수 코드 |
---|---|
IRP_MN_SCSI_CLASS |
0x01 |