1. 程式人生 > >【API】文件操作編程-CreateFile、WriteFile、SetFilePointer

【API】文件操作編程-CreateFile、WriteFile、SetFilePointer

移動 turn 操作 .cpp 名稱 create 輸出 拷貝 null

1、說明

 很多黑客工具的實現是通過對文件進行讀寫操作的,而文件讀寫操作實質也是對API函數的調用。

2、相關函數

CreateFile :

 創建或打開文件或I/O設備。最常用的I/O設備如下:文件,文件流,目錄,物理磁盤卷,控制臺緩沖,磁帶驅動器,通信資源,郵槽,和管。函數返回一個句柄,可以根據文件或設備和指定的標誌和屬性來訪問各種類型的I/O文件或設備。

HANDLE WINAPI CreateFile(
  _In_      LPCTSTR lpFileName,
  _In_      DWORD dwDesiredAccess,
  _In_      DWORD dwShareMode,
  _In_opt_  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  _In_      DWORD dwCreationDisposition,
  _In_      DWORD dwFlagsAndAttributes,
  _In_opt_  HANDLE hTemplateFile
);

字段說明:

  • In LPCTSTR lpFileName,

要創建或打開的文件或設備的名稱

  • In DWORD dwDesiredAccess,

請求對文件或設備的訪問,該文件或設備可以概括為讀、寫,兩者都或不為零)。

  • In DWORD dwShareMode,

文件或設備的請求共享模式,可以讀取、寫入、刪除、全部或全部

  • In_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,

一個指向security_attributes結構包含兩個獨立但相關的數據成員:一個可選的安全描述符,和一個布爾值,決定是否返回的句柄可以被繼承的子進程。

  • In
    DWORD dwCreationDisposition,

對存在或不存在的文件或設備采取的操作。

  • In DWORD dwFlagsAndAttributes,

文件或設備屬性和標誌

  • In_opt HANDLE hTemplateFile

hTemplateFile為一個文件或設備句柄,表示按這個參數給出的句柄為模板創建文件(就是將該句柄文件拷貝到lpFileName指定的路徑,然後再打開)。

返回值:

如果函數成功,返回值是指定文件、設備、命名管道或郵件槽的打開句柄。

如果函數失敗,返回值是invalid_handle_value。

SetFilePointer

移動指定文件的文件指針。

DWORD WINAPI SetFilePointer(
  _In_         HANDLE hFile,
  _In_         LONG lDistanceToMove,
  _Inout_opt_  PLONG lpDistanceToMoveHigh,
  _In_         DWORD dwMoveMethod
);

字段說明:

  • In HANDLE hFile, 文件句柄
  • In LONG lDistanceToMove,指定移動文件指針的字節數。
  • Inout_opt PLONG lpDistanceToMoveHigh,指向符號64位移動距離的高32位的指針。如果不需要高階32位,則指針必須設置為null。
  • In DWORD dwMoveMethod 文件指針移動的起始點。

WriteFile

BOOL WriteFile( 
  HANDLE hFile, 
  LPCVOID lpBuffer, 
  DWORD nNumberOfBytesToWrite, 
  LPDWORD lpNumberOfBytesWritten, 
  LPOVERLAPPED lpOverlapped
);

字段說明:

  • HANDLE hFile, 對要寫入的文件的句柄。
  • LPCVOID lpBuffer, 指向包含寫入文件的數據的緩沖區的指針。
  • DWORD nNumberOfBytesToWrite, 寫入文件的字節數。
  • LPDWORD lpNumberOfBytesWritten, 指向該函數調用寫入的字節數的指針。
  • LPOVERLAPPED lpOverlapped 指向重疊結構的指針,它包含異步輸入和輸出中使用的信息。

3、代碼

// 20180218_文件操作編程-CreateFile、WriteFile、SetFilePointer.cpp : 定義控制臺應用程序的入口點。
//


#include "stdafx.h"
#include <windows.h>
#include <stdio.h>

int wmain(int argc, wchar_t *argv[])
{
    //調用CreateFile函數以只寫方式打開一個文件
    HANDLE hFile = CreateFile(argv[1], GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == INVALID_HANDLE_VALUE)
    {
        printf("CreateFile error\n");
        return 0;
    }
    //調用SetFilePointer函數調整文件指針位置,移動到文件末尾
    if (SetFilePointer(hFile, 0, NULL, FILE_END) == -1)
    {
        printf("SetFilePointer error \n");
        return 0;
    }
    char buff[256] = "配置信息_URL_information";
    DWORD dwWrite;
    //把buff中的內容寫入到文件末尾
    if (!WriteFile(hFile, &buff, strlen(buff), &dwWrite, NULL))
    {
        printf("WriteFile error \n");
        return 0;
    }
    printf("往%ls中寫入數據成功\n", argv[1]);
    CloseHandle(hFile);
    return 0;
}

4、效果

【API】文件操作編程-CreateFile、WriteFile、SetFilePointer