[/
 / Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
 /
 / Distributed under the Boost Software License, Version 1.0. (See accompanying
 / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 /]

[section:windows Windows-Specific Functionality]

[link asio.overview.windows.stream_handle Stream-Oriented HANDLEs]

[link asio.overview.windows.random_access_handle Random-Access HANDLEs]

[link asio.overview.windows.object_handle Object HANDLEs]

[section:stream_handle Stream-Oriented HANDLEs]

Asio contains classes to allow asynchronous read and write operations to be
performed on Windows `HANDLE`s, such as named pipes.

For example, to perform asynchronous operations on a named pipe, the following
object may be created:

  HANDLE handle = ::CreateFile(...);
  windows::stream_handle pipe(my_io_context, handle);

These are then used as synchronous or asynchronous read and write streams. This
means the objects can be used with any of the [link asio.reference.read
read()], [link asio.reference.async_read async_read()], [link
asio.reference.write write()], [link asio.reference.async_write
async_write()], [link asio.reference.read_until read_until()] or [link
asio.reference.async_read_until async_read_until()] free functions.

The kernel object referred to by the `HANDLE` must support use with I/O
completion ports (which means that named pipes are supported, but anonymous
pipes and console streams are not).

[heading See Also]

[link asio.reference.windows__stream_handle windows::stream_handle],
[link asio.reference.windows__basic_stream_handle windows::basic_stream_handle],
[link asio.reference.windows__stream_handle_service windows::stream_handle_service].

[heading Notes]

Windows stream `HANDLE`s are only available at compile time when targeting
Windows and only when the I/O completion port backend is used (which is the
default). A program may test for the macro `ASIO_HAS_WINDOWS_STREAM_HANDLE` to
determine whether they are supported.

[endsect]

[/-----------------------------------------------------------------------------]

[section:random_access_handle Random-Access HANDLEs]

Asio provides Windows-specific classes that permit asynchronous read and write
operations to be performed on HANDLEs that refer to regular files.

For example, to perform asynchronous operations on a file the following object
may be created:

  HANDLE handle = ::CreateFile(...);
  windows::random_access_handle file(my_io_context, handle);

Data may be read from or written to the handle using one of the
`read_some_at()`, `async_read_some_at()`, `write_some_at()` or
`async_write_some_at()` member functions. However, like the equivalent
functions (`read_some()`, etc.) on streams, these functions are only required
to transfer one or more bytes in a single operation. Therefore free functions
called [link asio.reference.read_at read_at()], [link
asio.reference.async_read_at async_read_at()], [link asio.reference.write_at
write_at()] and [link asio.reference.async_write_at async_write_at()] have been
created to repeatedly call the corresponding [^[**]_some_at()] function until
all data has been transferred.

[heading See Also]

[link asio.reference.windows__random_access_handle windows::random_access_handle],
[link asio.reference.windows__basic_random_access_handle windows::basic_random_access_handle],
[link asio.reference.windows__random_access_handle_service windows::random_access_handle_service].

[heading Notes]

Windows random-access `HANDLE`s are only available at compile time when
targeting Windows and only when the I/O completion port backend is used (which
is the default). A program may test for the macro
`ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE` to determine whether they are
supported.

[endsect]

[/-----------------------------------------------------------------------------]

[section:object_handle Object HANDLEs]

Asio provides Windows-specific classes that permit asynchronous wait operations
to be performed on HANDLEs to kernel objects of the following types:

* Change notification
* Console input
* Event
* Memory resource notification
* Process
* Semaphore
* Thread
* Waitable timer

For example, to perform asynchronous operations on an event, the following
object may be created:

  HANDLE handle = ::CreateEvent(...);
  windows::object_handle file(my_io_context, handle);

The `wait()` and `async_wait()` member functions may then be used to wait until
the kernel object is signalled.

[heading See Also]

[link asio.reference.windows__object_handle windows::object_handle],
[link asio.reference.windows__basic_object_handle windows::basic_object_handle],
[link asio.reference.windows__object_handle_service windows::object_handle_service].

[heading Notes]

Windows object `HANDLE`s are only available at compile time when targeting
Windows. Programs may test for the macro `ASIO_HAS_WINDOWS_OBJECT_HANDLE` to
determine whether they are supported.

[endsect]

[endsect]
