[NPFS]
[reactos.git] / reactos / dll / win32 / kernel32 / file / npipe.c
index 9afa4ca..7112ffb 100644 (file)
 /* INCLUDES *****************************************************************/
 
 #include <k32.h>
-
 #define NDEBUG
-//#define USING_PROPER_NPFS_WAIT_SEMANTICS
 #include <debug.h>
+DEBUG_CHANNEL(kernel32file);
+
+#define USING_PROPER_NPFS_WAIT_SEMANTICS
 
 /* FUNCTIONS ****************************************************************/
 
@@ -54,7 +55,7 @@ CreateNamedPipeA(LPCSTR lpName,
  * @implemented
  */
 HANDLE
-STDCALL
+WINAPI
 CreateNamedPipeW(LPCWSTR lpName,
                  DWORD dwOpenMode,
                  DWORD dwPipeMode,
@@ -103,8 +104,8 @@ CreateNamedPipeW(LPCWSTR lpName,
         return INVALID_HANDLE_VALUE;
     }
 
-    DPRINT("Pipe name: %wZ\n", &NamedPipeName);
-    DPRINT("Pipe name: %S\n", NamedPipeName.Buffer);
+    TRACE("Pipe name: %wZ\n", &NamedPipeName);
+    TRACE("Pipe name: %S\n", NamedPipeName.Buffer);
 
     /* Always case insensitive, check if we got extra attributes */
     Attributes = OBJ_CASE_INSENSITIVE;
@@ -228,7 +229,7 @@ CreateNamedPipeW(LPCWSTR lpName,
     if (!NT_SUCCESS(Status))
     {
         /* Failed to create it */
-        DPRINT1("NtCreateNamedPipe failed (Status %x)!\n", Status);
+        WARN("NtCreateNamedPipe failed (Status %x)!\n", Status);
         SetLastErrorByStatus (Status);
         return INVALID_HANDLE_VALUE;
     }
@@ -250,7 +251,7 @@ WaitNamedPipeA(LPCSTR lpNamedPipeName,
     UNICODE_STRING NameU;
 
     /* Convert the name to Unicode */
-    Basep8BitStringToLiveUnicodeString(&NameU, lpNamedPipeName);
+    Basep8BitStringToHeapUnicodeString(&NameU, lpNamedPipeName);
 
     /* Call the Unicode API */
     r = WaitNamedPipeW(NameU.Buffer, nTimeOut);
@@ -263,16 +264,6 @@ WaitNamedPipeA(LPCSTR lpNamedPipeName,
 }
 
 
-/*
- * 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
  */
@@ -294,7 +285,7 @@ WaitNamedPipeW(LPCWSTR lpNamedPipeName,
     PFILE_PIPE_WAIT_FOR_BUFFER WaitPipeInfo;
 
     /* Start by making a unicode string of the name */
-    DPRINT("Sent path: %S\n", lpNamedPipeName);
+    TRACE("Sent path: %S\n", lpNamedPipeName);
     RtlCreateUnicodeString(&NamedPipeName, lpNamedPipeName);
     NameLength = NamedPipeName.Length / sizeof(WCHAR);
 
@@ -321,7 +312,7 @@ WaitNamedPipeW(LPCWSTR lpNamedPipeName,
         NewName.Length -= 9 * sizeof(WCHAR);
 
         /* Initialize the Dos Devices name */
-        DPRINT("NewName: %wZ\n", &NewName);
+        TRACE("NewName: %wZ\n", &NewName);
         RtlInitUnicodeString(&DevicePath, L"\\DosDevices\\pipe\\");
     }
     else if (Type == RtlPathTypeRootLocalDevice)
@@ -348,7 +339,7 @@ WaitNamedPipeW(LPCWSTR lpNamedPipeName,
         else
         {
             /* The name is invalid */
-            DPRINT1("Invalid name!\n");
+            WARN("Invalid name!\n");
             SetLastErrorByStatus(STATUS_OBJECT_PATH_SYNTAX_BAD);
             return FALSE;
         }
@@ -357,7 +348,7 @@ WaitNamedPipeW(LPCWSTR lpNamedPipeName,
     }
     else
     {
-        DPRINT1("Invalid path type\n");
+        WARN("Invalid path type\n");
         SetLastErrorByStatus(STATUS_OBJECT_PATH_SYNTAX_BAD);
         return FALSE;
     }
@@ -373,7 +364,7 @@ WaitNamedPipeW(LPCWSTR lpNamedPipeName,
     }
 
     /* Initialize the object attributes */
-    DPRINT("Opening: %wZ\n", &DevicePath);
+    TRACE("Opening: %wZ\n", &DevicePath);
     InitializeObjectAttributes(&ObjectAttributes,
                                &DevicePath,
                                OBJ_CASE_INSENSITIVE,
@@ -390,7 +381,7 @@ WaitNamedPipeW(LPCWSTR lpNamedPipeName,
     if (!NT_SUCCESS(Status))
     {
         /* Fail; couldn't open */
-        DPRINT1("Status: %lx\n", Status);
+        WARN("Status: %lx\n", Status);
         SetLastErrorByStatus(Status);
         RtlFreeUnicodeString(&NamedPipeName);
         RtlFreeHeap(RtlGetProcessHeap(), 0, WaitPipeInfo);
@@ -419,7 +410,7 @@ WaitNamedPipeW(LPCWSTR lpNamedPipeName,
         }
 
         /* In both cases, we do have a timeout */
-        WaitPipeInfo->TimeoutSpecified = FALSE;
+        WaitPipeInfo->TimeoutSpecified = TRUE;
     }
 
     /* Set the length and copy the name */
@@ -449,7 +440,7 @@ WaitNamedPipeW(LPCWSTR lpNamedPipeName,
     if (!NT_SUCCESS(Status))
     {
         /* Failure to wait on the pipe */
-        DPRINT1("Status: %lx\n", Status);
+        WARN("Status: %lx\n", Status);
         SetLastErrorByStatus (Status);
         return FALSE;
      }
@@ -457,92 +448,6 @@ WaitNamedPipeW(LPCWSTR lpNamedPipeName,
     /* 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))
-    {
-        SetLastErrorByStatus(Status);
-        return FALSE;
-    }
-
-    /* Check what timeout we got */
-    if (nTimeOut == NMPWAIT_USE_DEFAULT_WAIT)
-    {
-        /* Don't use a timeout */
-        WaitPipe.TimeoutSpecified = FALSE;
-    }
-    else
-    {
-        /* Check if we should wait forever */
-        if (nTimeOut == NMPWAIT_WAIT_FOREVER)
-        {
-            /* Set the max */
-            WaitPipe.Timeout.LowPart = 0;
-            WaitPipe.Timeout.HighPart = 0x80000000;
-        }
-        else
-        {
-            /* Convert to NT format */
-            WaitPipe.Timeout.QuadPart = UInt32x32To64(-10000, nTimeOut);
-        }
-
-        /* In both cases, we do have a timeout */
-        WaitPipe.TimeoutSpecified = FALSE;
-    }
-
-    Status = NtFsControlFile(FileHandle,
-                             NULL,
-                             NULL,
-                             NULL,
-                             &Iosb,
-                             FSCTL_PIPE_WAIT,
-                             &WaitPipe,
-                             sizeof(WaitPipe),
-                             NULL,
-                             0);
-    NtClose(FileHandle);
-    if (!NT_SUCCESS(Status))
-    {
-        SetLastErrorByStatus(Status);
-        return FALSE;
-    }
-
-    return TRUE;
-}
-#endif
 
 
 /*
@@ -951,7 +856,7 @@ GetNamedPipeHandleStateA(HANDLE hNamedPipe,
                          LPSTR lpUserName,
                          DWORD nMaxUserNameSize)
 {
-    UNICODE_STRING UserNameW = {0};
+    UNICODE_STRING UserNameW = { 0, 0, NULL };
     ANSI_STRING UserNameA;
     BOOL Ret;
 
@@ -1068,7 +973,7 @@ PeekNamedPipe(HANDLE hNamedPipe,
     NTSTATUS Status;
 
     /* Calculate the buffer space that we'll need and allocate it */
-    BufferSize = nBufferSize + FIELD_OFFSET(FILE_PIPE_PEEK_BUFFER, Data[0]);
+    BufferSize = nBufferSize + sizeof(FILE_PIPE_PEEK_BUFFER);
     Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferSize);
     if (Buffer == NULL)
     {