⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ntoskernel.h

📁 ndiswrapper工具
💻 H
📖 第 1 页 / 共 2 页
字号:
/* *  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_#include <linux/types.h>#include <linux/timer.h>#include <linux/time.h>#include <linux/module.h>#include <linux/kmod.h>#include <linux/netdevice.h>#include <linux/wireless.h>#include <linux/pci.h>#include <linux/wait.h>#include <linux/pm.h>#include <linux/delay.h>#include <linux/mm.h>#include <linux/random.h>#include <linux/ctype.h>#include <linux/list.h>#include <linux/sched.h>#include <linux/usb.h>#include <linux/spinlock.h>#include <asm/mman.h>#include <linux/version.h>#include <linux/etherdevice.h>#include <net/iw_handler.h>#include <linux/netdevice.h>#include <linux/ethtool.h>#include <linux/if_arp.h>#include <linux/rtnetlink.h>#include "winnt_types.h"#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,7)#include <linux/kthread.h>#endif/* Interrupt backwards compatibility stuff */#include <linux/interrupt.h>#ifndef IRQ_HANDLED#define IRQ_HANDLED#define IRQ_NONE#define irqreturn_t void#endif/* Workqueue / task queue backwards compatibility stuff */#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,41)#include <linux/workqueue.h>/* pci functions in 2.6 kernels have problems allocating dma buffers, * but seem to work fine with dma functions */typedef struct workqueue_struct *workqueue;#include <asm/dma-mapping.h>#define PCI_DMA_ALLOC_COHERENT(pci_dev,size,dma_handle)			\	dma_alloc_coherent(&pci_dev->dev,size,dma_handle,		\			   GFP_KERNEL | __GFP_REPEAT)#define PCI_DMA_FREE_COHERENT(pci_dev,size,cpu_addr,dma_handle)		\	dma_free_coherent(&pci_dev->dev,size,cpu_addr,dma_handle)#define PCI_DMA_MAP_SINGLE(pci_dev,addr,size,direction)		\	dma_map_single(&pci_dev->dev,addr,size,direction)#define PCI_DMA_UNMAP_SINGLE(pci_dev,dma_handle,size,direction)		\	dma_unmap_single(&pci_dev->dev,dma_handle,size,direction)#define MAP_SG(pci_dev, sglist, nents, direction)		\	dma_map_sg(&pci_dev->dev, sglist, nents, direction)#define UNMAP_SG(pci_dev, sglist, nents, direction)		\	dma_unmap_sg(&pci_dev->dev, sglist, nents, direction)#else // linux version <= 2.5.41#define PCI_DMA_ALLOC_COHERENT(dev,size,dma_handle)	\	pci_alloc_consistent(dev,size,dma_handle)#define PCI_DMA_FREE_COHERENT(dev,size,cpu_addr,dma_handle)	\	pci_free_consistent(dev,size,cpu_addr,dma_handle)#define PCI_DMA_MAP_SINGLE(dev,addr,size,direction)	\	pci_map_single(dev,addr,size,direction)#define PCI_DMA_UNMAP_SINGLE(dev,dma_handle,size,direction)	\	pci_unmap_single(dev,dma_handle,size,direction)#define MAP_SG(dev, sglist, nents, direction)		\	pci_map_sg(dev, sglist, nents, direction)#define UNMAP_SG(dev, sglist, nents, direction)		\	pci_unmap_sg(dev, sglist, nents, direction)/* 2.4 kernels don't have workqueues, but we need them */struct workqueue_struct {	spinlock_t lock;	wait_queue_head_t waitq_head;	/* how many work_structs pending? */	int pending;	const char *name;	int pid;	/* list of work_structs pending */	struct list_head work_list;};struct work_struct {	struct list_head list;	void (*func)(void *data);	void *data;	/* whether/on which workqueue scheduled */	struct workqueue_struct *workq;};#define INIT_WORK(work_struct, worker_func, worker_data)	\	do {							\		(work_struct)->func = worker_func;		\		(work_struct)->data = worker_data;		\		(work_struct)->workq = NULL;			\	} while (0)struct workqueue_struct *create_singlethread_workqueue(const char *name);void destroy_workqueue(struct workqueue_struct *workq);void queue_work(struct workqueue_struct *workq,		struct work_struct *work_struct) wfastcall;void cancel_delayed_work(struct work_struct *work_struct);#include <linux/smp_lock.h>/* RedHat kernels #define irqs_disabled this way */#ifndef irqs_disabled#define irqs_disabled()                \({                                     \	unsigned long flags;	       \       __save_flags(flags);            \       !(flags & (1<<9));              \})#endif#ifndef in_atomic#ifdef CONFIG_PREEMPT#define in_atomic()					\	((preempt_get_count() & ~PREEMPT_ACTIVE) != 0)#else#define in_atomic() (in_interrupt())#endif // CONFIG_PREEMPT#endif // in_atomic#endif // LINUX_VERSION_CODE#ifndef __wait_event_interruptible_timeout#define __wait_event_interruptible_timeout(wq, condition, ret)		\do {									\	wait_queue_t __wait;						\	init_waitqueue_entry(&__wait, current);				\									\	add_wait_queue(&wq, &__wait);					\	for (;;) {							\		set_current_state(TASK_INTERRUPTIBLE);			\		if (condition)						\			break;						\		if (!signal_pending(current)) {				\			ret = schedule_timeout(ret);			\			if (!ret)					\				break;					\			continue;					\		}							\		ret = -ERESTARTSYS;					\		break;							\	}								\	current->state = TASK_RUNNING;					\	remove_wait_queue(&wq, &__wait);				\} while (0)#endif#ifndef wait_event_interruptible_timeout#define wait_event_interruptible_timeout(wq, condition, timeout)	\({									\	long __ret = timeout;						\	if (!(condition))						\		__wait_event_interruptible_timeout(wq, condition, __ret); \	__ret;								\})#endif#ifndef __wait_event_timeout#define __wait_event_timeout(wq, condition, ret)			\do {									\	wait_queue_t __wait;						\	init_waitqueue_entry(&__wait, current);				\									\	add_wait_queue(&wq, &__wait);					\	for (;;) {							\		set_current_state(TASK_UNINTERRUPTIBLE);		\		if (condition)						\			break;						\		ret = schedule_timeout(ret);				\		if (!ret)						\			break;						\	}								\	current->state = TASK_RUNNING;					\	remove_wait_queue(&wq, &__wait);				\} while (0)#endif#ifndef wait_event_timeout#define wait_event_timeout(wq, condition, timeout)			\({									\	long __ret = timeout;						\	if (!(condition))						\		__wait_event_timeout(wq, condition, __ret);		\	 __ret;								\})#endif#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,9)#define WRAP_MODULE_PARM_INT(name, perm) module_param(name, int, perm)#define WRAP_MODULE_PARM_STRING(name, perm) module_param(name, charp, perm)#else#define WRAP_MODULE_PARM_INT(name, perm) MODULE_PARM(name, "i")#define WRAP_MODULE_PARM_STRING(name, perm) MODULE_PARM(name, "s")#endif#ifndef LOCK_PREFIX#ifdef LOCK#define LOCK_PREFIX LOCK#else#ifdef CONFIG_SMP#define LOCK_PREFIX "lock ; "#else#define LOCK_PREFIX ""#endif#endif#endif#ifndef NETDEV_TX_OK#define NETDEV_TX_OK 0#endif#ifndef NETDEV_TX_BUSY#define NETDEV_TX_BUSY 1#endif#ifndef CHECKSUM_HW#define CHECKSUM_HW CHECKSUM_PARTIAL#endif/* this ugly hack is to handle RH kernels; I don't know any better, * but this has to be fixed soon */#ifndef rt_task#define rt_task(p) ((p)->prio < MAX_RT_PRIO)#endif#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)#ifndef preempt_enable#define preempt_enable()  do { } while (0)#endif#ifndef preempt_disable#define preempt_disable() do { } while (0)#endif#ifndef preempt_enable_no_resched#define preempt_enable_no_resched() preempt_enable()#endif#ifndef container_of#define container_of(ptr, type, member)					\({									\	const typeof( ((type *)0)->member ) *__mptr = (ptr);		\	(type *)( (char *)__mptr - offsetof(type,member) );		\})#endif#ifndef virt_addr_valid#define virt_addr_valid(addr) VALID_PAGE(virt_to_page(addr))#endif#ifndef SET_NETDEV_DEV#define SET_NETDEV_DEV(net,pdev) do { } while (0)#endif#define usb_set_intfdata(intf, data) do { } while (0)#endif // LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)#ifndef offset_in_page#define offset_in_page(p) ((unsigned long)(p) & ~PAGE_MASK)#endif#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,23)#define HAVE_ETHTOOL 1#endif#ifndef PMSG_SUSPEND#ifdef PM_SUSPEND/* this is not correct - the value of PM_SUSPEND is different from * PMSG_SUSPEND, but ndiswrapper doesn't care about the value when * suspending */#define PMSG_SUSPEND PM_SUSPEND#define PSMG_ON PM_ON#elsetypedef u32 pm_message_t;#define PMSG_SUSPEND 2#define PMSG_ON 0#endif#endif#ifndef PCI_D0#define PCI_D0 0#define PCI_D3hot 3#endif#ifndef PM_EVENT_SUSPEND#define PM_EVENT_SUSPEND 2#endif#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,9)#define pci_choose_state(dev, state) (state)#endif#if defined(CONFIG_SOFTWARE_SUSPEND2) || defined(CONFIG_SUSPEND2)#define KTHREAD_RUN(a,b,c) kthread_run(a,b,0,c)#else#define KTHREAD_RUN(a,b,c) kthread_run(a,b,c)#endif#if !defined(HAVE_NETDEV_PRIV)#define netdev_priv(dev)  ((dev)->priv)#endif#define memcpy_skb(skb, from, length)			\	memcpy(skb_put(skb, length), from, length)#include "ndiswrapper.h"#include "pe_linker.h"#include "wrapmem.h"#include "lin2win.h"#include "loader.h"#ifdef CONFIG_X86_64#define get_sp(sp) __asm__ __volatile__("mov %%rsp, %0\n\t" : "=m"(sp))#else#define get_sp(sp) __asm__ __volatile__("mov %%esp, %0\n\t" : "=m"(sp))#endif#define print_sp() do {				\		void *sp;			\		get_sp(sp);			\		DBGTRACE1("sp: %p", sp);	\	} while (0)//#define DEBUG_IRQL 1#if !defined(CONFIG_USB) && defined(CONFIG_USB_MODULE)#define CONFIG_USB 1#endif#if defined(DISABLE_USB)#undef CONFIG_USB#undef CONFIG_USB_MODULE#endif#define KMALLOC_THRESHOLD 130000/* TICK is 100ns */#define TICKSPERSEC		10000000LL#define TICKSPERMSEC		10000#define SECSPERDAY		86400/* 1601 to 1970 is 369 years plus 89 leap days */#define SECS_1601_TO_1970	((369 * 365 + 89) * (u64)SECSPERDAY)#define TICKS_1601_TO_1970	(SECS_1601_TO_1970 * TICKSPERSEC)/* 100ns units to HZ; if sys_time is negative, relative to current * clock, otherwise from year 1601 */#define SYSTEM_TIME_TO_HZ(sys_time)					\	((((sys_time) <= 0) ? (((u64)HZ * (-(sys_time))) / TICKSPERSEC) : \	  (((s64)HZ * ((sys_time) - ticks_1601())) / TICKSPERSEC)))#define MSEC_TO_HZ(ms) ((ms) * HZ / 1000)#define USEC_TO_HZ(us) ((us) * HZ / 1000000)extern u64 wrap_ticks_to_boot;static inline u64 ticks_1601(void){	return wrap_ticks_to_boot + (u64)jiffies * TICKSPERSEC / HZ;}typedef void (*generic_func)(void);struct wrap_export {	const char *name;	generic_func func;};#ifdef CONFIG_X86_64#define WIN_SYMBOL(name, argc)					\	{#name, (generic_func) win2lin_ ## name ## _ ## argc}#define WIN_WIN_SYMBOL(name, argc)					\	{#name, (generic_func) win2lin__win_ ## name ## _ ## argc}#define WIN_FUNC_DECL(name, argc)			\	typeof(name) win2lin_ ## name ## _ ## argc ;#define WIN_FUNC_PTR(name, argc) win2lin_ ## name ## _ ## argc#else#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#endif#define WIN_FUNC(name, argc) name/* map name s to f - if f is different from s */#define WIN_SYMBOL_MAP(s, f)#define POOL_TAG(A, B, C, D)					\	((ULONG)((A) + ((B) << 8) + ((C) << 16) + ((D) << 24)))struct pe_image {	char name[MAX_DRIVER_NAME_LEN];	UINT (*entry)(struct driver_object *, struct unicode_string *) wstdcall;	void *image;	int size;	int type;	IMAGE_NT_HEADERS *nt_hdr;	IMAGE_OPTIONAL_HEADER *opt_hdr;};struct ndis_miniport_block;struct wrap_timer {	long repeat;	struct nt_list list;	struct timer_list timer;	struct nt_timer *nt_timer;#ifdef TIMER_DEBUG	unsigned long wrap_timer_magic;#endif};struct ntos_work_item {	struct nt_list list;	void *arg1;	void *arg2;	void (*func)(void *arg1, void *arg2) wstdcall;};struct wrap_device_setting {	struct nt_list list;	char name[MAX_SETTING_NAME_LEN];	char value[MAX_SETTING_VALUE_LEN];	void *encoded;};struct wrap_bin_file {	char name[MAX_DRIVER_NAME_LEN];	size_t size;	void *data;};#define WRAP_DRIVER_CLIENT_ID 1struct wrap_driver {	struct nt_list list;	struct driver_object *drv_obj;	char name[MAX_DRIVER_NAME_LEN];	char version[MAX_SETTING_VALUE_LEN];	unsigned short num_pe_images;	struct pe_image pe_images[MAX_DRIVER_PE_IMAGES];	unsigned short num_bin_files;	struct wrap_bin_file *bin_files;	struct nt_list wrap_devices;	struct wrap_ndis_driver *ndis_driver;};struct usbd_pipe_information;struct wrap_device {	/* first part is (de)initialized once by loader */	struct nt_list list;	int dev_bus;	int vendor;	int device;	int subvendor;	int subdevice;	char conf_file_name[MAX_DRIVER_NAME_LEN];	char driver_name[MAX_DRIVER_NAME_LEN];	struct wrap_driver *driver;	struct nt_list settings;	/* rest should be (de)initialized when a device is	 * (un)plugged */	struct device_object *pdo;	union {		struct {			struct pci_dev *pdev;#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,9)			u32 pci_state[16];#endif		} pci;		struct {			struct usb_device *udev;			struct usb_interface *intf;			int num_alloc_urbs;			struct nt_list wrap_urb_list;		} usb;	};	union {		struct wrap_ndis_device *wnd;	};	struct cm_resource_list *resource_list;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -