图解WinCE6.0下的内核驱动和用户驱动-程序员宅基地

技术标签: CE  驱动  

作者:SUKHOI27SMK

转自:http://blog.csdn.net/sukhoi27smk/article/details/8201766


在《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
复制代码

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

      image

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

      image

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

      image

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

      image

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

      image 

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

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

      image

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

      image

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

      image

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

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


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/whw8007/article/details/18191817

智能推荐

使用dockerfile文件创建镜像时docker build没有反应-程序员宅基地

文章浏览阅读1.3k次。问题:  先 docker pull centos:7 拉取了一个官方的基础镜像,为后续创建jdk8镜像做准备,在创建如下的dockerfile文件  执行docker build -t jdk_8u191:20190307 . jdk_dockerfile 时都没有反应  jdk_dockerfile文件内容# 以此镜像作为基础镜像构建新的镜像FROM cento..._建立一个dockerfile,docker build -t cetos7/linuxc_env不成功

mysql优先队列排序算法_硬核!手写一个优先队列-程序员宅基地

文章浏览阅读190次。前言事情还要从一个故事讲起:对于上面那只可爱的小狗狗不会,本篇即为该教程,首先,我要告诉这只可爱的小狗狗,这种问题你要使用的数据结构为优先队列,每次操作的时间复杂度为O(logn),而整个过程的时间复杂度为O(nlogn).对于本片的设计与实现和堆排序可能有些相似,因为他们都借助堆来实现算法和数据结构,下面详细介绍优先队列的设计与实现。堆而堆就是一类特殊的数据结构的统称。堆通常是一个可以被看做一棵..._mysql 的堆排序

C# c++ Json序列化与反序列_c++json序列化与反序列化-程序员宅基地

文章浏览阅读231次。C# 序列化与反序列化, 读文件和写到文件_c++json序列化与反序列化

智能制造控制中的AI研究进展-程序员宅基地

文章浏览阅读446次,点赞14次,收藏14次。1.背景介绍智能制造控制是现代制造业中的一个重要领域,它涉及到制造过程中的自动化、智能化和优化。随着计算能力的提高和数据技术的发展,人工智能(AI)技术在智能制造控制中的应用也逐渐成为主流。本文将从背景、核心概念、算法原理、代码实例、未来趋势等多个方面进行深入探讨,以帮助读者更好地理解AI在智能制造控制中的应用和研究进展。1.1 背景介绍智能制造控制是制造业中的一个重要领域,涉及到制造...

2018美亚杯个人赛刷题-程序员宅基地

文章浏览阅读5.4k次,点赞6次,收藏27次。文章目录写在前面题目1.E2.C3.B -D-4.C -E-5.C6. D7.D8. A9.A10.C11.E12.D13.D14.A15.D16.E17.D18.A19. B20.C21.E22.D23.A24.C25.C26.D27.D28.C29.D30.D31.C32.E33.D34.B -C-35. -E-36.A37.A38.D39.D -C-40.B41.C42.E -D-43.C44.B45.A46.C47.E48.B49.D50.CPS写在前面这是美亚杯2018个人赛的个人_2018美亚杯个人赛

ECS框架学习(Entitas)入门_ecs框架 entitas-程序员宅基地

文章浏览阅读6.2k次。公司要求使用ECS框架经行开发,没办法只能自己学习了。记录一下学习过程。框架的含义可以去其他地方查看,我这里写一点我的理解(新人,不对请谅解)。ECS即Entity-Component-System(实体-组件-系统) 的缩写。它做到了行为、数据分开,Component存数据。Entity用来就是由各个Component组成。System用来经行他们中间的通信。对于网上或者官方说速度更快、更容..._ecs框架 entitas

随便推点

Serverless 基本概念入门_seveless 百度-程序员宅基地

文章浏览阅读1k次。从行业趋势看,Serverless 是云计算必经的一场革命2019 年,Serverless 被 Gartner 称为最有潜力的云计算技术发展方向,并被赋予是必然性的发展趋势。Serverless 从底层开始变革计算资源的形态,为软件架构设计与应用服务部署带来了新的设计思路。为此,我们策划了Serverless 技术专栏,从基础概念入门,到前后台架构设计、应用拓展、最佳实践等多维度,揭开 Serverless 的面纱,带你走进无服务器的世界。什么是 Serverless?Serverl.._seveless 百度

ubuntu proxy-程序员宅基地

文章浏览阅读68次。升级到Ubuntu10.04后,发现apt-get的代理设置有改变了,在9.10以前使用“http_proxy”环境变量就可以令apt-get使用代理了export http_proxy=http://127.0.0.1:8000sudo apt-get update然后在Ubuntu10.04下就无效了,看来apt-get已经被改成不使用这个环境变量了。一阵郁闷后,最后..._重装ubuntu proxy address

Qt笔记_正则表达式(regular expression)_qt regex-程序员宅基地

文章浏览阅读9.2k次,点赞4次,收藏28次。手册里使用的词汇是 regexp 优点: 方便地完成字符串的一些处理操作,例如验证、查找、替换和分割等。类名称为QRegExp类,是基于Perl的正则表达式语言,支持Unicode。头文件:#include < QRegExp >//(尖括号中的空格是为了适应markdown而添加的,编程时不使用多余的空格)qmake:QT += core帮助文档中指出:All functions in_qt regex

系统设计与分析homework5_sdlc的第一阶段是分析。写一个简单的报告,包括: 分析新系统需要解决的问题 l可行-程序员宅基地

文章浏览阅读151次。一、根据订旅馆建模文档,Asg-RH.pdf:1. 绘制用例图模型(到子用例)给出 make reservation 用例的活动图2、根据课程练习“投递员使用投递箱给收件人快递包裹”的业务场景分别用多泳道图建模三个场景的业务过程场景一x科技公司发明了投递柜,它们自建了投递柜以及远程控制系统。注册的投递员在推广期免费使用投递柜。由于缺乏资源,仅能使用y移动平台向客户发送短信通知。..._sdlc的第一阶段是分析。写一个简单的报告,包括: 分析新系统需要解决的问题 l可行

LayUI的后台管理模板_layui后端模板-程序员宅基地

文章浏览阅读8k次,点赞2次,收藏18次。  以前没有做网页开发不知道的内容太多了,现在开始做了这一块,发现内容真多。  星期五接到一个资产核查的任务,时间紧,我对网页这一块的内容还不是很熟练,有些着急,在网上一搜,LayUI的模板,有很多好评和讲解,拿来一用,感觉很不错。  这个后台系统可以很快上手,界面部分不用操心太多,很多页面有实例,略微改动就可以直接使用。  写程序界面是个大问题,这下省事多了,虽然后期项目使用LayUI比较少,但做一些中小型的项目真的是很好的选择,最主要的就是快。..._layui后端模板

常见的数组概念-程序员宅基地

文章浏览阅读90次。常见数组_常见的数组