AuroraRuntime/Source/Processes/AuCreatePipeEx.NT.cpp

106 lines
3.0 KiB
C++

/*
* Copyright 1995 - 1997 Microsoft Corporation.
* Module Name:
* CreatePipeEx.NT.cpp
* Abstract:
* CreatePipe-like function that lets one or both handles be overlapped
* Author:
* Dave Hart Summer 1997
* Revision History:
* J Reece Wilson 2022: Updated default size to match Linux's 16 page assumption
* Renamed MyCreatePipeEx to CreatePipeEx
* Now using Au atomics
* Added second parameter check
* J Reece Wilson 202[2/3]: Rewritten in C++
* J Reece Wilson 2024: Widening
*
* License:
* MICROSOFT LIMITED PUBLIC LICENSE version 1.1
*/
#include <Source/RuntimeInternal.hpp>
static AuUInt32 gPipeSerialNumber;
BOOL
APIENTRY
CreatePipeEx(
OUT LPHANDLE lpReadPipe,
OUT LPHANDLE lpWritePipe,
IN LPSECURITY_ATTRIBUTES lpPipeAttributes,
IN DWORD nSize,
DWORD dwReadMode,
DWORD dwWriteMode
)
{
HANDLE ReadPipeHandle, WritePipeHandle;
DWORD dwError;
wchar_t sPipeNameBuffer[MAX_PATH];
//
// Only one valid OpenMode flag - FILE_FLAG_OVERLAPPED
//
if ((dwReadMode | dwWriteMode) & (~FILE_FLAG_OVERLAPPED))
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
//
// Check output arguments are non-null
//
if (!lpReadPipe || !lpWritePipe)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
//
// Set the default pipe size
//
if (nSize == 0)
{
nSize = 16 * AuHwInfo::GetPageSize();
}
swprintf(sPipeNameBuffer,
L"\\\\.\\Pipe\\AuroraProcessCStandardStream.%08x.%08x",
GetCurrentProcessId(),
AuAtomicAdd(&gPipeSerialNumber, 1u));
ReadPipeHandle = CreateNamedPipeW(sPipeNameBuffer,
PIPE_ACCESS_INBOUND | dwReadMode,
PIPE_TYPE_BYTE | PIPE_WAIT,
1, // Number of pipes
nSize, // Out buffer size
nSize, // In buffer size
120 * 1000, // Timeout in ms
lpPipeAttributes);
if (!ReadPipeHandle)
{
return FALSE;
}
WritePipeHandle = Aurora::Win32Open2(sPipeNameBuffer,
GENERIC_WRITE,
0, // No sharing
lpPipeAttributes,
OPEN_EXISTING,
dwWriteMode,
NULL);
if (INVALID_HANDLE_VALUE == WritePipeHandle)
{
dwError = GetLastError();
CloseHandle(ReadPipeHandle);
SetLastError(dwError);
return FALSE;
}
*lpReadPipe = ReadPipeHandle;
*lpWritePipe = WritePipeHandle;
return TRUE;
}