【玩转.Net MF – 05】加载文件系统中的Pe文件

简介: 在远程文件查看器里,我们可以很方便地访问设备的文件,但是有一点,双击其中的pe文件并不能直接执行,下面我们将为.Net MF添加这个功能。

在远程文件查看器里,我们可以很方便地访问设备的文件,但是有一点,双击其中的pe文件并不能直接执行,下面我们将为.Net MF添加这个功能。

默认情况下,.Net MF的用户程序是放在Flash中的BLOCKTYPE_DEPLOYMENT区(参见《Flash远程读写》),只能通过VS2008进行部署。TinyCLR启动后,直接从Flash的BLOCKTYPE_DEPLOYMENT区的加载应用程序,由于这样的设计,所以在Flash上仅能存放一个用户程序。

.Net MF已经支持了文件系统,并且我们实现了远程文件查看器,理论上只要空间足够,我们能放若干个用户程序,这样问题就来了,我们能否任意执行文件系统中的pe文件?

.Net MF系统中的可执行文件或模块,其扩展名并不是exe或dll,统一为pe,唯一不同是,可执行的pe文件中含有启动入口标识。pe文件是exe和dll经过MetaDataProcessor.exe文件再加工而来。

实现思路其实很简单:第一、分别把不同的用户程序,放到不同目录中去;第二、在根目录建立一个config.ini纯文本文件,里面有一条记录:Startup=/xxx,标识启动项;第三、修改TinyCLR代码,让其从config.ini中的指定目录处加载用户程序。

 TinyCLR中的Code修改如下(CLRStartup.cpp文件),枚举指定目录中的pe文件,并加载之。

 HRESULT LoadDeploymentAssemblies()

 {

     TINYCLR_HEADER();

 

     WCHAR current_file[256];

       WCHAR temp_path[256];

     UINT32 findHandle=NULL;

       FileSystemVolume* volume = NULL;

     STREAM_DRIVER_INTERFACE*  streamDriver=volume->m_streamDriver;

       HRESULT ret;

 

     volume = FileSystemVolumeList::GetFirstVolume();

       if(volume ==NULL)

       {

            TINYCLR_SET_AND_LEAVE(CLR_E_FAIL);

       }

       streamDriver=volume->m_streamDriver;

         if(streamDriver==NULL)

       {

            TINYCLR_SET_AND_LEAVE(CLR_E_FAIL);

       }

     //--

     UINT32 rHandle = NULL; 

      if(streamDriver->Open(&volume->m_volumeId, L"//config.ini", &rHandle) == S_OK && rHandle != NULL)

       {          

              INT64 FileSize;

              int bytesread=0;

            streamDriver->GetLength(rHandle,&FileSize);

                if(FileSize>510 || FileSize<20)

                {

                     streamDriver->Close(rHandle);

                if(FileSize == 0)  debug_printf("Can't find config.ini!/r/n");

                     else debug_printf("Load Application failed(2)!/r/n");

                  TINYCLR_SET_AND_LEAVE(CLR_E_FAIL);

                }          

         if(streamDriver->Read(rHandle, (BYTE *)temp_path,(INT32)FileSize ,&bytesread) != S_OK && bytesread!=(UINT32)FileSize)

             {

                    streamDriver->Close(rHandle); 

                 debug_printf("Load Application failed(3)!/r/n");

                 TINYCLR_SET_AND_LEAVE(CLR_E_FAIL);

             }

             streamDriver->Close(rHandle);          

 

             if(temp_path[0]!=0xFEFF || temp_path[8]!=0x3D)

             {

                 TINYCLR_SET_AND_LEAVE(CLR_E_FAIL);

             }

             memcpy(current_file, &temp_path[9],FileSize-9*2 );

             temp_path[FileSize/2-9] = 0;

             for(int i=FileSize/2-10;i>0; i--)

             {

                  if(current_file[i]==0x0D ||current_file[i]==0x0A) current_file[i] = 0;

             }

      }

        else

      {

            TINYCLR_SET_AND_LEAVE(CLR_E_FAIL);

        }

        //--

        ret = volume->FindOpen(current_file,&findHandle);

      if(findHandle==NULL || ret != S_OK)

  {

           TINYCLR_SET_AND_LEAVE(CLR_E_FAIL);   

      } 

    //--

    FS_FILEINFO findData;

    int pathsize=wcslen(current_file);

      current_file[pathsize++]='//';

    

    findData.FileName=(UINT16 *)&current_file[pathsize];

    findData.FileNameSize = 200;

      memset(findData.FileName,0,(findData.FileNameSize+1)*2);

            

      BOOL found=FALSE;

      ret = volume->FindNext(findHandle,&findData,&found);

      while( ret==S_OK && found)

      {        TINYCLR_CHECK_HRESULT(ContiguousBlockAssemblies(volume,current_file));         

           memset(temp_path,0,findData.FileNameSize+1);

            ret = volume->FindNext(findHandle,&findData,&found);

      }

    //--

    volume->FindClose(findHandle);    

      TINYCLR_NOCLEANUP();          

}

