Reapply a modified r18883 patch (by Thomas Weidenmueller) that doesn't break named pipes.

svn path=/trunk/; revision=19019
This commit is contained in:
Eric Kohl 2005-11-05 16:11:31 +00:00
parent 2de23bb008
commit cb31a202c1

View file

@ -72,7 +72,6 @@ CreateNamedPipeW(LPCWSTR lpName,
HANDLE PipeHandle;
ACCESS_MASK DesiredAccess;
ULONG CreateOptions;
ULONG CreateDisposition;
ULONG WriteModeMessage;
ULONG ReadModeMessage;
ULONG NonBlocking;
@ -81,6 +80,12 @@ CreateNamedPipeW(LPCWSTR lpName,
LARGE_INTEGER DefaultTimeOut;
PSECURITY_DESCRIPTOR SecurityDescriptor = NULL;
if (nMaxInstances == 0 || nMaxInstances > PIPE_UNLIMITED_INSTANCES)
{
SetLastError(ERROR_INVALID_PARAMETER);
return INVALID_HANDLE_VALUE;
}
Result = RtlDosPathNameToNtPathName_U((LPWSTR)lpName,
&NamedPipeName,
NULL,
@ -108,77 +113,51 @@ CreateNamedPipeW(LPCWSTR lpName,
NULL,
SecurityDescriptor);
DesiredAccess = 0;
DesiredAccess = SYNCHRONIZE | (dwOpenMode & (WRITE_DAC | WRITE_OWNER | ACCESS_SYSTEM_SECURITY));
ShareAccess = 0;
CreateDisposition = FILE_OPEN_IF;
CreateOptions = 0;
if (dwOpenMode & FILE_FLAG_WRITE_THROUGH)
{
CreateOptions = CreateOptions | FILE_WRITE_THROUGH;
}
if (!(dwOpenMode & FILE_FLAG_OVERLAPPED))
{
CreateOptions = CreateOptions | FILE_SYNCHRONOUS_IO_NONALERT;
}
if (dwOpenMode & PIPE_ACCESS_DUPLEX)
switch (dwOpenMode & PIPE_ACCESS_DUPLEX)
{
CreateOptions = CreateOptions | FILE_PIPE_FULL_DUPLEX;
DesiredAccess |= (FILE_GENERIC_READ | FILE_GENERIC_WRITE);
}
else if (dwOpenMode & PIPE_ACCESS_INBOUND)
{
CreateOptions = CreateOptions | FILE_PIPE_INBOUND;
DesiredAccess |= FILE_GENERIC_READ;
}
else if (dwOpenMode & PIPE_ACCESS_OUTBOUND)
{
CreateOptions = CreateOptions | FILE_PIPE_OUTBOUND;
DesiredAccess |= FILE_GENERIC_WRITE;
case PIPE_ACCESS_INBOUND:
CreateOptions |= FILE_PIPE_INBOUND;
ShareAccess |= FILE_SHARE_WRITE;
DesiredAccess |= GENERIC_READ;
break;
case PIPE_ACCESS_OUTBOUND:
CreateOptions |= FILE_PIPE_OUTBOUND;
ShareAccess |= FILE_SHARE_READ;
DesiredAccess |= GENERIC_WRITE;
break;
case PIPE_ACCESS_DUPLEX:
CreateOptions |= FILE_PIPE_FULL_DUPLEX;
ShareAccess |= (FILE_SHARE_READ | FILE_SHARE_WRITE);
DesiredAccess |= (GENERIC_READ | GENERIC_WRITE);
break;
}
if (dwPipeMode & PIPE_TYPE_BYTE)
{
WriteModeMessage = FILE_PIPE_BYTE_STREAM_MODE;
}
else if (dwPipeMode & PIPE_TYPE_MESSAGE)
{
if (dwPipeMode & PIPE_TYPE_MESSAGE)
WriteModeMessage = FILE_PIPE_MESSAGE_MODE;
}
else
{
WriteModeMessage = FILE_PIPE_BYTE_STREAM_MODE;
}
if (dwPipeMode & PIPE_READMODE_BYTE)
{
ReadModeMessage = FILE_PIPE_BYTE_STREAM_MODE;
}
else if (dwPipeMode & PIPE_READMODE_MESSAGE)
{
if (dwPipeMode & PIPE_READMODE_MESSAGE)
ReadModeMessage = FILE_PIPE_MESSAGE_MODE;
}
else
{
ReadModeMessage = FILE_PIPE_BYTE_STREAM_MODE;
}
if (dwPipeMode & PIPE_WAIT)
{
NonBlocking = FILE_PIPE_QUEUE_OPERATION;
}
else if (dwPipeMode & PIPE_NOWAIT)
{
if (dwPipeMode & PIPE_NOWAIT)
NonBlocking = FILE_PIPE_COMPLETE_OPERATION;
}
else
{
NonBlocking = FILE_PIPE_QUEUE_OPERATION;
}
if (nMaxInstances >= PIPE_UNLIMITED_INSTANCES)
{
nMaxInstances = 0xFFFFFFFF;
}
DefaultTimeOut.QuadPart = nDefaultTimeOut * -10000LL;
@ -187,7 +166,7 @@ CreateNamedPipeW(LPCWSTR lpName,
&ObjectAttributes,
&Iosb,
ShareAccess,
CreateDisposition,
FILE_OPEN_IF,
CreateOptions,
WriteModeMessage,
ReadModeMessage,