前言

前段时间遇到了一些对文件操作的题目,因此这里介绍一下常见的文件操作API函数(不是大全,只是本人遇到的)

CreatFileA

HANDLE CreateFileA(
LPCSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
/*
各个参数的作用是:

- lpFileName:指定要创建或打开的文件名或设备名。
- dwDesiredAccess:指定对文件或设备的访问权限。
- dwShareMode:指定其他进程可以与文件或设备共享的方式。
- lpSecurityAttributes:指定一个安全描述符,控制对文件或设备的访问。
- dwCreationDisposition:指定如何创建或打开文件或设备。
- dwFlagsAndAttributes:指定文件或设备的属性和标志。
- hTemplateFile:指定一个文件句柄,用于指定要创建的文件的属性。

CreatefileA函数的作用是创建或打开一个文件或设备,并返回一个句柄,可以使用该句柄对文件或设备进行读写等操作。*/

这个以一个例子来讲解这个函数

CreateFileA("C:\\nk.ctf", 0x80000000, 1u, 0, 3u, 0x80u, 0)

参数1:文件路径名,字符串类型,指定创建的文件名和路径

参数2:文件访问控制标志,指定文件的访问权限和共享方式,0x80000000表示以独占方式打开文件

参数3:文件创建标志,指定文件的创建方式和属性,1u表示创建一个新文件

参数4:文件句柄模板,指定一个已经打开的文件句柄,0表示不使用模板句柄

参数5:文件操作方式,指定文件的读写方式,3u表示以可读可写方式打开文件

参数6:文件属性标志,指定文件的属性,0x80u表示将文件设置为临时文件

参数7:文件的扩展属性,指定文件的扩展属性,0表示不设置扩展属性。

需要注意的是,这个函数是创建或者打开一个文件,也就是说如果这个文件不存在的话才会创建这个文件,因此我们可以手动创建这个文件,然后让这个函数执行打开这个文件的命令。

ReadFile


BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);

/*
其中,各个参数的意思如下:

- `hFile`:文件句柄,表示要读取的文件。
- `lpBuffer`:指向要读取数据的缓冲区。
- `nNumberOfBytesToRead`:要读取的字节数。
- `lpNumberOfBytesRead`:指向保存实际读取字节数的变量。
- `lpOverlapped`:指向一个`OVERLAPPED`结构体,用于异步操作。如果不使用异步操作,可以设置为`NULL`。*/
ReadFile(hObject, &Buffer, 1u, &NumberOfBytesRead, 0)

hObject:文件句柄,指向要读取的文件。

Buffer:缓冲区,用于存储从文件中读取的数据。

1u:要读取的字节数。

NumberOfBytesRead:实际读取的字节数,由函数返回。

0:用于控制文件指针的偏移量,0表示从文件的当前位置开始读取。

CloseHandle

CloseHandle()函数的作用是关闭一个打开的句柄对象。它会释放句柄对象所占用的系统资源,因此在使用完句柄对象后应该调用该函数来关闭它。如果不关闭句柄对象,可能会导致资源泄漏或其他问题。该函数通常用于Windows编程中的文件、进程、线程等对象的操作。

LiadLibraryW

这个函数的作用是加载一个动态链接库(DLL)文件,并返回一个句柄(hModule)。这个句柄可以用于后续的函数调用,比如GetProcAddress()函数来获取动态链接库中的函数地址。LoadLibraryW()函数的参数是一个Unicode字符串,表示要加载的DLL文件的文件名。如果加载成功,返回的句柄非空;如果加载失败,返回NULL。

hModule=LoadLibraryW(L"Dll2.dll")

GetProcAddress


FARPROC GetProcAddress(
HMODULE hModule, // DLL模块句柄
LPCSTR lpProcName // 函数名或函数的序号
);

/*
参数说明:

- `hModule`:DLL模块句柄,表示要获取函数地址的DLL模块。可以通过`LoadLibrary`等函数获取。
- `lpProcName`:函数名或函数的序号,表示要获取的函数的名称或序号。如果是函数名,需要以字符串形式传入;如果是函数序号,需要以整数形式传入。在Windows中,函数名是以ASCII字符组成的字符串,函数序号是一个整数,是函数在DLL导出表中的位置。

返回值:

- 如果函数调用成功,返回值为函数的地址;
- 如果函数调用失败,返回值为NULL。*/
v10=GetProcAddress(hModule, "flag")

FreeLibrary

FreeLibrary函数的作用是释放一个动态链接库(DLL)的句柄,使该DLL从当前进程中卸载。在调用LoadLibrary函数加载一个DLL后,必须调用FreeLibrary函数释放该DLL的句柄,否则该DLL将一直驻留在内存中,直到进程结束。

fopen

FILE *fopen(const char *Filename, const char *Mode);
/*
参数说明:

- Filename:要打开的文件名,可以是绝对路径或相对路径。
- Mode:打开文件的模式,可以是以下几种:
- "r":只读模式,打开文件用于读取。
- "w":只写模式,如果文件存在则将其截断为零长度,如果文件不存在则创建该文件。
- "a":追加模式,打开文件用于写入,如果文件存在则在末尾追加数据,如果文件不存在则创建该文件。
- "rb":二进制只读模式,打开文件用于读取二进制数据。
- "wb":二进制只写模式,如果文件存在则将其截断为零长度,如果文件不存在则创建该文件,用于写入二进制数据。
- "ab":二进制追加模式,打开文件用于写入二进制数据,如果文件存在则在末尾追加数据,如果文件不存在则创建该文件。
返回值:
- 如果成功打开文件,则返回指向该文件的指针,否则返回NULL。*/
fopen(Filename, "rb")

fgetc

int fgetc(FILE *stream);
/*
函数作用:从指定的文件流中读取一个字符,并将该字符作为无符号字符转换为int类型返回。如果到达文件结尾或发生读取错误,则返回EOF。*/

fgetc(File)

fputc


int fputc(int c, FILE *stream);
/*
其中,参数c是要写入的字符,参数stream是输出流,即要写入的文件指针。

函数返回值为写入成功的字符,如果出现错误则返回EOF。*/

fputc(*(v11 + 4 * i) ^ v8, v6)

fclose

fclose(File)函数的作用是关闭文件。如果文件已打开,则该函数将文件缓冲区中的任何剩余数据刷新到磁盘,并释放该文件占用的任何系统资源。关闭文件后,不能再读取或写入该文件,除非再次打开。该函数的语法如下:

int fclose(FILE *File);

其中,File是指向FILE类型结构体的指针,表示要关闭的文件。该函数返回0表示成功,返回EOF表示失败。