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;
}
CreateOptions = CreateOptions | FILE_WRITE_THROUGH;
if (!(dwOpenMode & FILE_FLAG_OVERLAPPED))
{
CreateOptions = CreateOptions | FILE_SYNCHRONOUS_IO_NONALERT;
}
if (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;
}
CreateOptions = CreateOptions | FILE_SYNCHRONOUS_IO_NONALERT;
if (dwPipeMode & PIPE_TYPE_BYTE)
{
WriteModeMessage = FILE_PIPE_BYTE_STREAM_MODE;
}
else if (dwPipeMode & PIPE_TYPE_MESSAGE)
{
WriteModeMessage = FILE_PIPE_MESSAGE_MODE;
}
switch (dwOpenMode & PIPE_ACCESS_DUPLEX)
{
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_MESSAGE)
WriteModeMessage = FILE_PIPE_MESSAGE_MODE;
else
{
WriteModeMessage = FILE_PIPE_BYTE_STREAM_MODE;
}
WriteModeMessage = FILE_PIPE_BYTE_STREAM_MODE;
if (dwPipeMode & PIPE_READMODE_BYTE)
{
ReadModeMessage = FILE_PIPE_BYTE_STREAM_MODE;
}
else if (dwPipeMode & PIPE_READMODE_MESSAGE)
{
ReadModeMessage = FILE_PIPE_MESSAGE_MODE;
}
if (dwPipeMode & PIPE_READMODE_MESSAGE)
ReadModeMessage = FILE_PIPE_MESSAGE_MODE;
else
{
ReadModeMessage = FILE_PIPE_BYTE_STREAM_MODE;
}
ReadModeMessage = FILE_PIPE_BYTE_STREAM_MODE;
if (dwPipeMode & PIPE_WAIT)
{
NonBlocking = FILE_PIPE_QUEUE_OPERATION;
}
else if (dwPipeMode & PIPE_NOWAIT)
{
NonBlocking = FILE_PIPE_COMPLETE_OPERATION;
}
if (dwPipeMode & PIPE_NOWAIT)
NonBlocking = FILE_PIPE_COMPLETE_OPERATION;
else
{
NonBlocking = FILE_PIPE_QUEUE_OPERATION;
}
if (nMaxInstances >= PIPE_UNLIMITED_INSTANCES)
{
nMaxInstances = 0xFFFFFFFF;
}
NonBlocking = FILE_PIPE_QUEUE_OPERATION;
DefaultTimeOut.QuadPart = nDefaultTimeOut * -10000LL;
@ -187,7 +166,7 @@ CreateNamedPipeW(LPCWSTR lpName,
&ObjectAttributes,
&Iosb,
ShareAccess,
CreateDisposition,
FILE_OPEN_IF,
CreateOptions,
WriteModeMessage,
ReadModeMessage,
@ -371,7 +350,7 @@ ConnectNamedPipe(IN HANDLE hNamedPipe,
/*
* @implemented
*/
BOOL
BOOL
STDCALL
SetNamedPipeHandleState(HANDLE hNamedPipe,
LPDWORD lpMode,
@ -394,7 +373,7 @@ SetNamedPipeHandleState(HANDLE hNamedPipe,
Settings.ReadMode = (*lpMode & PIPE_READMODE_MESSAGE) ?
FILE_PIPE_MESSAGE_MODE: FILE_PIPE_BYTE_STREAM_MODE;
/* Send the changes to the Driver */
/* Send the changes to the Driver */
Status = NtSetInformationFile(hNamedPipe,
&Iosb,
&Settings,
@ -406,7 +385,7 @@ SetNamedPipeHandleState(HANDLE hNamedPipe,
return(FALSE);
}
}
/* Check if the Collection count or Timeout are being changed */
if (lpMaxCollectionCount || lpCollectDataTimeout)
{
@ -428,9 +407,9 @@ SetNamedPipeHandleState(HANDLE hNamedPipe,
}
}
/* Now set the new settings */
RemoteSettings.MaximumCollectionCount = (lpMaxCollectionCount) ?
*lpMaxCollectionCount :
/* Now set the new settings */
RemoteSettings.MaximumCollectionCount = (lpMaxCollectionCount) ?
*lpMaxCollectionCount :
RemoteSettings.MaximumCollectionCount;
if (lpCollectDataTimeout)
{