3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/kernel32/file/create.c
6 * PURPOSE: Directory functions
7 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
8 * GetTempFileName is modified from WINE [ Alexandre Juiliard ]
11 * Removed use of SearchPath (not used by Windows)
12 * 18/08/2002: CreateFileW mess cleaned up (KJK::Hyperion)
13 * 24/08/2002: removed superfluous DPRINTs (KJK::Hyperion)
16 /* INCLUDES *****************************************************************/
18 #include <ddk/ntddk.h>
19 /* please FIXME: ddk/ntddk.h should be enough */
20 #include <ddk/iodef.h>
21 #include <ntdll/rtl.h>
25 #include <kernel32/kernel32.h>
26 #include <kernel32/error.h>
29 /* FUNCTIONS ****************************************************************/
31 HANDLE STDCALL CreateFileA (LPCSTR lpFileName,
32 DWORD dwDesiredAccess,
34 LPSECURITY_ATTRIBUTES lpSecurityAttributes,
35 DWORD dwCreationDisposition,
36 DWORD dwFlagsAndAttributes,
39 UNICODE_STRING FileNameU;
43 DPRINT("CreateFileA(lpFileName %s)\n",lpFileName);
45 RtlInitAnsiString (&FileName,
48 /* convert ansi (or oem) string to unicode */
50 RtlAnsiStringToUnicodeString (&FileNameU,
54 RtlOemStringToUnicodeString (&FileNameU,
58 FileHandle = CreateFileW (FileNameU.Buffer,
62 dwCreationDisposition,
66 RtlFreeHeap (RtlGetProcessHeap (),
74 HANDLE STDCALL CreateFileW (LPCWSTR lpFileName,
75 DWORD dwDesiredAccess,
77 LPSECURITY_ATTRIBUTES lpSecurityAttributes,
78 DWORD dwCreationDisposition,
79 DWORD dwFlagsAndAttributes,
82 OBJECT_ATTRIBUTES ObjectAttributes;
83 IO_STATUS_BLOCK IoStatusBlock;
84 UNICODE_STRING NtPathU;
89 DPRINT("CreateFileW(lpFileName %S)\n",lpFileName);
91 if(hTemplateFile != NULL)
94 DPRINT("Template file feature not supported yet\n");
95 SetLastError(ERROR_NOT_SUPPORTED);
96 return INVALID_HANDLE_VALUE;
99 /* validate & translate the creation disposition */
100 switch (dwCreationDisposition)
103 dwCreationDisposition = FILE_CREATE;
107 dwCreationDisposition = FILE_OVERWRITE_IF;
111 dwCreationDisposition = FILE_OPEN;
115 dwCreationDisposition = FILE_OPEN_IF;
118 case TRUNCATE_EXISTING:
119 dwCreationDisposition = FILE_OVERWRITE;
123 SetLastError(ERROR_INVALID_PARAMETER);
124 return (INVALID_HANDLE_VALUE);
127 /* validate & translate the flags */
128 if (dwFlagsAndAttributes & FILE_FLAG_OVERLAPPED)
130 DPRINT("Overlapped I/O not supported\n");
131 SetLastError(ERROR_NOT_SUPPORTED);
132 return INVALID_HANDLE_VALUE;
135 Flags |= FILE_SYNCHRONOUS_IO_ALERT;
137 /* validate & translate the filename */
138 if (!RtlDosPathNameToNtPathName_U ((LPWSTR)lpFileName,
143 DPRINT("Invalid path\n");
144 SetLastError(ERROR_BAD_PATHNAME);
145 return INVALID_HANDLE_VALUE;
148 DPRINT("NtPathU \'%S\'\n", NtPathU.Buffer);
150 /* translate the flags that need no validation */
151 if(dwFlagsAndAttributes & FILE_FLAG_WRITE_THROUGH)
152 Flags |= FILE_WRITE_THROUGH;
154 if(dwFlagsAndAttributes & FILE_FLAG_NO_BUFFERING)
155 Flags |= FILE_NO_INTERMEDIATE_BUFFERING;
157 if(dwFlagsAndAttributes & FILE_FLAG_RANDOM_ACCESS)
158 Flags |= FILE_RANDOM_ACCESS;
160 if(dwFlagsAndAttributes & FILE_FLAG_SEQUENTIAL_SCAN)
161 Flags |= FILE_SEQUENTIAL_ONLY;
163 if(dwFlagsAndAttributes & FILE_FLAG_DELETE_ON_CLOSE)
164 Flags |= FILE_DELETE_ON_CLOSE;
166 if(dwFlagsAndAttributes & FILE_FLAG_BACKUP_SEMANTICS)
168 if(dwDesiredAccess & GENERIC_ALL)
169 Flags |= FILE_OPEN_FOR_BACKUP_INTENT | FILE_OPEN_FOR_RECOVERY;
172 if(dwDesiredAccess & GENERIC_READ)
173 Flags |= FILE_OPEN_FOR_BACKUP_INTENT;
175 if(dwDesiredAccess & GENERIC_WRITE)
176 Flags |= FILE_OPEN_FOR_RECOVERY;
180 Flags |= FILE_NON_DIRECTORY_FILE;
182 /* FILE_FLAG_POSIX_SEMANTICS is handled later */
185 /* FIXME: Win32 constants to be defined */
186 if(dwFlagsAndAttributes & FILE_FLAG_OPEN_REPARSE_POINT)
187 Flags |= FILE_OPEN_REPARSE_POINT;
189 if(dwFlagsAndAttributes & FILE_FLAG_OPEN_NO_RECALL)
190 Flags |= FILE_OPEN_NO_RECALL;
193 /* translate the desired access */
194 if (dwDesiredAccess & GENERIC_ALL)
195 dwDesiredAccess |= FILE_ALL_ACCESS;
198 if (dwDesiredAccess & GENERIC_READ)
199 dwDesiredAccess |= FILE_GENERIC_READ;
201 if (dwDesiredAccess & GENERIC_WRITE)
202 dwDesiredAccess |= FILE_GENERIC_WRITE;
204 if (dwDesiredAccess & GENERIC_EXECUTE)
205 dwDesiredAccess |= FILE_GENERIC_EXECUTE;
208 /* build the object attributes */
209 InitializeObjectAttributes(
217 if (lpSecurityAttributes)
219 if(lpSecurityAttributes->bInheritHandle)
220 ObjectAttributes.Attributes |= OBJ_INHERIT;
222 ObjectAttributes.SecurityDescriptor = lpSecurityAttributes->lpSecurityDescriptor;
225 if(!(dwFlagsAndAttributes & FILE_FLAG_POSIX_SEMANTICS))
226 ObjectAttributes.Attributes |= OBJ_CASE_INSENSITIVE;
228 /* perform the call */
229 Status = NtCreateFile (&FileHandle,
234 dwFlagsAndAttributes,
236 dwCreationDisposition,
241 RtlFreeUnicodeString(&NtPathU);
244 if (!NT_SUCCESS(Status))
246 SetLastErrorByStatus (Status);
247 return INVALID_HANDLE_VALUE;
250 switch(IoStatusBlock.Information)
254 SetLastError(ERROR_ALREADY_EXISTS);