d711d731d7
## Summary of the Pull Request - Enables auditing of some Terminal libraries (Connection, Core, Settings) - Also audit WinConPTY.LIB since Connection depends on it ## PR Checklist * [x] Rolls audit out to more things * [x] I work here * [x] Tests should still pass * [x] Am core contributor ## Detailed Description of the Pull Request / Additional comments This is turning on the auditing of these projects (as enabled by the heavier lifting in the other refactor) and then cleaning up the remaining warnings. ## Validation Steps Performed - [x] Built it - [x] Ran the tests
122 lines
4 KiB
C++
122 lines
4 KiB
C++
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT license.
|
|
|
|
#include "precomp.h"
|
|
#include "DeviceHandle.h"
|
|
|
|
#include "WinNTControl.h"
|
|
|
|
#define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
|
|
|
|
/*++
|
|
Routine Description:
|
|
- This routine creates a handle to an input or output client of the given
|
|
server. No control io is sent to the server as this request must be coming
|
|
from the server itself.
|
|
|
|
Arguments:
|
|
- Handle - Receives a handle to the new client.
|
|
- ServerHandle - Supplies a handle to the server to which to attach the
|
|
newly created client.
|
|
- Name - Supplies the name of the client object.
|
|
- Inheritable - Supplies a flag indicating if the handle must be inheritable.
|
|
|
|
Return Value:
|
|
- NTSTATUS indicating if the client was successfully created.
|
|
--*/
|
|
[[nodiscard]] NTSTATUS
|
|
DeviceHandle::CreateClientHandle(
|
|
_Out_ PHANDLE Handle,
|
|
_In_ HANDLE ServerHandle,
|
|
_In_ PCWSTR Name,
|
|
_In_ BOOLEAN Inheritable)
|
|
{
|
|
return _CreateHandle(Handle,
|
|
Name,
|
|
GENERIC_WRITE | GENERIC_READ | SYNCHRONIZE,
|
|
ServerHandle,
|
|
Inheritable,
|
|
FILE_SYNCHRONOUS_IO_NONALERT);
|
|
}
|
|
|
|
/*++
|
|
Routine Description:
|
|
- This routine creates a new server on the driver and returns a handle to it.
|
|
|
|
Arguments:
|
|
- Handle - Receives a handle to the new server.
|
|
- Inheritable - Supplies a flag indicating if the handle must be inheritable.
|
|
|
|
Return Value:
|
|
- NTSTATUS indicating if the console was successfully created.
|
|
--*/
|
|
[[nodiscard]] NTSTATUS
|
|
DeviceHandle::CreateServerHandle(
|
|
_Out_ PHANDLE Handle,
|
|
_In_ BOOLEAN Inheritable)
|
|
{
|
|
return _CreateHandle(Handle,
|
|
L"\\Device\\ConDrv\\Server",
|
|
GENERIC_ALL,
|
|
nullptr,
|
|
Inheritable,
|
|
0);
|
|
}
|
|
|
|
/*++
|
|
Routine Description:
|
|
- This routine opens a handle to the console driver.
|
|
|
|
Arguments:
|
|
- Handle - Receives the handle.
|
|
- DeviceName - Supplies the name to be used to open the console driver.
|
|
- DesiredAccess - Supplies the desired access mask.
|
|
- Parent - Optionally supplies the parent object.
|
|
- Inheritable - Supplies a boolean indicating if the new handle is to be made inheritable.
|
|
- OpenOptions - Supplies the open options to be passed to NtOpenFile. A common
|
|
option for clients is FILE_SYNCHRONOUS_IO_NONALERT, to make the handle
|
|
synchronous.
|
|
|
|
Return Value:
|
|
- NTSTATUS indicating if the handle was successfully created.
|
|
--*/
|
|
[[nodiscard]] NTSTATUS
|
|
DeviceHandle::_CreateHandle(
|
|
_Out_ PHANDLE Handle,
|
|
_In_ PCWSTR DeviceName,
|
|
_In_ ACCESS_MASK DesiredAccess,
|
|
_In_opt_ HANDLE Parent,
|
|
_In_ BOOLEAN Inheritable,
|
|
_In_ ULONG OpenOptions)
|
|
|
|
{
|
|
ULONG Flags = OBJ_CASE_INSENSITIVE;
|
|
|
|
if (Inheritable)
|
|
{
|
|
WI_SetFlag(Flags, OBJ_INHERIT);
|
|
}
|
|
|
|
UNICODE_STRING Name;
|
|
#pragma warning(suppress : 26492) // const_cast is prohibited, but we can't avoid it for filling UNICODE_STRING.
|
|
Name.Buffer = const_cast<wchar_t*>(DeviceName);
|
|
Name.Length = gsl::narrow_cast<USHORT>((wcslen(DeviceName) * sizeof(wchar_t)));
|
|
Name.MaximumLength = Name.Length + sizeof(wchar_t);
|
|
|
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
|
#pragma warning(suppress : 26477) // The QOS part of this macro in the define is 0. Can't fix that.
|
|
InitializeObjectAttributes(&ObjectAttributes,
|
|
&Name,
|
|
Flags,
|
|
Parent,
|
|
nullptr);
|
|
|
|
IO_STATUS_BLOCK IoStatus;
|
|
return WinNTControl::NtOpenFile(Handle,
|
|
DesiredAccess,
|
|
&ObjectAttributes,
|
|
&IoStatus,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
|
|
OpenOptions);
|
|
}
|