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