- 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:
Alex Ionescu 2005-11-08 20:53:53 +00:00
parent 7f3dd627ae
commit 4e84f04716
3 changed files with 97 additions and 73 deletions

View file

@ -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

View file

@ -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

View file

@ -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 */