diff options
Diffstat (limited to 'um/service/src/device.cpp')
| -rw-r--r-- | um/service/src/device.cpp | 161 |
1 files changed, 79 insertions, 82 deletions
diff --git a/um/service/src/device.cpp b/um/service/src/device.cpp index 870930f..2634a9a 100644 --- a/um/service/src/device.cpp +++ b/um/service/src/device.cpp @@ -8,108 +8,105 @@ #include <Windows.h> #include <cstddef> - #include <limits> #include <stdexcept> #include <string> -namespace service -{ - namespace - { - Handle open_device(const std::string& path) - { - const auto raw = CreateFileA( - path.c_str(), - GENERIC_READ | GENERIC_WRITE, - 0, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - NULL); +namespace service { +namespace { - if (INVALID_HANDLE_VALUE == raw) - { - const auto ec = GetLastError(); - throw windows_error::make(ec, __FILE__, __LINE__, __FUNCTION__); - } +Handle open_device(const std::string& path) { + const auto raw = CreateFileA( + path.c_str(), + GENERIC_READ | GENERIC_WRITE, + 0, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL + ); - return Handle(raw); - } + if (INVALID_HANDLE_VALUE == raw) { + const auto ec = GetLastError(); + throw windows_error::make(ec, __FILE__, __LINE__, __FUNCTION__); } - Device Device::open(const std::string& path) - { - return Device(open_device(path)); - } + return Handle(raw); +} - std::size_t Device::get_required_output_size( - Code code, - const void* in_buf, - std::size_t in_buf_size) const - { - DWORD nbreq; +} // namespace - if (in_buf_size > std::numeric_limits<DWORD>::max()) - throw std::range_error("input buffer size is too large"); +Device Device::open(const std::string& path) { + return Device(open_device(path)); +} - std::size_t nbwritten = DeviceIoControl( - handle, - code, - const_cast<void*>(in_buf), - static_cast<DWORD>(in_buf_size), - NULL, - 0, - &nbreq, - NULL); +std::size_t Device::get_required_output_size( + Code code, + const void* in_buf, + std::size_t in_buf_size +) const { + DWORD nbreq; - if (0 == nbwritten) - { - const auto ec = GetLastError(); + if (in_buf_size > std::numeric_limits<DWORD>::max()) + throw std::range_error("input buffer size is too large"); - switch (ec) - { - case ERROR_MORE_DATA: - return nbreq; + std::size_t nbwritten = DeviceIoControl( + handle, + code, + const_cast<void*>(in_buf), + static_cast<DWORD>(in_buf_size), + NULL, + 0, + &nbreq, + NULL + ); - default: - throw windows_error::make(ec, __FILE__, __LINE__, __FUNCTION__); - } - } + if (0 == nbwritten) { + const auto ec = GetLastError(); - return nbwritten; + switch (ec) { + case ERROR_MORE_DATA: + return nbreq; + + default: + throw windows_error::make(ec, __FILE__, __LINE__, __FUNCTION__); + } } - std::size_t Device::send_control_code( - Code code, - const void* in_buf, - std::size_t in_buf_size, - void* out_buf, - std::size_t out_buf_size) const - { - DWORD nbreq; + return nbwritten; +} - if (in_buf_size > std::numeric_limits<DWORD>::max()) - throw std::range_error("input buffer size is too large"); - if (out_buf_size > std::numeric_limits<DWORD>::max()) - throw std::range_error("output buffer size is too large"); +std::size_t Device::send_control_code( + Code code, + const void* in_buf, + std::size_t in_buf_size, + void* out_buf, + std::size_t out_buf_size +) const { + DWORD nbreq; - std::size_t nbwritten = DeviceIoControl( - handle, - code, - const_cast<void*>(in_buf), - static_cast<DWORD>(in_buf_size), - out_buf, - static_cast<DWORD>(out_buf_size), - &nbreq, - NULL); + if (in_buf_size > std::numeric_limits<DWORD>::max()) + throw std::range_error("input buffer size is too large"); + if (out_buf_size > std::numeric_limits<DWORD>::max()) + throw std::range_error("output buffer size is too large"); - if (0 == nbwritten) - { - const auto ec = GetLastError(); - throw windows_error::make(ec, __FILE__, __LINE__, __FUNCTION__); - } + std::size_t nbwritten = DeviceIoControl( + handle, + code, + const_cast<void*>(in_buf), + static_cast<DWORD>(in_buf_size), + out_buf, + static_cast<DWORD>(out_buf_size), + &nbreq, + NULL + ); - return nbwritten; + if (0 == nbwritten) { + const auto ec = GetLastError(); + throw windows_error::make(ec, __FILE__, __LINE__, __FUNCTION__); } + + return nbwritten; } + +} // namespace service |
