#include <debug.h>
DEBUG_CHANNEL(kernel32file);
-//#define USING_PROPER_NPFS_WAIT_SEMANTICS
-
/* GLOBALS ********************************************************************/
LONG ProcessPipeId;
lpSecurityAttributes);
}
-
/*
* @implemented
*/
return PipeHandle;
}
-
/*
* @implemented
*/
return r;
}
-
-/*
- * When NPFS will work properly, use this code instead. It is compatible with
- * Microsoft's NPFS.SYS. The main difference is that:
- * - This code actually respects the timeout instead of ignoring it!
- * - This code validates and creates the proper names for both UNC and local pipes
- * - On NT, you open the *root* pipe directory (either \DosDevices\Pipe or
- * \DosDevices\Unc\Server\Pipe) and then send the pipe to wait on in the
- * FILE_PIPE_WAIT_FOR_BUFFER structure.
- */
-#ifdef USING_PROPER_NPFS_WAIT_SEMANTICS
/*
* @implemented
*/
/* Success */
return TRUE;
}
-#else
-/*
- * @implemented
- */
-BOOL
-WINAPI
-WaitNamedPipeW(LPCWSTR lpNamedPipeName,
- DWORD nTimeOut)
-{
- UNICODE_STRING NamedPipeName;
- NTSTATUS Status;
- OBJECT_ATTRIBUTES ObjectAttributes;
- FILE_PIPE_WAIT_FOR_BUFFER WaitPipe;
- HANDLE FileHandle;
- IO_STATUS_BLOCK Iosb;
-
- if (RtlDosPathNameToNtPathName_U(lpNamedPipeName,
- &NamedPipeName,
- NULL,
- NULL) == FALSE)
- {
- return FALSE;
- }
-
- InitializeObjectAttributes(&ObjectAttributes,
- &NamedPipeName,
- OBJ_CASE_INSENSITIVE,
- NULL,
- NULL);
- Status = NtOpenFile(&FileHandle,
- FILE_READ_ATTRIBUTES | SYNCHRONIZE,
- &ObjectAttributes,
- &Iosb,
- FILE_SHARE_READ | FILE_SHARE_WRITE,
- FILE_SYNCHRONOUS_IO_NONALERT);
- if (!NT_SUCCESS(Status))
- {
- BaseSetLastNTError(Status);
- RtlFreeUnicodeString(&NamedPipeName);
- return FALSE;
- }
-
- /* Check what timeout we got */
- if (nTimeOut == NMPWAIT_WAIT_FOREVER)
- {
- /* Don't use a timeout */
- WaitPipe.TimeoutSpecified = FALSE;
- }
- else
- {
- /* Check if default */
- if (nTimeOut == NMPWAIT_USE_DEFAULT_WAIT)
- {
- /* Set it to 0 */
- WaitPipe.Timeout.LowPart = 0;
- WaitPipe.Timeout.HighPart = 0;
- }
- else
- {
- /* Convert to NT format */
- WaitPipe.Timeout.QuadPart = UInt32x32To64(-10000, nTimeOut);
- }
-
- /* In both cases, we do have a timeout */
- WaitPipe.TimeoutSpecified = TRUE;
- }
-
- Status = NtFsControlFile(FileHandle,
- NULL,
- NULL,
- NULL,
- &Iosb,
- FSCTL_PIPE_WAIT,
- &WaitPipe,
- sizeof(WaitPipe),
- NULL,
- 0);
- NtClose(FileHandle);
- if (!NT_SUCCESS(Status))
- {
- BaseSetLastNTError(Status);
- RtlFreeUnicodeString(&NamedPipeName);
- return FALSE;
- }
-
- RtlFreeUnicodeString(&NamedPipeName);
- return TRUE;
-}
-#endif
-
/*
* @implemented
}
else
{
-#if 0 /* We don't implement FSCTL_PIPE_TRANSCEIVE yet */
IO_STATUS_BLOCK Iosb;
Status = NtFsControlFile(hNamedPipe,
BaseSetLastNTError(Status);
return FALSE;
}
-#else /* Workaround while FSCTL_PIPE_TRANSCEIVE not available */
- DWORD nActualBytes;
-
- while (0 != nInBufferSize &&
- WriteFile(hNamedPipe, lpInBuffer, nInBufferSize, &nActualBytes,
- NULL))
- {
- lpInBuffer = (LPVOID)((char *) lpInBuffer + nActualBytes);
- nInBufferSize -= nActualBytes;
- }
-
- if (0 != nInBufferSize)
- {
- /* Must have dropped out of the while 'cause WriteFile failed */
- return FALSE;
- }
-
- if (!ReadFile(hNamedPipe, lpOutBuffer, nOutBufferSize, &nActualBytes,
- NULL))
- {
- return FALSE;
- }
-
- if (NULL != lpBytesRead)
- {
- *lpBytesRead = nActualBytes;
- }
-#endif
}
return TRUE;