Chinaunix首页 | 论坛 | 博客
  • 博客访问: 55655
  • 博文数量: 13
  • 博客积分: 850
  • 博客等级: 准尉
  • 技术积分: 220
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-10 16:20
文章存档

2008年(13)

我的朋友
最近访客

分类: WINDOWS

2008-10-30 21:58:13

字符串类
KUnitizedName 类,方便了设备的命名.其构造函数只有在Passive_Level调用.用于Unicode串管理
KUstring类,是Unicode串.
内存管理类
在内核模式中,有6种内存类型,最常用的内存是分页内存(PagedPool)和非分页内存(NonPagedPool).数据能被交换到硬盘的内存,称为分页内存。不要在DISPATH_LEVEL或者更高级别访问内存.
可以用new和delete分配和释放这些内存.
PUCHAR m_Image;
#define m_Size 2048
m_Image = new(PagedPool)UCHAR[m_Size];
if (m_Image != NULL)
      delete m_Image;
KMemory类.为系统的内存描述符表(MDL)提供服务的.在直接访问中有非常重要的作用.一种是ReadFile和WriteFile的IO_DIRECT_IO方式访问.另一种是DeviceIoControl的METHOD_IN_DIRECT或METHOD_OUT_DIRECT
方式访问.用MapToSystemSpace函数获得虚拟内存在系统空间的地址指针后,驱动程序可以直接访问虚拟内存.
    KMemory Mem(I.Mdl());
    wcscpy((PWCHAR)Mem.MapToSystemSpace(),m_RegString);
KHeap类和KPagedHeap类
  KHeap分配的是非分页内存的,而KPagedHeap类是分配分页内存的。与之成对出现的还有KHeapClient和KPagedHeapClient.后者用于从所分配的内存堆中再分配和释放内存块。

数据操作类.
DriverWorks提供双链表结构,其中Klist,KInterlockedList,KinterruptSafeList类,用于处理双链表。KList不提供串行服务,不能处理多线程。KInterlockedList内部有一个自旋锁,可以安全的对其访问,但KInterlockedList只能在<=DISPATH_LEVEL调用。KInteruptSafeList可以在任何级别上访问。
Kfifo,KInterlockedFifo,KInterruptSafeFifo类,这是DriverWorks提供的三个先进先出的类,类似于KList三个类.
KArray类,提供一个一维数组的服务。它有三个特点:
1,用Insert和InsertNext成员函数可以自动扩展数组大小。
2,提供一个重载操作符[],和普通C语言的数组操作一样。
3,提供了同步技术支持,请看通用锁类(Generic Lock Classes)
通用锁有以下五类:
KGenericLockNop,KGenericLockSpinLock,KGenericLockEvent,KGenericLockMutex,KGenericLockSemphore.

KRegistryKey类,用于访问注册表。通常,它的实例生存期比较短,一般说来,它们在例程中作为局部变量使用,在堆栈上分配空间,当例程结束也就消失了。
KFile类,它包含了系统文件的所有服务,除了HANDLE,Status,IsValid和InValidate外,其它成员函数必须都在PASSIVE_LEVEL上访问。
KDeferredCall类,实现了延迟过程调用操作。在中断结束后,内核在DISPATH_LEVEL级上调用这个DPC例程,然后就可以在DPC中调用这些系统服务。
定时器的实现:
1, 1Hz定时器,对于已经创建的设备对象,1Hz的定时器可以做些定时控制操作。
2,KTimedCallback类,是KTimer类的派生类,包含一个DPC。当定时器到时后,系统就调用DPC。
KIoWorkItem类
当 PASSIVE_LEVEL < IRQL <= DISPATH_LEVEL时,此时想调用PASSIVE_LEVEL上函数,可以排队一个工作项(workitem),之后这个工作项会请求驱动程序回调PASSIVE_LEVEL上例程.KIoWorkItem和KWorkItem类都是工作项类,但KIoWorkItem只能在2K/XP上运行。

CancelSpinLock类
取消自旋锁用于同步IRP的取消,是一个系统范围内有效的自旋锁,称全局自取消旋锁。只有两个静态成员函数:Acquire和Release.
系统提供一个CancelSpinLock类实例,驱动程序不能再创建CancelSpinLock实例,只能调用其成员函数.

KSpinLock类
自旋锁用于保护数据性访问。同一时间试图获取同一个自旋锁的其他线程或DPC将被阻塞,直到自旋锁被释放。

内核同步对象
KDispatherObject类,它是DriverWork提供的抽象类,它的派生类有:KEvent,KSemaphore,KMutex,KTimer,KSystemThread.
这些对象类都有两个共同点:
1,这些对象有一个二进制变量,在某一时刻,要么处于信号态,要么处于非信号态。可用Status函数返回当前状态,True表示有信号.
2,这些对象都是可等待的,调用Wait函数将阻塞调用都线程,直到等到有信号为此。
另外使用这些对象有三点注意:
1,只能在PASSIVE_LEVEL级别调用Wait函数.
2,通常,不能在分发例程和Unload()中等待对象.
3,如果使用多个同步对象,则必须这样处理:总是按同样的顺序获取对象,以相反的顺序释放同步对象.
 
阅读(972) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~