[HEADERS]
[reactos.git] / reactos / dll / win32 / kernel32 / file / create.c
index ee3d8bb..f5c9fab 100644 (file)
 
 /* INCLUDES *****************************************************************/
 
-/* File contains Vista Semantics */
-#undef _WIN32_WINNT
-#define _WIN32_WINNT 0x0600
-
 #include <k32.h>
-
-#define NDEBUG
-#include "../include/debug.h"
-
+#include <wine/debug.h>
+
+WINE_DEFAULT_DEBUG_CHANNEL(kernel32file);
+
+#define SYMLINK_FLAG_RELATIVE   1
+
+typedef struct _REPARSE_DATA_BUFFER {
+    ULONG  ReparseTag;
+    USHORT ReparseDataLength;
+    USHORT Reserved;
+    union {
+        struct {
+            USHORT SubstituteNameOffset;
+            USHORT SubstituteNameLength;
+            USHORT PrintNameOffset;
+            USHORT PrintNameLength;
+            ULONG Flags;
+            WCHAR PathBuffer[1];
+        } SymbolicLinkReparseBuffer;
+        struct {
+            USHORT SubstituteNameOffset;
+            USHORT SubstituteNameLength;
+            USHORT PrintNameOffset;
+            USHORT PrintNameLength;
+            WCHAR PathBuffer[1];
+        } MountPointReparseBuffer;
+        struct {
+            UCHAR  DataBuffer[1];
+        } GenericReparseBuffer;
+    };
+} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
+
+#define REPARSE_DATA_BUFFER_HEADER_SIZE   FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer)
 
 /* FUNCTIONS ****************************************************************/
 
 /*
  * @implemented
  */
