精华内容
下载资源
问答
  • writefile

    千次阅读 2019-04-08 17:47:42
    WriteFile()----同步 函数原型: BOOL WriteFile ( HANDLE hFile, LPCVOID lpBuffer,// DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped//OVERLAPPED )...

    WriteFile()----同步

    复制代码
    函数原型:
    BOOL WriteFile
    (
    HANDLE  hFile,
    LPCVOID lpBuffer,//
    DWORD   nNumberOfBytesToWrite,
    LPDWORD lpNumberOfBytesWritten,
    LPOVERLAPPED lpOverlapped//OVERLAPPED
    );
    复制代码

    参数说明:


    HANDLE hFile 文件句柄

      注意:如果文件打开方式没有指明FILE_FLAG_OVERLAPPED的话,当程序调用成功时,它将实际写入文件的字节数保存到lpNumberOfBytesWriten指明的地址空间中

    LPCVOID lpBuffer 数据缓存区指针

      指针,指向将写入文件的数据缓冲区

    DWORD nNumberOfBytesToWrite 字节数
      要写入数据的字节数量。如写入零字节,表示什么都不写入,但会更新文件的“上一次修改时间”。针对位于远程系统的命名管道,限制在65535个字节以内

    LPDWORD lpNumberOfBytesWritten  用于保存实际写入字节数的存储区域的指针
      实际写入文件的字节数量(此变量是用来返回的 )

    LPOVERLAPPED lpOverlapped//OVERLAPPED 结构体指针
      倘若在指定FILE_FLAG_OVERLAPPED的前提下打开文件,指针不能为空,这个参数就必须引用一个特殊的结构。那个结构定义了一次异步写操作。否则,该参数应置为空(将声明变为ByVal As Long,并传递零值)。

    问题:
    使用WriteFile的时候,我直接将宽字符串写进了文件,文件显示如大家所想,掺杂了很多乱码。但是很有规则。所以我很快就明白了这需要将宽字符串转换成ASCII码。

    解决方法:
    把宽字符串转换成ASCII码。我们需要将pBuffer进行转换。这就要用到了WideCharToMultiByte
    改进后:
    char* pchBuffer = new char[dwLen+1];
    WideCharToMultiByte(CP_ACP, NULL, pBuffer, -1, pchBuffer, dwLen+1, NULL, FALSE );
    WriteFile(hFile, pBuffer, dwLen+1, &dwSize, NULL );
    Delete[] pchBuffer;

    复制代码
    代码:
    BOOL WriteOwnFile(TCHAR* pFileName, TCHAR* pBuffer)
    

    {

    HANDLE hFile = CreateFile(
    pFileName,
    GENERIC_WRITE,
    FILE_SHARE_WRITE,
    NULL,
    CREATE_ALWAYS,
    FILE_ATTRIBUTE_NORMAL,
    NULL
    );

    if(hFile == INVALID_HANDLE_VALUE)
    {
    MessageBox(NULL, “打开文件失败”, “Error”, MB_OK);
    CloseHandle((hFile); //一定注意在函数退出之前对句柄进行释放。
    return;
    }

    DWORD dwSize = 0;

    //把宽字符串转换成ASCII码
    DWORD dwLen = WideCharToMultiByte(CP_ACP, NULL, pBuffer, -1, NULL, NULL, NULL, FALSE );
    char* pchBuffer = new char[dwLen];
    WideCharToMultiByte(CP_ACP, NULL, pBuffer, -1, pchBuffer, dwLen, NULL, FALSE );
    //转换后再进行写入 dwLen+1 因为ASCII码后有结束符’\0’;
    WriteFile(hFile, pBuffer, dwLen+1, &dwSize, NULL );
    delete[] pchBuffer;

    CloseHandle(hFile);
    return TRUE;
    }

    复制代码

    。。。。。。。。。。。。结束。。。。。。。。。。。。。。。

     

    0
    0
    « 上一篇: ReadFile()-----同步
    » 下一篇: 完成端口
    	</div>
    	<div class="postDesc">posted @ <span id="post-date">2017-05-29 18:48</span> <a href="https://www.cnblogs.com/gd-luojialin/">gd_无痕</a> 阅读(<span id="post_view_count">2115</span>) 评论(<span id="post_comment_count">0</span>)  <a href="https://i.cnblogs.com/EditPosts.aspx?postid=6918742" rel="nofollow">编辑</a> <a href="#" "AddToWz(6918742);return false;">收藏</a></div>
    </div>
    <script type="text/javascript">var allowComments=true,cb_blogId=342488,cb_entryId=6918742,cb_blogApp=currentBlogApp,cb_blogUserGuid='0f4bd337-730d-e711-845c-ac853d9f53ac',cb_entryCreatedDate='2017/5/29 18:48:00';loadViewCount(cb_entryId);var cb_postType=1;var isMarkdown=false;</script>
    
    展开全文
  • WriteFile

    2016-09-12 20:49:00
    1:kernel32 WriteFile 1) 挺惊讶的,符号好使了, 前面大概4条判断,根据句柄判断要写到什么地方,一共有4个地方可能要去, stdin stdout stderr 还有最后一个 控制台 2)然后就是一个异步的判断 ...

    从R3 ,到磁盘

     

    1:kernel32  WriteFile

     

    1)

    挺惊讶的,符号好使了,

    前面大概4条判断,根据句柄判断要写到什么地方,一共有4个地方可能要去,

    stdin   stdout   stderr   还有最后一个  控制台

     

    2)然后就是一个异步的判断

    如果是异步,那么整理信息,然后调用NtWriteFile,根据返回值判断情况成功了,返回1

    否则返回0

    这里不考虑,主要考虑同步的情况

     

    3)同步的位置

    倒是不拖拉,直接就走Nt函数准备进内核了

     

     

    2:

     

    1)内核里面,一个深情的问候,先获取有用的信息,ETHREAD,和FILE_OBJECT,还有设备对象

     

    2)打了招呼,开始干活

    Zw函数的标准玩法,先判断处于用户模式还是内核模式,其实我就很搞不懂,

    驱动里面,Zw函数和Nt函数就那么点区别,一个判断内核模式,一个不判断内核模式,

    判断了之后,简单地说,就是修改模式之后,Zw调用Nt,然后再走原有流程,

    这里直接判断了,应该是优化了吧。

     

    3)做完环境判断之后,

    开始准备可能用到的结构了,

     

    4)准备结构之后,还有一个步骤,

      1.就是判断是否为同步操作,

      

      如果是同步操作的话,那么后面直接走

     

      2.并行的步骤还有个判断异步的

      

      这里顺带判断了,如果传入字符个数是0个,并且又是非管道或者邮槽操作,

      (这里要说一下,其实,管道等的操作,写入地址是NULL,写入字符个数0个,实际上是个常规操作,不算是违规操作)

     

    5)这里先看同步操作吧

    1。首先,设置当前状态,给文件系统,告诉它我现在在忙,我有同步的事情正在做

    如果以前有人设置了,那么v17 = 0,否则减个引用计数,然后v17 = 1。

     

    2。如果之前有人设置过了,那么这里自己获取一个文件对象锁

    这里有个细节,其实挺奇怪的,这里加了锁,但是后面没有地方Release这个锁,所以是不是可以考虑,这个锁根本就不会加,

    也就是说不会走到这里,也就是说当前文件不会有其他人在用,但是这不科学,这个理论说不通。

    其实后面有地方SetEvnet了。是不是就为了这个锁而存在的。

     

    3。

    如果要写入的字符个数为0个,并且v35,没有修正,或者值有异常,

    那么就把它修正为当前文件的偏移位置。

     

    4。又是一个分水岭,这里,如果这个成员有值,则继续走内部流程,否则就走到外面去了,外面就是和异步流程相同的其它流程了

    其实,这个成员是干嘛的,我就没搞清楚

    An opaque member, set only by file systems, that points to handle-specific information and that is used for Cache Manager interaction.

    MSDN上,只有这么一段话,说一个不透明的成员,只有文件系统可以操作它,类似于句柄,是和CM交互用的。

    我是不是可以猜测成,这个东西的存在,就是说CM中,我要改写的这个文件已经进入缓存了,我直接修改缓存就可以了,所以才出现这个判断。

    没有缓存的话,那就自然不是简单操作就能完成任务的。

     

    5。这个判断,真的搞得我好郁闷,

    首先判断 v35 的高位 < 0 ,就是说,它必须是 0xFFFF,

    然后并且,v35 的值不为 -1 ,就是说,v35的值必须是 0xFFFF0000 ~ 0xFFFFFFFE

    这是要判断什么呢,根据前面的经验,实际上这里出现这种值得可能性几乎没有,因为在前面已经通过各种设置,

    设置了v35的值,不会变成这个样子,除非是文件位置的有意为之。

    v35实际上是文件指针当前偏移,

     

    6。终于到了同步最后一个位置了

    这里的操作比较好理解,首先

     1 typedef
     2 BOOLEAN
     3 FAST_IO_WRITE (
     4     __in struct _FILE_OBJECT *FileObject,
     5     __in PLARGE_INTEGER FileOffset,
     6     __in ULONG Length,
     7     __in BOOLEAN Wait,
     8     __in ULONG LockKey,
     9     __in PVOID Buffer,
    10     __out PIO_STATUS_BLOCK IoStatus,
    11     __in struct _DEVICE_OBJECT *DeviceObject
    12     );
    View Code

    fastiowrite的原型是这样的,也就是说,调用的时候,函数包含了,哪个设备(文件所在设备),哪个文件(FILE_OBJECT 对应的文件),从哪写,写多少,甚至是否加锁是否等待都有了,

    返回值是 BOOLEAN,符合要求,返回成功失败,如果函数调用成功了,判断 STATUS,是否执行也成功,执行也成功的话,

    走进函数内部了。

    第一个函数 IopUpdateWriteOperationCount ,具体做什么的网上没找到,自己看,发现它内部先更新了一个全局的写操作计数器,

    然后又更新了一下ETHREAD里面的一个位置,很可能是解锁相关的

    第二个函数 IopUpdateWriteTransferCount ,看名字,以及参数的用途,大概是提交修改字符的个数,

    后续一系列的返回数据整理,然后设置Event,如果文件在忙,就给文件设置为空闲状态,如果文件在等待,那么就给它一个Event,

    最后释放了句柄,就可以返回了。

     

    6)异步操作部分

    1。也是先判断偏移

    不符合标准,直接就滚蛋了,这里不管

     

    2。这里是我最喜欢的部分,创建IRP,然后整理IRP的初始化的部分

    这部分操作结束之后

     

    3。代码开始逐渐明朗了,把两块互斥的指针初始化

    如果是 DO_BUFFERED_IO 的话,那么就是用 systembuffer

    如果设置成功的话,标记IRP标志为48,也就是0x30,翻译成中文就是

    这里使用的是 Buffered IO,用完之后,管理器需要把Buffer 释放

    如果设置失败,那么就修改flags值为16,也就是0x10,和上面区别就是,你别删了,其实根本就用不了

     

    4。代码第二块

    也就是非 DO_BUFFERED_IO 的情况下,先判断是否为 MDL 方式,如果是的话,给IRP创建一个MDL,然后LOCK住,

    如果不是MDL的情况,那么直接挂UserBuffer 为应用层传来的空间,这种方法非常危险,

    标识位为0,鸡毛都没有

     

    5。这块,主要是告诉下面处理的地方,这里都是什么操作

    最后就是一个分发操作,开始让IRP干活去吧

     

    至此,整个流程基本完成了,

    实际上我们可以看出,

    大体流程并不是很多,

     

    大致流程就是

    应用层的 WriteFile

    然后进内核NtWriteFile

    里面判断同步异步,

    同步走磁盘设备的FastIoWrite

    调用失败,或者异步的话,就自己创建IRP来实现,

    整体流程就这么短。

    剩下的就是FastIoWrite里面,或者文件系统驱动去对照IRP写磁盘了。

     

    还有几处我不懂得地方,就是那个UserBuffer,为什么它在里面竟然写了东西,

    IDA实际上没有识别出那个UserBuffer,是我自己根据偏移算出来的,

    也不知道我算得是否正确

    转载于:https://www.cnblogs.com/suanguade/p/5857746.html

    展开全文
  • WriteFile函数: 该函数的功能是往文件中写数据,该函数可用来完成同步和异步操作的。写入的位置是由文件指针制定的文字,在完成写操作后,文件的指针会移动到文件新增加的字节的最后(当然这是在文件打开的方式不是...

    WriteFile函数:

    该函数的功能是往文件中写数据,该函数可用来完成同步和异步操作的。写入的位置是由文件指针制定的文字,在完成写操作后,文件的指针会移动到文件新增加的字节的最后(当然这是在文件打开的方式不是FILE_FLAG_OVERLAPPED)。
    注:并不是每种操作系统都支持在任何类型的设备上进行异步操作。windows 95不支持对磁盘文件的重叠读取操作

    函数声明

    WINBASEAPI
    BOOL
    WINAPI
    WriteFile(
        __in        HANDLE hFile,
        __in_bcount(nNumberOfBytesToWrite) LPCVOID lpBuffer,
        __in        DWORD nNumberOfBytesToWrite,
        __out_opt   LPDWORD lpNumberOfBytesWritten,
        __inout_opt LPOVERLAPPED lpOverlapped
        );
    

    前面已经介绍过ReadFile函数,这里只需复习一下即可:

    WINBASEAPI
    BOOL
    WINAPI
    ReadFile(
        __in        HANDLE hFile,//hFile 是文件句柄。
        __out_bcount_part(nNumberOfBytesToRead, *lpNumberOfBytesRead) LPVOID lpBuffer,//lpBuffer 是读写数据缓冲区。nNumberOfBytesToWrite 是多少数据要写入。lpNumberOfBytesWritten 是已经写入多少数据。
        __in        DWORD nNumberOfBytesToRead,//nNumberOfBytesToRead 是多少数据要读取。
        __out_opt   LPDWORD lpNumberOfBytesRead,//nNumberOfBytesToRead 是已经读取多少数据。
        __inout_opt LPOVERLAPPED lpOverlapped//lpOverlapped 是异步读写的结构。
        );
    

    函数原型:

    BOOL WriteFile( HANDLE hFile, // handle to file 
    LPCVOID lpBuffer, // data buffer 
    DWORD nNumberOfBytesToWrite, // number of bytes to write 
    LPDWORD lpNumberOfBytesWritten, // number of bytes written
    LPOVERLAPPED lpOverlapped // overlapped buffer );
    

    第一个参数

    hFile——已经打开的文件句柄。需要写入数据的文件指针,这个指针指向的文件必须是GENERIC_WRITE access 访问属性的文件。

    第二个参数

    lpBuffer——缓冲区头指针,它的类型是 LPCVOID ,可以不经转化地传递任意类型的指针,如果需要传递的是一个例化的结构体,则可以使用“&”操作取地址。

    第三个参数

    nNumberOfBytesToWrite——将要写入的字节数。如写入零字节,表示什么都不写入,但会更新文件的“上一次修改时间”。针对位于远程系统的命名管道,限制在65535个字节以内

    第四个参数

    lpNumberOfBytesWritten——实际写入的字节数。

    第五个参数

    lpOverlapped——指向一个OVERLAPPED结构。大多数情况使用NULL(将声明变为ByVal As Long,并传递零值)。,如果文件是以FILE_FLAG_OVERLAPPED方式打开的话,那么这个指针就不能为NULL

    返回值:

    如果函数成功返回TRUE,否则返回FALSE。会设置GetLastError

    代码实现:

    #include <iostream>
    #include<Windows.h>
    using namespace std;
    int main()
    {
        TCHAR szSystemDir[MAX_PATH];
        GetSystemDirectory(szSystemDir, MAX_PATH);
           printf("%s", szSystemDir);
      
           HANDLE hFile;
           DWORD dwWritten;
           hFile = CreateFile(L"text.txt",
               GENERIC_WRITE,
               0, NULL, CREATE_ALWAYS,
               FILE_ATTRIBUTE_NORMAL, NULL);
           if (hFile != INVALID_HANDLE_VALUE) {
               if (!WriteFile(hFile, szSystemDir, lstrlen(szSystemDir), &dwWritten, NULL))
               {
                   return  GetLastError();
               }
           }
           CloseHandle(hFile);
    }
    
    
    

    运行截图:

    在这里插入图片描述

    补充一下,为什么输出控制台界面为什么只有一个C,因为TCHAR是宽字符,然后printf默认输出是ASCII(多字节字符集),举个例子,在宽字符下面,'A'占两个字节,对应的值就是0x0065 而不是0x65,又因为内存中小端序存放的原因 'A'在内存里就是65 00,而%s这个格式化字符串,判断字符串结尾的标志就是读到\00就结束,空格是0x20,所以遇到空格会继续输出。换用wprintf,输出就行,然后就能看到喽。。。
    在这里插入图片描述

    遗留疑问点:

    然后呢,疑问点又来了,文件里面写入的东西又和输出控制台的少了一个\system32了,让人头大

    疑问点已解决:

    WriteFile的第三个参数出问题,但是我测量的时候用的是lstrlen,用strlen测出来乘以2还可以让人想通,但是这里lstrlen测的是宽字符长度,居然还要乘以2,我也表示无法理解。

    解决答疑:这第三个参数传递的是字节数,并非字符数,lstrlen测出来的是宽字符的字符个数,而我们第三个传递的是字节数,所以乘以2,就可以把所需的内存大小传过去。就解决了。

    到这里呢,我们的所有疑问一一摆平,谢谢各位
    在这里插入图片描述

    备注:
    2021年坚持学写博客第5天(学习两个windows API) 寻梦SS

    明日目标:
    windows核心编程API函数

    展开全文
  • fs.writeFile

    2020-09-08 20:39:44
    // 2 调用fs.writeFile()方法,写入文件的内容 // 参数1:表示文件的存放路劲 // 参数2 表示要写入的内容 // 参数 3 回调函数 fs.writeFile(’./2.txt’, ‘abcd’, function(err) { // 2.1 如果文件写入成功 则 err...

    // 1 导入 fs文件系统模块

    const fs = require(‘fs’)

    // 2 调用fs.writeFile()方法,写入文件的内容

    // 参数1:表示文件的存放路劲

    // 参数2 表示要写入的内容

    // 参数 3 回调函数

    fs.writeFile(’./2.txt’, ‘abcd’, function(err) {
    // 2.1 如果文件写入成功 则 err的值等于 null

    // 2.2 如果文件写入失败,则err 的值等于一个 错误对象
    console.log(err);
    

    })

    在这里插入图片描述

    展开全文
  • WriteFile函数

    2014-03-27 12:45:00
    WriteFile函数: 该函数的功能是往文件中写数据,该函数可用来完成同步和异步操作的。写入的位置是由文件指针制定的文字,在完成写操作后,文件的指针会移动到文件新增加的字节的最后(当然这是在文件打开的方式...
  • WriteFile与ReadFile

    千次阅读 2018-07-18 08:35:09
    WriteFile函数: 该函数的功能是往文件中写数据,该函数可用来完成同步和异步操作的。写入的位置是由文件指针制定的文字,在完成写操作后,文件的指针会移动到文件新增加的字节的最后(当然这是在文件打开的方式...
  • 主要介绍了node.js中的fs.writeFile方法使用说明,本文介绍了fs.writeFile的方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下
  • Unicode字符集下WriteFile中文处理.pdf
  • ReadFile和WriteFile

    2019-10-04 11:19:22
    1同步方式 读写函数操作完成后才返回,会导致线程阻塞。...若ReadFile、WriteFile返回FALSE,并不表示读写失败,读写操作可能尚未完成。 转载于:https://www.cnblogs.com/LWJin/p/6035599.html...
  • writefile lasterror 5

    2020-09-11 11:59:31
    windows api writefile写磁盘数据的时候lasterror返回错误码5的情况,该问题是由于windows format格式化fat32或者ntfs之后无法写(可能被磁盘保护),有两种方法可以执行writefile,一种是磁盘变成RAW格式,表示没有...
  • WriteFile中途取消

    2016-05-06 12:46:18
    <p>It looks like <code>ioutil.WriteFile("last_import.txt", []byte(id), 0644)</code> would do the job, however it randomly leaves the file empty without writing the new identifier when I cancel the job...
  • win32 WriteFile

    千次阅读 2018-05-31 09:49:59
    参考网址: ... 写数据到指定的文件或者设备。 这个函数被设计为同步的或者异步的操作。 一个类似的用来只针对异步操作的函数,名字是WriteFileEx 函数原型: ...BOOL WINAPI WriteFile( _In_ ...
  • public static bool WriteFile(string strText,string strContent,string strAuthor) { string path = HttpContext.Current.Server.MapPath("/news/"); Encoding code = Encoding.GetEncoding("gb2312...
  • VC6.0 串口 通信稳定的例子,亲测OK, 用CreateFile 方式建立串口, WriteFile发送串口数据, ReadFile 方式接收串口数据,欢迎下载学习
  • 关于WriteFile函数的lpNumberOfBytesWritten在Win8开始的不同.pdf
  • 莱特档案 包装 fs.writeFile、mkdirp 和其他整洁。
  • WriteFile 同步(bug)

    千次阅读 2017-11-17 19:37:01
    真是虐了狗了,windows10上运行好好的,windows7竟然挂点了。同事,还跟我说,要挂也window10上挂吧,怎么在windows7上...BOOL WINAPI WriteFile( HANDLE hFile,LPCVOID lpBuffer,DWORD nNumberOfBytesToWrite, LPDWORD
  • fs的writefile方法

    千次阅读 2019-08-13 21:18:40
    Node.js的 fs.writeFile() 函数将数据写入到一个文件异步地替换的已经存在的情况下的文件。这个功能可以写从字符串或缓冲区中的数据。 如果数据是一个缓冲的编码选项被忽略。它默认的编码为“UTF8”,默认的文件模式...
  • Windows API一日一练(54)WriteFile和ReadFile函数.pdf
  • writefile写串口函数

    千次阅读 2019-04-08 17:15:34
    WriteFile()写串口,用GetLastError()的得到的错误是ERROR_IO_PENDING 请问这是什么错误,我该如何改正?多谢!    2003-8-19 13:50:42    harrymeng    &nbs....
  • VC++使用串口API WriteFile接口发送数据,接收端可以接收到数据,WriteFile函数返回值为FALSE,这是为什么?
  • 使用WriteFile 块读写数据 VB技术很实用的源码喜欢VB的朋友,相信它肯定可以提高编码的效率! 目录 译者序
  • WriteFile.zip

    2019-06-30 23:07:57
    自己写的写文件demo,用来调试操作系统内核代码,测试用的。
  • 串口之ReadFile WriteFile函数详解

    千次阅读 2019-02-23 13:47:30
    串口之ReadFile WriteFile函数详解

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 52,067
精华内容 20,826
关键字:

writefile