*** empty log message ***
[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
38 WCHAR FileNameW[MAX_PATH];
39 ULONG i = 0;
40
41 DPRINT("CreateFileA(lpFileName %s)\n",lpFileName);
42
43 while ((*lpFileName)!=0 && i < MAX_PATH)
44 {
45 FileNameW[i] = *lpFileName;
46 lpFileName++;
47 i++;
48 }
49 FileNameW[i] = 0;
50
51 return CreateFileW(FileNameW,dwDesiredAccess,
52 dwShareMode,
53 lpSecurityAttributes,
54 dwCreationDisposition,
55 dwFlagsAndAttributes,
56 hTemplateFile);
57 }
58
59
60 HANDLE STDCALL CreateFileW(LPCWSTR lpFileName,
61 DWORD dwDesiredAccess,
62 DWORD dwShareMode,
63 LPSECURITY_ATTRIBUTES lpSecurityAttributes,
64 DWORD dwCreationDisposition,
65 DWORD dwFlagsAndAttributes,
66 HANDLE hTemplateFile)
67 {
68 HANDLE FileHandle;
69 NTSTATUS Status;
70 OBJECT_ATTRIBUTES ObjectAttributes;
71 IO_STATUS_BLOCK IoStatusBlock;
72 UNICODE_STRING FileNameString;
73 ULONG Flags = 0;
74 WCHAR PathNameW[MAX_PATH];
75 WCHAR FileNameW[MAX_PATH];
76 WCHAR *FilePart;
77 UINT Len = 0;
78
79 switch (dwCreationDisposition)
80 {
81 case CREATE_NEW:
82 dwCreationDisposition = FILE_CREATE;
83 break;
84
85 case CREATE_ALWAYS:
86 dwCreationDisposition = FILE_OVERWRITE_IF;
87 break;
88
89 case OPEN_EXISTING:
90 dwCreationDisposition = FILE_OPEN;
91 break;
92
93 case OPEN_ALWAYS:
94 dwCreationDisposition = OPEN_ALWAYS;
95 break;
96
97 case TRUNCATE_EXISTING:
98 dwCreationDisposition = FILE_OVERWRITE;
99 }
100
101 DPRINT("CreateFileW(lpFileName %w)\n",lpFileName);
102
103 if (!(dwFlagsAndAttributes & FILE_FLAG_OVERLAPPED))
104 {
105 Flags |= FILE_SYNCHRONOUS_IO_ALERT;
106 }
107
108 if (lpFileName[1] == (WCHAR)':')
109 {
110 wcscpy(PathNameW, lpFileName);
111 }
112 else if (wcslen(lpFileName) > 4 &&
113 lpFileName[0] == (WCHAR)'\\' &&
114 lpFileName[1] == (WCHAR)'\\' &&
115 lpFileName[2] == (WCHAR)'.' &&
116 lpFileName[3] == (WCHAR)'\\')
117 {
118 wcscpy(PathNameW, lpFileName);
119 }
120 else if (lpFileName[0] == (WCHAR)'\\')
121 {
122 GetCurrentDriveW(MAX_PATH,PathNameW);
123 wcscat(PathNameW, lpFileName);
124 }
125 else
126 {
127 Len = GetCurrentDirectoryW(MAX_PATH,PathNameW);
128 if ( Len == 0 )
129 return NULL;
130 if ( PathNameW[Len-1] != L'\\' ) {
131 PathNameW[Len] = L'\\';
132 PathNameW[Len+1] = 0;
133 }
134 wcscat(PathNameW,lpFileName);
135 }
136
137 FileNameW[0] = '\\';
138 FileNameW[1] = '?';
139 FileNameW[2] = '?';
140 FileNameW[3] = '\\';
141 FileNameW[4] = 0;
142 wcscat(FileNameW,PathNameW);
143
144 FileNameString.Length = wcslen( FileNameW)*sizeof(WCHAR);
145
146 if ( FileNameString.Length == 0 )
147 return NULL;
148
149 if ( FileNameString.Length > MAX_PATH*sizeof(WCHAR) )
150 return NULL;
151
152 FileNameString.Buffer = (WCHAR *)FileNameW;
153 FileNameString.MaximumLength = FileNameString.Length + sizeof(WCHAR);
154
155 ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
156 ObjectAttributes.RootDirectory = NULL;
157 ObjectAttributes.ObjectName = &FileNameString;
158 ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE;
159 ObjectAttributes.SecurityDescriptor = NULL;
160 ObjectAttributes.SecurityQualityOfService = NULL;
161
162 DPRINT("File Name %w\n",FileNameW);
163
164 Status = ZwCreateFile(&FileHandle,
165 dwDesiredAccess,
166 &ObjectAttributes,
167 &IoStatusBlock,
168 NULL,
169 dwFlagsAndAttributes,
170 dwShareMode,
171 dwCreationDisposition,
172 Flags,
173 NULL,
174 0);
175 if (!NT_SUCCESS(Status))
176 {
177 SetLastError(RtlNtStatusToDosError(Status));
178 return INVALID_HANDLE_VALUE;
179 }
180 return(FileHandle);
181 }
182