跳到主要内容

Windows 常用的系统模块

Kernel32.dll

常用函数

  1. CreateFile:创建或打开文件、文件流、目录等。
  2. ReadFile:从文件中读取数据。
  3. WriteFile:将数据写入文件。
  4. VirtualAlloc:在进程的虚拟地址空间中分配内存。
  5. VirtualProtect:更改已分配内存的保护属性。

示例

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

int main() {
HANDLE hFile = CreateFile("example.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
printf("Could not create file (error %d)\n", GetLastError());
return 1;
}

const char *data = "Hello, World!";
DWORD bytesWritten;
BOOL result = WriteFile(hFile, data, strlen(data), &bytesWritten, NULL);
if (!result) {
printf("WriteFile failed (error %d)\n", GetLastError());
} else {
printf("Wrote %d bytes to example.txt\n", bytesWritten);
}

CloseHandle(hFile);
return 0;
}

Advapi32.dll

常用函数

  1. RegCreateKeyEx:在注册表中创建一个键。
  2. RegSetValueEx:设置注册表项的值。
  3. RegGetValue:从注册表项中获取值。
  4. OpenProcessToken:打开进程的访问令牌。
  5. GetTokenInformation:检索访问令牌的信息。

示例

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

int main() {
HKEY hKey;
LONG result = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Example", 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL);
if (result != ERROR_SUCCESS) {
printf("RegCreateKeyEx failed (error %d)\n", result);
return 1;
}

const char *data = "Hello, Registry!";
result = RegSetValueEx(hKey, "TestValue", 0, REG_SZ, (const BYTE *)data, strlen(data) + 1);
if (result != ERROR_SUCCESS) {
printf("RegSetValueEx failed (error %d)\n", result);
} else {
printf("Registry value set successfully\n");
}

RegCloseKey(hKey);
return 0;
}

User32.dll

常用函数

  1. CreateWindowEx:创建一个窗口或控件。
  2. ShowWindow:设置窗口的显示状态。
  3. UpdateWindow:更新窗口的工作区。
  4. SendMessage:发送消息到窗口。
  5. GetMessage:从线程的消息队列中检索消息。

示例

#include <windows.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
if (uMsg == WM_DESTROY) {
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

int main() {
const char *CLASS_NAME = "Sample Window Class";

WNDCLASS wc = {0};
wc.lpfnWndProc = WindowProc;
wc.hInstance = GetModuleHandle(NULL);
wc.lpszClassName = CLASS_NAME;

RegisterClass(&wc);

HWND hwnd = CreateWindowEx(
0, // Optional window styles.
CLASS_NAME, // Window class
"Learn to Program Windows", // Window text
WS_OVERLAPPEDWINDOW, // Window style

// Size and position
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

NULL, // Parent window
NULL, // Menu
GetModuleHandle(NULL), // Instance handle
NULL // Additional application data
);

if (hwnd == NULL) {
return 0;
}

ShowWindow(hwnd, SW_SHOW);

MSG msg = {0};
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return 0;
}

Gdi32.dll

常用函数

  1. CreateCompatibleDC:创建一个与指定设备兼容的内存设备上下文。
  2. CreateCompatibleBitmap:创建一个与指定设备上下文兼容的位图。
  3. BitBlt:执行位块传输。
  4. SelectObject:将选定的对象选入指定的设备上下文。
  5. DeleteDC:删除设备上下文。

示例

#include <windows.h>

int main() {
HDC hdcScreen = GetDC(NULL);
HDC hdcMem = CreateCompatibleDC(hdcScreen);
HBITMAP hbmMem = CreateCompatibleBitmap(hdcScreen, 100, 100);
SelectObject(hdcMem, hbmMem);

RECT rect = {0, 0, 100, 100};
FillRect(hdcMem, &rect, (HBRUSH)(COLOR_WINDOW+1));
BitBlt(hdcScreen, 0, 0, 100, 100, hdcMem, 0, 0, SRCCOPY);

DeleteDC(hdcMem);
ReleaseDC(NULL, hdcScreen);
DeleteObject(hbmMem);

return 0;
}

Psapi.dll

常用函数

  1. EnumProcesses:检索当前系统中所有进程的进程标识符。
  2. GetProcessMemoryInfo:检索指定进程的内存使用信息。
  3. GetModuleBaseName:检索指定进程中指定模块的基础名称。
  4. GetModuleFileNameEx:检索指定进程中指定模块的完整路径。
  5. EnumProcessModules:检索指定进程中所有模块的句柄。

示例

#include <windows.h>
#include <psapi.h>
#include <stdio.h>

int main() {
DWORD processes[1024], processCount, cbNeeded;
if (!EnumProcesses(processes, sizeof(processes), &cbNeeded)) {
printf("EnumProcesses failed (error %d)\n", GetLastError());
return 1;
}

processCount = cbNeeded / sizeof(DWORD);
printf("Number of processes: %u\n", processCount);

for (unsigned int i = 0; i < processCount; i++) {
if (processes[i] != 0) {
TCHAR processName[MAX_PATH] = TEXT("<unknown>");
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processes[i]);
if (hProcess) {
HMODULE hMod;
DWORD cbNeeded;
if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded)) {
GetModuleBaseName(hProcess, hMod, processName, sizeof(processName) / sizeof(TCHAR));
}
CloseHandle(hProcess);
}
printf("%s (PID: %u)\n", processName, processes[i]);
}
}

return 0;
}

这些示例代码展示了如何使用 Windows API 函数来进行文件操作、注册表操作、窗口管理、图形处理和进程管理。这些函数在不同的 DLL 模块中定义,每个模块提供特定类别的功能。通过参考这些示例,可以帮助你更好地理解和应用 Windows API。