Win32 API Reference

Introduction to the Win32 API

The Win32 API (Application Programming Interface) is a set of core application programming interfaces that are available to applications targeting Microsoft Windows operating systems. It provides access to the vast majority of operating system services, including:

  • Process and thread management
  • Memory management
  • Inter-process communication (IPC)
  • File I/O operations
  • User interface elements (windows, dialogs, controls)
  • Graphics and multimedia services
  • Networking capabilities
  • Security and access control

Understanding and utilizing the Win32 API is fundamental for developing native Windows applications, device drivers, and system utilities.

Getting Started with Win32 Development

To begin developing with the Win32 API, you will typically need:

  • A C or C++ development environment (e.g., Visual Studio).
  • The Windows SDK (Software Development Kit), which includes headers, libraries, and tools.

A basic "Hello, World!" Win32 application involves creating a window, handling messages, and displaying text. Here's a simplified example of a message loop:


LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    // Window class registration
    WNDCLASS wc = {};
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = L"MyWindowClass";
    RegisterClass(&wc);

    // Create the window
    HWND hwnd = CreateWindowEx(0, L"MyWindowClass", L"My Window", WS_OVERLAPPEDWINDOW,
                               CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                               NULL, NULL, hInstance, NULL);
    ShowWindow(hwnd, nCmdShow);

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

Core API Categories

The Win32 API is vast and can be categorized into several key areas:

Kernel Services

These APIs provide fundamental operating system services, including process and thread management, memory allocation, synchronization primitives, and file system access.

  • CreateProcess: Creates a new process.
  • CreateThread: Creates a new thread.
  • VirtualAlloc: Allocates a region of memory.
  • CreateFile: Opens or creates a file or I/O device.

User Interface (UI) APIs

This category includes functions for creating and managing windows, controls (buttons, edit boxes, lists), menus, dialog boxes, and handling user input events.

  • CreateWindowEx: Creates an extended window.
  • GetMessage / TranslateMessage / DispatchMessage: The core message loop for processing user input and system events.
  • RegisterClass: Registers a window class.
  • MessageBox: Displays a modal message box.

Graphics and Multimedia APIs

APIs like GDI (Graphics Device Interface), GDI+, Direct2D, and Direct3D provide capabilities for drawing 2D and 3D graphics, rendering text, and handling multimedia content.

  • CreateCompatibleDC: Creates a memory device context.
  • BitBlt: Copies a block of pixels.
  • TextOut: Writes a string of text at the specified coordinates.

Networking APIs

WinSock (Windows Sockets) and the newer Winsock Kernel (WSK) provide a programming interface for network communication.

  • socket: Creates a socket.
  • bind: Associates a local address with a socket.
  • connect: Establishes a connection to a remote host.
  • send / recv: Sends and receives data over a socket.

Security APIs

These APIs allow for management of security descriptors, access tokens, and privileges.

  • CreateSecurityDescriptor: Creates a security descriptor.
  • SetSecurityInfo: Sets security information for securable objects.

Frequently Used Win32 Functions

CreateFileW

Opens or creates a file or I/O device. The 'W' suffix indicates the wide-character (Unicode) version.


HANDLE CreateFileW(
  LPCWSTR               lpFileName,
  DWORD                 dwDesiredAccess,
  DWORD                 dwShareMode,
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  DWORD                 dwCreationDisposition,
  DWORD                 dwFlagsAndAttributes,
  HANDLE                hTemplateFile
);
                    
Parameters:
  • lpFileName: The name of the file or device.
  • dwDesiredAccess: The generic access rights to the file.
  • dwShareMode: How the file can be shared.
  • dwCreationDisposition: Action to take if the file exists or not.
Return Value:

A handle to the opened or created file or device. INVALID_HANDLE_VALUE on failure.

GetLastError

Retrieves the last-error code value set by a failed function call.


DWORD GetLastError(void);
                    
Return Value:

The last-error code. Call FormatMessage to get a descriptive string for the error code.

MessageBoxW

Displays a modal dialog box that contains an application-defined message and buttons.


int MessageBoxW(
  HWND    hWnd,
  LPCWSTR lpText,
  LPCWSTR lpCaption,
  UINT    uType
);
                    
Parameters:
  • hWnd: Handle to the owner window.
  • lpText: The message to be displayed.
  • lpCaption: The title of the dialog box.
  • uType: The contents and behavior of the dialog box.
Return Value:

An integer indicating which button was pressed. For example, IDOK, IDCANCEL.

Memory Management Functions

Functions like GlobalAlloc, LocalAlloc (older), VirtualAlloc, HeapAlloc are used for dynamic memory allocation. For freeing memory, use corresponding functions like GlobalFree, VirtualFree, HeapFree.

File I/O Functions

Beyond CreateFileW, functions like ReadFile, WriteFile, CloseHandle are essential for interacting with files and devices.

Process and Thread Management Functions

GetCurrentProcessId, GetCurrentThreadId, ExitProcess, ExitThread, and synchronization objects like Mutexes (CreateMutex) and Events (CreateEvent) are key.

Registry Operations

Functions such as RegOpenKeyEx, RegQueryValueEx, RegSetValueEx, and RegCloseKey are used to access the Windows Registry.

Error Handling

Always check the return values of Win32 API functions. If a function fails, call GetLastError to retrieve the error code, and then use FormatMessage to obtain a human-readable error string.