mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 22:13:06 +00:00
- Add some definitions to NDK
- Prettify/document CreatePipe and correct some mistakes, use 120 second timeout like on NT and send FILE_PIPE flags instead of weird BOOLEAN values from hell. svn path=/trunk/; revision=19065
This commit is contained in:
parent
7f3dd627ae
commit
4e84f04716
3 changed files with 97 additions and 73 deletions
|
@ -37,6 +37,7 @@ extern POBJECT_TYPE NTSYSAPI IoDriverObjectType;
|
||||||
#define FILE_DOES_NOT_EXIST 0x00000005
|
#define FILE_DOES_NOT_EXIST 0x00000005
|
||||||
|
|
||||||
/* Pipe Flags */
|
/* Pipe Flags */
|
||||||
|
#define FILE_PIPE_BYTE_STREAM_TYPE 0x00000000
|
||||||
#define FILE_PIPE_BYTE_STREAM_MODE 0x00000000
|
#define FILE_PIPE_BYTE_STREAM_MODE 0x00000000
|
||||||
#define FILE_PIPE_MESSAGE_MODE 0x00000001
|
#define FILE_PIPE_MESSAGE_MODE 0x00000001
|
||||||
#define FILE_PIPE_QUEUE_OPERATION 0x00000000
|
#define FILE_PIPE_QUEUE_OPERATION 0x00000000
|
||||||
|
|
|
@ -1181,6 +1181,15 @@ RtlIsTextUnicode(
|
||||||
ULONG *Flags
|
ULONG *Flags
|
||||||
);
|
);
|
||||||
|
|
||||||
|
NTSYSAPI
|
||||||
|
BOOLEAN
|
||||||
|
NTAPI
|
||||||
|
RtlPrefixString(
|
||||||
|
PCANSI_STRING String1,
|
||||||
|
PCANSI_STRING String2,
|
||||||
|
BOOLEAN CaseInsensitive
|
||||||
|
);
|
||||||
|
|
||||||
NTSYSAPI
|
NTSYSAPI
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
NTAPI
|
NTAPI
|
||||||
|
|
|
@ -17,95 +17,109 @@
|
||||||
|
|
||||||
/* GLOBALS ******************************************************************/
|
/* GLOBALS ******************************************************************/
|
||||||
|
|
||||||
ULONG ProcessPipeId = 0;
|
LONG ProcessPipeId = 0;
|
||||||
|
|
||||||
/* FUNCTIONS ****************************************************************/
|
/* FUNCTIONS ****************************************************************/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @implemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
BOOL STDCALL CreatePipe(PHANDLE hReadPipe,
|
BOOL
|
||||||
PHANDLE hWritePipe,
|
STDCALL
|
||||||
LPSECURITY_ATTRIBUTES lpPipeAttributes,
|
CreatePipe(PHANDLE hReadPipe,
|
||||||
DWORD nSize)
|
PHANDLE hWritePipe,
|
||||||
|
LPSECURITY_ATTRIBUTES lpPipeAttributes,
|
||||||
|
DWORD nSize)
|
||||||
{
|
{
|
||||||
WCHAR Buffer[64];
|
WCHAR Buffer[64];
|
||||||
UNICODE_STRING PipeName;
|
UNICODE_STRING PipeName;
|
||||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||||
IO_STATUS_BLOCK StatusBlock;
|
IO_STATUS_BLOCK StatusBlock;
|
||||||
LARGE_INTEGER DefaultTimeout;
|
LARGE_INTEGER DefaultTimeout;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
HANDLE ReadPipeHandle;
|
HANDLE ReadPipeHandle;
|
||||||
HANDLE WritePipeHandle;
|
HANDLE WritePipeHandle;
|
||||||
ULONG PipeId;
|
LONG PipeId;
|
||||||
ULONG Attributes;
|
ULONG Attributes;
|
||||||
PSECURITY_DESCRIPTOR SecurityDescriptor = NULL;
|
PSECURITY_DESCRIPTOR SecurityDescriptor = NULL;
|
||||||
|
|
||||||
DefaultTimeout.QuadPart = -300000000; /* 30 seconds */
|
/* Set the timeout to 120 seconds */
|
||||||
|
DefaultTimeout.QuadPart = -1200000000;
|
||||||
|
|
||||||
PipeId = (ULONG)InterlockedIncrement((LONG*)&ProcessPipeId);
|
/* Use default buffer size if desired */
|
||||||
swprintf(Buffer,
|
if (!nSize) nSize = 0x1000;
|
||||||
L"\\\\.\\PIPE\\Win32Pipes.%08x.%08x",
|
|
||||||
NtCurrentTeb()->Cid.UniqueProcess,
|
|
||||||
PipeId);
|
|
||||||
RtlInitUnicodeString (&PipeName,
|
|
||||||
Buffer);
|
|
||||||
|
|
||||||
Attributes = OBJ_CASE_INSENSITIVE;
|
/* Increase the Pipe ID */
|
||||||
if (lpPipeAttributes)
|
PipeId = InterlockedIncrement(&ProcessPipeId);
|
||||||
{
|
|
||||||
SecurityDescriptor = lpPipeAttributes->lpSecurityDescriptor;
|
|
||||||
if (lpPipeAttributes->bInheritHandle)
|
|
||||||
Attributes |= OBJ_INHERIT;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* use default buffer size if desired */
|
/* Create the pipe name */
|
||||||
if (nSize == 0)
|
swprintf(Buffer,
|
||||||
nSize = 0x1000;
|
L"\\\\.\\PIPE\\Win32Pipes.%08x.%08x",
|
||||||
|
NtCurrentTeb()->Cid.UniqueProcess,
|
||||||
|
PipeId);
|
||||||
|
RtlInitUnicodeString(&PipeName, Buffer);
|
||||||
|
|
||||||
InitializeObjectAttributes(&ObjectAttributes,
|
/* Always use case insensitive */
|
||||||
&PipeName,
|
Attributes = OBJ_CASE_INSENSITIVE;
|
||||||
Attributes,
|
|
||||||
NULL,
|
|
||||||
SecurityDescriptor);
|
|
||||||
|
|
||||||
Status = NtCreateNamedPipeFile(&ReadPipeHandle,
|
/* Check if we got attributes */
|
||||||
FILE_GENERIC_READ |FILE_WRITE_ATTRIBUTES | SYNCHRONIZE,
|
if (lpPipeAttributes)
|
||||||
&ObjectAttributes,
|
{
|
||||||
&StatusBlock,
|
/* Use the attributes' SD instead */
|
||||||
FILE_SHARE_WRITE,
|
SecurityDescriptor = lpPipeAttributes->lpSecurityDescriptor;
|
||||||
FILE_CREATE,
|
|
||||||
FILE_SYNCHRONOUS_IO_NONALERT,
|
|
||||||
FALSE,
|
|
||||||
FALSE,
|
|
||||||
FALSE,
|
|
||||||
1,
|
|
||||||
nSize,
|
|
||||||
nSize,
|
|
||||||
&DefaultTimeout);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
SetLastErrorByStatus(Status);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
Status = NtOpenFile(&WritePipeHandle,
|
/* Set OBJ_INHERIT if requested */
|
||||||
FILE_GENERIC_WRITE | SYNCHRONIZE,
|
if (lpPipeAttributes->bInheritHandle) Attributes |= OBJ_INHERIT;
|
||||||
&ObjectAttributes,
|
}
|
||||||
&StatusBlock,
|
|
||||||
FILE_SHARE_READ,
|
|
||||||
FILE_SYNCHRONOUS_IO_NONALERT);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
NtClose(ReadPipeHandle);
|
|
||||||
SetLastErrorByStatus(Status);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
*hReadPipe = ReadPipeHandle;
|
/* Initialize the attributes */
|
||||||
*hWritePipe = WritePipeHandle;
|
InitializeObjectAttributes(&ObjectAttributes,
|
||||||
|
&PipeName,
|
||||||
|
Attributes,
|
||||||
|
NULL,
|
||||||
|
SecurityDescriptor);
|
||||||
|
|
||||||
return TRUE;
|
/* Create the named pipe */
|
||||||
|
Status = NtCreateNamedPipeFile(&ReadPipeHandle,
|
||||||
|
FILE_GENERIC_READ |FILE_WRITE_ATTRIBUTES | SYNCHRONIZE,
|
||||||
|
&ObjectAttributes,
|
||||||
|
&StatusBlock,
|
||||||
|
FILE_SHARE_WRITE,
|
||||||
|
FILE_CREATE,
|
||||||
|
FILE_SYNCHRONOUS_IO_NONALERT,
|
||||||
|
FILE_PIPE_BYTE_STREAM_TYPE,
|
||||||
|
FILE_PIPE_BYTE_STREAM_MODE,
|
||||||
|
FILE_PIPE_BYTE_STREAM_MODE,
|
||||||
|
1,
|
||||||
|
nSize,
|
||||||
|
nSize,
|
||||||
|
&DefaultTimeout);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
/* Convert error and fail */
|
||||||
|
SetLastErrorByStatus(Status);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now try opening it for write access */
|
||||||
|
Status = NtOpenFile(&WritePipeHandle,
|
||||||
|
FILE_GENERIC_WRITE | SYNCHRONIZE,
|
||||||
|
&ObjectAttributes,
|
||||||
|
&StatusBlock,
|
||||||
|
FILE_SHARE_READ,
|
||||||
|
FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
/* Convert error and fail */
|
||||||
|
NtClose(ReadPipeHandle);
|
||||||
|
SetLastErrorByStatus(Status);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return both handles */
|
||||||
|
*hReadPipe = ReadPipeHandle;
|
||||||
|
*hWritePipe = WritePipeHandle;
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue