********************************LoongEmbedded********************************
作者:LoongEmbedded(kandi)
时间:2011.11.11
类别:WINCE应用开发
********************************LoongEmbedded********************************
本周的工作的一部分内容是根据产品的需求做些修改,其中包括应用程序来直接控制物理寄存器来实现关机,以及如何保护保存在FLASH分区中的应用程序的问题,下面总结一下,作为备忘录。
1. 应用程序访问物理寄存器
背景:产品在异地做试验,不便于更新NK,但客户要求在推出应用程序的时候关机。
刚开始尝试用MmMapIoSpace()和MmUnmapIoSpace()函数的方式来实现,但会出现内核出错的信息,因为WINCE6.0的应用程序是运行在用户态的,用户态下的应用程序不能直接访问物理寄存器(比如S3C6410的GPNDATA寄存器)。后来经过了解,可以采用应用程序加载流驱动,然后由流驱动来访问物理寄存器,从而实现关机功能。
应用程序的设计思想如下:
1) 调用RegCreateKeyEx()函数创建一个子键。
2) 在上面创建的子键下创建驱动(比如GPIO.dll)所需要的键项和键值。
3) 调用ActivateDeviceEx()函数来加载流驱动GPIO.dll。
4) 调用CreateFile函数来获取GPIO.dll的句柄。
5) 调用DeviceIoControl()函数来通过操作系统的调用,从而调用GPIO.dll的GPO_IOControl()函数,这样就可以实现此功能了。
参考代码如下所示:
图1
2. 隐藏文件夹
背景:为了加强对应用软件的保护,避免用户的操作而破坏了应用程序
基本可行的方式有如下几种:
1) 为应用程序的文件夹建立一个专门的分区,然后隐藏此分区
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\FDSK\FATFS]
"FriendlyName"="PocketMory FAT FileSystem"
; "Dll"="fatfsd.dll"
"Flags"=dword:00000014 ; FATFS_ENABLE_BACKUP_FAT | FATFS_DISABLE_AUTOSCAN
"Folder"="PocketMory"
"FormatExfat"=dword:1
; "EnableCacheWarm"=dword:0
"CheckForFormat"=dword:1
"EnableWriteBack"=dword:1
"MountAsRoot"=dword:1 ; for ROM-only file system
"DisableAutoScan"=dword:1
IF IMGHIVEREG
"MountAsBootable"=dword:1
ENDIF IMGHIVEREG
比如应用程序放在名称为PocketMory的分区中,那么只需要在上面注册表信息的基础上增加”MountHidden”=1就可以了,但是这种方式是把整个分区隐藏了,后面就不便于往此分区写数据了。
2) 采用SetFileAttributes()函数来设置文件或是文件夹的属性
隐藏文件夹LoongEmbedded
TCHAR m_szHiddenFolder[] = TEXT("\\SDMMC\\LoongEmbedded");
SetFileAttributes(m_szHiddenFolder,FILE_ATTRIBUTE_HIDDEN);
当然也可以重新显示此文件夹
SetFileAttributes(m_szHiddenFolder,FILE_ATTRIBUTE_NORMAL);
这种方式,我试过下面的方式来设置此文件夹为只读的方式,但是还是可以删除,不知道为什么?
SetFileAttributes(m_szHiddenFolder,FILE_ATTRIBUTE_READONLY);
而且如果设置为系统属性也可以隐藏此文件夹
SetFileAttributes(m_szHiddenFolder,FILE_ATTRIBUTE_SYSTEM);
3) 采用守护进程的思想,当删除应用程序的关键内容时做保护,这样的方式我没有实现,但这应该是一种不错的办法。