-
Notifications
You must be signed in to change notification settings - Fork 24
/
apiset.h
248 lines (203 loc) · 6.58 KB
/
apiset.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
/**
* API Set Lookup
* Copyright (c) 2018-2019 Aidan Khoury. All rights reserved.
*
* @file apiset.h
* @author Aidan Khoury (ajkhoury)
* @date 11/22/2018
*/
#ifndef _API_SET_H_
#define _API_SET_H_
#if defined(_MSC_VER)
#pragma once
#endif
#include "ntapi.h"
// API Set calling convention
#define APISETAPI NTAPI
//
// API schema definitions.
//
#define API_SET_SCHEMA_VERSION_V2 0x00000002
#define API_SET_SCHEMA_VERSION_V3 0x00000003 // No offline support.
#define API_SET_SCHEMA_VERSION_V4 0x00000004
#define API_SET_SCHEMA_VERSION_V6 0x00000006
//
// API Set data structures
//
typedef struct _API_SET_NAMESPACE {
ULONG Version;
} API_SET_NAMESPACE, *PAPI_SET_NAMESPACE;
//
// API set schema version 6.
//
typedef struct _API_SET_NAMESPACE_V6 {
ULONG Version;
ULONG Size;
ULONG Flags;
ULONG Count;
ULONG EntryOffset; // API_SET_NAMESPACE_ENTRY_V6
ULONG HashOffset; // API_SET_NAMESPACE_HASH_ENTRY_V6
ULONG HashFactor;
} API_SET_NAMESPACE_V6, *PAPI_SET_NAMESPACE_V6;
typedef struct _API_SET_NAMESPACE_ENTRY_V6 {
ULONG Flags;
ULONG NameOffset;
ULONG NameLength;
ULONG HashedLength;
ULONG ValueOffset;
ULONG ValueCount;
} API_SET_NAMESPACE_ENTRY_V6, *PAPI_SET_NAMESPACE_ENTRY_V6;
typedef struct _API_SET_HASH_ENTRY_V6 {
ULONG Hash;
ULONG Index;
} API_SET_HASH_ENTRY_V6, *PAPI_SET_HASH_ENTRY_V6;
typedef struct _API_SET_VALUE_ENTRY_V6 {
ULONG Flags;
ULONG NameOffset;
ULONG NameLength;
ULONG ValueOffset;
ULONG ValueLength;
} API_SET_VALUE_ENTRY_V6, *PAPI_SET_VALUE_ENTRY_V6;
typedef const API_SET_VALUE_ENTRY_V6 *PCAPI_SET_VALUE_ENTRY_V6;
typedef const API_SET_HASH_ENTRY_V6 *PCAPI_SET_HASH_ENTRY_V6;
typedef const API_SET_NAMESPACE_ENTRY_V6 *PCAPI_SET_NAMESPACE_ENTRY_V6;
typedef const API_SET_NAMESPACE_V6 *PCAPI_SET_NAMESPACE_V6;
//
// API set schema version 4.
//
typedef struct _API_SET_VALUE_ENTRY_V4 {
ULONG Flags; // 0x00
ULONG NameOffset; // 0x04
ULONG NameLength; // 0x08
ULONG ValueOffset; // 0x0C
ULONG ValueLength; // 0x10
} API_SET_VALUE_ENTRY_V4, *PAPI_SET_VALUE_ENTRY_V4;
typedef struct _API_SET_VALUE_ARRAY_V4 {
ULONG Flags; // 0x00
ULONG Count; // 0x04
API_SET_VALUE_ENTRY_V4 Array[ANYSIZE_ARRAY];
} API_SET_VALUE_ARRAY_V4, *PAPI_SET_VALUE_ARRAY_V4;
typedef struct _API_SET_NAMESPACE_ENTRY_V4 {
ULONG Flags;
ULONG NameOffset;
ULONG NameLength;
ULONG AliasOffset;
ULONG AliasLength;
ULONG DataOffset; // API_SET_VALUE_ARRAY_V4
} API_SET_NAMESPACE_ENTRY_V4, *PAPI_SET_NAMESPACE_ENTRY_V4;
typedef struct _API_SET_NAMESPACE_ARRAY_V4 {
ULONG Version; // 0x00
ULONG Size; // 0x04
ULONG Flags; // 0x08
ULONG Count; // 0x0C
API_SET_NAMESPACE_ENTRY_V4 Array[ANYSIZE_ARRAY];
} API_SET_NAMESPACE_ARRAY_V4, *PAPI_SET_NAMESPACE_ARRAY_V4;
typedef const API_SET_VALUE_ENTRY_V4 *PCAPI_SET_VALUE_ENTRY_V4;
typedef const API_SET_VALUE_ARRAY_V4 *PCAPI_SET_VALUE_ARRAY_V4;
typedef const API_SET_NAMESPACE_ENTRY_V4 *PCAPI_SET_NAMESPACE_ENTRY_V4;
typedef const API_SET_NAMESPACE_ARRAY_V4 *PCAPI_SET_NAMESPACE_ARRAY_V4;
#define API_SET_SCHEMA_FLAGS_SEALED 0x00000001
#define API_SET_SCHEMA_FLAGS_HOST_EXTENSION 0x00000002
#define API_SET_SCHEMA_ENTRY_FLAGS_SEALED 0x00000001
#define API_SET_SCHEMA_ENTRY_FLAGS_EXTENSION 0x00000002
//
// API set schema version 3.
//
typedef struct _API_SET_VALUE_ENTRY_V3 {
ULONG NameOffset;
ULONG NameLength;
ULONG ValueOffset;
ULONG ValueLength;
} API_SET_VALUE_ENTRY_V3, *PAPI_SET_VALUE_ENTRY_V3;
typedef struct _API_SET_VALUE_ARRAY_V3 {
ULONG Count;
API_SET_VALUE_ENTRY_V3 Array[ANYSIZE_ARRAY];
} API_SET_VALUE_ARRAY_V3, *PAPI_SET_VALUE_ARRAY_V3;
typedef struct _API_SET_NAMESPACE_ENTRY_V3 {
ULONG NameOffset;
ULONG NameLength;
ULONG DataOffset; // API_SET_VALUE_ARRAY_V3
} API_SET_NAMESPACE_ENTRY_V3, *PAPI_SET_NAMESPACE_ENTRY_V3;
typedef struct _API_SET_NAMESPACE_ARRAY_V3 {
ULONG Version;
ULONG Count;
API_SET_NAMESPACE_ENTRY_V3 Array[ANYSIZE_ARRAY];
} API_SET_NAMESPACE_ARRAY_V3, *PAPI_SET_NAMESPACE_ARRAY_V3;
typedef const API_SET_VALUE_ENTRY_V3 *PCAPI_SET_VALUE_ENTRY_V3;
typedef const API_SET_VALUE_ARRAY_V3 *PCAPI_SET_VALUE_ARRAY_V3;
typedef const API_SET_NAMESPACE_ENTRY_V3 *PCAPI_SET_NAMESPACE_ENTRY_V3;
typedef const API_SET_NAMESPACE_ARRAY_V3 *PCAPI_SET_NAMESPACE_ARRAY_V3;
//
// Support for downlevel API set schema version 2.
//
typedef struct _API_SET_VALUE_ENTRY_V2 {
ULONG NameOffset;
ULONG NameLength;
ULONG ValueOffset;
ULONG ValueLength;
} API_SET_VALUE_ENTRY_V2, *PAPI_SET_VALUE_ENTRY_V2;
typedef struct _API_SET_VALUE_ARRAY_V2 {
ULONG Count;
API_SET_VALUE_ENTRY_V2 Array[ANYSIZE_ARRAY];
} API_SET_VALUE_ARRAY_V2, *PAPI_SET_VALUE_ARRAY_V2;
typedef struct _API_SET_NAMESPACE_ENTRY_V2 {
ULONG NameOffset;
ULONG NameLength;
ULONG DataOffset; // API_SET_VALUE_ARRAY_V2
} API_SET_NAMESPACE_ENTRY_V2, *PAPI_SET_NAMESPACE_ENTRY_V2;
typedef struct _API_SET_NAMESPACE_ARRAY_V2 {
ULONG Version;
ULONG Count;
API_SET_NAMESPACE_ENTRY_V2 Array[ANYSIZE_ARRAY];
} API_SET_NAMESPACE_ARRAY_V2, *PAPI_SET_NAMESPACE_ARRAY_V2;
typedef const API_SET_VALUE_ENTRY_V2 *PCAPI_SET_VALUE_ENTRY_V2;
typedef const API_SET_VALUE_ARRAY_V2 *PCAPI_SET_VALUE_ARRAY_V2;
typedef const API_SET_NAMESPACE_ENTRY_V2 *PCAPI_SET_NAMESPACE_ENTRY_V2;
typedef const API_SET_NAMESPACE_ARRAY_V2 *PCAPI_SET_NAMESPACE_ARRAY_V2;
//
// API Set Routines
//
NTSTATUS
APISETAPI
ApiSetResolveToHostV6(
_In_ PAPI_SET_NAMESPACE ApiSetNamespace,
_In_ PCUNICODE_STRING ApiSetNameToResolve,
_In_opt_ PCUNICODE_STRING ParentName,
_Out_ PBOOLEAN Resolved,
_Out_ PUNICODE_STRING Output
);
NTSTATUS
APISETAPI
ApiSetResolveToHostV4(
_In_ PAPI_SET_NAMESPACE ApiSetNamespace,
_In_ PCUNICODE_STRING ApiSetNameToResolve,
_In_opt_ PCUNICODE_STRING ParentName,
_Out_ PBOOLEAN Resolved,
_Out_ PUNICODE_STRING Output
);
NTSTATUS
APISETAPI
ApiSetResolveToHostV3(
_In_ PAPI_SET_NAMESPACE ApiSetNamespace,
_In_ PCUNICODE_STRING ApiSetNameToResolve,
_In_opt_ PCUNICODE_STRING ParentName,
_Out_ PBOOLEAN Resolved,
_Out_ PUNICODE_STRING Output
);
NTSTATUS
APISETAPI
ApiSetResolveToHostV2(
_In_ PAPI_SET_NAMESPACE ApiSetNamespace,
_In_ PCUNICODE_STRING ApiSetNameToResolve,
_In_opt_ PCUNICODE_STRING ParentName,
_Out_ PBOOLEAN Resolved,
_Out_ PUNICODE_STRING Output
);
BOOLEAN
APISETAPI
ApiSetResolve(
_In_z_ PWCHAR ApiSetName,
_In_opt_z_ PWCHAR BaseDllName,
_Out_ PUNICODE_STRING ResolvedHostLibrary
);
#endif // _ODIN_API_SET_H_