图解WinCE6.0下的内核驱动和用户驱动

      在《WinCE驱动程序的分类》中曾提到,WinCE6.0的流驱动既可以加载到内核态也可以加载到用户态。下面通过一组图片简单说明一下这两种驱动的关系。

      首先编写一个流驱动WCEDrv,代码如下。

代码

#include <windows.h>

extern "C"
BOOL WINAPI DllMain(HANDLE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
{
    UNREFERENCED_PARAMETER(lpvReserved);

    switch(dwReason) {
    case DLL_PROCESS_ATTACH:
        DisableThreadLibraryCalls((HMODULE) hinstDLL);
        break;
    case DLL_PROCESS_DETACH:
        break;
    };
    return TRUE;
}

extern "C"
DWORD Init(LPCTSTR pContext, DWORD dwBusContext)
{
    RETAILMSG(1,(_T("Init(%s, %x)"),pContext,dwBusContext));
    
    PBYTE pBuffer = new BYTE[4096*1024];     
    RETAILMSG(1,(TEXT("pBuffer(%x)\r\n"),pBuffer));

    return  (DWORD)pBuffer;
}

extern "C"
BOOL Deinit(DWORD hDeviceContext)
{
    RETAILMSG(1,(_T("Deinit(%x)\r\n"),hDeviceContext));
    
    PBYTE pBuffer = (PBYTE)hDeviceContext;
    if (pBuffer)
    {
        delete[] pBuffer;
    }    

    return TRUE;
}

extern "C"
void PowerUp(DWORD hDeviceContext)
{
}

extern "C"
void PowerDown(DWORD hDeviceContext)
{
}

extern "C"
DWORD Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
    RETAILMSG(1,(_T("Open(%x, 0x%x, 0x%x)\r\n"),hDeviceContext, AccessCode, ShareMode));

    return hDeviceContext;
}

extern "C"
BOOL Close(DWORD hOpenContext)
{
    RETAILMSG(1,(_T("Close(%x)\r\n"),hOpenContext));

    return TRUE;
}

extern "C"
BOOL IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn
               , PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut)
{
    UNREFERENCED_PARAMETER(hOpenContext);
    UNREFERENCED_PARAMETER(dwCode);
    UNREFERENCED_PARAMETER(pBufIn);
    UNREFERENCED_PARAMETER(dwLenIn);
    UNREFERENCED_PARAMETER(pBufOut);
    UNREFERENCED_PARAMETER(dwLenOut);
    UNREFERENCED_PARAMETER(pdwActualOut);

    SetLastError(ERROR_INVALID_FUNCTION);
    return FALSE;
}

extern "C"
DWORD Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
    RETAILMSG(1,(_T("Read(%x, %x, 0x%x)\r\n"),hOpenContext, pBuffer, Count));

    return TRUE;
}

extern "C"
DWORD Write(DWORD hOpenContext, LPCVOID pBuffer, DWORD Count)
{
    RETAILMSG(1,(_T("Write(%x, %x, 0x%x)\r\n"),hOpenContext, pBuffer, Count));

    return TRUE;
}

extern "C"
DWORD Seek(DWORD hOpenContext, long Amount, WORD Type)
{
    UNREFERENCED_PARAMETER(hOpenContext);
    UNREFERENCED_PARAMETER(Amount);
    UNREFERENCED_PARAMETER(Type);

    SetLastError(ERROR_NOT_SUPPORTED);
    return -1;
}

       其对应的注册表文件内容如下。

注册表

[HKEY_LOCAL_MACHINE\Drivers\WCEDrv1]
    "Prefix"="AAA"
    "Dll"="WCEDrv.dll"
    "Index"=dword:1
    "Flags"=dword:8        ; DEVFLAGS_NAKEDENTRIES
    "Order"=dword:0

[HKEY_LOCAL_MACHINE\Drivers\WCEDrv2]
    "Prefix"="BBB"
    "Dll"="WCEDrv.dll"
    "Index"=dword:1
    "Flags"=dword:8        ; DEVFLAGS_NAKEDENTRIES
    "Order"=dword:0

[HKEY_LOCAL_MACHINE\Drivers\WCEDrv3]
    "Prefix"="CCC"
    "Dll"="WCEDrv.dll"
    "Index"=dword:1
    "Flags"=dword:18    ; DEVFLAGS_LOAD_AS_USERPROC | DEVFLAGS_NAKEDENTRIES
    "Order"=dword:0

[HKEY_LOCAL_MACHINE\Drivers\WCEDrv4]
    "Prefix"="DDD"
    "Dll"="WCEDrv.dll"
    "Index"=dword:1
    "Flags"=dword:18    ; DEVFLAGS_LOAD_AS_USERPROC | DEVFLAGS_NAKEDENTRIES
    "Order"=dword:0

       通过驱动调试助手动态加载该驱动,在加载时,根据注册表中的设置,分别加载两个到内核空间和用户空间。

     

                                   通过驱动调试助手导入注册表文件

     

                                    用户态和内核态分别加载两个,共加载四个驱动

     

                                 加载驱动过程时的串口打印

     

                加载驱动成功后,HKEY_LOCAL_MACHINE\Drivers\Active下内核驱动对应的键

       

                     加载驱动成功后,HKEY_LOCAL_MACHINE\Drivers\Active下用户驱动对应的键     

                          通过远程堆查看器,查看内存的分配情况

     

                      通过远程进程查看器 ,查看wcedrv.dll加载为内核态驱动 

     

                          通过远程进程查看器,查看wcedrv.dll加载为用户态驱动1

     

                      通过远程进程查看器,查看wcedrv.dll加载为用户态驱动2

      WCEDRV的源代码下载地址:http://files.cnblogs.com/we-hjb/WCEDrv.rar

