e3728b79c1182a9d1eb265472347f4ef407e755c
[reactos.git] / reactos / lib / kernel32 / file / create.c
1 /* $Id: create.c,v 1.19 2000/03/14 23:09:23 ekohl Exp $
2 *
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 ]
9 * UPDATE HISTORY:
10 * Created 01/11/98
11 * Removed use of SearchPath (not used by Windows)
12 */
13
14 /* INCLUDES *****************************************************************/
15
16 #include <ddk/ntddk.h>
17 #include <ntdll/rtl.h>
18 #include <windows.h>
19
20 #define NDEBUG
21 #include <kernel32/kernel32.h>
22
23
24 /* FUNCTIONS ****************************************************************/
25
26 HANDLE
27 STDCALL
28 CreateFileA (
29 LPCSTR lpFileName,
30 DWORD dwDesiredAccess,
31 DWORD dwShareMode,
32 LPSECURITY_ATTRIBUTES lpSecurityAttributes,
33 DWORD dwCreationDisposition,
34 DWORD dwFlagsAndAttributes,
35 HANDLE hTemplateFile
36 )
37 {
38 UNICODE_STRING FileNameU;
39 ANSI_STRING FileName;
40 HANDLE FileHandle;
41
42 DPRINT("CreateFileA(lpFileName %s)\n",lpFileName);
43
44 RtlInitAnsiString (&FileName,
45 (LPSTR)lpFileName);
46
47 /* convert ansi (or oem) string to unicode */
48 if (bIsFileApiAnsi)
49 RtlAnsiStringToUnicodeString (&FileNameU,
50 &FileName,
51 TRUE);
52 else
53 RtlOemStringToUnicodeString (&FileNameU,
54 &FileName,
55 TRUE);
56
57 FileHandle = CreateFileW (FileNameU.Buffer,
58 dwDesiredAccess,
59 dwShareMode,
60 lpSecurityAttributes,
61 dwCreationDisposition,
62 dwFlagsAndAttributes,
63 hTemplateFile);
64
65 RtlFreeHeap (RtlGetProcessHeap (),
66 0,
67 FileNameU.Buffer);
68
69 return FileHandle;
70 }
71
72
73 HANDLE
74 STDCALL
75 CreateFileW (
76 LPCWSTR lpFileName,
77 DWORD dwDesiredAccess,
78 DWORD dwShareMode,
79 LPSECURITY_ATTRIBUTES lpSecurityAttributes,
80 DWORD dwCreationDisposition,
81 DWORD dwFlagsAndAttributes,
82 HANDLE hTemplateFile
83 )
84 {
85 OBJECT_ATTRIBUTES ObjectAttributes;
86 IO_STATUS_BLOCK IoStatusBlock;
87 UNICODE_STRING NtPathU;
88 HANDLE FileHandle;
89 NTSTATUS Status;
90 ULONG Flags = 0;
91
92 switch (dwCreationDisposition)
93 {
94 case CREATE_NEW:
95 dwCreationDisposition = FILE_CREATE;
96 break;
97
98 case CREATE_ALWAYS:
99 dwCreationDisposition = FILE_OVERWRITE_IF;
100 break;
101
102 case OPEN_EXISTING:
103 dwCreationDisposition = FILE_OPEN;
104 break;
105
106 case OPEN_ALWAYS:
107 dwCreationDisposition = OPEN_ALWAYS;
108 break;
109
110 case TRUNCATE_EXISTING:
111 dwCreationDisposition = FILE_OVERWRITE;
112 }
113
114 DPRINT("CreateFileW(lpFileName %S)\n",lpFileName);
115
116 if (dwDesiredAccess & GENERIC_READ)
117 dwDesiredAccess |= FILE_GENERIC_READ;
118
119 if (dwDesiredAccess & GENERIC_WRITE)
120 dwDesiredAccess |= FILE_GENERIC_WRITE;
121
122 if (!(dwFlagsAndAttributes & FILE_FLAG_OVERLAPPED))
123 {
124 Flags |= FILE_SYNCHRONOUS_IO_ALERT;
125 }
126
127 if (!RtlDosPathNameToNtPathName_U ((LPWSTR)lpFileName,
128 &NtPathU,
129 NULL,
130 NULL))
131 return FALSE;
132
133 DPRINT("NtPathU \'%S\'\n", NtPathU.Buffer);
134
135 ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
136 ObjectAttributes.RootDirectory = NULL;
137 ObjectAttributes.ObjectName = &NtPathU;
138 ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE;
139 ObjectAttributes.SecurityDescriptor = NULL;
140 ObjectAttributes.SecurityQualityOfService = NULL;
141
142 Status = NtCreateFile (&FileHandle,
143 dwDesiredAccess,
144 &ObjectAttributes,
145 &IoStatusBlock,
146 NULL,
147 dwFlagsAndAttributes,
148 dwShareMode,
149 dwCreationDisposition,
150 Flags,
151 NULL,
152 0);
153 if (!NT_SUCCESS(Status))
154 {
155 SetLastError (RtlNtStatusToDosError (Status));
156 return INVALID_HANDLE_VALUE;
157 }
158
159 return FileHandle;
160 }
161
162 /* EOF */