远程文件查看器中的代码稍加修改,就能支持双击运行。在双击事件里,一是修改config.ini文件中的运行目录,二是重启TinyCLR,让其加载指定目录中的程序。由于相关代码比较简单,这里就不贴了。

下面来演示一下最终成果。

1、              新建两个.Net MF测试程序,分别命名为Test1、Test2,相关代码如下:

public static void Main()

{

Debug.Print("123456789");

}

public static void Main()

{

Debug.Print("abcdefghijklmn!!!");

}

编译后的pe文件分别为:Test1.pe,Test2.pe

2、              新建config.ini文件(这步可以省略)

3、              通过远程文件查看器,新建两个目录,Test1和Test2,分别拷入Test1.pe和Test2.pe文件。

4、              分别双击Test1.pe和Test2.pe文件,查看运行结果。

相关文章
|
16天前
|
C# Windows
.NET开源免费的Windows快速文件搜索和应用程序启动器
今天大姚给大家分享一款.NET开源(MIT License)、免费、功能强大的Windows快速文件搜索和应用程序启动器:Flow Launcher。
|
6月前
|
对象存储
.net core 阿里云接口之拷贝文件
紧接上文, 1)[.net core 阿里云接口之获取临时访问凭证](https://developer.aliyun.com/article/1363447?spm=a2c6h.12873639.article-detail.7.2b0e5b1cpeWbZ5 ".net core 阿里云接口之获取临时访问凭证") 2)[.net core 阿里云接口之将指定的OSS文件下载到流](https://developer.aliyun.com/article/1363886 ".net core 阿里云接口之将指定的OSS文件下载到流") 本文继续阿里云接口调用,将指定的OSS文件下载到流。
34 0
|
6月前
|
C#
.net core 从(本地)服务器获取APK文件并解析APK信息
## 1、apk解析除了使用客户端利用aapt.exe、unzip.exe开发客户端解析外,还可以直接利用服务进行解析 ```csharp /// <summary> /// 从本地服务器获取APK文件并解析APK信息 /// </summary> /// <param name="fileName">APK文件的完整路径</param> /// <returns></returns> [HttpPost, HttpGet, HttpOptions, CorsOptions] public IActionResult DecodeAPK(string fileName) { if(fi
30 0
|
6月前
|
JavaScript 前端开发 关系型数据库
.net core + vue + elementui 删除指定日期段、指定路径下的所有文件
# 1、呈现效果 ![image.png](https://ucc.alicdn.com/pic/developer-ecology/j2ygdazy447va_0782583bbc894c33a079db9e44385acd.png) # 2、后端 ## 1)服务层 ```csharp /// <summary> /// 删除指定修改日期段及指定路径下的所有文件 /// </summary> /// <param name="filepath">指定路径</param> /// <returns>返回删除结果提示</returns> public string DeleteSpecif
42 0
|
6月前
|
C#
.net core 删除指定路径下的所有文件以及文件夹(文件夹建议保留目录)
1、服务层 ```csharp /// <summary> /// 删除指定路径下的所有文件 /// </summary> /// <param name="filepath">指定路径</param> /// <returns></returns> public string DeleteSpecifiedPathAllFile(string filepath) { try { DirectoryInfo info = new DirectoryInfo(filepath); // 去除文件夹的只读属性 info.Attribu
28 0
|
7月前
|
开发框架 JSON Kubernetes
.NET Core - 环境变量配置和文件提供程序配置方式详解
.NET Core - 环境变量配置和文件提供程序配置方式详解
|
9月前
|
数据库 C#
C#,.net,winform导入Excel功能以及下载Excel文件到本地,并使用SqlBulkCopy把DataTable类型的数据写入到sqlserver数据库中
C#,.net,winform导入Excel功能以及下载Excel文件到本地,并使用SqlBulkCopy把DataTable类型的数据写入到sqlserver数据库中
219 0
|
9月前
|
开发框架 前端开发 JavaScript
ASP .Net Core 中间件的使用(一):搭建静态文件服务器/访问指定文件
ASP .Net Core 中间件的使用(一):搭建静态文件服务器/访问指定文件
|
9月前
|
开发框架 .NET
解决NET Core发布iis项目覆盖原有的项目时"另一个程序正在使用此文件,进程无法访问"
解决NET Core发布iis项目覆盖原有的项目时"另一个程序正在使用此文件,进程无法访问"
|
JSON API 数据格式
八、.net core(.NET 6)配置读取appsettings文件内容的通用功能
添加通用读取配置文件功能在Wsk.Core.Package项目下,新增Microsoft.Extensions.Configuration包:
552 0
八、.net core(.NET 6)配置读取appsettings文件内容的通用功能