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 *****************************************************************/
21 #include <kernel32/kernel32.h>
24 /* FUNCTIONS ****************************************************************/
29 HANDLE STDCALL CreateFileA (LPCSTR lpFileName,
30 DWORD dwDesiredAccess,
32 LPSECURITY_ATTRIBUTES lpSecurityAttributes,
33 DWORD dwCreationDisposition,
34 DWORD dwFlagsAndAttributes,
37 UNICODE_STRING FileNameU;
41 DPRINT("CreateFileA(lpFileName %s)\n",lpFileName);
43 RtlInitAnsiString (&FileName,
46 /* convert ansi (or oem) string to unicode */
48 RtlAnsiStringToUnicodeString (&FileNameU,
52 RtlOemStringToUnicodeString (&FileNameU,
56 FileHandle = CreateFileW (FileNameU.Buffer,
60 dwCreationDisposition,
64 RtlFreeHeap (RtlGetProcessHeap (),
75 HANDLE STDCALL CreateFileW (LPCWSTR lpFileName,
76 DWORD dwDesiredAccess,
78 LPSECURITY_ATTRIBUTES lpSecurityAttributes,
79 DWORD dwCreationDisposition,
80 DWORD dwFlagsAndAttributes,
83 OBJECT_ATTRIBUTES ObjectAttributes;
84 IO_STATUS_BLOCK IoStatusBlock;
85 UNICODE_STRING NtPathU;
89 CSRSS_API_REQUEST Request;
90 CSRSS_API_REPLY Reply;
92 DPRINT("CreateFileW(lpFileName %S)\n",lpFileName);
94 if(hTemplateFile != NULL)
97 DPRINT("Template file feature not supported yet\n");
98 SetLastError(ERROR_NOT_SUPPORTED);
99 return INVALID_HANDLE_VALUE;
102 /* validate & translate the creation disposition */
103 switch (dwCreationDisposition)
106 dwCreationDisposition = FILE_CREATE;
110 dwCreationDisposition = FILE_OVERWRITE_IF;
114 dwCreationDisposition = FILE_OPEN;
118 dwCreationDisposition = FILE_OPEN_IF;
121 case TRUNCATE_EXISTING:
122 dwCreationDisposition = FILE_OVERWRITE;
126 SetLastError(ERROR_INVALID_PARAMETER);
127 return (INVALID_HANDLE_VALUE);
130 /* validate & translate the flags */
131 if (dwFlagsAndAttributes & FILE_FLAG_OVERLAPPED)
133 DPRINT("Overlapped I/O not supported\n");
134 SetLastError(ERROR_NOT_SUPPORTED);
135 return INVALID_HANDLE_VALUE;
138 Flags |= FILE_SYNCHRONOUS_IO_ALERT;
140 /* validate & translate the filename */
141 if (!RtlDosPathNameToNtPathName_U ((LPWSTR)lpFileName,
146 DPRINT("Invalid path\n");
147 SetLastError(ERROR_BAD_PATHNAME);
148 return INVALID_HANDLE_VALUE;
151 DPRINT("NtPathU \'%S\'\n", NtPathU.Buffer);
153 /* translate the flags that need no validation */
154 if(dwFlagsAndAttributes & FILE_FLAG_WRITE_THROUGH)
155 Flags |= FILE_WRITE_THROUGH;
157 if(dwFlagsAndAttributes & FILE_FLAG_NO_BUFFERING)
158 Flags |= FILE_NO_INTERMEDIATE_BUFFERING;
160 if(dwFlagsAndAttributes & FILE_FLAG_RANDOM_ACCESS)
161 Flags |= FILE_RANDOM_ACCESS;
163 if(dwFlagsAndAttributes & FILE_FLAG_SEQUENTIAL_SCAN)
164 Flags |= FILE_SEQUENTIAL_ONLY;
166 if(dwFlagsAndAttributes & FILE_FLAG_DELETE_ON_CLOSE)
167 Flags |= FILE_DELETE_ON_CLOSE;
169 if(dwFlagsAndAttributes & FILE_FLAG_BACKUP_SEMANTICS)
171 if(dwDesiredAccess & GENERIC_ALL)
172 Flags |= FILE_OPEN_FOR_BACKUP_INTENT | FILE_OPEN_FOR_RECOVERY;
175 if(dwDesiredAccess & GENERIC_READ)
176 Flags |= FILE_OPEN_FOR_BACKUP_INTENT;
178 if(dwDesiredAccess & GENERIC_WRITE)
179 Flags |= FILE_OPEN_FOR_RECOVERY;
183 Flags |= FILE_NON_DIRECTORY_FILE;
185 /* FILE_FLAG_POSIX_SEMANTICS is handled later */
188 /* FIXME: Win32 constants to be defined */
189 if(dwFlagsAndAttributes & FILE_FLAG_OPEN_REPARSE_POINT)
190 Flags |= FILE_OPEN_REPARSE_POINT;
192 if(dwFlagsAndAttributes & FILE_FLAG_OPEN_NO_RECALL)
193 Flags |= FILE_OPEN_NO_RECALL;
196 /* translate the desired access */
197 if (dwDesiredAccess & GENERIC_ALL)
198 dwDesiredAccess |= FILE_ALL_ACCESS;
201 if (dwDesiredAccess & GENERIC_READ)
202 dwDesiredAccess |= FILE_GENERIC_READ;
204 if (dwDesiredAccess & GENERIC_WRITE)
205 dwDesiredAccess |= FILE_GENERIC_WRITE;
207 if (dwDesiredAccess & GENERIC_EXECUTE)
208 dwDesiredAccess |= FILE_GENERIC_EXECUTE;
211 /* check for console output */
212 if (0 == _wcsicmp(L"CONOUT$", lpFileName))
214 /* FIXME: Send required access rights to Csrss */
215 Request.Type = CSRSS_GET_OUTPUT_HANDLE;
216 Status = CsrClientCallServer(&Request,
218 sizeof(CSRSS_API_REQUEST),
219 sizeof(CSRSS_API_REPLY));
220 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
222 SetLastErrorByStatus(Status);
223 return INVALID_HANDLE_VALUE;
227 return Reply.Data.GetOutputHandleReply.OutputHandle;
231 /* check for console input */
232 if (0 == _wcsicmp(L"CONIN$", lpFileName))
234 /* FIXME: Send required access rights to Csrss */
235 Request.Type = CSRSS_GET_INPUT_HANDLE;
236 Status = CsrClientCallServer(&Request,
238 sizeof(CSRSS_API_REQUEST),
239 sizeof(CSRSS_API_REPLY));
240 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
242 SetLastErrorByStatus(Status);
243 return INVALID_HANDLE_VALUE;
247 return Reply.Data.GetInputHandleReply.InputHandle;
251 /* build the object attributes */
252 InitializeObjectAttributes(
260 if (lpSecurityAttributes)
262 if(lpSecurityAttributes->bInheritHandle)
263 ObjectAttributes.Attributes |= OBJ_INHERIT;
265 ObjectAttributes.SecurityDescriptor = lpSecurityAttributes->lpSecurityDescriptor;
268 if(!(dwFlagsAndAttributes & FILE_FLAG_POSIX_SEMANTICS))
269 ObjectAttributes.Attributes |= OBJ_CASE_INSENSITIVE;
271 /* perform the call */
272 Status = NtCreateFile (&FileHandle,
277 dwFlagsAndAttributes,
279 dwCreationDisposition,
284 RtlFreeUnicodeString(&NtPathU);
287 if (!NT_SUCCESS(Status))
289 SetLastErrorByStatus (Status);
290 return INVALID_HANDLE_VALUE;
293 switch(IoStatusBlock.Information)
297 SetLastError(ERROR_ALREADY_EXISTS);