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

图解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
复制代码

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

      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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】什么是CT使用的水模、体模

为了正确判断人体内部组织结构的密度&#xff0c;我们规定空气为一1000HU(CT值)&#xff0c;水为OHU&#xff0c;而致密骨质为1000HU&#xff0c;并把这些规定的参数事先输入CT的计算机。在行CT检查时&#xff0c;CT机就可以根据这个标准将人体内的组织密度转化为CT图象&#x…

人体轮廓_女性人体油画轮廓柔和生动,优美动人,你喜欢吗?

人体油画是艺术和时代的产物&#xff0c;也是艺术结晶的重要体现&#xff0c;在文艺复兴以前&#xff0c;人体艺术大都以雕塑形式来表现&#xff0c;在此之后&#xff0c;人们都以意大利威尼斯绘画为代表&#xff0c;艺术家们开始以色彩塑造人体绘画艺术。随着时代进步和人们对…

机器学习分类模型中的评价指标介绍:准确率、精确率、召回率、ROC曲线

文章来源&#xff1a;https://blog.csdn.net/wf592523813/article/details/95202448 1 二分类评价指标 准确率&#xff0c;精确率&#xff0c;召回率&#xff0c;F1-Score&#xff0c; AUC, ROC, P-R曲线 1.1 准确率&#xff08;Accuracy&#xff09; 评价分类问题的性能指标…

WINCE 加入驱动DLL步骤

1 主要文件1)驱动程序源代码文件&#xff0c;例如driver.c&#xff1b;2)驱动程序头文件&#xff0c;例如driver.h&#xff1b;3)动态库导出文件&#xff0c;例如driver.def&#xff1b;4)makefile 文件&#xff0c;文件名固定为makefile&#xff0c;该文件指出了驱动程序的编译…

【转】AI-900认证考试攻略

架构师的信仰系列文章&#xff0c;主要介绍我对系统架构的理解&#xff0c;从我的视角描述各种软件应用系统的架构设计思想和实现思路。 从程序员开始&#xff0c;到架构师一路走来&#xff0c;经历过太多的系统和应用。做过手机游戏&#xff0c;写过编程工具&#xff1b;做过…

300plc与组态王mpi通讯_S7-300与S7-200之间的MPI通信

通信说明S7-200PLC与S7-300PLC之间采用MPI通讯方式时&#xff0c;S7-200PLC中不需要编写任何与通讯有关的程序&#xff0c;只需要将要交换的数据整理到一个连续的V 存储区当中即可&#xff0c;而S7-300PLC中需要在组织块OB1(或是定时中断组织块OB35)当中调用系统功能X_GET(SFC6…

ORA-01114: 将块写入文件 35 时出现 IO 错误

参考文档&#xff1a; https://blog.csdn.net/z_x_1000/article/details/17263077 https://www.cnblogs.com/login2012/p/5775602.html https://www.iteye.com/blog/yangyangcom-2200174 一、问题背景 最开始发现应用服务打不开&#xff0c;于是登录服务器发现Oracle数据关…

【转】CT影像文件格式DICOM详解

CT影像文件格式DICOM详解 DICOM简介 DICOM&#xff08;Digital Imaging and Communications in Medicine&#xff09;即医学数字成像和通信&#xff0c;是医学图像和相关信息的国际标准&#xff08;ISO 12052&#xff09;。DICOM被广泛应用于放射医疗&#xff0c;心血管成像以…

Window CE 6.0流驱动开发动态加载实验

amily:宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:"Times New Roman">我是直接从51到ARM&#xff0c;受51的影响&#xff0c;在wince6.0下怎么编写应用程序控制开发板的LED&#xff0c;查了好多资料&#xff0c;并结合开发板…

fatal error lnk1120: 1 个无法解析的外部命令_3月1日七牛云存储割韭菜的应对方法...

前言早上起来看邮件&#xff0c;看到一封被七牛云割韭菜的公告&#xff1a;内心冰冰凉&#xff0c;不过大家都要吃饭的嘛总不能一直免费下去。所以来研究一下对于我们这种穷人应该如何应对。一、七牛CDN加速流程主要流程分析1、用户通过浏览器访问我的网站(腾讯云服务器)&#…

