8376c166d31896ad2086da93e548281fd3156dba
[reactos.git] / reactos / lib / kernel32 / file / create.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: lib/kernel32/file/create.c
5 * PURPOSE: Directory functions
6 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
7 * GetTempFileName is modified from WINE [ Alexandre Juiliard ]
8 * UPDATE HISTORY:
9 * Created 01/11/98
10 * Removed use of SearchPath (not used by Windows)
11 */
12
13 /* INCLUDES *****************************************************************/
14
15 #include <windows.h>
16 #include <ddk/ntddk.h>
17 #include <wchar.h>
18 #include <string.h>
19
20 #define NDEBUG
21 #include <kernel32/kernel32.h>
22
23 /* EXTERNS ******************************************************************/
24
25 DWORD STDCALL GetCurrentDriveW(DWORD nBufferLength, PWSTR lpBuffer);
26
27 /* FUNCTIONS ****************************************************************/
28
29 HANDLE STDCALL CreateFileA(LPCSTR lpFileName,
30 DWORD dwDesiredAccess,
31 DWORD dwShareMode,
32 LPSECURITY_ATTRIBUTES lpSecurityAttributes,
33 DWORD dwCreationDisposition,
34 DWORD dwFlagsAndAttributes,
35 HANDLE hTemplateFile)
36 {
37 WCHAR FileNameW[MAX_PATH];
38 ULONG i = 0;
39
40 DPRINT("CreateFileA(lpFileName %s)\n",lpFileName);
41
42 while ((*lpFileName)!=0 && i < MAX_PATH)
43 {
44 FileNameW[i] = *lpFileName;
45 lpFileName++;
46 i++;
47 }
48 FileNameW[i] = 0;
49
50 return CreateFileW(FileNameW,dwDesiredAccess,
51 dwShareMode,
52 lpSecurityAttributes,
53 dwCreationDisposition,
54 dwFlagsAndAttributes,
55 hTemplateFile);
56 }
57
58
59 HANDLE STDCALL CreateFileW(LPCWSTR lpFileName,
60 DWORD dwDesiredAccess,
61 DWORD dwShareMode,
62 LPSECURITY_ATTRIBUTES lpSecurityAttributes,
63 DWORD dwCreationDisposition,
64 DWORD dwFlagsAndAttributes,
65 HANDLE hTemplateFile)
66 {
67 HANDLE FileHandle;
68 NTSTATUS Status;
69 OBJECT_ATTRIBUTES ObjectAttributes;
70 IO_STATUS_BLOCK IoStatusBlock;
71 UNICODE_STRING FileNameString;
72 ULONG Flags = 0;
73 WCHAR PathNameW[MAX_PATH];
74 WCHAR FileNameW[MAX_PATH];
75 UINT Len = 0;
76
77 switch (dwCreationDisposition)
78 {
79 case CREATE_NEW:
80 dwCreationDisposition = FILE_CREATE;
81 break;
82
83 case CREATE_ALWAYS:
84 dwCreationDisposition = FILE_OVERWRITE_IF;
85 break;
86
87 case OPEN_EXISTING:
88 dwCreationDisposition = FILE_OPEN;
89 break;
90
91 case OPEN_ALWAYS:
92 dwCreationDisposition = OPEN_ALWAYS;
93 break;
94
95 case TRUNCATE_EXISTING:
96 dwCreationDisposition = FILE_OVERWRITE;
97 }
98
99 DPRINT("CreateFileW(lpFileName %w)\n",lpFileName);
100
101 if (dwDesiredAccess & GENERIC_READ)
102 dwDesiredAccess |= FILE_GENERIC_READ;
103
104 if (dwDesiredAccess & GENERIC_WRITE)
105 dwDesiredAccess |= FILE_GENERIC_WRITE;
106
107 if (!(dwFlagsAndAttributes & FILE_FLAG_OVERLAPPED))
108 {
109 Flags |= FILE_SYNCHRONOUS_IO_ALERT;
110 }
111
112 if (lpFileName[1] == (WCHAR)':')
113 {
114 wcscpy(PathNameW, lpFileName);
115 }
116 else if (wcslen(lpFileName) > 4 &&
117 lpFileName[0] == (WCHAR)'\\' &&
118 lpFileName[1] == (WCHAR)'\\' &&
119 lpFileName[2] == (WCHAR)'.' &&
120 lpFileName[3] == (WCHAR)'\\')
121 {
122 wcscpy(PathNameW, lpFileName);
123 }
124 else if (lpFileName[0] == (WCHAR)'\\')
125 {
126 GetCurrentDriveW(MAX_PATH,PathNameW);
127 wcscat(PathNameW, lpFileName);
128 }
129 else
130 {
131 Len = GetCurrentDirectoryW(MAX_PATH,PathNameW);
132 if ( Len == 0 )
133 return NULL;
134 if ( PathNameW[Len-1] != L'\\' ) {
135 PathNameW[Len] = L'\\';
136 PathNameW[Len+1] = 0;
137 }
138 wcscat(PathNameW,lpFileName);
139 }
140
141 FileNameW[0] = '\\';
142 FileNameW[1] = '?';
143 FileNameW[2] = '?';
144 FileNameW[3] = '\\';
145 FileNameW[4] = 0;
146 wcscat(FileNameW,PathNameW);
147
148 FileNameString.Length = wcslen( FileNameW)*sizeof(WCHAR);
149
150 if ( FileNameString.Length == 0 )
151 return NULL;
152
153 if ( FileNameString.Length > MAX_PATH*sizeof(WCHAR) )
154 return NULL;
155
156 FileNameString.Buffer = (WCHAR *)FileNameW;
157 FileNameString.MaximumLength = FileNameString.Length + sizeof(WCHAR);
158
159 ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
160 ObjectAttributes.RootDirectory = NULL;
161 ObjectAttributes.ObjectName = &FileNameString;
162 ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE;
163 ObjectAttributes.SecurityDescriptor = NULL;
164 ObjectAttributes.SecurityQualityOfService = NULL;
165
166 DPRINT("File Name %w\n",FileNameW);
167
168 Status = ZwCreateFile(&FileHandle,
169 dwDesiredAccess,
170 &ObjectAttributes,
171 &IoStatusBlock,
172 NULL,
173 dwFlagsAndAttributes,
174 dwShareMode,
175 dwCreationDisposition,
176 Flags,
177 NULL,
178 0);
179 if (!NT_SUCCESS(Status))
180 {
181 SetLastError(RtlNtStatusToDosError(Status));
182 return INVALID_HANDLE_VALUE;
183 }
184 return(FileHandle);
185 }
186