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

📄 wd_syn.h

📁 国内文件驱动编程知名人物蔡大侠的教程源代码
💻 H
字号:
/**
	@file	wd_syn.h
	@brief	同步元素头文件.如果你直接包含这个头文件,
			在包含之前必须包含DDK相关头文件.(你可以
			选择WDM或者IFS或者NDIS相关头文件.)
	@author tan wen 谭文
	@date	2005-12-20
*/


#ifndef _WD_SYN_HEADER_
#define _WD_SYN_HEADER_

typedef KSPIN_LOCK wd_splock;
typedef KIRQL wd_irql;

enum {
	wd_irql_passive = PASSIVE_LEVEL
};

_inline wd_irql wd_get_cur_irql()
{
	return KeGetCurrentIrql();
}


typedef struct _wd_spin{
	wd_splock splock;
	wd_irql	irql; 
} wd_spin;
_inline wd_void wd_spin_init(wd_spin *spin)
{	KeInitializeSpinLock(&spin->splock);	}
_inline wd_void wd_spin_hold(wd_spin *spin)
{	KeAcquireSpinLock(&spin->splock,&spin->irql);	}
_inline wd_void wd_spin_loose(wd_spin *spin)
{	KeReleaseSpinLock(&spin->splock,spin->irql);	}

// 事件
typedef KEVENT wd_event;
_inline wd_void wd_event_init(wd_event *event)
{	KeInitializeEvent(event,NotificationEvent,FALSE);	}
_inline wd_void wd_event_set(wd_event *event)
{   KeSetEvent(event,IO_NO_INCREMENT,FALSE);	}
_inline wd_stat wd_event_wait(wd_event *event)
{	return KeWaitForSingleObject(event,Executive,KernelMode,FALSE,NULL);	}
_inline wd_void wd_event_clear(wd_event *event)
{	KeClearEvent(event);	}

// 我在windows2003下使用mutex,似乎常常进入死机状态,
// 原因还不明朗.

typedef KMUTEX	wd_mutex;
_inline wd_mutex_init(wd_mutex *mutex)
{	KeInitializeMutex(mutex,0);	}

_inline wd_mutex_hold(wd_mutex *mutex)
{   while(KeWaitForSingleObject(mutex,
                          Executive,
                          KernelMode,
                          FALSE,
                          0)!=wd_stat_suc){};	}

_inline wd_mutex_loose(wd_mutex *mutex)
{	KeReleaseMutex(mutex,FALSE);	}

// 工作者线程
typedef WORK_QUEUE_ITEM wd_work_item;

typedef PWORKER_THREAD_ROUTINE wd_work_func;

_inline wd_void wd_work_init(wd_work_item *item,
							 wd_work_func worker,
							 wd_void *context)
{
	ExInitializeWorkItem(item,worker,context);
}

typedef enum _wd_work_quque_type{
	wd_work_crit = CriticalWorkQueue,
	wd_work_delay = DelayedWorkQueue,
	wd_work_hyper = HyperCriticalWorkQueue
} wd_work_queue_type; 

_inline wd_void wd_work_queue(in wd_work_item *item,
							  in wd_work_queue_type type)
{
	ExQueueWorkItem(item,(WORK_QUEUE_TYPE)type);
}

_inline wd_void wd_work_run(in wd_work_item *item)
{
	(item->WorkerRoutine)(item->Parameter);
}

// 时钟

#endif // _WD_SYN_HEADER_

⌨️ 快捷键说明

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