6.1.1 一个简单的例子
首先我们尝试把用户程序中最简单的类拷贝到内核中,编译链接,看看行不行。下面就是笔者定义的整数类,它封装一个整数,对象能够被当成整数使用。
- class clsInt{
- Public:
- clsInt(){m_nValue = 0;}
- clsInt(int nValue){m_nValue = nValue;}
- void print(){KdPrint(("m_nValue:%d\n", m_nValue));}
- operator int(){return m_nValue;}
-
- private:
- int m_nValue;
- };
上例是一个非常简单的类定义,我们将在DriverEntry函数中使用它,分别定义一个局部变量和动态创建一个对象。我们通过Debug信息来观察对象行踪,希望能够得到正确的输出。入口函数中的定义如下:
- extern "C" NTSTATUS DriverEntry(
- IN PDRIVER_OBJECT DriverObject,
- IN PUNICODE_STRING RegistryPath
- )
- {
- // 创建两个对象,一个是局部变量,一个是动态创建的
- clsInt obj1(1);
- clsInt* obj2 = new(NonPagedPool, 'abcd') clsInt(2);
-
- // 打印Log信息
- obj1.print();
- obj2->print();
- delete obj2;
-
- // 让模块加载失败
- return STATUS_UNSUCCESSFUL;
- }
上面代码中先后创建了两个clsInt对象,一个是在栈中创建的,初始变量为1;一个是动态创建的,初始变量为2。后者由于是动态创建的,必须手动调用delete函数释放内存,所以其析构函数比前者先调用。我们必须从Log信息中得到类似的脉络,以证明其正确性。代码请参看simClass工程。图6-1是Log信息的截图,我们如愿以偿地得到了想要的结果。
|
| 图6-1 对象Log信息 |