【转】DCM(DICOM)医学影像文件格式详解

1、 什么是DICOM&#xff1f; DICOM(DigitalImaging andCommunications inMedicine)是指医疗数字影像传输协定&#xff0c;是用于医学影像处理、储存、打印、传输的一组通用的标准协定。它包含了文件格式的定义以及网络通信协议。DICOM是以TCP/IP为基础的应用协定&#xff0c;并…

WINCE下I/O操作基础

对外设进行 I/O 操作实际上也就是读写外设的寄存器,而我们通常使用的X86或者ARM处理器在硬件上决定了wince系统启动后,无法直接访问物理地址,因此需要做一些工作来实现I/O操作. 首先要理解 windows CE 下的地址映射机制。 wince有两种地址&#xff1a;物理地址和虚拟地址&am…

SM4对称加密算法及Java实现

文章来源&#xff1a;https://www.jianshu.com/p/5ec8464b0a1b 一、简介 与DES和AES算法类似&#xff0c;SM4算法是一种分组密码算法。 其分组长度为128bit&#xff0c;密钥长度也为128bit。 加密算法与密钥扩展算法均采用32轮非线性迭代结构&#xff0c;以字&#xff08;32位…

【转】DICOM网络协议(一)概述

转自&#xff1a;https://www.jianshu.com/p/8a0f0fe6a738 作者&#xff1a;我住的城市没有福合埕 DICOM (Digital Imaging and Communications in Medicine)即医学数字成像和通信&#xff0c;DICOM网络是基于TCP/IP的网络协议。通过DICOM将影像设备和存储管理设备连接起来。…

Windows进程系列(2) -- Svchost进程

在基于NT内核的Windows操作系统家族中&#xff0c;Svchost.exe是一个非常重要的进程。很多病毒、木马驻留系统与这个进程密切相关&#xff0c;因此深入了解该进程是非常有必要的。本文主要介绍Svchost进程的功能&#xff0c;以及与该进程相关的知识。      Svchost进程概述…

mysql数据库字符集设置_查看和设置MySQL数据库字符集

查看和设置MySQL数据库字符集作者&#xff1a;scorpio 2008-01-21 10:05:17 标签&#xff1a; 杂谈 Liunx下修改MySQL字符集&#xff1a;1.查找MySQL的cnf文件的位置find / -iname *.cnf -print /usr/share/mysql/my-innodb-heavy-4G.cnf/usr/share/mysql/my-large.cnf/usr/sha…

MQTT和HTTP的区别

来源&#xff1a;http://blog.sina.com.cn/s/blog_68f485d10102yowx.html HTTP是最流行和最广泛使用的协议。但在过去几年中&#xff0c;MQTT迅速获得了牵引力。当我们谈论物联网开发时&#xff0c;开发人员必须在它们之间做出选择。 设计和消息传递 MQTT以数据为中心&#x…

【转】DICOM入门(一)——语法

转自&#xff1a;https://www.jianshu.com/p/5db8933a25a4 作者&#xff1a;我住的城市没有福合埕 1.什么是DICOM DICOM(Digital Imaging and Communications in Medicine)即医学数字成像和传输协议&#xff0c;是用医疗影像&#xff08;CT 核磁共振 DR CR 超声等&#xff0…

1000并发 MySQL数据库_再送一波干货,测试2000线程并发下同时查询1000万条数据库表及索引优化...

继上篇文章《绝对干货&#xff0c;教你4分钟插入1000万条数据到mysql数据库表&#xff0c;快快进来》发布后在博客园首页展示得到了挺多的阅读量&#xff0c;我这篇文章就是对上篇文章的千万级数据库表在高并发访问下如何进行测试访问这篇文章的知识点如下:1.如何自写几十行代码…

从高中一次半夜不冲厕所的经历谈程序

我高中的时候&#xff0c;是住校生。寝室到了10点半就会熄灯&#xff0c;早上6点40左右就要起来跑早操。 一天半夜大概两三点&#xff0c;起床放了个大号。想要充厕所的时候发现没有水&#xff0c;很尴尬&#xff0c;也没有其他的办法。半夜还冷的很。就上床睡觉了&#xff0…