eBPF for Windows
Loading...
Searching...
No Matches
ebpf_error.h
Go to the documentation of this file.
1// Copyright (c) eBPF for Windows contributors
2// SPDX-License-Identifier: MIT
3
4#pragma once
5
6#include "ebpf_result.h"
7
8typedef _Return_type_success_(return >= 0) LONG NTSTATUS;
9
10// If status values are already defined, do not include ntstatus.h.
11// This avoids macro redefinitions errors when ebpf_error.h is included in other files that include these status codes.
12#ifndef STATUS_SUCCESS
13#include <ntstatus.h>
14#endif
15
16#if !defined(_AMD64_)
17#define _AMD64_
18#endif
19
20// Mapping from each eBPF result to NTSTATUS
21// (and also show the Win32 error code that the NTSTATUS maps to).
22// This should be consistent with win32_error_code_to_ebpf_result()
23// in include\ebpf_utilities.h.
24static const NTSTATUS _ebpf_result_mapping[] = {
25 /* EBPF_SUCCESS */ (NTSTATUS)STATUS_SUCCESS /* ERROR_SUCCESS */,
26 /* EBPF_VERIFICATION_FAILED */ (NTSTATUS)STATUS_VERIFIER_STOP /* ERROR_VERIFIER_STOP */,
27 /* EBPF_JIT_COMPILATION_FAILED */ (NTSTATUS)STATUS_NONE_MAPPED /* ERROR_NONE_MAPPED */,
28 /* EBPF_PROGRAM_LOAD_FAILED */ (NTSTATUS)STATUS_GENERIC_COMMAND_FAILED /* ERROR_GENERIC_COMMAND_FAILED */,
29 /* EBPF_INVALID_FD */ (NTSTATUS)STATUS_INVALID_HANDLE /* ERROR_INVALID_HANDLE */,
30 /* EBPF_INVALID_OBJECT */ (NTSTATUS)STATUS_INVALID_DEVICE_REQUEST /* ERROR_INVALID_FUNCTION */,
31 /* EBPF_INVALID_ARGUMENT */ (NTSTATUS)STATUS_INVALID_PARAMETER /* ERROR_INVALID_PARAMETER */,
32 /* EBPF_OBJECT_NOT_FOUND */ (NTSTATUS)STATUS_OBJECT_PATH_NOT_FOUND /* ERROR_PATH_NOT_FOUND */,
33 /* EBPF_OBJECT_ALREADY_EXISTS */ (NTSTATUS)STATUS_OBJECTID_EXISTS /* ERROR_OBJECT_ALREADY_EXISTS */,
34 /* EBPF_FILE_NOT_FOUND */ (NTSTATUS)STATUS_NO_SUCH_FILE /* ERROR_FILE_NOT_FOUND */,
35 /* EBPF_ALREADY_PINNED */ (NTSTATUS)STATUS_OBJECT_NAME_EXISTS /* ERROR_OBJECT_NAME_EXISTS */,
36 /* EBPF_NOT_PINNED */ (NTSTATUS)STATUS_RESOURCE_NOT_OWNED /* ERROR_NOT_OWNER */,
37 /* EBPF_NO_MEMORY */ (NTSTATUS)STATUS_NO_MEMORY /* ERROR_NOT_ENOUGH_MEMORY */,
38 /* EBPF_PROGRAM_TOO_LARGE */ (NTSTATUS)STATUS_TOO_MANY_COMMANDS /* ERROR_TOO_MANY_CMDS */,
39 /* EBPF_RPC_EXCEPTION */ (NTSTATUS)RPC_NT_CALL_FAILED /* RPC_S_CALL_FAILED */,
40 /* EBPF_ALREADY_INITIALIZED */ (NTSTATUS)STATUS_ALREADY_INITIALIZED /* ERROR_ALREADY_INITIALIZED */,
41 /* EBPF_ELF_PARSING_FAILED */ (NTSTATUS)STATUS_INVALID_IMAGE_FORMAT /* ERROR_BAD_EXE_FORMAT */,
42 /* EBPF_FAILED */ (NTSTATUS)STATUS_UNSUCCESSFUL /* ERROR_GEN_FAILURE */,
43 /* EBPF_OPERATION_NOT_SUPPORTED */ (NTSTATUS)STATUS_NOT_SUPPORTED /* ERROR_NOT_SUPPORTED */,
44 /* EBPF_KEY_NOT_FOUND */ (NTSTATUS)STATUS_NOT_FOUND /* ERROR_NOT_FOUND */,
45 /* EBPF_ACCESS_DENIED */ (NTSTATUS)STATUS_ACCESS_DENIED /* ERROR_ACCESS_DENIED */,
46 /* EBPF_BLOCKED_BY_POLICY */ (NTSTATUS)STATUS_CONTENT_BLOCKED /* ERROR_CONTENT_BLOCKED */,
47 /* EBPF_ARITHMETIC_OVERFLOW */ (NTSTATUS)STATUS_INTEGER_OVERFLOW /* ERROR_ARITHMETIC_OVERFLOW */,
48 /* EBPF_EXTENSION_FAILED_TO_LOAD */ (NTSTATUS)STATUS_DRIVER_UNABLE_TO_LOAD /* ERROR_BAD_DRIVER */,
49 /* EBPF_INSUFFICIENT_BUFFER */ (NTSTATUS)STATUS_BUFFER_OVERFLOW /* ERROR_MORE_DATA */,
50 /* EBPF_NO_MORE_KEYS */ (NTSTATUS)STATUS_NO_MORE_MATCHES /* ERROR_NO_MORE_MATCHES */,
51 /* EBPF_KEY_ALREADY_EXISTS */
52 (NTSTATUS)STATUS_ALREADY_REGISTERED /* ERROR_INTERNAL_ERROR, but ought to be ERROR_ALREADY_REGISTERED */,
53 /* EBPF_NO_MORE_TAIL_CALLS */ (NTSTATUS)STATUS_TOO_MANY_NODES /* ERROR_TOO_MANY_NAMES */,
54 /* EBPF_PENDING */ (NTSTATUS)STATUS_PENDING /* ERROR_IO_PENDING */,
55 /* EBPF_OUT_OF_SPACE */ (NTSTATUS)STATUS_INSUFFICIENT_RESOURCES /* ERROR_NO_SYSTEM_RESOURCES */,
56 /* EBPF_CANCELED */ (NTSTATUS)STATUS_CANCELLED /* ERROR_OPERATION_ABORTED */,
57 /* EBPF_INVALID_POINTER */ (NTSTATUS)STATUS_ACCESS_VIOLATION /* ERROR_NOACCESS */,
58 /* EBPF_TIMEOUT */ (NTSTATUS)STATUS_TIMEOUT /* ERROR_TIMEOUT */,
59 /* EBPF_STALE_ID */ (NTSTATUS)STATUS_INVALID_DEVICE_STATE /* ERROR_BAD_COMMAND */,
60 /* EBPF_INVALID_STATE */ (NTSTATUS)STATUS_INVALID_STATE_TRANSITION /* ERROR_INVALID_STATE */,
61};
62
63static_assert(
64 ARRAYSIZE(_ebpf_result_mapping) == EBPF_RESULT_COUNT, "_ebpf_result_mapping is out of sync with ebpf_result_t");
65
72static inline NTSTATUS
73ebpf_result_to_ntstatus(ebpf_result_t result)
74{
75
76 if (result < 0) {
77 return (NTSTATUS)STATUS_UNSUCCESSFUL;
78 }
79 if (result >= ARRAYSIZE(_ebpf_result_mapping)) {
80 return (NTSTATUS)STATUS_UNSUCCESSFUL;
81 }
82 return _ebpf_result_mapping[result];
83}
84
91static inline ebpf_result_t
92_ntstatus_to_ebpf_result(NTSTATUS status)
93{
94 switch (status) {
95 case STATUS_SUCCESS:
96 return EBPF_SUCCESS;
97 case STATUS_VERIFIER_STOP:
99 case STATUS_NONE_MAPPED:
101 case STATUS_GENERIC_COMMAND_FAILED:
103 case STATUS_INVALID_HANDLE:
104 return EBPF_INVALID_FD;
105 case STATUS_INVALID_DEVICE_REQUEST:
106 return EBPF_INVALID_OBJECT;
107 case STATUS_INVALID_PARAMETER:
109 case STATUS_OBJECT_PATH_NOT_FOUND:
111 case STATUS_OBJECTID_EXISTS:
113 case STATUS_NO_SUCH_FILE:
114 return EBPF_FILE_NOT_FOUND;
115 case STATUS_OBJECT_NAME_EXISTS:
116 return EBPF_ALREADY_PINNED;
117 case STATUS_RESOURCE_NOT_OWNED:
118 return EBPF_NOT_PINNED;
119 case STATUS_NO_MEMORY:
120 return EBPF_NO_MEMORY;
121 case STATUS_TOO_MANY_COMMANDS:
123 case RPC_NT_CALL_FAILED:
124 return EBPF_RPC_EXCEPTION;
125 case STATUS_ALREADY_INITIALIZED:
127 case STATUS_INVALID_IMAGE_FORMAT:
129 case STATUS_UNSUCCESSFUL:
130 return EBPF_FAILED;
131 case STATUS_NOT_SUPPORTED:
133 case STATUS_NOT_FOUND:
134 return EBPF_KEY_NOT_FOUND;
135 case STATUS_ACCESS_DENIED:
136 return EBPF_ACCESS_DENIED;
137 case STATUS_CONTENT_BLOCKED:
139 case STATUS_INTEGER_OVERFLOW:
141 case STATUS_DRIVER_UNABLE_TO_LOAD:
143 case STATUS_BUFFER_OVERFLOW:
145 case STATUS_NO_MORE_MATCHES:
146 return EBPF_NO_MORE_KEYS;
147 case STATUS_ALREADY_REGISTERED:
149 case STATUS_TOO_MANY_NODES:
151 case STATUS_PENDING:
152 return EBPF_PENDING;
153 case STATUS_INSUFFICIENT_RESOURCES:
154 return EBPF_OUT_OF_SPACE;
155 case STATUS_CANCELLED:
156 return EBPF_CANCELED;
157 case STATUS_ACCESS_VIOLATION:
159 case STATUS_TIMEOUT:
160 return EBPF_TIMEOUT;
161 case STATUS_INVALID_DEVICE_STATE:
162 return EBPF_STALE_ID;
163 case STATUS_INVALID_STATE_TRANSITION:
164 return EBPF_INVALID_STATE;
165 default:
166 return EBPF_FAILED;
167 }
168}
LONG NTSTATUS
Definition ebpf_error.h:8
#define EBPF_RESULT_COUNT
Definition ebpf_result.h:123
@ EBPF_KEY_NOT_FOUND
The requested key was not found.
Definition ebpf_result.h:75
@ EBPF_ALREADY_INITIALIZED
The handle was already initialized.
Definition ebpf_result.h:63
@ EBPF_NO_MORE_KEYS
The enumeration found no more keys.
Definition ebpf_result.h:93
@ EBPF_INVALID_OBJECT
Invalid object provided (ebpf_object, ebpf_map, ebpf_program).
Definition ebpf_result.h:33
@ EBPF_INSUFFICIENT_BUFFER
A buffer of insufficient size was supplied.
Definition ebpf_result.h:90
@ EBPF_BLOCKED_BY_POLICY
The operation was blocked for all requesters by policy.
Definition ebpf_result.h:81
@ EBPF_FAILED
Generic failure code for all other errors.
Definition ebpf_result.h:69
@ EBPF_OBJECT_NOT_FOUND
No pinned map or program exists for the path provided.
Definition ebpf_result.h:39
@ EBPF_JIT_COMPILATION_FAILED
JIT compilation failed.
Definition ebpf_result.h:24
@ EBPF_EXTENSION_FAILED_TO_LOAD
The eBPF extension failed to load.
Definition ebpf_result.h:87
@ EBPF_INVALID_POINTER
Invalid pointer.
Definition ebpf_result.h:111
@ EBPF_ACCESS_DENIED
Access was denied for the requested operation.
Definition ebpf_result.h:78
@ EBPF_OPERATION_NOT_SUPPORTED
Operation is not supported.
Definition ebpf_result.h:72
@ EBPF_NO_MEMORY
Low memory.
Definition ebpf_result.h:54
@ EBPF_OUT_OF_SPACE
The container can not hold additional elements.
Definition ebpf_result.h:105
@ EBPF_ALREADY_PINNED
The program or map already pinned to a different path.
Definition ebpf_result.h:48
@ EBPF_FILE_NOT_FOUND
Invalid ELF file path.
Definition ebpf_result.h:45
@ EBPF_SUCCESS
The operation was successful.
Definition ebpf_result.h:18
@ EBPF_PROGRAM_TOO_LARGE
The program is too large.
Definition ebpf_result.h:57
@ EBPF_PENDING
Requested action is still pending.
Definition ebpf_result.h:102
@ EBPF_ARITHMETIC_OVERFLOW
Arithmetic overflow occurred.
Definition ebpf_result.h:84
@ EBPF_OBJECT_ALREADY_EXISTS
A program or map is already pinned with the same path.
Definition ebpf_result.h:42
@ EBPF_INVALID_ARGUMENT
An invalid argument was supplied.
Definition ebpf_result.h:36
@ EBPF_RPC_EXCEPTION
An RPC exception occurred.
Definition ebpf_result.h:60
@ EBPF_PROGRAM_LOAD_FAILED
Program load failed.
Definition ebpf_result.h:27
@ EBPF_NO_MORE_TAIL_CALLS
Caller has reached tail call limit.
Definition ebpf_result.h:99
@ EBPF_TIMEOUT
Operation timed out.
Definition ebpf_result.h:114
@ EBPF_STALE_ID
ID is valid, but the object has been deleted.
Definition ebpf_result.h:117
@ EBPF_INVALID_FD
Invalid FD provided.
Definition ebpf_result.h:30
@ EBPF_CANCELED
Operation was canceled.
Definition ebpf_result.h:108
@ EBPF_VERIFICATION_FAILED
Program verification failed.
Definition ebpf_result.h:21
@ EBPF_ELF_PARSING_FAILED
A failure occurred in parsing the ELF file.
Definition ebpf_result.h:66
@ EBPF_INVALID_STATE
The system is in an invalid state for this operation.
Definition ebpf_result.h:120
@ EBPF_NOT_PINNED
The program or map is not pinned.
Definition ebpf_result.h:51
@ EBPF_KEY_ALREADY_EXISTS
The requested key is already present.
Definition ebpf_result.h:96
enum ebpf_result ebpf_result_t