-HANDLE STDCALL CreateFileA (LPCSTR                     lpFileName,
+HANDLE WINAPI CreateFileA (LPCSTR                      lpFileName,
                            DWORD                       dwDesiredAccess,
                            DWORD                       dwShareMode,
                            LPSECURITY_ATTRIBUTES       lpSecurityAttributes,
@@ -40,7 +65,7 @@ HANDLE STDCALL CreateFileA (LPCSTR                    lpFileName,
    PWCHAR FileNameW;
    HANDLE FileHandle;
 
-   DPRINT("CreateFileA(lpFileName %s)\n",lpFileName);
+   TRACE("CreateFileA(lpFileName %s)\n",lpFileName);
 
    if (!(FileNameW = FilenameA2W(lpFileName, FALSE)))
       return INVALID_HANDLE_VALUE;
@@ -60,7 +85,7 @@ HANDLE STDCALL CreateFileA (LPCSTR                    lpFileName,
 /*
  * @implemented
  */
-HANDLE STDCALL CreateFileW (LPCWSTR                    lpFileName,
+HANDLE WINAPI CreateFileW (LPCWSTR                     lpFileName,
                            DWORD                       dwDesiredAccess,
                            DWORD                       dwShareMode,
                            LPSECURITY_ATTRIBUTES       lpSecurityAttributes,
@@ -74,11 +99,10 @@ HANDLE STDCALL CreateFileW (LPCWSTR                 lpFileName,
    HANDLE FileHandle;
    NTSTATUS Status;
    ULONG FileAttributes, Flags = 0;
-   CSR_API_MESSAGE Request;
    PVOID EaBuffer = NULL;
    ULONG EaLength = 0;
 
-   DPRINT("CreateFileW(lpFileName %S)\n",lpFileName);
+   TRACE("CreateFileW(lpFileName %S)\n",lpFileName);
 
    /* validate & translate the creation disposition */
    switch (dwCreationDisposition)
@@ -108,6 +132,16 @@ HANDLE STDCALL CreateFileW (LPCWSTR                        lpFileName,
         return (INVALID_HANDLE_VALUE);
      }
 
+   /* check for console input/output */
+   if (0 == _wcsicmp(L"CONOUT$", lpFileName)
+       || 0 == _wcsicmp(L"CONIN$", lpFileName))
+   {
+      return OpenConsoleW(lpFileName,
+                          dwDesiredAccess, 
+                          lpSecurityAttributes ? lpSecurityAttributes->bInheritHandle : FALSE,
+                          FILE_SHARE_READ | FILE_SHARE_WRITE);
+   }
+
   /* validate & translate the flags */
 
    /* translate the flags that need no validation */
@@ -136,14 +170,14 @@ HANDLE STDCALL CreateFileW (LPCWSTR                       lpFileName,
    if(dwFlagsAndAttributes & FILE_FLAG_BACKUP_SEMANTICS)
    {
       if(dwDesiredAccess & GENERIC_ALL)
-         Flags |= FILE_OPEN_FOR_BACKUP_INTENT | FILE_OPEN_FOR_RECOVERY;
+         Flags |= FILE_OPEN_FOR_BACKUP_INTENT | FILE_OPEN_REMOTE_INSTANCE;
       else
       {
          if(dwDesiredAccess & GENERIC_READ)
             Flags |= FILE_OPEN_FOR_BACKUP_INTENT;
 
          if(dwDesiredAccess & GENERIC_WRITE)
-            Flags |= FILE_OPEN_FOR_RECOVERY;
+            Flags |= FILE_OPEN_REMOTE_INSTANCE;
       }
    }
    else
@@ -162,56 +196,18 @@ HANDLE STDCALL CreateFileW (LPCWSTR                       lpFileName,
 
    /* FILE_FLAG_POSIX_SEMANTICS is handled later */
 
-   /* check for console output */
-   if (0 == _wcsicmp(L"CONOUT$", lpFileName))
-   {
-      /* FIXME: Send required access rights to Csrss */
-      Status = CsrClientCallServer(&Request,
-                                  NULL,
-                                  MAKE_CSR_API(GET_OUTPUT_HANDLE, CSR_NATIVE),
-                                  sizeof(CSR_API_MESSAGE));
-      if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
-      {
-         SetLastErrorByStatus(Status);
-        return INVALID_HANDLE_VALUE;
-      }
-      else
-      {
-         return Request.Data.GetOutputHandleRequest.OutputHandle;
-      }
-   }
-
-   /* check for console input */
-   if (0 == _wcsicmp(L"CONIN$", lpFileName))
-   {
-      /* FIXME: Send required access rights to Csrss */
-      Status = CsrClientCallServer(&Request,
-                                  NULL,
-                                  MAKE_CSR_API(GET_INPUT_HANDLE, CSR_NATIVE),
-                                  sizeof(CSR_API_MESSAGE));
-      if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
-      {
-         SetLastErrorByStatus(Status);
-        return INVALID_HANDLE_VALUE;
-      }
-      else
-      {
-         return Request.Data.GetInputHandleRequest.InputHandle;
-      }
-   }
-
    /* validate & translate the filename */
    if (!RtlDosPathNameToNtPathName_U (lpFileName,
                                      &NtPathU,
                                      NULL,
                                      NULL))
    {
-     DPRINT("Invalid path\n");
+     WARN("Invalid path\n");
      SetLastError(ERROR_PATH_NOT_FOUND);
      return INVALID_HANDLE_VALUE;
    }
 
-   DPRINT("NtPathU \'%wZ\'\n", &NtPathU);
+   TRACE("NtPathU \'%wZ\'\n", &NtPathU);
 
    if (hTemplateFile != NULL)
    {
@@ -370,7 +366,8 @@ HANDLE STDCALL CreateFileW (LPCWSTR                 lpFileName,
 /*
  * @implemented
  */
-BOOL STDCALL
+BOOLEAN
+WINAPI
 CreateSymbolicLinkW(IN LPCWSTR lpSymlinkFileName,
                     IN LPCWSTR lpTargetFileName,
                     IN DWORD dwFlags)
@@ -390,13 +387,13 @@ CreateSymbolicLinkW(IN LPCWSTR lpSymlinkFileName,
     ULONG dwCreateOptions;
     DWORD dwErr;
 
-    if(!lpSymlinkFileName || !lpTargetFileName || (dwFlags | SYMLINK_FLAG_DIRECTORY) != SYMLINK_FLAG_DIRECTORY)
+    if(!lpSymlinkFileName || !lpTargetFileName || (dwFlags | SYMBOLIC_LINK_FLAG_DIRECTORY) != SYMBOLIC_LINK_FLAG_DIRECTORY)
     {
         SetLastError(ERROR_INVALID_PARAMETER);
         return FALSE;
     }
 
-    if(dwFlags & SYMLINK_FLAG_DIRECTORY)
+    if(dwFlags & SYMBOLIC_LINK_FLAG_DIRECTORY)
         dwCreateOptions = FILE_DIRECTORY_FILE;
     else
         dwCreateOptions = FILE_NON_DIRECTORY_FILE;
@@ -467,8 +464,8 @@ CreateSymbolicLinkW(IN LPCWSTR lpSymlinkFileName,
 
     pBufTail = (PBYTE)(pReparseData->SymbolicLinkReparseBuffer.PathBuffer);
 
-    pReparseData->ReparseTag = IO_REPARSE_TAG_SYMLINK;
-    pReparseData->ReparseDataLength = cbReparseData - REPARSE_DATA_BUFFER_HEADER_SIZE;
+    pReparseData->ReparseTag = (ULONG)IO_REPARSE_TAG_SYMLINK;
+    pReparseData->ReparseDataLength = (USHORT)cbReparseData - REPARSE_DATA_BUFFER_HEADER_SIZE;
     pReparseData->Reserved = 0;
 
     pReparseData->SymbolicLinkReparseBuffer.SubstituteNameOffset = 0;
@@ -477,7 +474,7 @@ CreateSymbolicLinkW(IN LPCWSTR lpSymlinkFileName,
     RtlCopyMemory(pBufTail, TargetFileName.Buffer, TargetFileName.Length);
 
     pReparseData->SymbolicLinkReparseBuffer.PrintNameOffset = pReparseData->SymbolicLinkReparseBuffer.SubstituteNameLength;
-    pReparseData->SymbolicLinkReparseBuffer.PrintNameLength = cbPrintName;
+    pReparseData->SymbolicLinkReparseBuffer.PrintNameLength = (USHORT)cbPrintName;
     pBufTail += pReparseData->SymbolicLinkReparseBuffer.PrintNameOffset;
     RtlCopyMemory(pBufTail, lpTargetFileName, cbPrintName);
 
@@ -572,13 +569,14 @@ Cleanup:
 /*
  * @implemented
  */
-BOOL STDCALL
+BOOLEAN
+NTAPI
 CreateSymbolicLinkA(IN LPCSTR lpSymlinkFileName,
                     IN LPCSTR lpTargetFileName,
                     IN DWORD dwFlags)
 {
     PWCHAR SymlinkW, TargetW;
-    BOOL Ret;
+    BOOLEAN Ret;
 
     if(!lpSymlinkFileName || !lpTargetFileName)
     {