时间: 2024-10-22 21:55:58

图解WinCE6.0下的内核驱动和用户驱动的相关文章

WinCE6.0下如何动态设置系统分辨率

      由于WinCE的显示驱动是本地驱动,不能像流驱动一样动态加载.所以,一般情况下不能动态修改和调试.前两天曾介绍过一种在应用程序中针对相同分辨率但不同尺寸的LCD的调试方法.这里继续介绍WinCE6.0下动态设置系统分辨率的一种方法.我们可以通过系统提供的ChangeDisplaySettingsEx()函数实现动态修改系统的分辨率.       设定系统分辨率的参考代码如下:  1     DWORD dwWidth, dwHeight; 2     DEVMODE dm; 3  4

wince6 0-想要在wince6.0下添加一个软关机的功能,就像xp一样

问题描述 想要在wince6.0下添加一个软关机的功能,就像xp一样 请教诸位大神,小弟用vs2005编译一个intel_X86芯片上的wince6.0系统,本身系统只有一个suspend功能,我就想添加一个关机的功能,今天看了一点电源管理方面的知识,想用直接调用setsystempowerstate()函数,但是没啥效果,求各位大神给个思路或步骤啥地,明天争取做出来,跪谢啊...... 解决方案 wince中实现关机功能 http://blog.csdn.net/ymzhou117/artic

WinCE6.0下TCPMP的BenchMark汇总

      这两天在论坛里看到有人在问WinCE6.0下绘图较慢的问题.现象很奇怪,同一个程序在WinCE5.0下运行得很好,但到某些WinCE6.0的平台上却很慢,而在另外一些6.0的平台上似乎又没有问题.看起来,应该跟硬件平台或者系统有关系.在我们的平台上也存在类似的问题,界面有点慢.这是为什么呢?又应该如何解决?是24位色导致系统变慢?使用DirectDraw能否有效的提高速度?为了寻找答案,今天利用TCPMP在我们的平台上做了一个详细的检测,希望能从中找到一些线索.       测试的方

图解Tomcat5.0下配置数据库连接池

1.配置说明 Tomcat5.0 Eclipse3.3+MyEclipse6.0 Mysql5 mysql-connector-java-3.1.12 2.新建web工程 [1]New Project-Web Project-取名为ConnectorPool [2]将mysql-connector-java-3.1.12加到%TOMCAT_HOME%/common/lib下. [3]部署测试该工程. 在地址栏输入http://127.0.0.1:8080/ConnectorPool/,将得到默认

WinCE6.0下BM1024600液晶屏的调试

      昨天拿到一款新的液晶屏,BYD出的BM1024600-8688FTGF,7寸,分辨率是1024*600,想要在WinCE下用起来.之前整理过一个专门用于调试LCD的小工具<WinCE下的LCD调试助手>,现在终于派上用场了.       硬件组的同事帮忙飞了两根线,系统启动后就有显示了,因为原来系统的分辨率是800*480,所以只在LCD的左上角显示,右边和下面的一块全黑,而800*480的部分显示完全正常.       通过LCD调试助手基本确定了LCD控制器里参数的设置.实际上

WinCE6.0中应用程序如何直接访问物理空间

   在实际开发过程中,经常希望能在应用程序中直接读写设备的物理空间.以前在做WinCE6.0下的MEMMgr时通过秘密加载一个内核态驱动实现了这个需求.但这种方式有一个明显的缺陷,每次读写都必须经由它才能完成.如果只是读取GPIO,那问题不算大.如果想通过这种方式实现视频播放的加速就比较困难了.估计非但不能加速,反而会变得更慢.      早先曾与ZL仔细的讨论过这个问题,他当时在WinCE6.0上移植TCPMP,发现播放视频不太流畅,于是想通过直接写显存进行加速.目的很明确,在应用中申请一段

WinCE6.0的EBOOT概要

     为一个新的硬件设备定制WinCE6.0操作系统,一般需要完成以下几个主要步骤: 1.       针对特定的硬件设备创建板级支持包(Board Support Package缩写为BSP),BSP必须包括BOOTLOADER.OEM适配层(OEM Adaptation Layer缩写为OAL)和一些必要的驱动. 2.       利用创建的BSP,定制一个系统设计(OS Design).即通过VS2005创建一个Platform Builder的工程.该工程可编译产生最终的运行时映像文

wince-WinCE6.0下AddFontResource动态加载黑体字库,导致CE系统的汉字消失,怎么解决?

问题描述 WinCE6.0下AddFontResource动态加载黑体字库,导致CE系统的汉字消失,怎么解决? WinCE6.0下AddFontResource动态加载黑体字库,导致CE系统的汉字消失,怎么解决? 解决方案 以下测试在模拟器上进行在我们的真机也是同样现象1. 首先打开模拟器2. 运行测试程序测试程序为新建一个MFC基于对话框的工程添加一个按钮caption是测试并且添加按钮按下的代码C/C++ codevoid CTestFont2Dlg::OnBnClickedButton1(

Resco Photo Viewer for WinCE6.0

     今天是奥运会的第一天.早晨,媒体说有5个夺金点,一天下来最终收罗了2枚,这两枚金牌的得主可都是第一次参加奥运会的新人.真是后生可畏,后继有人啊!不过,那些呼声较高的老将们也未尝不是英雄.譬如上届奥运冠军杜丽,按理她完全可以选择激流勇退,那就不会有今天的失败,也不会有今天的痛苦.但她没有,硬顶着莫大的压力,背负着众望,参加比赛.她虽然输了比赛,但依然值得敬佩!奥林匹克的精神不就是坚持.拼搏和不断超越么?        奥运会如火如荼的进行着,可惜咱没机会去现场加油,只能在家看看电视.也好