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:提供了与来 ...
随机推荐
- 【LOJ】#2985. 「WC2019」I 君的商店
LOJ#2985. 「WC2019」I 君的商店 一道很神仙的题啊QAQ 居然是智商题--不是乱搞或者是大数据 我们可以用2N问出一个最大值是1 然后对于任意两个值\(x + y\)和\(a\)比较 ...
- DRF 序列化组件 序列化的两种方式 反序列化 反序列化的校验
序列化组件 django自带的有序列化组件不过不可控不建议使用(了解) from django.core import serializers class Books(APIView): def ge ...
- 从入门到自闭之Python集合,深浅拷贝(大坑)
小数据池 int: -5~256 str: 字母,数字长度任意符合驻留机制 字符串进行乘法时总长度不能超过20 特殊符号进行乘法时只能乘以0 代码块: 一个py文件,一个函数,一个模块,终端中的每一行 ...
- hadoop-InputFormat-Split-任务并行度
首先来看 MapReduce 流程图 一个 map,一个 reduce,中间靠 shuffle 连接,shuffle 左边被划分到 map,右边被划分到 reduce InputFormat inpu ...
- es6 getter setter
https://stackoverflow.com/questions/34517538/setting-an-es6-class-getter-to-enumerable 1. 我要 getter ...
- NPOI_winfrom导出Excel表格(二)(直接打开Excel软件,将数据填充在当前的sheet中)
//// 存储路径弹框选择 SaveFileDialog saveDialog = new SaveFileDialog(); saveDialog.DefaultExt = "xls&qu ...
- AutoCAD2013 以上利用AccoreConsole+ c# NetApi Windows Froms 封装
1# 封装类 public static class CmdHelper { /// <summary> /// 调用AutoCAD 安装目录下的AccoreConsole.exe来实现批 ...
- O061、Boot from Volume
参考https://www.cnblogs.com/CloudMan6/p/5679384.html Volume 除了可以用作Instance的数据盘,也可以作为启动盘(Bootable Vol ...
- 利用Cmake 将最新版本OBS编译成windows版本。
准备工作: 1. VS2013 的最新更新版或者VS2015 2. QT Creater 5.7 https://www.qt.io/ 3. CMake (cmake-gui) 4. obs 依 ...
- django 上传路径至vue处理组件加载
1,在主目录(项目目录)下新建中间件middleware.py文件 写入 from django.utils.deprecation import MiddlewareMixin from djang ...