【API】文件操作編程-CreateFile、WriteFile、SetFilePointer
阿新 • • 發佈:2018-02-19
移動 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
對存在或不存在的文件或設備采取的操作。
- 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