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:提供了与来 ...
随机推荐
- Oracle-DQL 5- 分组函数(多行函数)
分组函数(多行函数):--针对表中的多行数据进行运算,返回一个结果 1.多行函数 --sum() 求和SELECT SUM(sal) FROM emp; --avg() 求平均值SELECT AVG( ...
- Lucky Sorting(CodeForces-109D)【思维】
题意:给出一组数,要求从小到大排序,并且排序的过程中,发生交换的两个数至少一个为幸运数(十进制位均为4或7),问能否在(2×n)次交换内完成排序,如果能,输出交换的方案(不要求步骤数最少). 思路:首 ...
- c++学习笔记之类模板
C++ 除了支持函数模板,还支持类模板(Class Template).函数模板中定义的类型参数可以用在函数声明和函数定义中,类模板中定义的类型参数可以用在类声明和类实现中.类模板的目的同样是将数据的 ...
- git回退
以前,如果是要去除某一块功能,我都是选择性删除,选择性注释,然后前后逻辑各种查看,各种比较.每一次,改完这些我总感觉心好累啊!!!然后,我就发现了 Git 一个非常强大的功能:回滚.当然我还是喜欢叫它 ...
- 并不对劲的bzoj1972:loj2885:p2482[SDOI2010]猪国杀
题目大意 只能放链接了. 题目中有一点没说:并不是保证牌够用,而是在牌不够用时反复抽最后一张牌. 题解 发现玩家的数量比较少,所以可以不太在意时间够不够用. 考虑三件事:1.基本操作,如摸牌.出牌.玩 ...
- 更改:把redis替换成kafka
之前的流程是:filebeat,redis,logstash,elasticsearch 现在的流程是:filebeat,Kafka(zookeeper),logstash,elasticsearch ...
- (转载)项目中表、类、包、JSP命名规范
对于Java(包括在jsp中)的代码,类名一律用pascal标记法,每个单词的头个字母大写:参数,方法一律用camel标记法,首字母是小写的,能不缩写的都不缩写! 项目名 = 数据库名 ...
- gridview单元格编辑添加数据
行号 private void gridView1_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIn ...
- 可能是全网最全的http面试答案
HTTP有哪些方法? HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法 HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNE ...
- TensorFlow教程使用RNN生成唐诗
本教程转载至:TensorFlow练习7: 基于RNN生成古诗词 使用的数据集是全唐诗,首先提供一下数据集的下载链接:https://pan.baidu.com/s/13pNWfffr5HSN79WN ...