- Add some definitions to NDK
authorAlex Ionescu <aionescu@gmail.com>
Tue, 8 Nov 2005 20:53:53 +0000 (20:53 +0000)
committerAlex Ionescu <aionescu@gmail.com>
Tue, 8 Nov 2005 20:53:53 +0000 (20:53 +0000)
- 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

reactos/include/ndk/iotypes.h
reactos/include/ndk/rtlfuncs.h
reactos/lib/kernel32/file/pipe.c

index cc65d25..4d81595 100644 (file)
@@ -37,6 +37,7 @@ extern POBJECT_TYPE NTSYSAPI IoDriverObjectType;
 #define FILE_DOES_NOT_EXIST                 0x00000005
 
 /* Pipe Flags */
+#define FILE_PIPE_BYTE_STREAM_TYPE          0x00000000
 #define FILE_PIPE_BYTE_STREAM_MODE          0x00000000
 #define FILE_PIPE_MESSAGE_MODE              0x00000001
 #define FILE_PIPE_QUEUE_OPERATION           0x00000000
index 5c52c23..5ec42c4 100644 (file)
@@ -1181,6 +1181,15 @@ RtlIsTextUnicode(
     ULONG *Flags
 );
 
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlPrefixString(
+    PCANSI_STRING String1,
+    PCANSI_STRING String2,
+    BOOLEAN CaseInsensitive
+);
+
 NTSYSAPI
 BOOLEAN
 NTAPI
index dc23507..b53ea14 100644 (file)
 
 /* GLOBALS ******************************************************************/
 
-ULONG ProcessPipeId = 0;
+LONG ProcessPipeId = 0;
 
 /* FUNCTIONS ****************************************************************/
 
 /*
  * @implemented
  */
-BOOL STDCALL CreatePipe(PHANDLE hReadPipe,
-                       PHANDLE hWritePipe,
-                       LPSECURITY_ATTRIBUTES lpPipeAttributes,
-                       DWORD nSize)
+BOOL
+STDCALL
+CreatePipe(PHANDLE hReadPipe,
+           PHANDLE hWritePipe,
+           LPSECURITY_ATTRIBUTES lpPipeAttributes,
+           DWORD nSize)
 {
-   WCHAR Buffer[64];
-   UNICODE_STRING PipeName;
-   OBJECT_ATTRIBUTES ObjectAttributes;
-   IO_STATUS_BLOCK StatusBlock;
-   LARGE_INTEGER DefaultTimeout;
-   NTSTATUS Status;
-   HANDLE ReadPipeHandle;
-   HANDLE WritePipeHandle;
-   ULONG PipeId;
-   ULONG Attributes;
-   PSECURITY_DESCRIPTOR SecurityDescriptor = NULL;
-
-   DefaultTimeout.QuadPart = -300000000; /* 30 seconds */
-
-   PipeId = (ULONG)InterlockedIncrement((LONG*)&ProcessPipeId);
-   swprintf(Buffer,
-           L"\\\\.\\PIPE\\Win32Pipes.%08x.%08x",
-           NtCurrentTeb()->Cid.UniqueProcess,
-           PipeId);
-   RtlInitUnicodeString (&PipeName,
-                        Buffer);
-
-   Attributes = OBJ_CASE_INSENSITIVE;
-   if (lpPipeAttributes)
-     {
-       SecurityDescriptor = lpPipeAttributes->lpSecurityDescriptor;
-       if (lpPipeAttributes->bInheritHandle)
-         Attributes |= OBJ_INHERIT;
-     }
-
-   /* use default buffer size if desired */
-   if (nSize == 0)
-      nSize = 0x1000;
-
-   InitializeObjectAttributes(&ObjectAttributes,
-                             &PipeName,
-                             Attributes,
-                             NULL,
-                             SecurityDescriptor);
-
-   Status = NtCreateNamedPipeFile(&ReadPipeHandle,
-                                 FILE_GENERIC_READ |FILE_WRITE_ATTRIBUTES | SYNCHRONIZE,
-                                 &ObjectAttributes,
-                                 &StatusBlock,
-                                 FILE_SHARE_WRITE,
-                                 FILE_CREATE,
-                                 FILE_SYNCHRONOUS_IO_NONALERT,
-                                 FALSE,
-                                 FALSE,
-                                 FALSE,
-                                 1,
-                                 nSize,
-                                 nSize,
-                                 &DefaultTimeout);
-   if (!NT_SUCCESS(Status))
-     {
-       SetLastErrorByStatus(Status);
-       return FALSE;
-     }
-
-   Status = NtOpenFile(&WritePipeHandle,
-                      FILE_GENERIC_WRITE | SYNCHRONIZE,
-                      &ObjectAttributes,
-                      &StatusBlock,
-                      FILE_SHARE_READ,
-                      FILE_SYNCHRONOUS_IO_NONALERT);
-   if (!NT_SUCCESS(Status))
-     {
-       NtClose(ReadPipeHandle);
-       SetLastErrorByStatus(Status);
-       return FALSE;
-     }
-
-   *hReadPipe = ReadPipeHandle;
-   *hWritePipe = WritePipeHandle;
-
-   return TRUE;
+    WCHAR Buffer[64];
+    UNICODE_STRING PipeName;
+    OBJECT_ATTRIBUTES ObjectAttributes;
+    IO_STATUS_BLOCK StatusBlock;
+    LARGE_INTEGER DefaultTimeout;
+    NTSTATUS Status;
+    HANDLE ReadPipeHandle;
+    HANDLE WritePipeHandle;
+    LONG PipeId;
+    ULONG Attributes;
+    PSECURITY_DESCRIPTOR SecurityDescriptor = NULL;
+
+    /* Set the timeout to 120 seconds */
+    DefaultTimeout.QuadPart = -1200000000;
+
+    /* Use default buffer size if desired */
+    if (!nSize) nSize = 0x1000;
+
+    /* Increase the Pipe ID */
+    PipeId = InterlockedIncrement(&ProcessPipeId);
+
+    /* Create the pipe name */
+    swprintf(Buffer,
+             L"\\\\.\\PIPE\\Win32Pipes.%08x.%08x",
+             NtCurrentTeb()->Cid.UniqueProcess,
+             PipeId);
+    RtlInitUnicodeString(&PipeName, Buffer);
+
+    /* Always use case insensitive */
+    Attributes = OBJ_CASE_INSENSITIVE;
+
+    /* Check if we got attributes */
+    if (lpPipeAttributes)
+    {
+        /* Use the attributes' SD instead */
+        SecurityDescriptor = lpPipeAttributes->lpSecurityDescriptor;
+
+        /* Set OBJ_INHERIT if requested */
+        if (lpPipeAttributes->bInheritHandle) Attributes |= OBJ_INHERIT;
+    }
+
+    /* Initialize the attributes */
+    InitializeObjectAttributes(&ObjectAttributes,
+                               &PipeName,
+                               Attributes,
+                               NULL,
+                               SecurityDescriptor);
+
+    /* 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 */