Driver 2.6.0.1 · Kernel Studio 3.2.2
| 현재 소스에서 확인한 목록 | 수 |
|---|---|
| HTTP / WebSocket route decorators | 82 |
| IOCTL identifiers | 43 |
| 직접 정의된 ctypes wire layouts¹ | 46 |
| 위 layouts의 직접 fields¹ | 355 |
¹ driver_bridge.py, manual_map_protocol.py, ob_callbacks_protocol.py 기준입니다. 중첩 보조 구조와 별도의 HWBP ring 데이터는 포함하지 않습니다.
Important
DeviceIoControl 전송 성공과 작업의 ResultStatus 성공은 별개입니다. ManualV4에서는 응답 전체의 길이·버전·요청 echo·주소·failcode·failmessage를 함께 검증합니다. 불명 응답을 성공으로 바꾸거나 자동 재호출하지 않습니다.
커널·C++ 공유 헤더 · Python 계약 · 브리지 검증 · UI 작업·이력
- Function
0x878· complete IOCTL0x0022E1E0 METHOD_BUFFERED, read + write access, pack=1- Version=3 · total 2104 bytes · UTF-16 ImagePath[520]
- v1/v2 요청 크기를 재사용하지 않습니다. 드라이버와 패널을 함께 업데이트하세요.
| Field | Offset | Bytes | 계약 |
|---|---|---|---|
Version |
0 | 4 | 입력 3 |
Reserved |
4 | 4 | 입력 0 |
ProcessId |
8 | 8 | 대상 PID |
ImagePath |
16 | 1040 | NUL 종료 NT disk path, WCHAR 520개 |
ResultStatus |
1056 | 4 | 작업 NTSTATUS |
MappedBase |
1060 | 8 | 입력 0; 응답 이미지 기준 주소 |
EntryPoint |
1068 | 8 | 입력 0; 응답 진입점 |
failcode |
1076 | 4 | 입력 0; 성공 0, 실패 위치 1–137 |
failmessage |
1080 | 1024 | 입력 모두 0; 실패 ANSI 호환 문자열 |
failcode는 실행한 분기 개수가 아니라 첫 최종 실패 위치의 고정 번호입니다. 복구 가능한 할당·검색 시도는 이 번호를 먼저 소비하지 않습니다. 전체 이름은 MKM_FAIL_CODE에 있습니다.
| 코드 | 영역 |
|---|---|
| 1–11 | IOCTL 요청 검증 |
| 12–20 | 매핑 준비·대상·범위·flush·cleanup |
| 21–26 | 파일 읽기 |
| 27–49 | PE headers 및 지원 조건 |
| 50–53 | 로컬 이미지 구성 |
| 54–71 | API-set namespace 및 attach |
| 72–79 | 대상 모듈·export 문자열 |
| 80–97 | export 해석·forwarder |
| 98–107 | IAT |
| 108–114 | 재배치 |
| 115–116 | 원격 할당·쓰기 |
| 117 / 118 / 119 | 전체 이미지 / headers / section 보호 적용 |
| 120–136 | DllMain 준비·스레드·관찰·정리 (123: stub 보호) |
| 137 | 최종 실패 fallback |
- 커널 출력은 ASCII 기반으로 ANSI 호환성을 유지합니다. 최대 1023 bytes + NUL이고 NUL 뒤 남은 bytes는 모두 0입니다.
- 성공이면
ResultStatus=0,failcode=0,failmessage전체가 0입니다. 실패면 첫 코드와 메시지를 보존하고 최종 operation status를 추가할 수 있습니다. - 공간 부족 시
[truncated]표시가 붙습니다. 경로나 뒷부분은 잘릴 수 있습니다. - 패널은 raw 1024 bytes의 NUL, ASCII 범위, zero tail을 검사합니다. 손상·짧은 전송·불일치 응답의
failcode와failmessage는None이며 작업은 불명 상태로 처리합니다. - 오래된 저장 이력의 메시지 누락도
None입니다. 화면 출력은 escape합니다.
Note
119는 section 보호 API가 실패했다는 위치 정보입니다. STATUS_ACCESS_DENIED와 페이지·정책 snapshot만으로 특정 Windows 정책을 원인으로 단정하지 않습니다. failmessage는 현장 기록자이며, 판사는 아닙니다. 🕵️
이미지, headers, section, DllMain stub의 네 보호 위치에 같은 읽기 전용 조회를 적용합니다.
sequenceDiagram
participant Mapper as Kernel mapper
participant OS as Windows query / protect APIs
Mapper->>OS: ProcessMitigationPolicy (52): DynamicCodePolicy (2)
OS-->>Mapper: Query status / returned bytes / Flags
Mapper->>OS: ProcessProtectionInformation (61)
OS-->>Mapper: Query status / returned bytes / protection byte
Mapper->>OS: MemoryBasicInformation at requested VA
OS-->>Mapper: Query status / returned bytes / first region
Mapper->>OS: Original ZwProtectVirtualMemory arguments
OS-->>Mapper: Original operation NTSTATUS
Note over Mapper: On failure: preserve code + API result + observations
| 진단 부분 | 기록 |
|---|---|
| API·요청 | handle, 입력 VA·size·protect, 보호 의미, NTSTATUS |
Section (119) |
index·name·RVA·VirtualSize·RawSize·span·Characteristics |
| API 출력 | output VA·size·old protect; 실패의 old protect는 untrusted_on_failure |
pre_page |
query status·length, State·Type·Protect·AllocationProtect, Base·AllocationBase·RegionSize |
| 페이지 범위 | first_region_only=1, page-rounded 요청이 첫 region에 포함되는지 |
pre_dynamic |
query status·length, Flags, ProhibitDynamicCode·AllowThreadOptOut·AllowRemoteDowngrade·AuditProhibitDynamicCode |
pre_protection |
query status·length, Level·Type·Audit·Signer |
조회 불가, 잘못된 반환 길이·selector·range는 UNAVAILABLE로 표시합니다. MEM_FREE/MEM_RESERVE에서 의미 없는 속성은 UNDEFINED로 구분합니다. 이 조회는 프로세스 정책이나 보호 값을 설정하지 않으며 원래 보호 API의 인자·실패 반환을 유지합니다. snapshot은 조회 시점의 관찰값이므로 보호 호출과 원자적으로 묶인 상태가 아닙니다.
ManualV4는 매핑 직전에 PID와 시작 키를 확인하지만 이 wire ABI에는 시작 키 필드가 없습니다. 확인 후 PID 교체를 커널 요청과 원자적으로 차단한다고 주장하지 않습니다. 실패 중 원격 이미지가 유지되는 경우나 timeout·불명 응답에서는 실행 여부를 별도로 확인해야 합니다.
CTL_CODE(FILE_DEVICE_UNKNOWN, function, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
Function ID와 완성된 IOCTL 값을 구분하세요. 0x878과 0x0022E1E0는 같은 요청의 서로 다른 표기입니다.
| Function | Full IOCTL | Python identifier | Scope |
|---|---|---|---|
0x800 |
0x0022E000 |
IOCTL_HELPER_PROCESS_INFORMATION |
연결 / Connected |
0x801 |
0x0022E004 |
IOCTL_HELPER_ALLOC_VIRTUAL_MEMORY |
연결 / Connected |
0x802 |
0x0022E008 |
IOCTL_HELPER_FREE_VIRTUAL_MEMORY |
연결 / Connected |
0x803 |
0x0022E00C |
IOCTL_HELPER_COPY_PROCESS_MEMORY |
연결 / Connected |
0x804 |
0x0022E010 |
IOCTL_HELPER_SCAN_VALUE_PROCESS |
연결 / Connected |
0x805 |
0x0022E014 |
IOCTL_HELPER_READ_PROCESS |
연결 / Connected |
0x806 |
0x0022E018 |
IOCTL_HELPER_READ_STRING_PROCESS |
연결 / Connected |
0x807 |
0x0022E01C |
IOCTL_HELPER_READ_PROCESS_INFORMATION |
연결 / Connected |
0x808 |
0x0022E020 |
IOCTL_HELPER_FREE_LINKED_LIST |
연결 / Connected |
0x809 |
0x0022E024 |
IOCTL_HELPER_FREE_STRING_LIST |
연결 / Connected |
0x80A |
0x0022E028 |
IOCTL_HELPER_SET_HARDWARE_BREAKPOINT |
연결 / Connected |
0x80B |
0x0022E02C |
IOCTL_HELPER_QUERY_HARDWARE_BREAKPOINT |
연결 / Connected |
0x80C |
0x0022E030 |
IOCTL_HELPER_REMOVE_HARDWARE_BREAKPOINT |
연결 / Connected |
0x80D |
0x0022E034 |
IOCTL_HELPER_FREE_HARDWARE_BREAKPOINT_RESULT |
연결 / Connected |
0x80E |
0x0022E038 |
IOCTL_HELPER_REGISTER_DLL |
연결 / Connected |
0x80F |
0x0022E03C |
IOCTL_HELPER_WRITE_PROCESS |
연결 / Connected |
0x810 |
0x0022E040 |
IOCTL_HELPER_PROTECT_VIRTUAL_MEMORY |
연결 / Connected |
0x811 |
0x0022E044 |
IOCTL_HELPER_PATTERN_SCAN |
연결 / Connected |
0x812 |
0x0022E048 |
IOCTL_HELPER_ENUMERATE_THREADS |
연결 / Connected |
0x813 |
0x0022E04C |
IOCTL_HELPER_SUSPEND_THREAD |
연결 / Connected |
0x814 |
0x0022E050 |
IOCTL_HELPER_RESUME_THREAD |
연결 / Connected |
0x815 |
0x0022E054 |
IOCTL_HELPER_GET_THREAD_CONTEXT |
연결 / Connected |
0x816 |
0x0022E058 |
IOCTL_HELPER_SET_THREAD_CONTEXT |
연결 / Connected |
0x817 |
0x0022E05C |
IOCTL_HELPER_EVENT_MONITOR_CONTROL |
비활성 호환 / Inactive compatibility |
0x818 |
0x0022E060 |
IOCTL_HELPER_POLL_EVENTS |
비활성 호환 / Inactive compatibility |
0x819 |
0x0022E064 |
IOCTL_HELPER_GET_DRIVER_STATUS |
연결 / Connected |
0x81A |
0x0022E068 |
IOCTL_HELPER_QUERY_PROCESS_EXTENDED |
연결 / Connected |
0x81B |
0x0022E06C |
IOCTL_HELPER_QUERY_PROCESS_HANDLES |
연결 / Connected |
0x81C |
0x0022E070 |
IOCTL_HELPER_QUERY_PROCESS_TOKEN |
연결 / Connected |
0x81D |
0x0022E074 |
IOCTL_HELPER_QUERY_THREAD_INFO |
연결 / Connected |
0x81E |
0x0022E078 |
IOCTL_HELPER_SET_THREAD_PRIORITY |
연결 / Connected |
0x81F |
0x0022E07C |
IOCTL_HELPER_SET_THREAD_AFFINITY |
연결 / Connected |
0x820 |
0x0022E080 |
IOCTL_HELPER_TERMINATE_THREAD |
UI 제외; kernel/bridge 존재 |
0x821 |
0x0022E084 |
IOCTL_HELPER_SET_THREAD_HIDE_FROM_DEBUGGER |
연결 / Connected |
0x822 |
0x0022E088 |
IOCTL_HELPER_CREATE_FUNCTION_CALL |
연결 / Connected |
0x823 |
0x0022E08C |
IOCTL_HELPER_QUERY_FUNCTION_CALL |
연결 / Connected |
0x824 |
0x0022E090 |
IOCTL_HELPER_RELEASE_FUNCTION_CALL |
연결 / Connected |
0x825 |
0x0022E094 |
IOCTL_HELPER_QUERY_PROCESS_OBJECT |
연결 / Connected |
0x826 |
0x0022E098 |
IOCTL_HELPER_READ_PROCESS_OBJECT |
연결 / Connected |
0x827 |
0x0022E09C |
IOCTL_HELPER_QUERY_OB_CALLBACKS_STATUS |
Ob observer V2 status |
0x828 |
0x0022E0A0 |
IOCTL_HELPER_REGISTER_OB_CALLBACKS |
Ob observer V2 explicit control |
0x829 |
0x0022E0A4 |
IOCTL_HELPER_UNREGISTER_OB_CALLBACKS |
Ob observer V2 explicit control |
0x878 |
0x0022E1E0 |
IOCTL_MANUAL_MAP |
ManualV4 v3 |
| 계약 | Version / pack | Bytes | 의미 |
|---|---|---|---|
QUERY_PROCESS_OBJECT_REQUEST |
pack=8 | 24 | EPROCESS address + process start key 조회 |
READ_PROCESS_OBJECT_REQUEST |
v1 / pack=8 | 4152 | 4096-byte 상한; 예상 address + start key 검증; Data offset=56 |
CREATE_FUNCTION_CALL_REQUEST |
v1 / pack=8 | 88 | 시작 키, 함수 주소, uint64 인자 하나 |
QUERY_FUNCTION_CALL_REQUEST |
v1 / pack=8 | 96 | 장치 파일 소유 CallId 관찰; 대기 ≤1000ms |
RELEASE_FUNCTION_CALL_REQUEST |
v1 / pack=8 | 24 | 추적 참조 해제; 스레드를 종료하지 않음 |
OB_CALLBACKS_STATUS_REQUEST (Python) |
v2 / pack=8 | 216 | observer 상태·등록 실패·altitude·generation |
OB_CALLBACKS_CONTROL_REQUEST |
v2 / pack=8 | 32 | 명시적 register / unregister |
Ob C++ 상태 이름은 OB_CALLBACK_STATUS_REQUEST입니다. query의 ResultStatus와 등록 작업의 RegistrationStatus는 별개입니다. register 요청 수락은 완료와 다르므로 후속 status에서 상태를 확인합니다. observer는 핸들 권한 변경용 필터가 아니라 관찰 경로입니다.
함수 호출은 ThreadCreated로 실행 생성 여부를, 스레드 신호로 완료를 구분합니다. 커널 기록 한도는 128개 / 장치 파일당 32개이고, 웹 작업 공간은 별도 활성 30개 / 이력 128개 상한을 사용합니다. reserved fields는 0이어야 합니다. 반환 목록은 복사한 뒤 해당 free/release 요청으로 정리합니다.
아래는 Windows x64에서 계산한 크기입니다. 각 링크에 전체 field 순서·타입이 있습니다. MANUAL_MAP_REQUEST의 pack=1을 다른 pack=8 요청과 혼동하지 마세요.
| Layout | Bytes | Pack | Fields | Source |
|---|---|---|---|---|
QUERY_PROCESS_OBJECT_REQUEST |
24 | 8 | 4 | driver_bridge.py |
READ_PROCESS_OBJECT_REQUEST |
4152 | 8 | 11 | driver_bridge.py |
CREATE_FUNCTION_CALL_REQUEST |
88 | 8 | 17 | driver_bridge.py |
QUERY_FUNCTION_CALL_REQUEST |
96 | 8 | 17 | driver_bridge.py |
RELEASE_FUNCTION_CALL_REQUEST |
24 | 8 | 5 | driver_bridge.py |
PROCESS_INFORMATION_REQUEST |
1096 | 8 | 11 | driver_bridge.py |
ALLOC_VIRTUAL_MEMORY_REQUEST |
32 | 8 | 5 | driver_bridge.py |
FREE_VIRTUAL_MEMORY_REQUEST |
24 | 8 | 3 | driver_bridge.py |
COPY_PROCESS_MEMORY_REQUEST |
56 | 8 | 7 | driver_bridge.py |
SCAN_VALUE_PROCESS_REQUEST |
40 | 8 | 6 | driver_bridge.py |
READ_PROCESS_REQUEST |
40 | 8 | 5 | driver_bridge.py |
READ_STRING_PROCESS_REQUEST |
32 | 8 | 4 | driver_bridge.py |
READ_PROCESS_INFORMATION_REQUEST |
16 | 8 | 3 | driver_bridge.py |
FREE_LINKED_LIST_REQUEST |
16 | 8 | 2 | driver_bridge.py |
FREE_STRING_LIST_REQUEST |
16 | 8 | 2 | driver_bridge.py |
IOCTL_HWBP_SET_REQUEST |
48 | 8 | 10 | driver_bridge.py |
IOCTL_HWBP_QUERY_REQUEST |
32 | 8 | 7 | driver_bridge.py |
IOCTL_HWBP_REMOVE_REQUEST |
32 | 8 | 7 | driver_bridge.py |
IOCTL_HWBP_FREE_RESULT_REQUEST |
16 | 8 | 3 | driver_bridge.py |
REGISTER_DLL_REQUEST |
560 | 8 | 9 | driver_bridge.py |
WRITE_PROCESS_REQUEST |
4144 | 8 | 7 | driver_bridge.py |
PROTECT_VIRTUAL_MEMORY_REQUEST |
56 | 8 | 8 | driver_bridge.py |
PATTERN_SCAN_REQUEST |
568 | 8 | 10 | driver_bridge.py |
THREAD_SNAPSHOT_INFO |
40 | 8 | 7 | driver_bridge.py |
ENUMERATE_THREADS_REQUEST |
2576 | 8 | 5 | driver_bridge.py |
THREAD_CONTROL_REQUEST |
12 | 8 | 3 | driver_bridge.py |
THREAD_REGISTERS_REQUEST |
152 | 8 | 20 | driver_bridge.py |
EVENT_MONITOR_CONTROL_REQUEST |
12 | 8 | 5 | driver_bridge.py |
KERNEL_MONITOR_EVENT |
1088 | 8 | 9 | driver_bridge.py |
POLL_EVENTS_REQUEST |
17424 | 8 | 5 | driver_bridge.py |
DRIVER_STATUS_REQUEST |
40 | 8 | 8 | driver_bridge.py |
PROCESS_EXTENDED_INFO |
1720 | 8 | 27 | driver_bridge.py |
PROCESS_EXTENDED_INFO_REQUEST |
1736 | 8 | 3 | driver_bridge.py |
PROCESS_HANDLE_ENTRY |
24 | 8 | 4 | driver_bridge.py |
PROCESS_HANDLES_REQUEST |
3096 | 8 | 5 | driver_bridge.py |
PROCESS_TOKEN_INFO |
40 | 8 | 8 | driver_bridge.py |
PROCESS_TOKEN_INFO_REQUEST |
56 | 8 | 3 | driver_bridge.py |
THREAD_EXTENDED_INFO |
112 | 8 | 17 | driver_bridge.py |
THREAD_INFO_REQUEST |
128 | 8 | 3 | driver_bridge.py |
THREAD_PRIORITY_REQUEST |
16 | 8 | 3 | driver_bridge.py |
THREAD_AFFINITY_REQUEST |
24 | 8 | 3 | driver_bridge.py |
THREAD_TERMINATE_REQUEST |
16 | 8 | 3 | driver_bridge.py |
THREAD_HIDE_REQUEST |
16 | 8 | 2 | driver_bridge.py |
MANUAL_MAP_REQUEST |
2104 | 1 | 9 | manual_map_protocol.py |
OB_CALLBACKS_STATUS_REQUEST |
216 | 8 | 33 | ob_callbacks_protocol.py |
OB_CALLBACKS_CONTROL_REQUEST |
32 | 8 | 7 | ob_callbacks_protocol.py |
주소와 64-bit identity·정수는 JSON에서 문자열로 전달하여 브라우저 정밀도 손실을 피하세요. {action} 입력은 연결된 기능 구현을 확인하세요. 실행 서버의 /docs, /redoc, /openapi.json이 런타임 스키마를 제공합니다. ManualV4 작업은 Studio의 공통 execute/job 경로를 사용합니다.
| Method | Path | Implementation |
|---|---|---|
| GET | / |
read_root |
| GET | /api/build |
get_build |
| POST | /api/dll/register |
register_dll |
| GET | /api/hwbp/query/{pid} |
query_hwbp |
| POST | /api/hwbp/remove |
remove_hwbp |
| POST | /api/hwbp/set |
set_hwbp |
| POST | /api/memory/alloc |
alloc_virtual_memory |
| POST | /api/memory/copy |
copy_virtual_memory |
| POST | /api/memory/free |
free_virtual_memory |
| POST | /api/memory/inspect |
inspect_memory_data |
| GET | /api/memory/map/{pid} |
get_memory_map |
| POST | /api/memory/pattern_scan |
pattern_scan |
| POST | /api/memory/protect |
protect_virtual_memory |
| POST | /api/memory/read |
read_virtual_memory |
| POST | /api/memory/write |
write_virtual_memory |
| POST | /api/monitor/control |
monitor_control |
| GET | /api/monitor/poll |
monitor_poll |
| POST | /api/ob-callbacks/register |
ob_callbacks_register |
| GET | /api/ob-callbacks/status |
ob_callbacks_status |
| POST | /api/ob-callbacks/unregister |
ob_callbacks_unregister |
| GET | /api/process/{pid} |
get_process_details |
| GET | /api/process/{pid}/handles |
get_process_handles |
| GET | /api/process/{pid}/threads |
get_process_threads |
| GET | /api/processes |
get_process_list |
| POST | /api/scan/first |
scan_first |
| POST | /api/scan/next |
scan_next |
| POST | /api/scan/reset |
scan_reset |
| GET | /api/scan/results |
scan_results |
| GET | /api/status |
get_driver_status |
| POST | /api/struct/dissect |
dissect_memory_structure |
| POST | /api/studio/allocation-histories |
create_allocation_history |
| DELETE | /api/studio/allocation-histories/{key} |
remove_allocation_history |
| POST | /api/studio/allocation-histories/{key}/{action} |
allocation_history_action |
| PUT | /api/studio/assets/{kind} |
upload_asset |
| GET | /api/studio/capabilities |
capabilities |
| GET | /api/studio/dump |
dump |
| GET | /api/studio/dumps |
list_dumps |
| POST | /api/studio/dumps |
start_dump |
| DELETE | /api/studio/dumps/{key} |
delete_dump |
| GET | /api/studio/dumps/{key} |
get_dump |
| POST | /api/studio/dumps/{key}/cancel |
cancel_dump |
| GET | /api/studio/dumps/{key}/files/{name} |
download_dump |
| POST | /api/studio/dumps/{key}/resume |
resume_dump |
| POST | /api/studio/editors |
create_editor |
| DELETE | /api/studio/editors/{key} |
remove_editor |
| POST | /api/studio/editors/{key}/{action} |
editor_action |
| GET | /api/studio/eprocess/presets |
eprocess_presets |
| POST | /api/studio/eprocess/snapshot |
eprocess_snapshot |
| GET | /api/studio/events |
events |
| POST | /api/studio/execute |
execute |
| GET | /api/studio/history |
history |
| GET | /api/studio/hwbp/capture |
capture_view |
| POST | /api/studio/hwbp/capture/{action} |
capture_action |
| GET | /api/studio/jobs |
jobs |
| POST | /api/studio/jobs |
submit |
| GET | /api/studio/jobs/{key} |
job |
| POST | /api/studio/jobs/{key}/cancel |
cancel |
| GET | /api/studio/scan-jobs/{key} |
scan_job |
| POST | /api/studio/scan-jobs/{key}/cancel |
cancel_scan_job |
| POST | /api/studio/scans |
create_scan |
| DELETE | /api/studio/scans/{key} |
remove_scan |
| GET | /api/studio/scans/{key}/exports/{export_id} |
download_scan_export |
| POST | /api/studio/scans/{key}/{action} |
scan_action |
| GET | /api/studio/scheduler |
scheduler_stats |
| POST | /api/studio/suite/{action} |
suite_action |
| GET | /api/studio/symbols |
list_symbols |
| POST | /api/studio/symbols |
add_symbol_path |
| DELETE | /api/studio/symbols/{key} |
delete_symbols |
| POST | /api/studio/wide-views |
create_wide_view |
| DELETE | /api/studio/wide-views/{key} |
remove_wide_view |
| POST | /api/studio/wide-views/{key}/{action} |
wide_view_action |
| GET | /api/thread/{tid}/context |
get_thread_context |
| POST | /api/thread/{tid}/context |
set_thread_context |
| POST | /api/thread/{tid}/hide |
set_thread_hide |
| POST | /api/thread/{tid}/resume |
resume_thread |
| POST | /api/thread/{tid}/suspend |
suspend_thread |
| POST | /api/watch/add |
add_watch_item |
| POST | /api/watch/freeze |
freeze_watch_item |
| GET | /api/watch/list |
get_watch_list |
| POST | /api/watch/remove |
remove_watch_item |
| POST | /api/watch/update |
update_watch_item |
| WEBSOCKET | /ws/events |
websocket_events_endpoint |
English: This reference is derived from the current sources: 43 IOCTL identifiers, 82 route decorators, and 46 direct ctypes layouts / 355 fields in the three wire-contract modules. ManualV4 uses v3, pack=1, 2104 bytes, with failcode at 1076 and a 1024-byte failmessage at 1080. Transport success, packet validity and operation success are distinct; malformed or uncertain responses never become successful mapping results. Protection diagnostics record read-only observations and do not establish a policy cause.