欢迎来到天天文库
浏览记录
ID:33191297
大小:46.50 KB
页数:6页
时间:2019-02-21
《native app 程序开发》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、Nativeapp程序开发BymicroDebug程序类型关于程序级别的分类,大概可以分为三层:应用层程序,即普通的APP程序;NativeApp程序,如常见的chkdsk工具,PQ分区工具等,都属于这类,它是在win子系统未启动起来就执行的程序,执行环境比较纯净,只能调用ntdll.dll导出的函数;Driver内核驱动程序,因功能不同也分为若干类,如设备驱动程序,内核扩展程序,文件系统驱动,过滤驱动等,同属于内核态程序;其中,nativeapp在项目开发中用的较少,所用的函数接口MS也均未公开,开发难度和驱动相当,所以很少有人问津。但是,事实上,在某些应用场景下,用nativeapp
2、来实现是非常完美的,比如:接管winodws的开机启动界面和密码输入界面,需要nativeapp;在开机前,执行磁盘修复,需要nativeapp;开机前,执行杀毒,或者磁盘整理,因为此时环境比较纯净,需要nativeapp。诸如此类~最近,开发一个NativeApp项目,其规模和复杂度也不一般。期间遇到很多问题,在逐一解决的时候也收获了很多东西。现在略作整理,以备将来查用,二来与大家分享之~Nativeapp基本工作原理这里,只想简单的描述下。Windows的设计是基于分层模型的,在设计之初,内核NT支持三个子系统,OS/2,posix,win32,这些子系统同属于一个层面上,它们公用w
3、indowsnt提供的系统API和例程。其中,在某一个子系统上的API调用,都会经过NT”native”API同windowsNT进行通信。这些nativeAPI就是ntdll.dll导出的函数,因为它导出的大部分函数都只是起一个从子系统到NT内核的转发传递作用,所以也成为stub函数,这些函数的原型大多是未公开的,在早期的DDK里会有相关的描述,但是现在没了,取而代之的是内核实现的zw*,nt*开头的驱动函数。这里表明了MS的一个态度,不希望第三方在nativeapp上干涉windows的太多工作,比如,接管了开机启动系统,接管了登录密码界面:D.后来,因为种种历史原因,对OS/2和p
4、osix子系统的支持逐渐被淡忘。但是这种分层模型仍然存在,nativeapp就是工作在子系统未启动之前,此时的系统环境很纯净,权限也相对较高;另外,对操作系统来说,支持nativeapp也是一种必须,因为在子系统启动之前,很多功能的程序只能以nativeapp来呈现,比如登录界面,CSRSS~具体的启动时机:Nativeapp由启动会话管理器(smss.exe)来启动,如果想通知smss来执行一个nativeapp程序,只需要修改一个注册表项,smss在每次启动的时候会去检查该项,确保该项下面的每个nativeapp程序依次执行。注册表项为:HKLMSystemCurrentCont
5、rolSetControlSessionManagerBootExecute,其类型为MULTI_SZ,又是MS玩的一种字符串类型—多字符串类型,也就是说,这个MULTI_SZ字符串包含多个以 结尾的子字符串,而整个字符串以 结尾。在该注册表项后面添加要注册的native程序名和参数就可以了。关于nativeapp的更多详细介绍,可以参考MarkRussinovich的一篇关于native的文章。开发相关Nativeapp程序结构Nativeapp程序结构很简单,就好像我们写helloworld,需要写一个main函数入口一样,nativeapp的入口函数是NtProces
6、sStartup,形如:voidNtProcessStartup(PSTARTUP_ARGUMENTArgument)其中,参数PSTARTUP_ARGUMENT是一个结构体,用来存放传入参数。程序退出时,主动调用函数NtProcessTerminate退出,它不会像普通应用程序一样一个返回return就退出了。基本的结构就是这样了:voidNtProcessStartup(PSTARTUP_ARGUMENTArgument){//dosomethingelseNtProcessTerminate(NtCurrentProcess(),0);}当然现在还没有包含头文件之类的。开发语言及第
7、三方的库Nativeapp支持的开发语言有C/ASM/C++,并且完美的支持C++的类特性,不过要像编写驱动一样,需要重载new,delete等内存分配函数。在内存使用上,可以使用两套接口:堆函数接口,以及虚拟内存函数接口,但是根据我的经验,使用堆函数接口,更高效并且内存bug出现的频率会大大降低。举个例子:我在调试nativeapp的时候,一切正常,且全部通过,但是双机调试的时候,功能代码都运行完了,在子系统起来的时候,提示mem
此文档下载收益归作者所有