Files
Tavis Ormandy aa445174ce initial commit
2017-05-23 14:36:59 -07:00

160 lines
6.0 KiB
C

/*
* Copyright (C) 2003-2005 Pontus Fuchs, Giridhar Pemmasani
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#ifndef _NTOSKERNEL_H_
#define _NTOSKERNEL_H_
#define ARRAY_SIZE(x) (sizeof((x)) / sizeof((x)[0]))
#ifndef __packed
#define __packed __attribute__((packed))
#endif
#define int_div_round(x, y) (((x) + (y - 1)) / (y))
typedef void (*generic_func)(void);
struct wrap_export {
const char *name;
void *func;
};
#define WIN_SYMBOL(name, argc) {#name, (generic_func)name}
#define WIN_WIN_SYMBOL(name, argc) {#name, (generic_func)_win_ ## name}
#define WIN_FUNC_DECL(name, argc)
#define WIN_FUNC_PTR(name, argc) name
#define WIN_FUNC(name, argc) (name)
/* map name s to f - if f is different from s */
#define WIN_SYMBOL_MAP(s, f)
struct pe_image {
char name[128];
BOOL WINAPI (*entry)(PVOID hinstDLL, DWORD fdwReason, PVOID lpvReserved);
void *image;
int size;
int type;
IMAGE_NT_HEADERS *nt_hdr;
IMAGE_OPTIONAL_HEADER *opt_hdr;
};
struct ntos_work_item {
struct nt_list list;
void *arg1;
void *arg2;
NTOS_WORK_FUNC func;
};
#define WRAP_DRIVER_CLIENT_ID 1
enum hw_status {
HW_INITIALIZED = 1, HW_SUSPENDED, HW_HALTED, HW_DISABLED,
};
#define wrap_is_pci_bus(dev_bus) \
(WRAP_BUS(dev_bus) == WRAP_PCI_BUS || \
WRAP_BUS(dev_bus) == WRAP_PCMCIA_BUS)
#ifdef ENABLE_USB
/* earlier versions of ndiswrapper used 0 as USB_BUS */
#define wrap_is_usb_bus(dev_bus) \
(WRAP_BUS(dev_bus) == WRAP_USB_BUS || \
WRAP_BUS(dev_bus) == WRAP_INTERNAL_BUS)
#else
#define wrap_is_usb_bus(dev_bus) 0
#endif
#define wrap_is_bluetooth_device(dev_bus) \
(WRAP_DEVICE(dev_bus) == WRAP_BLUETOOTH_DEVICE1 || \
WRAP_DEVICE(dev_bus) == WRAP_BLUETOOTH_DEVICE2)
extern struct workqueue_struct *ntos_wq;
extern struct workqueue_struct *ndis_wq;
extern struct workqueue_struct *wrapndis_wq;
#define atomic_unary_op(var, size, oper) \
do { \
if (size == 1) \
__asm__ __volatile__( \
LOCK_PREFIX oper "b %b0\n\t" : "+m" (var)); \
else if (size == 2) \
__asm__ __volatile__( \
LOCK_PREFIX oper "w %w0\n\t" : "+m" (var)); \
else if (size == 4) \
__asm__ __volatile__( \
LOCK_PREFIX oper "l %0\n\t" : "+m" (var)); \
else if (size == 8) \
__asm__ __volatile__( \
LOCK_PREFIX oper "q %q0\n\t" : "+m" (var)); \
else { \
extern void _invalid_op_size_(void); \
_invalid_op_size_(); \
} \
} while (0)
#define atomic_inc_var_size(var, size) atomic_unary_op(var, size, "inc")
#define atomic_inc_var(var) atomic_inc_var_size(var, sizeof(var))
#define atomic_dec_var_size(var, size) atomic_unary_op(var, size, "dec")
#define atomic_dec_var(var) atomic_dec_var_size(var, sizeof(var))
#define pre_atomic_add(var, i) \
({ \
typeof(var) pre; \
__asm__ __volatile__( \
LOCK_PREFIX "xadd %0, %1\n\t" \
: "=r"(pre), "+m"(var) \
: "0"(i)); \
pre; \
})
#define post_atomic_add(var, i) (pre_atomic_add(var, i) + i)
//#define DEBUG_IRQL 1
#ifdef DEBUG_IRQL
#define assert_irql(cond) \
do { \
KIRQL _irql_ = current_irql(); \
if (!(cond)) { \
WARNING("assertion '%s' failed: %d", #cond, _irql_); \
DBG_BLOCK(4) { \
dump_stack(); \
} \
} \
} while (0)
#else
#define assert_irql(cond) do { } while (0)
#endif
/* When preempt is enabled, we should preempt_disable to raise IRQL to
* DISPATCH_LEVEL, to be consistent with the semantics. However, using
* a mutex instead, so that only ndiswrapper threads run one at a time
* on a processor when at DISPATCH_LEVEL seems to be enough. So that
* is what we will use until we learn otherwise. If
* preempt_(en|dis)able is required for some reason, comment out
* following #define. */
#define WRAP_PREEMPT 1
#if !defined(CONFIG_PREEMPT) || defined(CONFIG_PREEMPT_RT)
#ifndef WRAP_PREEMPT
#define WRAP_PREEMPT 1
#endif
#endif
#endif // _NTOSKERNEL_H_