Remote API(RAPI)之 文件管理
RAPI库由一组函数组成,这些函数可用于通过桌面应用程序管理设备,包括设备的目录文件、设备的注册表和系统信息。
RAPI提供了一组文件管理方法
CeCopyFile:复制文件
CeCreateDirectory:创建目录
CeCreateFile:创建,打开文件、管道、通讯资源、磁盘设备或者控制台。返回一个句柄用来访问对象。
CeDeleteFile:删除文件
CeFindAllFiles:从指定的Windows CE目录中获取所有文件和目录的信息,并且复制到一个包含CE_FIND_DATA结构的数组中
CeFindFirstFile:在目录中查找匹配的给定文件名的一个文件
CeFindClose:关闭指定的查找句柄,CeFindFirstFile和CeFindNextFile函数用这个句柄查找文件
CeFindNextFile:从上一次访问的CeFindFirstFile继续查找文件
CeGetFileAttributes:返回指定文件和目录的属性
CeGetFileSize:获取指定文件的字节大小
CeGetFileTime:获取文件创建日期时间,最后访问日期时间和最后修改日期时间
CeMoveFile:移动(重命名)一个文件或目录
CeReadFile:从文件指针处读取文件
CeWriteFile:从文件指针处写入文件数据
任何RAPI操作都需要首先初始化和设备的连接
CeRapiInit():同步初始化设备
CeRapiInitEx():异步初始化设备,并返回一个事件句柄
操作完毕后在合适的时候断开RAPI连接
CeRapiUninit(): 断开或停止设备连接
下面是复制文件到PDA的一个例子:
private const uint GENERIC_WRITE = 0x40000000;//设置读写权限
private const short CREATE_NEW = ;//创建新文件
private const short FILE_ATTRIBUTE_NORMAL = 0x80;//设置文件属性
private const short INVALID_HANDLE_VALUE = -;//错误句柄 private const int TimeOut = ;//异步连接设备超时时间2秒 private void btnCopyFileToPDA_Click(object sender, EventArgs e)
{
//1、初始化设备连接 ///---同步连接失败---
//int ret = CeRapiInit();
//if (ret != 0)
//{
// //连接失败,获取失败代码
// int error = CeRapiGetError();
// //抛出异常
// Marshal.ThrowExceptionForHR(ret);
//} ///---采用异步连接---
Rapiinit ri = new Rapiinit();
ri.cbsize = Marshal.SizeOf(ri);
uint hRes = CeRapiInitEx(ref ri);
ManualResetEvent me = new ManualResetEvent(false);
me.SafeWaitHandle = new Microsoft.Win32.SafeHandles.SafeWaitHandle(ri.heRapiInit, false);
if (!me.WaitOne(TimeOut, true))
{
CeRapiUninit();
} //2、PC复制文件到PDA IntPtr remoteFile = IntPtr.Zero;
String LocalFileName = @"D:\test.txt";//本地计算机文件名
String RemoteFileName = @"\ResidentFlash\Fire\test.txt";//远程设备文件名
byte[] buffer = new byte[0x1000];//传输缓冲区定义为4k
FileStream localFile; int bytesread = ;
int bytesrwritten = ;
int filepos = ; //创建远程文件
remoteFile = CeCreateFile(RemoteFileName, GENERIC_WRITE, , , CREATE_NEW, FILE_ATTRIBUTE_NORMAL, );
//检查文件是否创建成功
if ((int)remoteFile == INVALID_HANDLE_VALUE)
{
throw new Exception("Could not create remote file.");
}
else
{
//打开本地文件
localFile = new FileStream(LocalFileName, FileMode.Open);
//读取4k字节
bytesread = localFile.Read(buffer, filepos, buffer.Length);
while (bytesread > )
{
//移动文件指针到已读取的位置
filepos += bytesread;
//写缓冲区数据到远程设备文件
if (!Convert.ToBoolean(CeWriteFile(remoteFile, buffer, bytesread, ref bytesrwritten, )))
{
//检查是否成功,不成功关闭文件句柄,抛出异常
CeCloseHandle(remoteFile);
throw new Exception("Could not write to remote file.");
}
try
{
//重新填入本地缓冲区
bytesread = localFile.Read(buffer, , buffer.Length);
}
catch(Exception)
{
bytesread = ;
}
}
}
//关闭本地文件
localFile.Close();
//关闭远程文件
CeCloseHandle(remoteFile); //3、断开连接 文件句柄使用后一定要释放 CeRapiUninit(); } [StructLayout(LayoutKind.Explicit)]
private struct Rapiinit
{
[FieldOffset()]
public int cbsize;
[FieldOffset()]
public readonly IntPtr heRapiInit;
[FieldOffset()]
private readonly IntPtr hrRapiInit;
} [DllImport("rapi.dll")]
private static extern uint CeRapiInitEx(ref Rapiinit pRapiInt); [DllImport("rapi.dll", CharSet = CharSet.Unicode)]
internal static extern int CeRapiGetError(); [DllImport("rapi.dll", CharSet = CharSet.Unicode)]
internal static extern int CeRapiInit(); [DllImport("rapi.dll", CharSet = CharSet.Unicode)]
internal static extern int CeCloseHandle(IntPtr hObject); [DllImport("rapi.dll", CharSet = CharSet.Unicode)]
internal static extern int CeWriteFile(IntPtr hFile, byte[] lpBuffer, int nNumberOfbytesToWrite, ref int lpNumberOfBytesWritten, int lpOverlapped); [DllImport("rapi.dll", CharSet = CharSet.Unicode, SetLastError = true)]
internal static extern IntPtr CeCreateFile(string lpFileName, uint dwDesireAccess, int dwShareMode, int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile); [DllImport("rapi.dll", CharSet = CharSet.Unicode)]
internal static extern int CeRapiUninit();
MSDN:https://msdn.microsoft.com/zh-cn/ee497185
Remote API(RAPI)之 文件管理的更多相关文章
- Docker入门教程(八)Docker Remote API
Docker入门教程(八)Docker Remote API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第八篇,重点介绍了Docker Remote ...
- 【转+自己研究】新姿势之Docker Remote API未授权访问漏洞分析和利用
0x00 概述 最近提交了一些关于 docker remote api 未授权访问导致代码泄露.获取服务器root权限的漏洞,造成的影响都比较严重,比如 新姿势之获取果壳全站代码和多台机器root权限 ...
- Docker remote API简单配置使用
1.启动docker remote API的方式如下: docker -d -H uninx:///var/run/docker.sock -H tcp://0.0.0.0:5678 2.但是为了伴随 ...
- V-REP Remote API(C++)实现简单的关节转动
基础内容参考:https://www.cnblogs.com/eternalmoonbeam/p/10753149.html V-REP客户端设置: 在V-REP场景文件中需要添加三个实体,包括两个形 ...
- docker remote api enable in ubuntu
现在使用docker作为开发环境,操作系统是ubuntu16.10,pycharm中使用remote interpreter,需要用到remote api,结果发现自己的原答案是针对ubuntu 14 ...
- Docker Remote API v1.24
1. Brief introduction The Remote API has replaced rcli. The daemon listens on unix:///var/run/docker ...
- 关于docker remote api未授权访问漏洞的学习与研究
漏洞介绍: 该未授权访问漏洞是因为docker remote api可以执行docker命令,从官方文档可以看出,该接口是目的是取代docker 命令界面,通过url操作docker. docker ...
- docker 开启remote api
docker官方文档上有相关说明(Configure and run Docker on various distributions),ubuntu上是可行的 sudo vi /etc/default ...
- Docker开启Remote API 访问 2375端口
Docker常见端口 我看到的常见docker端口包括: 2375:未加密的docker socket,远程root无密码访问主机2376:tls加密套接字,很可能这是您的CI服务器4243端口作为h ...
- Docker remote API
Docker remote API 该教程基于Ubuntu或Debian环境,如果不是,请略过本文 Docker API 在Docker生态系统中一共有三种API Registry API:提供了与来 ...
随机推荐
- SqlServer中获取所有数据库,所有表,所有字段
原文:SqlServer中获取所有数据库,所有表,所有字段 一.获取所有数据库 select * from master.dbo.SysDatabases 二.获取某个库中所有表 SELECT * F ...
- Netty怎么切换三种I/O模式和源码解释
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! 三种I/O模式 BIO:Block I/O,即同步并阻塞的IO:BI ...
- Resistors in Parallel(找规律+大数)
题意:https://codeforces.com/group/ikIh7rsWAl/contest/254825/problem/E 给你一个n,计算n / Sigma(1~n)的d(是n的只出现一 ...
- Linux就该这么学——初识重定向
重定向的本质(个人理解) 若是输出重定向,则将命令信息写入到指定文件中; 若是输入重定向,表示将对文件执行一些命令,并将命令结果输出到屏幕. 重定向的5种模式 标准覆盖输入重定向/标准追加输入重定向/ ...
- 经验:什么影响了数据库查询速度、什么影响了MySQL性能 (转)
一.什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定 ...
- Jmeter的基础使用一安装、启动、关联、断言
一.下载Jmeter,配置环境变量 下载完解压即可, 环境变量配置: -------在环境变量中添加新变量JMETER_HOME:D:\jmeter\apache-jmeter-4.0 ------- ...
- 使用 ASP.NET Core 的 gRPC 服务
将 gRPC 服务添加到 ASP.NET Core 应用 gRPC 需要gRPC包. 配置 gRPC 在 Startup.cs 中: gRPC 是通过AddGrpc方法启用的. 每个 gRPC 服务通 ...
- inline元素、block元素
inline元素 不会独占一行,相邻的行内元素会排列在同一行内,直到一行排不下才会换行 高.行高.以及外边距和内边距不可改变 宽度就是它的文字或图片的宽度,不可改变,随元素内容变化而变化 内联元素只能 ...
- Navicat 12的安装与使用(附加破解)
地址https://blog.csdn.net/tomos428/article/details/80483450?tdsourcetag=s_pctim_aiomsg
- 异常-try...catch的方式处理异常1
package cn.itcast_02; /* * 我们自己如何处理异常呢? * A:try...catch...finally * B:throws 抛出 * * try...catch...fi ...