ntoskrnl_var.h revision 128295
1123474Swpaul/*
2123474Swpaul * Copyright (c) 2003
3123474Swpaul *	Bill Paul <wpaul@windriver.com>.  All rights reserved.
4123474Swpaul *
5123474Swpaul * Redistribution and use in source and binary forms, with or without
6123474Swpaul * modification, are permitted provided that the following conditions
7123474Swpaul * are met:
8123474Swpaul * 1. Redistributions of source code must retain the above copyright
9123474Swpaul *    notice, this list of conditions and the following disclaimer.
10123474Swpaul * 2. Redistributions in binary form must reproduce the above copyright
11123474Swpaul *    notice, this list of conditions and the following disclaimer in the
12123474Swpaul *    documentation and/or other materials provided with the distribution.
13123474Swpaul * 3. All advertising materials mentioning features or use of this software
14123474Swpaul *    must display the following acknowledgement:
15123474Swpaul *	This product includes software developed by Bill Paul.
16123474Swpaul * 4. Neither the name of the author nor the names of any co-contributors
17123474Swpaul *    may be used to endorse or promote products derived from this software
18123474Swpaul *    without specific prior written permission.
19123474Swpaul *
20123474Swpaul * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
21123474Swpaul * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22123474Swpaul * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23123474Swpaul * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
24123474Swpaul * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25123474Swpaul * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26123474Swpaul * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27123474Swpaul * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28123474Swpaul * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29123474Swpaul * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
30123474Swpaul * THE POSSIBILITY OF SUCH DAMAGE.
31123474Swpaul *
32123474Swpaul * $FreeBSD: head/sys/compat/ndis/ntoskrnl_var.h 128295 2004-04-16 00:04:28Z wpaul $
33123474Swpaul */
34123474Swpaul
35123474Swpaul#ifndef _NTOSKRNL_VAR_H_
36123474Swpaul#define _NTOSKRNL_VAR_H_
37123474Swpaul
38123512Swpaul/* Note: assumes x86 page size of 4K. */
39123512Swpaul#define PAGE_SHIFT	12
40123512Swpaul#define SPAN_PAGES(ptr, len)					\
41123512Swpaul	((uint32_t)((((uintptr_t)(ptr) & (PAGE_SIZE -1)) +	\
42123512Swpaul	(len) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
43123757Swpaul#define PAGE_ALIGN(ptr)						\
44123757Swpaul	((void *)((uintptr_t)(ptr) & ~(PAGE_SIZE - 1)))
45123757Swpaul#define BYTE_OFFSET(ptr)					\
46123757Swpaul	((uint32_t)((uintptr_t)(ptr) & (PAGE_SIZE - 1)))
47123757Swpaul#define MDL_INIT(b, baseva, len)					\
48123757Swpaul	(b)->nb_next = NULL;						\
49123757Swpaul	(b)->nb_size = (uint16_t)(sizeof(struct ndis_buffer) +		\
50123757Swpaul		(sizeof(uint32_t) * SPAN_PAGES((baseva), (len))));	\
51123757Swpaul	(b)->nb_flags = 0;						\
52123757Swpaul	(b)->nb_startva = (void *)PAGE_ALIGN((baseva));			\
53123757Swpaul	(b)->nb_byteoffset = BYTE_OFFSET((baseva));			\
54123757Swpaul	(b)->nb_bytecount = (uint32_t)(len);
55123757Swpaul#define MDL_VA(b)						\
56123757Swpaul	((void *)((char *)((b)->nb_startva) + (b)->nb_byteoffset))
57123512Swpaul
58124729Swpaul#define WDM_MAJOR		1
59124729Swpaul#define WDM_MINOR_WIN98		0x00
60124729Swpaul#define WDM_MINOR_WINME		0x05
61124729Swpaul#define WDM_MINOR_WIN2000	0x10
62124729Swpaul#define WDM_MINOR_WINXP		0x20
63124729Swpaul#define WDM_MINOR_WIN2003	0x30
64124729Swpaul
65124582Sobrien/*-
66124582Sobrien * The ndis_kspin_lock type is called KSPIN_LOCK in MS-Windows.
67124582Sobrien * According to the Windows DDK header files, KSPIN_LOCK is defined like this:
68124582Sobrien *	typedef ULONG_PTR KSPIN_LOCK;
69124582Sobrien *
70124582Sobrien * From basetsd.h (SDK, Feb. 2003):
71124582Sobrien * 	typedef [public] unsigned __int3264 ULONG_PTR, *PULONG_PTR;
72124582Sobrien * 	typedef unsigned __int64 ULONG_PTR, *PULONG_PTR;
73124582Sobrien * 	typedef _W64 unsigned long ULONG_PTR, *PULONG_PTR;
74124582Sobrien *
75124582Sobrien * The keyword __int3264 specifies an integral type that has the following
76124582Sobrien * properties:
77124582Sobrien *	+ It is 32-bit on 32-bit platforms
78124582Sobrien *	+ It is 64-bit on 64-bit platforms
79124582Sobrien *	+ It is 32-bit on the wire for backward compatibility.
80124582Sobrien *	  It gets truncated on the sending side and extended appropriately
81124582Sobrien *	  (signed or unsigned) on the receiving side.
82124582Sobrien *
83124582Sobrien * Thus register_t seems the proper mapping onto FreeBSD for spin locks.
84124582Sobrien */
85123474Swpaul
86124582Sobrientypedef register_t kspin_lock;
87124582Sobrien
88123474Swpaulstruct slist_entry {
89123474Swpaul	struct slist_entry	*sl_next;
90123474Swpaul};
91123474Swpaul
92123474Swpaultypedef struct slist_entry slist_entry;
93123474Swpaul
94123474Swpaulunion slist_header {
95123474Swpaul	uint64_t		slh_align;
96123474Swpaul	struct {
97123474Swpaul		struct slist_entry	*slh_next;
98123474Swpaul		uint16_t		slh_depth;
99123474Swpaul		uint16_t		slh_seq;
100123474Swpaul	} slh_list;
101123474Swpaul};
102123474Swpaul
103123474Swpaultypedef union slist_header slist_header;
104123474Swpaul
105123507Swpaulstruct list_entry {
106123507Swpaul        struct list_entry *nle_flink;
107123507Swpaul        struct list_entry *nle_blink;
108123507Swpaul};
109123507Swpaul
110123507Swpaultypedef struct list_entry list_entry;
111123507Swpaul
112125551Swpaul#define INIT_LIST_HEAD(l)	\
113125551Swpaul	l->nle_flink = l->nle_blink = l
114125551Swpaul
115125551Swpaul#define REMOVE_LIST_ENTRY(e)			\
116125551Swpaul	do {					\
117125551Swpaul		list_entry		*b;	\
118125551Swpaul		list_entry		*f;	\
119125551Swpaul						\
120125551Swpaul		f = e->nle_flink;		\
121125551Swpaul		b = e->nle_blink;		\
122125551Swpaul		b->nle_flink = f;		\
123125551Swpaul		f->nle_blink = b;		\
124125551Swpaul	} while (0)
125125551Swpaul
126125551Swpaul#define REMOVE_LIST_HEAD(l)			\
127125551Swpaul	do {					\
128125551Swpaul		list_entry		*f;	\
129125551Swpaul		list_entry		*e;	\
130125551Swpaul						\
131125551Swpaul		e = l->nle_flink;		\
132125551Swpaul		f = e->nle_flink;		\
133125551Swpaul		l->nle_flink = f;		\
134125551Swpaul		f->nle_blink = l;		\
135125551Swpaul	} while (0)
136125551Swpaul
137125551Swpaul#define REMOVE_LIST_TAIL(l)			\
138125551Swpaul	do {					\
139125551Swpaul		list_entry		*b;	\
140125551Swpaul		list_entry		*e;	\
141125551Swpaul						\
142125551Swpaul		e = l->nle_blink;		\
143125551Swpaul		b = e->nle_blink;		\
144125551Swpaul		l->nle_blink = b;		\
145125551Swpaul		b->nle_flink = l;		\
146125551Swpaul	} while (0)
147125551Swpaul
148125551Swpaul#define INSERT_LIST_TAIL(l, e)			\
149125551Swpaul	do {					\
150125551Swpaul		list_entry		*b;	\
151125551Swpaul						\
152125551Swpaul		b = l->nle_blink;		\
153125860Swpaul		e->nle_flink = l;		\
154125551Swpaul		e->nle_blink = b;		\
155125551Swpaul		b->nle_flink = e;		\
156125551Swpaul		l->nle_blink = e;		\
157125551Swpaul	} while (0)
158125551Swpaul
159125551Swpaul#define INSERT_LIST_HEAD(l, e)			\
160125551Swpaul	do {					\
161125551Swpaul		list_entry		*f;	\
162125551Swpaul						\
163125551Swpaul		f = l->nle_flink;		\
164125551Swpaul		e->nle_flink = f;		\
165125551Swpaul		e->nle_blink = l;		\
166125551Swpaul		f->nle_blink = e;		\
167125551Swpaul		l->nle_flink = e;		\
168125551Swpaul	} while (0)
169125551Swpaul
170125551Swpaulstruct nt_dispatch_header {
171125551Swpaul	uint8_t			dh_type;
172125551Swpaul	uint8_t			dh_abs;
173125551Swpaul	uint8_t			dh_size;
174125551Swpaul	uint8_t			dh_inserted;
175125551Swpaul	uint32_t		dh_sigstate;
176125551Swpaul	list_entry		dh_waitlisthead;
177125551Swpaul};
178125551Swpaul
179125551Swpaultypedef struct nt_dispatch_header nt_dispatch_header;
180125551Swpaul
181125551Swpaul#define OTYPE_EVENT		0
182125551Swpaul#define OTYPE_MUTEX		1
183125551Swpaul#define OTYPE_THREAD		2
184125551Swpaul#define OTYPE_TIMER		3
185125551Swpaul
186125551Swpaul/* Windows dispatcher levels. */
187125551Swpaul
188125551Swpaul#define PASSIVE_LEVEL		0
189125551Swpaul#define LOW_LEVEL		0
190125551Swpaul#define APC_LEVEL		1
191125551Swpaul#define DISPATCH_LEVEL		2
192128229Swpaul#define DEVICE_LEVEL		(DISPATCH_LEVEL + 1)
193125551Swpaul#define PROFILE_LEVEL		27
194125551Swpaul#define CLOCK1_LEVEL		28
195125551Swpaul#define CLOCK2_LEVEL		28
196125551Swpaul#define IPI_LEVEL		29
197125551Swpaul#define POWER_LEVEL		30
198125551Swpaul#define HIGH_LEVEL		31
199125551Swpaul
200125551Swpaul#define SYNC_LEVEL_UP		DISPATCH_LEVEL
201125551Swpaul#define SYNC_LEVEL_MP		(IPI_LEVEL - 1)
202125551Swpaul
203128229Swpaul#define AT_PASSIVE_LEVEL(td)		\
204128229Swpaul	((td)->td_proc->p_flag & P_KTHREAD == FALSE)
205128229Swpaul
206128229Swpaul#define AT_DISPATCH_LEVEL(td)		\
207128295Swpaul	((td)->td_priority == PI_REALTIME)
208128229Swpaul
209128229Swpaul#define AT_DIRQL_LEVEL(td)		\
210128295Swpaul	((td)->td_priority <= PI_NET)
211128229Swpaul
212128229Swpaul#define AT_HIGH_LEVEL(td)		\
213128229Swpaul	((td)->td_critnest != 0)
214128229Swpaul
215125551Swpaulstruct nt_objref {
216125551Swpaul	nt_dispatch_header	no_dh;
217125551Swpaul	void			*no_obj;
218125551Swpaul	TAILQ_ENTRY(nt_objref)	link;
219125551Swpaul};
220125551Swpaul
221125551SwpaulTAILQ_HEAD(nt_objref_head, nt_objref);
222125551Swpaul
223125551Swpaultypedef struct nt_objref nt_objref;
224125551Swpaul
225125551Swpaul#define EVENT_TYPE_NOTIFY	0
226125551Swpaul#define EVENT_TYPE_SYNC		1
227125551Swpaul
228126620Swpaul/*
229126620Swpaul * We need to use the timeout()/untimeout() API for ktimers
230126620Swpaul * since timers can be initialized, but not destroyed (so
231126620Swpaul * malloc()ing our own callout structures would mean a leak,
232126620Swpaul * since there'd be no way to free() them). This means we
233126620Swpaul * need to use struct callout_handle, which is really just a
234126620Swpaul * pointer. To make it easier to deal with, we use a union
235126620Swpaul * to overlay the callout_handle over the k_timerlistentry.
236126620Swpaul * The latter is a list_entry, which is two pointers, so
237126620Swpaul * there's enough space available to hide a callout_handle
238126620Swpaul * there.
239126620Swpaul */
240126620Swpaul
241125551Swpaulstruct ktimer {
242125551Swpaul	nt_dispatch_header	k_header;
243125551Swpaul	uint64_t		k_duetime;
244126620Swpaul	union {
245126620Swpaul		list_entry		k_timerlistentry;
246126620Swpaul		struct callout_handle	k_handle;
247126620Swpaul	} u;
248125551Swpaul	void			*k_dpc;
249125551Swpaul	uint32_t		k_period;
250125551Swpaul};
251125551Swpaul
252126620Swpaul#define k_timerlistentry	u.k_timerlistentry
253126620Swpaul#define k_handle		u.k_handle
254126620Swpaul
255126620Swpaultypedef struct ktimer ktimer;
256126620Swpaul
257125551Swpaulstruct nt_kevent {
258125551Swpaul	nt_dispatch_header	k_header;
259125551Swpaul};
260125551Swpaul
261125551Swpaultypedef struct nt_kevent nt_kevent;
262125551Swpaul
263125551Swpaul/* Kernel defered procedure call (i.e. timer callback) */
264125551Swpaul
265125551Swpaulstruct kdpc;
266125551Swpaultypedef void (*kdpc_func)(struct kdpc *, void *, void *, void *);
267125551Swpaul
268125551Swpaulstruct kdpc {
269125551Swpaul	uint16_t		k_type;
270125551Swpaul	uint8_t			k_num;
271125551Swpaul	uint8_t			k_importance;
272125551Swpaul	list_entry		k_dpclistentry;
273125551Swpaul	kdpc_func		k_deferedfunc;
274125551Swpaul	void			*k_deferredctx;
275125551Swpaul	void			*k_sysarg1;
276125551Swpaul	void			*k_sysarg2;
277127552Swpaul	register_t		k_lock;
278125551Swpaul};
279125551Swpaul
280126620Swpaultypedef struct kdpc kdpc;
281126620Swpaul
282125551Swpaul/*
283125551Swpaul * Note: the acquisition count is BSD-specific. The Microsoft
284125551Swpaul * documentation says that mutexes can be acquired recursively
285125551Swpaul * by a given thread, but that you must release the mutex as
286125551Swpaul * many times as you acquired it before it will be set to the
287125551Swpaul * signalled state (i.e. before any other threads waiting on
288125551Swpaul * the object will be woken up). However the Windows KMUTANT
289125551Swpaul * structure has no field for keeping track of the number of
290125551Swpaul * acquisitions, so we need to add one ourselves. As long as
291125551Swpaul * driver code treats the mutex as opaque, we should be ok.
292125551Swpaul */
293125551Swpaulstruct kmutant {
294125551Swpaul	nt_dispatch_header	km_header;
295126620Swpaul	union {
296126620Swpaul		list_entry		km_listentry;
297126620Swpaul		uint32_t		km_acquirecnt;
298126620Swpaul	} u;
299125551Swpaul	void			*km_ownerthread;
300125551Swpaul	uint8_t			km_abandoned;
301125551Swpaul	uint8_t			km_apcdisable;
302125551Swpaul};
303125551Swpaul
304126620Swpaul#define km_listentry		u.km_listentry
305126620Swpaul#define km_acquirecnt		u.km_acquirecnt
306126620Swpaul
307125551Swpaultypedef struct kmutant kmutant;
308125551Swpaul
309125860Swpaul#define LOOKASIDE_DEPTH 256
310125860Swpaul
311123474Swpaulstruct general_lookaside {
312123474Swpaul	slist_header		gl_listhead;
313123474Swpaul	uint16_t		gl_depth;
314123474Swpaul	uint16_t		gl_maxdepth;
315123474Swpaul	uint32_t		gl_totallocs;
316123474Swpaul	union {
317123474Swpaul		uint32_t		gl_allocmisses;
318123474Swpaul		uint32_t		gl_allochits;
319123474Swpaul	} u_a;
320123474Swpaul	uint32_t		gl_totalfrees;
321123474Swpaul	union {
322123474Swpaul		uint32_t		gl_freemisses;
323123474Swpaul		uint32_t		gl_freehits;
324123474Swpaul	} u_m;
325123474Swpaul	uint32_t		gl_type;
326123474Swpaul	uint32_t		gl_tag;
327123474Swpaul	uint32_t		gl_size;
328123474Swpaul	void			*gl_allocfunc;
329123474Swpaul	void			*gl_freefunc;
330123507Swpaul	list_entry		gl_listent;
331123474Swpaul	uint32_t		gl_lasttotallocs;
332123474Swpaul	union {
333123474Swpaul		uint32_t		gl_lastallocmisses;
334123474Swpaul		uint32_t		gl_lastallochits;
335123474Swpaul	} u_l;
336123474Swpaul	uint32_t		gl_rsvd[2];
337123474Swpaul};
338123474Swpaul
339123474Swpaultypedef struct general_lookaside general_lookaside;
340123474Swpaul
341123474Swpaulstruct npaged_lookaside_list {
342123474Swpaul	general_lookaside	nll_l;
343123474Swpaul	kspin_lock		nll_obsoletelock;
344123474Swpaul};
345123474Swpaul
346123474Swpaultypedef struct npaged_lookaside_list npaged_lookaside_list;
347123474Swpaultypedef struct npaged_lookaside_list paged_lookaside_list;
348123474Swpaul
349123474Swpaultypedef void * (*lookaside_alloc_func)(uint32_t, size_t, uint32_t);
350123474Swpaultypedef void (*lookaside_free_func)(void *);
351123474Swpaul
352125551Swpaulstruct irp;
353123474Swpaul
354125551Swpaulstruct kdevice_qentry {
355125551Swpaul	list_entry		kqe_devlistent;
356125551Swpaul	uint32_t		kqe_sortkey;
357125551Swpaul	uint8_t			kqe_inserted;
358125551Swpaul};
359125551Swpaul
360125551Swpaultypedef struct kdevice_qentry kdevice_qentry;
361125551Swpaul
362125551Swpaulstruct kdevice_queue {
363125551Swpaul	uint16_t		kq_type;
364125551Swpaul	uint16_t		kq_size;
365125551Swpaul	list_entry		kq_devlisthead;
366125551Swpaul	kspin_lock		kq_lock;
367125551Swpaul	uint8_t			kq_busy;
368125551Swpaul};
369125551Swpaul
370125551Swpaultypedef struct kdevice_queue kdevice_queue;
371125551Swpaul
372125551Swpaulstruct wait_ctx_block {
373125551Swpaul	kdevice_qentry		wcb_waitqueue;
374125551Swpaul	void			*wcb_devfunc;
375125551Swpaul	void			*wcb_devctx;
376125551Swpaul	uint32_t		wcb_mapregcnt;
377125551Swpaul	void			*wcb_devobj;
378125551Swpaul	void			*wcb_curirp;
379125551Swpaul	void			*wcb_bufchaindpc;
380125551Swpaul};
381125551Swpaul
382125551Swpaultypedef struct wait_ctx_block wait_ctx_block;
383125551Swpaul
384125551Swpaulstruct wait_block {
385125551Swpaul	list_entry		wb_waitlist;
386125551Swpaul	void			*wb_kthread;
387125551Swpaul	nt_dispatch_header	*wb_object;
388125551Swpaul	struct wait_block	*wb_next;
389125551Swpaul	uint16_t		wb_waitkey;
390125551Swpaul	uint16_t		wb_waittype;
391125551Swpaul};
392125551Swpaul
393125551Swpaultypedef struct wait_block wait_block;
394125551Swpaul
395125551Swpaul#define THREAD_WAIT_OBJECTS	3
396125551Swpaul#define MAX_WAIT_OBJECTS	64
397125551Swpaul
398125551Swpaul#define WAITTYPE_ALL		0
399125551Swpaul#define WAITTYPE_ANY		1
400125551Swpaul
401125551Swpaulstruct thread_context {
402125551Swpaul	void			*tc_thrctx;
403125551Swpaul	void			*tc_thrfunc;
404125551Swpaul};
405125551Swpaul
406125551Swpaultypedef struct thread_context thread_context;
407125551Swpaul
408125551Swpaulstruct device_object {
409125551Swpaul	uint16_t		do_type;
410125551Swpaul	uint16_t		do_size;
411125551Swpaul	uint32_t		do_refcnt;
412125551Swpaul	struct device_object	*do_drvobj;
413125551Swpaul	struct device_object	*do_nextdev;
414125551Swpaul	struct device_object	*do_attacheddev;
415125551Swpaul	struct irp		*do_currirp;
416125551Swpaul	void			*do_iotimer;
417125551Swpaul	uint32_t		do_flags;
418125551Swpaul	uint32_t		do_characteristics;
419125551Swpaul	void			*do_vpb;
420125551Swpaul	void			*do_devext;
421125551Swpaul	uint8_t			do_stacksize;
422125551Swpaul	union {
423125551Swpaul		list_entry		do_listent;
424125551Swpaul		wait_ctx_block		do_wcb;
425125551Swpaul	} queue;
426125551Swpaul	uint32_t		do_alignreq;
427125551Swpaul	kdevice_queue		do_devqueue;
428125551Swpaul	struct kdpc		do_dpc;
429125551Swpaul	uint32_t		do_activethreads;
430125551Swpaul	void			*do_securitydesc;
431125551Swpaul	struct nt_kevent	do_devlock;
432125551Swpaul	uint16_t		do_sectorsz;
433125551Swpaul	uint16_t		do_spare1;
434125551Swpaul	void			*do_devobj_ext;
435125551Swpaul	void			*do_rsvd;
436125551Swpaul};
437125551Swpaul
438125551Swpaultypedef struct device_object device_object;
439125551Swpaul
440125551Swpaulstruct irp {
441125551Swpaul	uint32_t		i_dummy;
442125551Swpaul};
443125551Swpaul
444125551Swpaultypedef struct irp irp;
445125551Swpaul
446125551Swpaultypedef uint32_t (*driver_dispatch)(device_object *, irp *);
447125551Swpaul
448125551Swpaul#define DEVPROP_DEVICE_DESCRIPTION	0x00000000
449125551Swpaul#define DEVPROP_HARDWARE_ID		0x00000001
450125551Swpaul#define DEVPROP_COMPATIBLE_IDS		0x00000002
451125551Swpaul#define DEVPROP_BOOTCONF		0x00000003
452125551Swpaul#define DEVPROP_BOOTCONF_TRANSLATED	0x00000004
453125551Swpaul#define DEVPROP_CLASS_NAME		0x00000005
454125551Swpaul#define DEVPROP_CLASS_GUID		0x00000006
455125551Swpaul#define DEVPROP_DRIVER_KEYNAME		0x00000007
456125551Swpaul#define DEVPROP_MANUFACTURER		0x00000008
457125551Swpaul#define DEVPROP_FRIENDLYNAME		0x00000009
458125551Swpaul#define DEVPROP_LOCATION_INFO		0x0000000A
459125551Swpaul#define DEVPROP_PHYSDEV_NAME		0x0000000B
460125551Swpaul#define DEVPROP_BUSTYPE_GUID		0x0000000C
461125551Swpaul#define DEVPROP_LEGACY_BUSTYPE		0x0000000D
462125551Swpaul#define DEVPROP_BUS_NUMBER		0x0000000E
463125551Swpaul#define DEVPROP_ENUMERATOR_NAME		0x0000000F
464125551Swpaul#define DEVPROP_ADDRESS			0x00000010
465125551Swpaul#define DEVPROP_UINUMBER		0x00000011
466125551Swpaul#define DEVPROP_INSTALL_STATE		0x00000012
467125551Swpaul#define DEVPROP_REMOVAL_POLICY		0x00000013
468125551Swpaul
469125551Swpaul#define STATUS_SUCCESS			0x00000000
470125551Swpaul#define STATUS_USER_APC			0x000000C0
471125551Swpaul#define STATUS_KERNEL_APC		0x00000100
472125551Swpaul#define STATUS_ALERTED			0x00000101
473125551Swpaul#define STATUS_TIMEOUT			0x00000102
474125551Swpaul#define STATUS_INVALID_PARAMETER	0xC000000D
475125551Swpaul#define STATUS_INVALID_DEVICE_REQUEST	0xC0000010
476125551Swpaul#define STATUS_BUFFER_TOO_SMALL		0xC0000023
477125551Swpaul#define STATUS_MUTANT_NOT_OWNED		0xC0000046
478125551Swpaul#define STATUS_INVALID_PARAMETER_2	0xC00000F0
479125551Swpaul
480125551Swpaul#define STATUS_WAIT_0			0x00000000
481125551Swpaul
482127284Swpaul/*
483127284Swpaul * FreeBSD's kernel stack is 2 pages in size by default. The
484127284Swpaul * Windows stack is larger, so we need to give our threads more
485127284Swpaul * stack pages. 4 should be enough, we use 8 just to extra safe.
486127284Swpaul */
487127284Swpaul#define NDIS_KSTACK_PAGES	8
488127284Swpaul
489123474Swpaulextern image_patch_table ntoskrnl_functbl[];
490123474Swpaul
491123474Swpaul__BEGIN_DECLS
492123474Swpaulextern int ntoskrnl_libinit(void);
493123474Swpaulextern int ntoskrnl_libfini(void);
494127248Swpaul__stdcall extern void ntoskrnl_init_dpc(kdpc *, void *, void *);
495127552Swpaul__stdcall extern uint8_t ntoskrnl_queue_dpc(kdpc *, void *, void *);
496127552Swpaul__stdcall extern uint8_t ntoskrnl_dequeue_dpc(kdpc *);
497127248Swpaul__stdcall extern void ntoskrnl_init_timer(ktimer *);
498127248Swpaul__stdcall extern void ntoskrnl_init_timer_ex(ktimer *, uint32_t);
499127248Swpaul__stdcall extern uint8_t ntoskrnl_set_timer(ktimer *, int64_t, kdpc *);
500127248Swpaul__stdcall extern uint8_t ntoskrnl_set_timer_ex(ktimer *, int64_t,
501127248Swpaul	uint32_t, kdpc *);
502127248Swpaul__stdcall extern uint8_t ntoskrnl_cancel_timer(ktimer *);
503127248Swpaul__stdcall extern uint8_t ntoskrnl_read_timer(ktimer *);
504128229Swpaul__stdcall extern uint32_t ntoskrnl_waitforobj(nt_dispatch_header *, uint32_t,
505127248Swpaul	uint32_t, uint8_t, int64_t *);
506128229Swpaul__stdcall extern void ntoskrnl_init_event(nt_kevent *, uint32_t, uint8_t);
507128229Swpaul__stdcall extern void ntoskrnl_clear_event(nt_kevent *);
508128229Swpaul__stdcall extern uint32_t ntoskrnl_read_event(nt_kevent *);
509128229Swpaul__stdcall extern uint32_t ntoskrnl_set_event(nt_kevent *, uint32_t, uint8_t);
510128229Swpaul__stdcall extern uint32_t ntoskrnl_reset_event(nt_kevent *);
511128229Swpaul__stdcall extern void ntoskrnl_lock_dpc(/*kspin_lock * */ void);
512128229Swpaul__stdcall extern void ntoskrnl_unlock_dpc(/*kspin_lock * */ void);
513128229Swpaul
514128229Swpaul/*
515128229Swpaul * On the Windows x86 arch, KeAcquireSpinLock() and KeReleaseSpinLock()
516128229Swpaul * routines live in the HAL. We try to imitate this behavior.
517128229Swpaul */
518128229Swpaul#ifdef __i386__
519128229Swpaul#define ntoskrnl_acquire_spinlock(a, b)		\
520128229Swpaul	*(b) = FASTCALL(hal_lock, a, 0)
521128229Swpaul#define ntoskrnl_release_spinlock(a, b)		\
522128229Swpaul	FASTCALL(hal_unlock, a, b)
523128229Swpaul#endif /* __i386__ */
524123474Swpaul__END_DECLS
525123474Swpaul
526123474Swpaul#endif /* _NTOSKRNL_VAR_H_ */
527