add stubs for CreateSymbolicLinkA/W
[reactos.git] / reactos / lib / kernel32 / file / create.c
index f9046a3..168cb52 100644 (file)
@@ -34,37 +34,22 @@ HANDLE STDCALL CreateFileA (LPCSTR                  lpFileName,
                            DWORD                       dwFlagsAndAttributes,
                            HANDLE                      hTemplateFile)
 {
-   UNICODE_STRING FileNameU;
-   ANSI_STRING FileName;
+   PWCHAR FileNameW;
    HANDLE FileHandle;
-   
+
    DPRINT("CreateFileA(lpFileName %s)\n",lpFileName);
-   
-   RtlInitAnsiString (&FileName,
-                     (LPSTR)lpFileName);
-   
-   /* convert ansi (or oem) string to unicode */
-   if (bIsFileApiAnsi)
-     RtlAnsiStringToUnicodeString (&FileNameU,
-                                  &FileName,
-                                  TRUE);
-   else
-     RtlOemStringToUnicodeString (&FileNameU,
-                                 &FileName,
-                                 TRUE);
 
-   FileHandle = CreateFileW (FileNameU.Buffer,
+   if (!(FileNameW = FilenameA2W(lpFileName, FALSE)))
+      return INVALID_HANDLE_VALUE;
+
+   FileHandle = CreateFileW (FileNameW,
                             dwDesiredAccess,
                             dwShareMode,
                             lpSecurityAttributes,
                             dwCreationDisposition,
                             dwFlagsAndAttributes,
                             hTemplateFile);
-   
-   RtlFreeHeap (RtlGetProcessHeap (),
-               0,
-               FileNameU.Buffer);
-   
+
    return FileHandle;
 }
 
@@ -86,8 +71,7 @@ HANDLE STDCALL CreateFileW (LPCWSTR                   lpFileName,
    HANDLE FileHandle;
    NTSTATUS Status;
    ULONG FileAttributes, Flags = 0;
-   CSRSS_API_REQUEST Request;
-   CSRSS_API_REPLY Reply;
+   CSR_API_MESSAGE Request;
    PVOID EaBuffer = NULL;
    ULONG EaLength = 0;
 
@@ -99,15 +83,15 @@ HANDLE STDCALL CreateFileW (LPCWSTR                 lpFileName,
       case CREATE_NEW:
        dwCreationDisposition = FILE_CREATE;
        break;
-       
+
       case CREATE_ALWAYS:
        dwCreationDisposition = FILE_OVERWRITE_IF;
        break;
-       
+
       case OPEN_EXISTING:
        dwCreationDisposition = FILE_OPEN;
        break;
-       
+
       case OPEN_ALWAYS:
        dwCreationDisposition = FILE_OPEN_IF;
        break;
@@ -115,7 +99,7 @@ HANDLE STDCALL CreateFileW (LPCWSTR                  lpFileName,
       case TRUNCATE_EXISTING:
        dwCreationDisposition = FILE_OVERWRITE;
         break;
-      
+
       default:
         SetLastError(ERROR_INVALID_PARAMETER);
         return (INVALID_HANDLE_VALUE);
@@ -131,7 +115,7 @@ HANDLE STDCALL CreateFileW (LPCWSTR                 lpFileName,
      SetLastError(ERROR_PATH_NOT_FOUND);
      return INVALID_HANDLE_VALUE;
    }
-   
+
    DPRINT("NtPathU \'%S\'\n", NtPathU.Buffer);
 
   /* validate & translate the flags */
@@ -143,7 +127,7 @@ HANDLE STDCALL CreateFileW (LPCWSTR                 lpFileName,
       while waiting for file io to complete */
       Flags |= FILE_SYNCHRONOUS_IO_NONALERT;
    }
-   
+
    if(dwFlagsAndAttributes & FILE_FLAG_WRITE_THROUGH)
       Flags |= FILE_WRITE_THROUGH;
 
@@ -152,13 +136,13 @@ HANDLE STDCALL CreateFileW (LPCWSTR                       lpFileName,
 
    if(dwFlagsAndAttributes & FILE_FLAG_RANDOM_ACCESS)
       Flags |= FILE_RANDOM_ACCESS;
-   
+
    if(dwFlagsAndAttributes & FILE_FLAG_SEQUENTIAL_SCAN)
       Flags |= FILE_SEQUENTIAL_ONLY;
-   
+
    if(dwFlagsAndAttributes & FILE_FLAG_DELETE_ON_CLOSE)
       Flags |= FILE_DELETE_ON_CLOSE;
-   
+
    if(dwFlagsAndAttributes & FILE_FLAG_BACKUP_SEMANTICS)
    {
       if(dwDesiredAccess & GENERIC_ALL)
@@ -182,7 +166,7 @@ HANDLE STDCALL CreateFileW (LPCWSTR                 lpFileName,
       Flags |= FILE_OPEN_NO_RECALL;
 
    FileAttributes = (dwFlagsAndAttributes & (FILE_ATTRIBUTE_VALID_FLAGS & ~FILE_ATTRIBUTE_DIRECTORY));
-    
+
    /* handle may allways be waited on and querying attributes are allways allowed */
    dwDesiredAccess |= SYNCHRONIZE | FILE_READ_ATTRIBUTES;
 
@@ -192,19 +176,18 @@ HANDLE STDCALL CreateFileW (LPCWSTR                       lpFileName,
    if (0 == _wcsicmp(L"CONOUT$", lpFileName))
    {
       /* FIXME: Send required access rights to Csrss */
-      Request.Type = CSRSS_GET_OUTPUT_HANDLE;
       Status = CsrClientCallServer(&Request,
-                                  &Reply,
-                                  sizeof(CSRSS_API_REQUEST),
-                                  sizeof(CSRSS_API_REPLY));
-      if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
+                                  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 Reply.Data.GetOutputHandleReply.OutputHandle;
+         return Request.Data.GetOutputHandleRequest.OutputHandle;
       }
    }
 
@@ -212,22 +195,21 @@ HANDLE STDCALL CreateFileW (LPCWSTR                       lpFileName,
    if (0 == _wcsicmp(L"CONIN$", lpFileName))
    {
       /* FIXME: Send required access rights to Csrss */
-      Request.Type = CSRSS_GET_INPUT_HANDLE;
       Status = CsrClientCallServer(&Request,
-                                  &Reply,
-                                  sizeof(CSRSS_API_REQUEST),
-                                  sizeof(CSRSS_API_REPLY));
-      if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
+                                  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 Reply.Data.GetInputHandleReply.InputHandle;
+         return Request.Data.GetInputHandleRequest.InputHandle;
       }
    }
-   
+
    if (hTemplateFile != NULL)
    {
       FILE_EA_INFORMATION EaInformation;
@@ -254,7 +236,7 @@ HANDLE STDCALL CreateFileW (LPCWSTR                 lpFileName,
                SetLastError(ERROR_NOT_ENOUGH_MEMORY);
                return INVALID_HANDLE_VALUE;
             }
-            
+
             Status = NtQueryEaFile(hTemplateFile,
                                    &IoStatusBlock,
                                    EaBuffer,
@@ -264,7 +246,7 @@ HANDLE STDCALL CreateFileW (LPCWSTR                 lpFileName,
                                    0,
                                    NULL,
                                    TRUE);
-            
+
             if (NT_SUCCESS(Status))
             {
                /* we successfully read the extended attributes, break the loop
@@ -278,7 +260,7 @@ HANDLE STDCALL CreateFileW (LPCWSTR                 lpFileName,
                            0,
                            EaBuffer);
                EaBuffer = NULL;
-               
+
                if (Status != STATUS_BUFFER_TOO_SMALL)
                {
                   /* unless we just allocated not enough memory, break the loop
@@ -311,7 +293,7 @@ HANDLE STDCALL CreateFileW (LPCWSTR                 lpFileName,
 
       ObjectAttributes.SecurityDescriptor = lpSecurityAttributes->lpSecurityDescriptor;
    }
-   
+
    if(!(dwFlagsAndAttributes & FILE_FLAG_POSIX_SEMANTICS))
     ObjectAttributes.Attributes |= OBJ_CASE_INSENSITIVE;
 
@@ -329,7 +311,7 @@ HANDLE STDCALL CreateFileW (LPCWSTR                 lpFileName,
                          EaLength);
 
    RtlFreeUnicodeString(&NtPathU);
-   
+
    /* free the extended attributes buffer if allocated */
    if (EaBuffer != NULL)
    {
@@ -355,14 +337,14 @@ HANDLE STDCALL CreateFileW (LPCWSTR                       lpFileName,
       {
          SetLastErrorByStatus (Status);
       }
-     
+
       return INVALID_HANDLE_VALUE;
    }
-   
+
   /*
   create with OPEN_ALWAYS (FILE_OPEN_IF) returns info = FILE_OPENED or FILE_CREATED
   create with CREATE_ALWAYS (FILE_OVERWRITE_IF) returns info = FILE_OVERWRITTEN or FILE_CREATED
-  */    
+  */
   if (dwCreationDisposition == FILE_OPEN_IF)
   {
     SetLastError(IoStatusBlock.Information == FILE_OPENED ? ERROR_ALREADY_EXISTS : 0);
@@ -375,4 +357,51 @@ HANDLE STDCALL CreateFileW (LPCWSTR                        lpFileName,
   return FileHandle;
 }
 
+
+/*
+ * @unimplemented
+ */
+BOOL STDCALL
+CreateSymbolicLinkW(IN LPCWSTR lpSymlinkFileName,
+                    IN LPCWSTR lpTargetFileName,
+                    IN DWORD dwFlags)
+{
+    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+    return FALSE;
+}
+
+
+/*
+ * @implemented
+ */
+BOOL STDCALL
+CreateSymbolicLinkA(IN LPCSTR lpSymlinkFileName,
+                    IN LPCSTR lpTargetFileName,
+                    IN DWORD dwFlags)
+{
+    PWCHAR SymlinkW, TargetW;
+    BOOL Ret;
+    
+    if(!lpSymlinkFileName || !lpTargetFileName)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+    
+    if (!(SymlinkW = FilenameA2W(lpSymlinkFileName, FALSE)))
+        return FALSE;
+
+    if (!(TargetW = FilenameA2W(lpTargetFileName, TRUE)))
+        return FALSE;
+    
+    Ret = CreateSymbolicLinkW(SymlinkW,
+                              TargetW,
+                              dwFlags);
+
+    RtlFreeHeap(RtlGetProcessHeap(), 0, TargetW);
+
+    return Ret;
+}
+
+
 /* EOF */