Win API
常见的基本数据类型
在 Windows API 编程中,通常会使用一些约定俗成的变量命名来表示特定的含义:
-
HINSTANCE/HMODULE: 表示一个动态链接库(DLL)或可执行文件的句柄 -
HWND: 表示一个窗口句柄 -
DWORD/UINT: 表示 32 位无符号整数 -
LPSTR/LPCSTR: 表示指向 null 结尾的字符串的指针
CreateThread函数
CreateThread 是 Windows API 中的一个函数,它用于创建一个新的线程。
1 | HANDLE CreateThread( |
参数说明:
-
lpThreadAttributes: 用于指定新线程的安全属性,通常设置为NULL 使用默认值。 -
dwStackSize: 指定新线程的栈大小,如果设置为 0,则使用默认值。 -
lpStartAddress: 指向线程入口函数的指针,这个函数是线程的起点。 -
lpParameter: 传递给线程入口函数的参数,可以是任何类型的数据。 -
dwCreationFlags: 用于指定线程的创建选项,如CREATE_SUSPENDED 可以创建一个暂停状态的线程。 -
lpThreadId: 用于接收新创建线程的 ID,可以为NULL。
该函数的返回值是一个 HANDLE 类型,它表示新创建的线程句柄。如果创建失败,返回值为 NULL。
GetTickCount函数
GetTickCount 是 Windows API 中的一个函数,它用于获取系统启动以来经过的毫秒数。
1 | DWORD GetTickCount(void); |
该函数没有任何参数,返回值是一个 DWORD 类型的值,表示系统启动以来经过的毫秒数。
这个函数通常用于以下场景:
- 性能测量和监控:计算某个操作或事件的持续时间,比如测试函数的执行时间、计算程序的总运行时间等。
- 定时和延迟操作:通过比较当前时间和之前保存的时间戳,可以实现定期执行任务或延迟一定时间后执行某个操作。
- 计算相对时间:不需要获取绝对的系统时间,只需要关心两个时间点之间的时间差。这对于某些时间敏感的应用程序很有用。
CreateNamedPipeA函数
CreateNamedPipeA 是 Windows API 中用于创建命名管道的函数。命名管道是一种进程间通信机制,允许进程之间通过管道进行数据交换。
1 | HANDLE WINAPI CreateNamedPipeA( |
各个参数的含义如下:
-
lpName: 指定要创建的命名管道的名称。管道名称以\\\\.\\pipe\\ 为前缀,后跟自定义的管道名称。 -
dwOpenMode: 指定管道的打开模式,如是否用于读取、写入或双向通信。 -
dwPipeMode: 指定管道的其他属性,如无阻塞模式、消息模式等。 -
nMaxInstances: 指定同时可以连接到管道的最大客户端数量。 -
nOutBufferSize: 指定管道的输出缓冲区大小(以字节为单位)。 -
nInBufferSize: 指定管道的输入缓冲区大小(以字节为单位)。 -
nDefaultTimeOut: 指定客户端连接超时时间(以毫秒为单位)。 -
lpSecurityAttributes: 指定管道的安全属性。
该函数返回一个 HANDLE 类型的句柄,表示创建的命名管道。如果创建失败,返回 INVALID_HANDLE_VALUE。
创建命名管道后,可以使用 ConnectNamedPipe 函数来等待客户端连接,或使用 CreateFile 函数来连接到管道。
ConnectNamedPipe函数
ConnectNamedPipe 是 Windows API 中用于连接到命名管道的函数。它允许客户端应用程序连接到由服务器应用程序创建的命名管道。
1 | BOOL WINAPI ConnectNamedPipe( |
参数说明:
-
hNamedPipe: 要连接的命名管道的句柄。这个句柄通常是由CreateNamedPipeA 或CreateNamedPipeW 函数返回的。 -
lpOverlapped: 指向一个OVERLAPPED 结构体的指针。这个参数用于指定异步 I/O 操作。如果不需要异步 I/O,可以设置为NULL。
函数返回值:
- 如果函数成功,返回值为
TRUE。 - 如果函数失败,返回值为
FALSE。可以使用GetLastError 函数获取错误代码。
WriteFile函数
WriteFile 是 Windows API 中用于向文件或其他输出设备写入数据的函数。它可以用于向命名管道写入数据。
1 | BOOL WINAPI WriteFile( |
参数说明:
-
hFile: 要写入数据的文件或设备的句柄。对于命名管道,这通常是由CreateNamedPipeA 或CreateNamedPipeW 函数返回的句柄。 -
lpBuffer: 指向要写入的数据缓冲区的指针。 -
nNumberOfBytesToWrite: 要写入的字节数。 -
lpNumberOfBytesWritten: 指向一个DWORD 变量的指针,用于接收实际写入的字节数。 -
lpOverlapped: 指向一个OVERLAPPED 结构体的指针,用于指定异步 I/O 操作。如果不需要异步 I/O,可以设置为NULL。
函数返回值:
- 如果函数成功,返回值为
TRUE。 - 如果函数失败,返回值为
FALSE。可以使用GetLastError 函数获取错误代码。
CloseHandle 函数
CloseHandle 函数是 Windows API 中用于关闭各种类型的内核对象句柄的函数。它可以用于关闭文件、管道、事件、互斥量等各种类型的句柄。
1 | BOOL WINAPI CloseHandle( |
参数说明:
-
hObject: 要关闭的内核对象的句柄。
函数返回值:
- 如果函数成功,返回值为
TRUE。 - 如果函数失败,返回值为
FALSE。可以使用GetLastError 函数获取错误代码。
CreateFileA函数
CreateFileA() 是 Windows API 中的一个函数,用于创建或打开文件。
1 | HANDLE CreateFileA( |
-
lpFileName: 指向要创建或打开的文件名的指针。这可以是一个文件路径。 -
dwDesiredAccess: 指定文件的访问模式,如读、写、读写等。可以使用预定义的标志位组合。 -
dwShareMode: 指定文件的共享模式,如允许其他进程读取、写入等。可以使用预定义的标志位组合。 -
lpSecurityAttributes: 指向描述新创建文件的安全属性的指针。通常传 NULL 使用默认值。 -
dwCreationDisposition: 指定如何创建或打开文件,比如创建新文件、打开现有文件、如果不存在则创建等。 -
dwFlagsAndAttributes: 指定附加的文件属性和标志,如文件类型、临时文件等。 -
hTemplateFile: 指向作为文件模板的现有文件的句柄。通常传 NULL。
该函数返回一个文件句柄(HANDLE)。如果创建或打开文件失败,返回 INVALID_HANDLE_VALUE。
ReadFile函数
ReadFile() 是 Windows API 中的一个函数,用于从文件中读取数据。
1 | BOOL ReadFile( |
各个参数的含义如下:
-
hFile: 要读取的文件的句柄。这通常是通过CreateFileA() 或CreateFileW() 函数获得的。 -
lpBuffer: 指向存储读取数据的缓冲区的指针。 -
nNumberOfBytesToRead: 要读取的字节数。 -
lpNumberOfBytesRead: 指向一个 DWORD 变量的指针,用于存储实际读取的字节数。 -
lpOverlapped: 指向一个 OVERLAPPED 结构体的指针,用于指定异步 I/O 操作。如果使用同步 I/O,则传 NULL。
该函数返回一个 BOOL 值,表示操作是否成功。如果成功,返回 TRUE;否则返回 FALSE,可以使用 GetLastError() 函数获取错误代码。
VirtualAlloc函数
VirtualAlloc 函数是一个 Windows API 函数,用于在进程的虚拟地址空间中分配内存。
1 | LPVOID WINAPI VirtualAlloc( |
参数说明:
lpAddress: 要分配的内存区域的起始地址。如果传递NULL,系统会自动确定分配的地址。
dwSize: 要分配的内存大小,单位是字节。
flAllocationType: 内存分配的类型,可以是以下值的组合:-
MEM_COMMIT: 提交指定内存区域的页面。 -
MEM_RESERVE: 保留进程虚拟地址空间中的一个范围,但不分配实际的物理存储。 -
MEM_LARGE_PAGES: 使用大页面大小分配内存。
-
flProtect: 分配的内存页面的访问权限,可以是内存保护常量之一。
返回值:
如果函数成功,返回分配的内存区域的起始地址;如果失败,返回 NULL。
GetModuleHandleA函数
GetModuleHandleA 是 Windows API 中的一个函数,用于获取指定模块的句柄。
1 | HMODULE WINAPI GetModuleHandleA( |
参数说明:
-
lpModuleName: 要获取句柄的模块的名称。如果传入NULL,则返回调用进程的模块句柄。
返回值:
- 如果函数成功,返回指定模块的句柄。
- 如果函数失败,返回
NULL。
GetProcAddress函数
GetProcAddress 是 Windows API 中的一个函数,用于获取指定模块中导出函数的地址
1 | FARPROC WINAPI GetProcAddress( |
参数说明:
-
hModule: 包含要获取的函数的模块的句柄。可以通过GetModuleHandleA 或LoadLibraryA 函数获取。 -
lpProcName: 要获取的函数的名称。如果函数采用序号导出,则可以传入一个 WORD 类型的序号。
返回值:
- 如果函数成功,返回指定函数的地址。
- 如果函数失败,返回
NULL。
VirtualProtect函数
VirtualProtect 是一个 Windows API 函数,用于修改指定内存区域的访问保护属性。
1 | BOOL WINAPI VirtualProtect( |
参数说明:
lpAddress: 要修改保护属性的内存区域的起始地址。
dwSize: 要修改保护属性的内存区域的大小(以字节为单位)。
flNewProtect: 新的内存区域保护属性。可以是以下值的组合:-
PAGE_NOACCESS: 内存区域不能访问。 -
PAGE_READONLY: 内存区域可读。 -
PAGE_READWRITE: 内存区域可读写。 -
PAGE_EXECUTE: 内存区域可执行。 -
PAGE_EXECUTE_READ: 内存区域可执行和读取。 -
PAGE_EXECUTE_READWRITE: 内存区域可执行、读取和写入。
-
lpflOldProtect: 指向一个DWORD 变量的指针,用于接收修改前的内存区域保护属性。
函数返回值:
- 成功返回
TRUE。 - 失败返回
FALSE,可以调用GetLastError 函数获取错误代码。